欧拉通路332. Reconstruct Itinerary

6 篇文章 0 订阅

这里写图片描述

解:
欧拉通路:遍历所有的边的一条路径
存在的充要条件:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值