题目链接:https://cn.vjudge.net/problem/POJ-1611
经典并查集,寻找跟序号为0的学生在一个集合的有多少人;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
//#include<bits/stdc++.h>
using namespace std;
const int N = 3e4+10;
int stu[N],f[N],Rank[N],number[N];
int Find(int x){
if(f[x]==-1)
return x;
while(f[x]!=-1)
x=f[x];
return x;
}
void Union(int x,int y){
int x1=Find(x);
int y1=Find(y);
if(x1==y1)return ;
if(x1!=y1){
if(Rank[x1]<Rank[y1]) {
f[x1]=y1;
number[y1]+=number[x1];
}
else {
f[y1]=x1;
number[x1]+=number[y1];
if(Rank[x1]==Rank[y1])
Rank[x1]++;
}
}
}
int main()
{
int n,m;
while(cin>>n>>m){
if(n==0&&m==0)break;
//if(m==0)continue;
int flag=-99;
for(int i=0;i<=n;i++){
stu[i]=0;
Rank[i]=0;
f[i]=-1;
number[i]=1;
}
for(int i=1;i<=m;i++){
int k,x,y;
cin>>k;
k--;
cin>>x;
for(int j=1;j<=k;j++){
cin>>y;
//if(x==0)flag=i;
// if(stu[x])
// Union(i,Find(x));
//stu[x]=1;
Union(x,y);
}
}
cout<<number[Find(0)]<<endl;
}
//cout << "Hello world!" << endl;
return 0;
}