POJ 1611 The Suspects(并查集)

题目链接

题目描述难懂。简单一句话,找和0在一个集合的。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[30001];
 4 int find(int x)
 5 {
 6     int t,r;
 7     r = x;
 8     while(x != p[x])
 9     {
10         x = p[x];
11     }
12     while(r != x)
13     {
14         t = p[r];
15         p[r] = x;
16         r = t;
17     }
18     return x;
19 }
20 void merge(int x,int y)
21 {
22     x = find(x);
23     y = find(y);
24     if(x != y)
25     p[x] = y;
26 }
27 int main()
28 {
29     int n,m,sv,ev,str,i,j,k,num;
30     while(scanf("%d%d",&n,&m)!=EOF)
31     {
32         if(!n && !m) break;
33         for(i = 0;i <= n-1;i ++)
34         {
35             p[i] = i;
36         }
37         for(i = 1;i <= m;i ++)
38         {
39             scanf("%d",&k);
40             scanf("%d",&sv);
41             for(j = 2;j <= k;j ++)
42             {
43                 scanf("%d",&ev);
44                 merge(sv,ev);
45             }
46         }
47         str = find(0);
48         num = 0;
49         for(i = 0;i <= n-1;i ++)
50         {
51             if(str == find(i))
52             num ++;
53         }
54         printf("%d\n",num);
55     }
56     return 0;
57 }
posted @ 2012-08-03 13:07  Naix_x  阅读(141)  评论(0编辑  收藏  举报