poj 1611The Suspects(并查集)

题目:http://poj.org/problem?id=1611

并查集问题,rank[]记录与根节点的关系,num[]记录树的节点数

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 
 4 using namespace std;
 5 int set[30010];
 6 int rank[30010];
 7 int num[30010];
 8 int find(int x)
 9 {
10     if(x!=set[x])
11     {
12         set[x]=find(set[x]);
13     }
14     return set[x];
15 }
16 void merge(int a,int b)
17 {
18     a=find(a);
19     b=find(b);
20     if(a==b)
21     {
22         return ;
23     }
24     if(rank[a]>rank[b])
25     {
26         set[b]=a;
27         num[a]+=num[b];
28     }
29     else
30     {
31         set[a]=b;
32         if(rank[a]==rank[b])
33         {
34             rank[a]++;
35             num[b]+=num[a];
36         }
37     }
38     return ;
39 }
40 int main()
41 {
42     int n,m;
43     while(scanf("%d%d",&n,&m)!=EOF)
44     {
45         if(n==0&&m==0)
46         break;
47         int t;
48         int i,j;
49         int a,b;
50         for(i=0;i<n;i++)
51         {
52             set[i]=i;
53             rank[i]=0;
54             num[i]=1;
55         }
56         for(i=0;i<m;i++)
57         {
58             cin>>t;
59             cin>>a;
60             for(j=1;j<t;j++)
61             {
62                 cin>>b;
63                 a=find(a);
64                 b=find(b);
65                 merge(a,b);
66             }
67         }
68         cout<<num[find(0)]<<endl;
69     }
70     return 0;
71 }

 

posted @ 2013-01-18 20:37  琳&leen  阅读(117)  评论(0编辑  收藏  举报