HDU 1878 欧拉回路(图论)
根据欧拉提出的定理,存在欧拉路的充要条件是连通,不存在奇数度数节点或者2个奇数节点。存在欧拉回路是连通,不存在奇数度数节点。
并查集写的有点暴力,水过。还好1Y。
1 #include <stdio.h> 2 #include <string.h> 3 int o[1001],p[1001]; 4 int find(int x) 5 { 6 while (x != p[x]) 7 x = p[x]; 8 return x; 9 } 10 void merge(int x,int y) 11 { 12 x = find(x); 13 y = find(y); 14 if(x != y) 15 p[x] = y; 16 } 17 int main() 18 { 19 int n,m,i,num,sv,ev; 20 while(scanf("%d",&n)!=EOF) 21 { 22 if(!n) break; 23 memset(o,0,sizeof(o)); 24 for(i = 1;i <= n;i ++) 25 { 26 p[i] = i; 27 } 28 num = 0; 29 scanf("%d",&m); 30 for(i = 1;i <= m;i ++) 31 { 32 scanf("%d%d",&sv,&ev); 33 merge(sv,ev); 34 o[sv]++; 35 o[ev]++; 36 } 37 for(i = 1;i <= n;i ++) 38 { 39 if(o[i]%2 == 1) 40 num ++; 41 } 42 for(i = 2;i <= n;i ++) 43 { 44 if(find(i) != find(1)) 45 break; 46 } 47 if(i == n+1) 48 { 49 if(num == 0) 50 printf("1\n"); 51 else 52 printf("0\n"); 53 } 54 else 55 printf("0\n"); 56 } 57 return 0; 58 }