poj the suspects 1611

题目链接:http://poj.org/problem?id=1611

 

题目大意:

有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数。

这道题是并查集的题目。没什么好多说的比较简单~

#include<stdio.h>
int set[30005],h[30005],num[30005];
void init(int m)
{
    int i;
    for(i = 0;i < m;i++)
    {
        set[i] = i;
        h[i] = 0;
        num[i] = 1;
    }
}
int find(int x)//怕数据比较大所以直接用的循环,如果用栈的话会可能会出现re
{
    int r= x;
    while(set[r] != r)
    {
        r = set[r];
    }
    return r;
}

void merge(int a,int b)
{
    a = find(a);
    b = find(b);
    if(a == b)//这部一定要有,我因为这个wa了一次
        return;
    if(h[a] == h[b])
        h[a] = h[a]+1,set[b] = a,num[a] += num[b];
    else if(h[a] < h[b])
        set[a] = b,num[b] += num[a];
    else
        set[b] = a,num[a] += num[b];
}
int main()
{
    int n,m,i,j,t,a,b;
    while(scanf("%d %d",&n,&m)&&n||m)
    {
        init(n);

        if(!m)
            printf("1\n");
        else
        {
        while(m--)
        {

            scanf("%d",&t);
            for(scanf("%d",&a),i = 1;i < t;i++)//嘿嘿,跟网上雪莱的~
            {
                scanf("%d",&b);
                merge(a,b);
            }
        }
        
        printf("%d\n",num[find(0)]);
        }
        
    }
    return 0;
}

 

posted @ 2012-07-16 23:57  某某。  阅读(149)  评论(0编辑  收藏  举报