POJ 1611 The Suspects

传送门:http://poj.org/problem?id=1611

题意:

0是SARS携带者,如果有人和他在一组那么他也会被感染。

而在输入的每一个小组,假定小组的第一个成员就是这一组的根,该组的所有成员都归并在在第一小组所在的那颗树(集合)上

最和在查询和编号为0的学生在同一个组的同学有多少人。

 

实现代码:

#include <iostream>
#include <cstdio>
using namespace std;

const int maxn=300000;
int par[maxn],rk[maxn];

void init(int n){
    for(int i=0;i<n;i++){
        par[i]=i;
        rk[i]=0;
    }
}



int findfa(int u){
    if(par[u]==u)
        return u;
    else{
        return par[u]=findfa(par[u]);
    }
}

void unit(int u,int v){
    u=findfa(u);
    v=findfa(v);
    if(u==v)
        return;

    if(rk[u]>rk[v])
        par[v]=u;
    else{
        par[u]=v;
        if(rk[u]==rk[v])
            rk[v]++;
    }
}

int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)&&(n||m)){
        init(n);
        for(int i=0;i<m;i++){
            int k;
            scanf("%d",&k);

            int f;
            if(k>=1)
                scanf("%d",&f);
            for(int j=1;j<k;j++){
                int u;
                scanf("%d",&u);
                unit(f,u);
            }
        }

        int sum=1;
        int zero=findfa(0);
        for(int i=1;i<n;i++)
            if(zero==findfa(i))
               sum++;
        printf("%d\n",sum);
    }
    return 0;
}

 

posted on 2017-03-02 09:22  mkfoy  阅读(125)  评论(0)    收藏  举报

导航