poj1611 // 并查集

#include<iostream>
using namespace std;


int son[30010],par[30010],rankk[30010];


void init(int n){
for(int i = 0;i<n;++i){
par[i] = i;
son[i] = 1;
rankk[i] = 1;
}
}


int find(int x){
if(par[x] == x)
return x;
else
return par[x] = find(par[x]);
}


void unite(int a,int b){
int x = find(a);
int y = find(b);
if(x == y)
return;
if(rankk[x] < rankk[y]){
par[x] = y;
son[y] += son[x];
}
else{
par[y] = x;
son[x] += son[y];
if(rankk[x] == rankk[y])
++rankk[x];
}
}


bool same(int x,int y){
return find(x) == find(y);
}


int main(){
int num,t,k,a,b;
while(cin>>num>>t){
if(num == 0&&t == 0)
break;
init(num);
for(int i = 0;i<t;++i){
cin>>k>>a;
for(int i = 1;i<k;++i){
cin>>b;
unite(a,b);
}
}
cout<<son[find(0)]<<endl;
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/dukig/article/details/80142684