poj1611(并查集简单应用)

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

思路:

显然是一个并查集的题,很简单,只要将一个group中的学生并在一起,最后遍历1到n-1,看有多少学生的祖先与0的祖先相等即可。

代码如下:

 1 #include<cstdio>
 2 using namespace std;
 3 
 4 int n,m,res,root[30005];
 5 
 6 int getr(int k){
 7     if(root[k]==k) return k;
 8     else return root[k]=getr(root[k]);
 9 }
10 
11 int main(){
12     while(~scanf("%d%d",&n,&m),n){
13         res=1;
14         for(int i=0;i<n;++i) root[i]=i;
15         while(m--){
16             int num,tmp1,tmp2;
17             scanf("%d",&num);
18             if(num>0){
19                 scanf("%d",&tmp1);
20                 num--;
21                 while(num--){
22                     scanf("%d",&tmp2);
23                     root[getr(tmp2)]=getr(tmp1);
24                 }
25             }
26         }
27         int tmp=getr(0);
28         for(int i=1;i<n;++i)
29             if(getr(i)==tmp)
30                 ++res;
31         printf("%d\n",res);
32     }
33     return 0;
34 }

 

posted @ 2019-02-28 17:50  Frank__Chen  阅读(127)  评论(0编辑  收藏  举报