前置知识:欧拉图 (两个要点:1.是连通图才有欧拉回路2.是否满足出度和入度的要求)
模板题 :P7771 【模板】欧拉路径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
欧拉回路
1.• 对于无向图,欧拉回路就是在图的所有结点的度都是偶数,并且图是连通的情况下,从任意一个节点开始 dfs 都可以回到原点。
一道典题:P6066 [USACO05JAN] Watchcow S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)从一点出发回到这一点的欧拉回路
2.P2731 [USACO3.3] 骑马修栅栏 Riding the Fences - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 欧拉回路需要考虑重边是否计算
欧拉路径
1.https://www.luogu.com.cn/problem/UVA10129 欧拉路径的应用题,对于每个单词都要出现一次相当于欧拉路径中每条边都有出现一次,要考虑如何保留边的信息
2.对于判连通图来说,dfs有可能会爆栈,那么可以改用并查集
寻找欧拉路径
//对于稠密图,删边操作还是很重要的,否则可能会T
void dfs(int u){
for(int i = vis[u];i<G[u].size();i = vis[u]){
vis[u] = i+1;//删边操作很重要,当边特别大时
dfs(G[u][i]);
}
st.push(u);
}
判断是否能够形成欧拉回路/路径(省略判连通图)
fa(i,1,n){
if(d[i][0] != d[i][1]){
tag = 0;
if(d[i][0]-d[i][1]==1) mp[0]++,start = i;
else if(d[i][1]-d[i][0]==1) mp[1]++;
else {
cout<<"No"<<endl;
return 0;
}
}
}
if((!tag)&&!(mp[0] == mp[1]&&mp[1] == 1)) {
cout<<"No"<<endl;
return 0;
}
标签:图论,cn,luogu,路径,回路,com,欧拉
From: https://www.cnblogs.com/hatsunemiku39/p/18087149