题解 并查集 POJ 1611
题意:nn个学生分属m个团体,(0< n <= 30000 ,0 <= m <= 500)一个学生可以属于多个团体。一个学生疑似患病,则它所属的整个团体都疑似患病。已知0号学生疑似患病,以及每个团体都由哪些学生构成,求一共多少个学生疑似患病。
做法:最基础的并查集,把所有可疑的都并一块。
代码:
#include <iostream> #include <cstdio> using namespace std; const int MAX=30000; int par[MAX+10]; int total[MAX+10]; int getparent(int a)//获取a的根 { if(par[a]!=a) par[a]=getparent(par[a]); return par[a]; } void merge(int a,int b) {//合并a和b int p1=getparent(a); int p2=getparent(b); if(p1==p2) return ; total[p1]+=total[p2]; par[p2]=p1; } int main() { int i,j,n,m; while(scanf("%d%d",&n,&m)) { int k,s,h; if(n==0&&m==0)break; for(i=0;i<n;i++) { par[i]=i;total[i]=1; } for(i=0;i<m;i++) { scanf("%d",&k);scanf("%d",&h); for(j=1;j<k;j++) scanf("%d",&s),merge(h,s); } printf("%d\n",total[getparent(0)]); } return 0; }