poj1611 The Suspects

来源:互联网 发布:pubmed数据库 编辑:程序博客网 时间:2024/05/20 21:44

题目链接:http://poj.org/problem?id=1611
题意:有n个人,总共有m个社团,现在0号病了,如果和0号处于一个社团的就会一起生病,总之在社团之间会相互传染,比如样例1,现在问你有几个人生病了
解析:并查集,对于全部人来做并查集,社团之间相互有连接就加到一个集合里面,最后看0号结点的那个集合有多少个元素即可,记录元素个数,可以开一个son数组,在合并的时候更新一下

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1e5+100;int fa[maxn],son[maxn];int getfa(int x){    if(fa[x]==x)        return fa[x];    return fa[x] = getfa(fa[x]);}void merge(int u,int v){    int t1 = getfa(u);    int t2 = getfa(v);    if(t1!=t2)    {        fa[t2] = t1;        son[t1] += son[t2];    }}int main(void){    int n,m;    while(~scanf("%d %d",&n,&m))    {        if(n==0 && m==0)            break;        for(int i=0;i<n;i++)        {            fa[i] = i;            son[i] = 1;        }        for(int i=0;i<m;i++)        {            int k,t1,t2;            scanf("%d %d",&k,&t1);            for(int j=1;j<k;j++)            {                scanf("%d",&t2);                merge(t1,t2);                t1 = t2;            }        }        printf("%d\n",son[getfa(0)]);    }    return 0;}
原创粉丝点击