https://acm.hdu.edu.cn/showproblem.php?pid=1878
无向图欧拉回路 :首先判断是否属于一个线段:并查集根节点相同
然后判断是否一笔画回路且可以回到起点:度为偶数 实现:开个数组计算度
概念解析详见欧拉回路总结博客
#include<cstdio>
#include<cstring>
const int N=1e3+5;
int root[N];//并查集
int du[N];//度
int n,m;//n个节点m条边
int l,r;//边的两个端点
inline int read(){//快读,可忽略
char c=getchar();int s=0,w=1;
while(c<'0' || c>'9'){if(c=='-') w*=-1;c=getchar();
}while(c>='0' && c<='9') s=(s<<3)+(s<<1)+c-'0',c=getchar();return s*w;
}
inline int find(int x){//找根借点
return x==root[x] ? x : x=root[x];
}
inline void merge(int x,int y){//合并并查集
if(find(x)!=find(y)) root[x]=y;
}
inline void init(){//初始化
for(int i=1;i<=n;i++){
root[i]=i;
du[i]=0;
}
}
int main(){
while((n=read()) != 0){
m=read();
init();
for(int i=1;i<=m;i++){
l=read(),r=read();
du[l]++,du[r]++;
merge(l,r);
}
//判断是否属于一个线段:并查集根节点相同
int flag=1,fa=find(1);
for(int i=2;i<=n;i++){
if(find(i)!=fa) {
flag=0; break;
}
}
if(!flag) {
printf("0\n");continue;
}
//然后判断是否一笔画回路且可以回到起点:度为偶数
for(int i=1;i<=n;i++){
if(du[i] & 1) {
flag=0;break;
}
}
if(!flag) {
printf("0\n");continue;
}
else {
printf("1\n");continue;
}
}
}