题目连接 http://acm.hust.edu.cn/vjudge/contest/121192#problem/B
题目要求求可能的感染者的人数,要运用并查集。
#include<iostream> #include<cstdio> using namespace std; #define N 30005//int 能装的最大的数是32768 int ptr[N]; int z[N]; int find(int x) { int r=x;while(ptr[r]!=r){r=ptr[r];} int i=x,j;while(i!=r){j=ptr[i];ptr[i]=r;i=j;}//路径压缩(把所有的点都直接与根节点相连) return r; } viod join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) ptr[fx]=fy; } int main() { int n,m,i,a,sum,j; while(scanf("%d %d",&n,&m)&&n+m)//条件是n=m=0为0;m&&n是其中一个不满足就结束循环 { sum=0; for(i=0;i<n;i++) ptr[i]=i; for(j=0;j<m;j++) { scanf("%d",&a); for(i=0;i<a;i++) { scanf("%d",&z[i]); if(i!=0) join(z[i-1],z[i]); } } for(i=0;i<n;i++) if(find(0)==find(i)) sum++; printf("%d ",sum); } }