欧拉通路332. Reconstruct Itinerary

来源:互联网 发布:物理实验模拟软件 编辑:程序博客网 时间:2024/05/22 03:19

这里写图片描述

解:
欧拉通路:遍历所有的边的一条路径
存在的充要条件:
2个点一个点出度大于入度(起始点),一个点入度大于出度(终止点)
或 所有点出度=入度(欧拉回路)
欧拉回路:遍历所有的边并回到初始点的一条回路
存在的充要条件:
所有点出度=入度(欧拉回路)

此题即遍历所有的边的一条路径,并不一定要回到JFC,所以是求欧拉通路问题,用dfs其实就是套圈法:
1、用dfs一延边找点,由于题目说要字典序,就按字典序来找,若找到不能继续往下找的点,记为p,此即为终止点
2、回溯到其上层节点,走别的路,由于p是唯一的终止点,所以再找一定最后可以回来(除p和JFC外其他都出度=入度)
3、不断重复1、2,直到所有边全部遍历

    def findItinerary(self, tickets):        """        :type tickets: List[List[str]]        :rtype: List[str]        """        res = []        stack = []        stack.append('JFK')        while 1 :            if len(tickets) == 0:                break            EdgeIndex = -1            NowPoint = stack[-1]            MinPoint = 'ZZZ'            flag = 0            for i in range(0,len(tickets)):                if tickets[i][0] == NowPoint:                    if len(res) > 0:                        if tickets[i][1] == res[0]:                            flag = 1                            continue                    if MinPoint > tickets[i][1]:                        MinPoint = tickets[i][1]                        EdgeIndex = i            if EdgeIndex == -1:                if flag == 1:                    break                res.append(stack.pop())                continue            stack.append(MinPoint)            del tickets[EdgeIndex]        return stack + res[::-1]

注意:res记录的时候是逆序的,最后要reverse一下

0 0