欧拉路径+欧拉回路:知识点+板子

求欧拉路

欧拉路:只经过所有边一次的道路

欧拉回路:只经过所有边一次且回到起点的道路

类似于一笔画

前提条件:如果图是连通的(同属于一个集合)

1 无向图:
欧拉路径存在条件:恰好有两个度数为奇数的点(其他点度数都为偶数),路径从一个度数为奇的点到另一个度数为奇的点

欧拉回路存在条件:所有点的度数为偶数

2 有向图:
欧拉路径存在条件:恰好有两个点入度不等于出度(其他所有点入度=出度),且一个出度-入度=1(起点),另一个入度-出度=1(终点)

欧拉回路存在条件:所有顶点入度=出度

不难发现欧拉回路是欧拉路径的子集

半欧拉图:存在欧拉路径,却不存在欧拉回路

无向图求欧拉回路板子

void euler(int u){
	for(int i=1;i<=n;i++){
		if(g[u][i]&&!vis[u][i]){
			vis[i][u]=vis[u][i]=1;
			euler(i);
		}
	}
	res.pb(u);
}

有向图求欧拉路径板子

int now[maxn];
stack<int>stk;

void dfs(int u){
    for(int i=now[u];i<e[u].size();i=now[u]){
        now[u]=i+1;
        dfs(e[u][i]);
        //0 1 2 ... now[u]-1 已经被访问 ,下一个访问的是now[u](其实等价于删边操作)
    }
    stk.push(u);//每pop一个就输出一个即可
}
posted @ 2025-04-05 16:12  Marinaco  阅读(55)  评论(0)    收藏  举报
//雪花飘落效果