欧拉路,欧拉回路
欧拉路,即“一笔划”路,要求路径上每条边只出现一次,每个点可以多次出现;欧拉回路即两个端点重合。
欧拉图:含有欧拉回路的图
半欧拉图:含有欧拉路的图
一个无向图含有欧拉路的充要条件:
- 含有 \(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\)。
理解:深搜过程中,优先将无出边的点放入答案路径中,而无出边的点必然对应欧拉路的末尾,因此可以理解为存储的路径是原图倒序的欧拉路。