多了一个需要维护的值,即为更新同一祖先的数。
代码如下:
#include<iostream>
#include<cstdio>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
#define maxn 30010
int pre[maxn];
int num[maxn];
int find(int x)
{
return pre[x]==x?x:(pre[x]=find(pre[x]));
}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b) {
pre[a]=b;
num[b]+=num[a];
}
}
int main()
{
int i,n,m,k,a,a0;
while(cin>>n>>m,n+m){
for(i=0;i<n;i++){
pre[i]=i;
num[i]=1;
}
while(m--){
cin>>k;
for(i=0;i<k;i++){
if(i==0) cin>>a0;
else{
cin>>a;
Union(a0,a);
}
}
}
cout<<num[find(0)]<<endl;
}
return 0;
}