并查集。。。
怎么分?想起了人民公社化。。。刚开始每个人在一个小社里。后来人际交流嘛各种互相介绍结果开始合成大社。总结和编号为0的人在一个大社的总人数。
#include<cstdio>
#include<algorithm>
int n,m,l,fa[30005],am[30005],faGroup[30005];
void init()
{
for(int i=0;i<n;i++)
{
fa[i] = i;
am[i] = 1;
}
}
int toGetFarther(int x)
{
while(fa[x]!=x)
x = fa[x];
return x;
}
void unon()
{
int maam = -1,max = -1;
scanf("%d",&l);
for(int i=0;i<l;i++)
{
int s;
scanf("%d",&s);
faGroup[i] = toGetFarther(s);
}
for(int i=0;i<l;i++)
if(am[faGroup[i]]>maam){
maam = am[faGroup[i]];
max = faGroup[i];
}
for(int i=0;i<l;i++)
{
if(faGroup[i]!=max){
fa[faGroup[i]]= max;
am[max]+=am[faGroup[i]];
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n+m==0)break;
init();
while(m--)
{
unon();
}
int ans = 1,re = toGetFarther(0);
for(int i=1;i<n;i++)
if(re==toGetFarther(i))ans++;
printf("%d\n",ans);
}
return 0;
}