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; }
原文地址:http://blog.csdn.net/u012773338/article/details/38794793