欧拉路径+欧拉回路:知识点+板子
求欧拉路
欧拉路:只经过所有边一次的道路
欧拉回路:只经过所有边一次且回到起点的道路
类似于一笔画
前提条件:如果图是连通的(同属于一个集合)
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一个就输出一个即可
}

浙公网安备 33010602011771号