欧拉回路
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
Sample Output
1 0
思路:先判断所有点是否在同一集合,再判断是否存在某点的度不是偶数
#include<stdio.h> #include<string.h> int a[1005],father[1005],depth[1005]; void init(int n) { int i; for(i = 1;i <= n;i ++) { father[i] = i; depth[i] = 0; a[i] = 0; } } int find(int x) { if(x==father[x]) return x; return father[x] = find(father[x]); } void unit(int x,int y) { x = find(x); y = find(y); if(x == y) return ; if(depth[x] < depth[y]) father[x] = y; else { if(depth[x]>depth[y]) father[y] = x; else { father[x] = y; depth[y]++; } } } int main() { int n,m,i,j,flag; while(~scanf("%d%d",&n,&m)&&n) { flag = 0; init(n); while(m--) { scanf("%d%d",&i,&j); a[i]++; a[j]++; i = find(i); j = find(j); unit(i,j); } for(i = 1; i <= n; i ++) { if(i==find(i)) flag++; if(flag==2) break ; } if(flag==2) { printf("0 "); continue ; } for(i = 1;i <= n; i ++) { if(a[i]%2!=0) flag = 0; } if(flag) printf("1 "); else printf("0 "); } return 0; }