欧拉回路(leetcode 重新安排行程)

先学习一下欧拉回路是怎么一回事。

对于图中这七个节点,从节点1出发,最终要到达节点1,并且每条路只能走一次,且每条路都得走过一次。

使用dfs,如果算法按照字典序的排列方式选择下一个节点。

第一部分:那么算法的流程是,节点1--> 节点2-->节点3-->节点1。这时候到达节点1后发现,节点1无路可走了兄弟们,退回到节点3继续走呗。

第二部分:接着流程是,节点3--> 节点4-->节点5-->节点3。退退退,退到节点5发现也无路可走,再退到节点4继续。

第三部分:接着流程是,节点4--> 节点6-->节点7-->节点4。最终所有的路都走了一遍。

我们发现,第二部分的流程,从3开始,最终到达3,那么可以插入到第一部分的节点3上。

第一部分的流程变成:节点1--> 节点2-->节点3--> 节点4-->节点5-->节点3-->节点1。

第三部分流程,从4开始,最终到达4,那么可以插入到第一部分的节点4上。

第一部分的流程变成:节点1--> 节点2-->节点3--> 节点4--> 节点6-->节点7-->节点4-->节点5-->节点3-->节点1。

这一套流程下来,所有的边都走过一遍,且只走一遍。

再重新分析一遍第一部分,节点1--> 节点2-->节点3-->节点1,发现最终到达节点1的时候,无路可走,节点3又可以走其他路,那么可以推出,从节点3-->节点1这一段路应该是最后的一段路。可以先加入列表ans中。

第二部分流程是,节点3--> 节点4-->节点5-->节点3。发现最终到达节点3的时候,无路可走,节点4又可以走其他路,那么可以推出,从节点4-->节点5-->节点3。这一段路应该是倒数第二段路。可以加入列表ans中。

第三部分流程是,节点4--> 节点6-->节点7-->节点4。最终所有的路都走了一遍。这是从节点4到达节点4的一段路,是正着走的一段路,ans中倒着走的一段路。

看例题:

这是有向图,并且路径可能重复。例如可能存在两条一样的路:JFK-->SFO。

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        edge = defaultdict(list)
        ans = []
        for x, y in tickets:
            edge[x].append(y)
        def dfs(u):
            qu = edge[u]
            qu.sort()
            while qu:
                v = qu.pop(0)
                dfs(v)
            ans.append(u)
        dfs('JFK')
        return ans[::-1]

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值