The Suspects(流感疑似病人)

poj 1611

题目大意:0号学生是流感疑似病人,找出与0接触及与0间接接触的人(与0接触的人接触的人)的个数

解决:并查集,找出与0同在一个集合的所有元素的个数

#include <iostream>
#include <cstring>
using namespace std;
int num[30005];
bool mark[30005];
int find(int x)
{
    if(num[x]<0)return x;
    return num[x]=find(num[x]);
}
void merge(int a,int b)
{
     int fa=find(a);
     int fb=find(b);
     if(fa==fb)return;
     int t=num[fa]+num[fb];
     if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;}
     else {num[fb]=fa;num[fa]=t;}
}
int main()
{
    int n,m;
    while(cin>>n>>m,n)
    {
        memset(num,-1,sizeof(num));
        memset(mark,false,sizeof(mark));
        int k,t,a;
        while(m--)
        {
                  cin>>k;
                  cin>>t;
                  mark[t]=true;;
                  while(--k)
                  {
                      cin>>a;
                      mark[a]=true;
                      merge(t,a);      
                  }
         }
         int count=1;
         int root0=find(0);//找出0所在的集合,因为0在所有集合中都是疑似病人
         for(int i=1;i<n;i++)//在所有学生中找出在集合某一个集合而且与0号接触或者间接接触的人
           if(mark[i] && find(i)==root0 )count++;
         cout<<count<<endl;             
    }
                 
 //   system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/hpustudent/p/2115038.html