F - The Suspects(2017-01-16)

2017-01-18  本文已影响0人  陌路晨曦

题目大意
这道题是一道并查集的题,大概意思就是编号为0的人被认为带有SARS病毒,与他同一组的人有可能被传染,而他们被传染后可能再次传染和他们同组的人;所以题目要求求出有多少人可能被传染?
思路
将输入的同组的人连起来,注意连的时候要把节点少的往节点大的树上连,不然可能会退化成链表;然后再搜索和0同一棵树上的人有多少;

代码如下:

#include<stdio.h>
int pre[30005];
int n,m,k,a,b;
int find(int x)
{
    if(pre[x]==x) return x;
    else
    return find(pre[x]);
}
int Union(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fy>fx)
    {
        pre[fy]=fx;
    }
    if(fy<fx)
    {
        pre[fx]=fy;
    }
}
void ini()
{
    for(int i=0;i<n;i++)
    {
        pre[i]=i;
    }
}
int main()
{
    
    while(~scanf("%d%d",&n,&m)&&(n||m))
    {
        ini();
        for(int i=0;i<m;i++)
        {
            scanf("%d",&k);
            scanf("%d",&a);
            for(int j=1;j<k;j++)
            {
                scanf("%d",&b);
                Union(a,b);
            }
        }
        int ans=0;
        for(int i=0;i<n;i++)
        {
            if(find(i)==0)
            {
                ans++;
            }
        }
        printf("%d\n",ans);
    }
}
上一篇下一篇

猜你喜欢

热点阅读