B

题目连接 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);

    }

}
原文地址:https://www.cnblogs.com/Twsc/p/5698859.html