欧拉路径与欧拉回路
欧拉回路是欧拉路径的子集。
对于有向图,欧拉路径的判定是所有点入度等于出度,或者只存在一个入度等于出度加一的点和一个出度等于入度加一的点。
对于有向图,欧拉回路的判定是所有点入度等于出度。
对于无向图,欧拉路径的判定是所有点度数为偶数,或者只存在两个度数为奇数的点。
对于无向图,欧拉回路的判定是所有点度数为偶数。
用一个算法可以求出具体的欧拉路径。
值得一提的是通过以下算法
如果一张无向图存在欧拉回路,那我求的任意欧拉路径都是欧拉回路;
如果一张有向图存在欧拉回路,那我从欧拉回路起点求的任意欧拉路径都是欧拉回路。
算法本身可以在左程云的算法课程里看一下大意。
for(int i = deal[s]; i < e[s].size(); i = deal[s]) {
deal[s] = i + 1;
euler(e[s][i]);
}
path.push_back(s);
}
注意点:注意path要在末尾添加,然后再把path倒过来。
如果把path的添加放在函数头,反例如下
1 → 2
1 → 3
3 → 1
输出:1 2 3 1
答案:1 3 1 2
这个其实跟算法本身的正确性有关。Hierholzer 算法允许先走进死路,再把这段路径放到最终答案的末尾。如果我们把path的添加放到开头,按照上面的例子,我们就会默认下一步答案从2开始生成,这是错误的。

浙公网安备 33010602011771号