poj1611The Suspects并查集

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

题意:有n个人参加了m个社团,同一个社团互相接触的人有感染疾病的概率,已知0号同学是疑似病例,求总的疑似病例的人数。找以0为根节点的有几个人;

并查集裸题;

code:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
int n,m;
int fa[maxn],vis[maxn];
int a[maxn];
void init()
{
    for(int i=0; i<=maxn-5; i++)
     fa[i]=i;
}
int Find(int x)
{
    return x==fa[x]?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y)
{
    int fx=Find(x),fy=Find(y);
    if(fx!=fy);
     fa[fy]=fx;
}
int main()
{
    while(cin>>n>>m)
    {
        init();
        int ans=0;
        if(n==0&&m==0)
         break;
        for(int i=1; i<=m; i++)
        {
            int x,m;
            cin>>a[i]>>m;
            for(int j=1; j<a[i]; j++)
            {
                cin>>x;
                Union(x,m);
            }
        }
        int c=Find(0);
        for(int i=0; i<n; i++)
          if(Find(i)==c)
            ans++;
        printf("%d
",ans);
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/sweetlittlebaby/p/12753278.html