加载中...

欧拉路,欧拉回路

欧拉路,即“一笔划”路,要求路径上每条边只出现一次,每个点可以多次出现;欧拉回路即两个端点重合。

欧拉图:含有欧拉回路的图

半欧拉图:含有欧拉路的图

一个无向图含有欧拉路的充要条件:

  • 含有 \(0\) 个或 \(2\) 个奇度数点
  • 除了孤立点外,图连通(即边连通)

对于有向图,所有点的入度和出度均相等,或者存在一个点 \(a\) 有 入度-出度=1,另一个点 \(b\) 有 出度-入度=1,其他点的入度均等于出度。

求一个图的欧拉路:\(Hierholzer\) 算法

set<int> G[N];

vector<int> euler_path;
void dfs(int u){
    while(!G[u].empty()){
        int v = *G[u].begin();
        G[u].erase(v);
        G[v].erase(u);
        dfs(v);
    }
    euler_path.pb(u);
}

dfs(start); // 奇数度点数为0时,任意点均可;为2时,只能是两个端点

注意在有向图中,经上述算法求出的欧拉路是倒序的,需要 \(reverse\);而无向图不存在反转的问题。

如果图的规模足够小,可以直接用邻接矩阵存图;由于涉及到删边,需要用 \(set\) 存图,而不能用 \(vector\)

理解:深搜过程中,优先将无出边的点放入答案路径中,而无出边的点必然对应欧拉路的末尾,因此可以理解为存储的路径是原图倒序的欧拉路。

posted @ 2025-09-06 14:00  jxs123  阅读(10)  评论(0)    收藏  举报