传送门: The Suspects
题意:一开始只有0号学生被视为可能的患者,与0号患者直接或间接接触的人都视为可能患者,求出所有可能的患者。
思路:思路很简单,将学生之间接触的都放在一个集合里,然后求出0号学生的根节点,循环判断有多少个学生的根节点与之相同即可。
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int n,m,p[30005];
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
for(int i=0;i<n;i++)
p[i]=i;
for(int i=1;i<=m;i++)
{
int num,a;
scanf("%d",&num);
scanf("%d",&a);
int ff=find(a);
for(int j=2;j<=num;j++)
{
int x;
scanf("%d",&x);
p[find(x)]=ff;
}
}
int ans=0,fa=find(0);
for(int i=0;i<n;i++)
{
if(find(i)==fa)
ans++;
}
printf("%d\n",ans);
}
return 0;
}