并查集水题。
一个图存在欧拉回路的判断条件:
无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数且该图是连通图。
有向图存在欧拉回路的充要条件
一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图
1.每次加点都对两个点的度数加1
2.加点时如果两点不在同一集合,则合并两点所在集合。
3.最后统计每个点度数是否为偶数,并且判断连不连通。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define N 1100 int du[N]; int fa[N]; void makeset(int n) { for(int i=1;i<=n;i++) { fa[i] = i; } } int findset(int x) { if(x != fa[x]) { fa[x] = findset(fa[x]); } return fa[x]; } void unionset(int a,int b) { int x = findset(a); int y = findset(b); if(x != y) { fa[x] = y; } } int main() { int n,m,i; int a,b; while(scanf("%d",&n)!=EOF && n) { memset(du,0,sizeof(du)); makeset(n); scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); du[a]++; du[b]++; unionset(a,b); } int flag = 1; int cnt = 0; for(i=1;i<=n;i++) { if(fa[i] == i) cnt++; } if(cnt>=2) flag = 0; if(flag){ for(i=1;i<=n;i++) { if(du[i]%2 != 0) { flag=0; break; } } } if(flag) cout<<1<<endl; else cout<<0<<endl; } return 0; }