http://poj.org/problem?id=1611
题意是说为了控制病毒,需要收集全部病人的信息,然后有n个人和m个组,初始0号人是病毒,满足一个组只要有一个人是病毒,那么这个组全部的人都认为有病毒。问最终感染病毒的人数。
并查集来实现,只要输出0所在祖先节点的秩就行,秩保存的就是该节点所有的儿子数。
#include<cstdio>
#define N 300001
int father[N],sz[N],f[N];
int find(int x)
{
if(x==father[x]) return x;
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b) return;
if(sz[a]>sz[b])
{
father[b]=a;
sz[a]+=sz[b];
}
else
{
father[a]=b;
sz[b]+=sz[a];
}
}
int main()
{
int n,m,k,a,b,i,j;
while(scanf("%d%d",&n,&m)!=EOF&&n+m)
{
for(i=0;i<n;i++)
{
father[i]=i;
sz[i]=1;
}
for(i=1;i<=m;i++)
{
scanf("%d",&k);
scanf("%d",&f[0]);
for(j=1;j<k;j++)
{
scanf("%d",&f[j]);
Union(f[j-1],f[j]);
}
}
printf("%d\n",sz[find(0)]);
}
return 0;
}