SSL-ZYC POJ 1611 The Suspects
题目大意:
为了防止SARS传染,最好的策略是将患病者与其他人分开。
在一个学校中,有很多学生群体。在同一组的学生相互联系频繁,和一个学生可以参加几组。为防止SARS传染,学校收集所有学生团体的成员列表,并在他们的规则的标准操作程序。
一旦某一组中的某一成员是患病者,该组中的所有成员都是患病者。
轻微有多少学生是患病者?
思路:
并查集
用并查集求出哪些学生是与患病者同组的同学,将这些同学个数相加输出即可。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
int father[30001],n,m,k,x,y,sum;
int find(int x) //并查集
{
return x==father[x]?x:father[x]=find(father[x]);
}
int main()
{
scanf("%d%d",&n,&m);
while (n||m)
{
sum=0;
for (int i=0;i<=n;i++)
father[i]=i; //初始化
for (int j=1;j<=m;j++)
{
scanf("%d",&k);
if (k>0) scanf("%d",&x);
for (int i=2;i<=k;i++)
{
scanf("%d",&y);
if (find(x)!=find(y)) father[find(x)]=find(y); //化为同组的人
}
}
for (int i=0;i<=n;i++)
if (find(i)==father[0]) sum++; //记录有多少人与患病者同组
printf("%d\n",sum);
scanf("%d%d",&n,&m);
}
return 0;
}