思路:直接用并查集,最后找到 0 所在的集合,把 集合中的 人数 输出即可
#include<iostream>
using namespace std;
const int maxn=30000 +100;
int set[maxn];
int sum[maxn];
int set_find(int d)
{
if(set[d]<0)
return d;
return set[d]=set_find(set[d]);
}
void join(int x,int y)
{
x=set_find(x);
y=set_find(y);
set[x]=y;
}
int main()
{
int n,m;
int k;
while(cin>>n>>m)
{
if(n==0 &&m==0)
break;
memset(set,-1,sizeof(set));
memset(sum,0,sizeof(sum));
int i;
for(i=0;i<n;i++)
sum[i]=1;
while(m--)
{
cin>>k;
int a,b;
k--;
cin>>a;
while(k--)
{
cin>>b;
if(set_find(a)!=set_find(b))
{
sum[set_find(b)]=sum[set_find(b)]+sum[set_find(a)];//先求和
join(set_find(a),set_find(b));//再 合并,把 根合并
}
a=b;
}
}
cout<<sum[set_find(0)]<<endl;
}
}