并查集之寻找某元素所在集合的元素个数----the suspects

另外建立一个数组NUM[],每次FIND(x)如果相等之后都将NUM[X]++,简单题。。。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 #define N 40000
 6 int pre[N];
 7 int num[N];
 8 int rank[N];
 9 
10 void init()
11 {
12     for(int i=0; i<N; i++)
13     {
14         num[i]=1;
15         pre[i]=i;
16         rank[i]=0;
17     }
18 }
19 
20 int find(int x)
21 {
22     int r=x;
23     while(r!=pre[r])
24         r=pre[r];
25     int i=x,j;
26     while(i!=r)
27     {
28         j=pre[i];
29         pre[i]=r;
30         i=j;
31     }
32     return r;
33 }
34 void merge(int x,int y)
35 {
36     int fx=find(x);
37     int fy=find(y);
38     if(fy==fx)   return;
39     if(rank[fx]>rank[fy])
40     {
41         pre[fy]=fx;
42         num[fx]+=num[fy];
43     }
44     else
45     {
46         pre[fx]=fy;
47         if(rank[fx]==rank[fy])
48             rank[fy]++;
49         num[fy]+=num[fx];
50     }
51 }
52 int main()
53 {
54 
55     int n,m;
56     while(~scanf("%d%d",&n,&m))
57     {
58         init();
59         if(n==0&&m==0)  break;
60         if(m==0)
61         {
62             printf("1\n");
63             continue;
64         }
65         while(m>0)
66         {
67             m--;
68             int t,first,next;
69             cin>>t>>first;
70             for(int i=1; i<t; i++)
71             {
72                 scanf("%d",&next);
73                 merge(first,next);
74                 first=next;
75             }
76         }
77         int x=find(0);
78         cout<<num[x]<<endl;
79     }
80     return 0;
81 }

 

posted @ 2015-10-31 15:28  请叫我凯凯大人  阅读(523)  评论(0编辑  收藏  举报