欧拉路径

欧拉路径

模板题
一个感性的定义:一笔画路径,经过一次所有的边,点可以多次走
特别的,若该路径的起点与终点相同,则称其为 欧拉回路
欧拉路径的存在条件

  • 此图连通;
  • 对于无向图,当且仅当度数为奇的点的个数为 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);
}
posted @ 2024-11-25 19:04  花子の水晶植轮daisuki  阅读(0)  评论(0编辑  收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js