传送门:http://poj.org/problem?id=1611
题意:
0是SARS携带者,如果有人和他在一组那么他也会被感染。
而在输入的每一个小组,假定小组的第一个成员就是这一组的根,该组的所有成员都归并在在第一小组所在的那颗树(集合)上
最和在查询和编号为0的学生在同一个组的同学有多少人。
实现代码:
#include <iostream> #include <cstdio> using namespace std; const int maxn=300000; int par[maxn],rk[maxn]; void init(int n){ for(int i=0;i<n;i++){ par[i]=i; rk[i]=0; } } int findfa(int u){ if(par[u]==u) return u; else{ return par[u]=findfa(par[u]); } } void unit(int u,int v){ u=findfa(u); v=findfa(v); if(u==v) return; if(rk[u]>rk[v]) par[v]=u; else{ par[u]=v; if(rk[u]==rk[v]) rk[v]++; } } int main(){ int n,m; while(scanf("%d%d",&n,&m)&&(n||m)){ init(n); for(int i=0;i<m;i++){ int k; scanf("%d",&k); int f; if(k>=1) scanf("%d",&f); for(int j=1;j<k;j++){ int u; scanf("%d",&u); unit(f,u); } } int sum=1; int zero=findfa(0); for(int i=1;i<n;i++) if(zero==findfa(i)) sum++; printf("%d ",sum); } return 0; }