欧拉路径
欧拉路径
模板题
一个感性的定义:一笔画路径,经过一次所有的边,点可以多次走
特别的,若该路径的起点与终点相同,则称其为 欧拉回路
欧拉路径的存在条件:
- 此图连通;
- 对于无向图,当且仅当度数为奇的点的个数为 0 或 2;
- 对于有向图,当且仅当
- 入度与出度不同的点的个数为 0 或 2;
- 当入度与出度不同的点的个数为 2 时,必须要一个点(即路径终点)入度比出度多 1,一个点(即路径起点)入度比出度少1。
(我不会证明以上结论)
代码写法:
先判断有没有回路
然后找是否有入度比出度刚好少一的点,作为起点(基于上面的结论),否则把1(任一点)作为起点。
dfs删边,继续递归,把访问的点加入栈
依次输出栈中元素
补充:删边操作可以写成记录起点,每次循环无视起点之前的边,相当于删除了这些边。
正确性:有回路时想怎么走都可以。(其实就是不会证)
核心代码如下:
void oularoad(int u){
//不要看到有head数组就以为是链式前向星,下面的代码本质上还是链接列表
for(int i = head[u];i < edge[u].size(); i = head[u]){
//注:用auto x : edge[u]的写法不方便记录删边,老老实实写循环
head[u] = i + 1;
oularoad(edge[u][i]);
}
stk.push(u);
}