题意:
判断一个图是否是欧拉回路。
欧拉回路:
图 G 的一个回路,若它通过 G 中每条边一次且仅一次,则称为欧拉回路。
其中有著名的哥尼斯堡七桥问题或一笔画问题。(原来小时候我们就接触欧拉回路了,欧拉回路还是蛮常见,蛮简单的)
解题思路:
只要每个点都有入度,出度,那么这个图就是一个欧拉回路。然后再用并查集判断一个图是否是连通的即可。
代码:
#include<iostream> using namespace std; const int MAX=1005; int dep[MAX],father[MAX],du[MAX]; int find_set(int x) { if(x!=father[x]) { father[x]=find_set(father[x]);//回溯压缩路径 } /*所有的子节点的根都归到boss下*/ return father[x]; } void union_set(int f1,int f2) { f1=find_set(f1); f2=find_set(f2); if(f1==f2) return ; if(dep[f1]>dep[f2]) { father[f2]=f1; } else { if(dep[f1]==dep[f2]) { dep[f2]++; } father[f1]=f2; } return ; } void init(int n) { for(int i=0;i<=n;i++) { father[i]=i; dep[i]=0; } memset(du,0,sizeof(du)); } int main(void) { int point,edge; int count,i,u,v; bool exist; while(scanf("%d",&point),point) { scanf("%d",&edge); init(point); for(i=0;i<edge;i++) { scanf("%d%d",&u,&v); du[u]++; du[v]++; union_set(u,v); } exist=1; for(i=0;i<=point;i++) { if(du[i]&&du[i]%2!=0) { exist=0; break; } } for(i=0,count=0;i<=point;i++) { if(du[i]&&i==find_set(i)) count++; } if(exist) { if(count!=1) cout<<"0"<<endl; else cout<<"1"<<endl; } else cout<<"0"<<endl; } return 0; } |