原题链接
在图论里面这是一个相当经典的问题了,如果满足以下两个条件则存在无向图的欧拉回路,否则不存在。
- 每个点的度为偶数
- 图连通
这里就涉及用并查集来判断一个图是否连通,并查集的思想参照下方链接
超有爱的并查集~
这位大佬写的相当好。
本题的具体代码如下,对应部分有注释:
#include <stdio.h>
int pre[1005],num[1005]={0};
int find(int root){
int son=root,tmp;
while(root!=pre[root]){
root=pre[root];//寻找根结点,根结点的前置结点和自身相同
}
while(son!=root){//路径压缩
tmp=pre[son];//tmp指向当前结点的前置结点
pre[son]=root;//当前结点的前置结点置为根结点
son=tmp;//指向当前结点的前置结点
}
return root;//返回根结点
}
int main(){
int i,j,n,m,v1,v2,r1,r2,k=1,p=0;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
pre[i]=i;
}
for(i=0;i<m;i++){
scanf("%d %d",&v1,&v2);
r1=find(v1);
r2=find(v2);
if(r1!=r2){//如果v1和v2的根结点不一致,那么置r2的根结点为r1
pre[r2]=r1;
k++;//多了一条路
}
num[v1]++;
num[v2]++;
}
if(k!=n){
printf("0");
}
for(i=1;i<=n;i++){
if(num[i]%2!=0){
p=1;
break;
}
}
if(p){
printf("0");
}else{
printf("1");
}
return 0;
}