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 }
posted @ 2012-06-23 10:52  Naix_x  阅读(230)  评论(0编辑  收藏  举报