题目链接: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 ",res); 32 } 33 return 0; 34 }