输入第一行给出两个正整数,分别是节点数NN (1\le N\le 10001≤N≤1000)和边数MM;随后的MM行对应MM条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到NN编号)。
若欧拉回路存在则输出1,否则输出0。
6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6
1
5 8
1 2
1 3
2 3
2 4
2 5
5 3
5 4
3 4
0
/* 凡是由偶点(每个节点的边数)组成的连通图,一定可以一笔画成。*/ /* 并查集 解决问题 度相当与边数*/ #include "iostream" #include "cstring" #include "set" using namespace std; #define Max 3000 int Father[Max],Degree[Max]; int Find(int x) //查 { if(x==Father[x]) return x; else return Find(Father[x]); } void Union(int x,int y) { Father[x]=y; } int main() { //freopen("1.txt","r",stdin); int m,n; scanf("%d%d",&m,&n); //Top ,Edge int i; for(i=1;i<=m;i++) { Father[i]=i; Degree[i]=0; } int x,y; int count=m; for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); Degree[x]++; Degree[y]++; if(Find(x)!=Find(y)) { Union(x,y); } } bool One=true; for(i=1;i<=m;i++) { if(Degree[i]%2!=0) { One=false; break; } } if(One==true) { set<int> F; for(i=1;i<=m;i++) { F.insert(Find(i)); } if(F.size()==1) printf("1\n"); else printf("0\n"); } else printf("0\n"); return 0 ; }