332. 重新安排行程(欧拉路径模板题目)
题目链接:332. 重新安排行程 - 力扣(LeetCode)
解析
这道题的核心是有向图的欧拉路径问题,可以使用Hierholzer算法解决:
关键点分析
-
欧拉路径定义:在图中经过每条边恰好一次的路径
-
有向图欧拉路径存在条件:
-
所有顶点的入度等于出度(欧拉回路)
-
或者恰好有一个顶点出度比入度大1(起点),一个顶点入度比出度大1(终点)
-
-
字典序要求:需要按字典序最小的顺序访问邻接点
算法步骤
-
构建邻接表:使用字典存储每个机场可以到达的机场列表,并按字典序排序
-
深度优先搜索(DFS):从"JFK"开始进行后序遍历
-
逆序构建结果:由于是后序遍历,需要将结果逆序
Hierholzer算法详解
算法背景
Hierholzer算法是用于在图中寻找欧拉路径或欧拉回路的经典算法,由德国数学家Carl Hierholzer在1873年提出。它比之前的Fleury算法更加高效。
欧拉图基本概念
-
欧拉路径:经过图中每条边恰好一次的路径
-
欧拉回路:起点和终点相同的欧拉路径
-
欧拉图:存在欧拉回路的图
-
半欧拉图:存在欧拉路径但不存在欧拉回路的图
算法适用范围
Hierholzer算法适用于:
-
有向图和无向图
-
寻找欧拉路径或欧拉回路
-
图中所有边都只能遍历一次
算法核心思想
Hierholzer算法采用深度优先搜索(DFS) 的后序遍历方式,逐步构建欧拉路径。关键在于:
-
从起点开始DFS
-
沿着边前进直到无路可走
-
然后将节点加入结果(后序遍历)
-
最后将结果逆序得到正确顺序
算法步骤详解
1. 检查欧拉路径存在性
对于有向图:
-
欧拉回路:所有顶点的入度 = 出度
-
欧拉路径:存在一个顶点出度=入度+1(起点),另一个顶点入度=出度+1(终点),其余顶点入度=出度
对于无向图:
-
欧拉回路:所有顶点的度数为偶数
-
欧拉路径:0个或2个顶点的度数为奇数
2. 算法流程
为什么Hierholzer算法使用后序遍历?
欧拉路径的性质
欧拉路径是经过所有边恰好一次的路径。在DFS中:
-
当我们进入一个节点时,可能还有未访问的边
-
当我们离开一个节点时,必须确保从该节点出发的所有边都已被访问
后序遍历保证了:只有当一个节点的所有出边都被访问后,这个节点才会被加入结果。这确保了路径的连续性。
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号