欧拉路径

高级

欧拉路径问题是"一笔画"问题的图论形式化。

欧拉路径

输入节点数和无向边,观察 Hierholzer 算法求欧拉路径。

AlgoAnim · 欧拉路径

待机

速度
待机
// 源代码
1void hierholzer(int u, vector<vector<pair<int,int>>>& adj,
2                  list<int>& path) {
3    while (!adj[u].empty()) {
4        auto [v, id] = adj[u].back();
5        adj[u].pop_back();
6        hierholzer(v, adj, path);
7    }
8    path.push_front(u);
9}

复杂度分析

时间 O(V + E)
空间 O(V + E)
最优 O(V + E)
最坏 O(V + E)

算法讲解

欧拉路径要求经过图中每条边恰好一次。欧拉回路要求 additionally 起点与终点相同。

无向图存在欧拉回路当且仅当所有顶点度数为偶数且连通;存在欧拉路径当且仅当恰好有两个奇度顶点。

Hierholzer 算法用 DFS 从起点出发,每当无路可走时回溯并将节点加入路径,最终逆序输出即为欧拉路径。

它在 DNA 序列拼接和邮路问题中有直接应用。