poj1611(并查集)

 1 #include <stdio.h>
 2 using namespace std;
 3 int set[30005];
 4 int num[30005];
 5 void makeset(int n)
 6 {
 7     for(int i=0;i<n;i++)
 8     {
 9         set[i]=i;
10         num[i]=1;
11     }
12 }
13 
14 
15 int findset(int x)
16 {
17     if(x!=set[x])
18     {
19         set[x]=findset(set[x]);//之所以不可以直接返回是因为这里可能有多层的关系
20     }
21     return set[x];
22 }
23 void Union(int a,int b)
24 {
25     int x=findset(a);
26     int y=findset(b);
27     if(x==y)
28     {
29         return ;
30     }
31     if(num[x]>=num[y])
32     {
33         num[x]+=num[y];
34         set[y]=set[x];
35     }
36     else
37     {
38         num[y]+=num[x];
39         set[x]=set[y];
40     }
41 }
42 int main()
43 {
44     int peopleNum,groupNum,eachNum,first,index;
45     while(1)
46     {
47         scanf("%d %d",&peopleNum,&groupNum);
48         if(peopleNum==0 && groupNum==0) break;
49         makeset(peopleNum);//
50         for(int k=0;k<groupNum;k++)
51         {
52             scanf("%d %d",&eachNum,&first);
53             for(int j=1;j<eachNum;j++)
54             {
55                 scanf("%d",&index);
56                 Union(first,index);
57             }
58         }
59         printf("%d\n",num[findset(0)]);
60 
61     }
62     return 0;
63 }

其实就那么几个函数,搞明白了关系就行了,可以看下接下来写的模板

posted on 2012-08-12 13:03  矮人狙击手!  阅读(254)  评论(0编辑  收藏  举报

导航