332. 重新安排行程(欧拉路径模板题目)

题目链接:332. 重新安排行程 - 力扣(LeetCode)

 

 

 

 

 

解析

这道题的核心是有向图的欧拉路径问题,可以使用Hierholzer算法解决:

关键点分析

  1. 欧拉路径定义:在图中经过每条边恰好一次的路径
  2. 有向图欧拉路径存在条件
    • 所有顶点的入度等于出度(欧拉回路)
    • 或者恰好有一个顶点出度比入度大1(起点),一个顶点入度比出度大1(终点)
  3. 字典序要求:需要按字典序最小的顺序访问邻接点

算法步骤

  1. 构建邻接表:使用字典存储每个机场可以到达的机场列表,并按字典序排序
  2. 深度优先搜索(DFS):从"JFK"开始进行后序遍历
  3. 逆序构建结果:由于是后序遍历,需要将结果逆序

Hierholzer算法详解

算法背景

Hierholzer算法是用于在图中寻找欧拉路径或欧拉回路的经典算法,由德国数学家Carl Hierholzer在1873年提出。它比之前的Fleury算法更加高效。

欧拉图基本概念

  • 欧拉路径:经过图中每条边恰好一次的路径
  • 欧拉回路:起点和终点相同的欧拉路径
  • 欧拉图:存在欧拉回路的图
  • 半欧拉图:存在欧拉路径但不存在欧拉回路的图

算法适用范围

Hierholzer算法适用于:
  1. 有向图和无向图
  2. 寻找欧拉路径或欧拉回路
  3. 图中所有边都只能遍历一次

算法核心思想

Hierholzer算法采用深度优先搜索(DFS)​ 的后序遍历方式,逐步构建欧拉路径。关键在于:
  • 从起点开始DFS
  • 沿着边前进直到无路可走
  • 然后将节点加入结果(后序遍历)
  • 最后将结果逆序得到正确顺序

算法步骤详解

1. 检查欧拉路径存在性

对于有向图
  • 欧拉回路:所有顶点的入度 = 出度
  • 欧拉路径:存在一个顶点出度=入度+1(起点),另一个顶点入度=出度+1(终点),其余顶点入度=出度
对于无向图
  • 欧拉回路:所有顶点的度数为偶数
  • 欧拉路径:0个或2个顶点的度数为奇数

2. 算法流程

function hierholzer(graph, start):
    stack = [start]
    result = []
    
    while stack not empty:
        current = stack.peek()
        if graph[current] not empty:
            next = graph[current].pop_first()  # 移除一条边
            stack.push(next)
        else:
            result.append(stack.pop())  # 当前节点无出边,加入结果
    
    return reverse(result)  # 逆序得到正确顺序

为什么Hierholzer算法使用后序遍历?

欧拉路径的性质

欧拉路径是经过所有边恰好一次的路径。在DFS中:
  • 当我们进入一个节点时,可能还有未访问的边
  • 当我们离开一个节点时,必须确保从该节点出发的所有边都已被访问
后序遍历保证了:只有当一个节点的所有出边都被访问后,这个节点才会被加入结果。这确保了路径的连续性。
posted @ 2026-03-09 21:25  WTSRUVF  阅读(32)  评论(0)    收藏  举报