链接: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;
}