F - The Suspects(2017-01-16)
2017-01-18 本文已影响0人
陌路晨曦
题目大意
这道题是一道并查集的题,大概意思就是编号为0的人被认为带有SARS病毒,与他同一组的人有可能被传染,而他们被传染后可能再次传染和他们同组的人;所以题目要求求出有多少人可能被传染?
思路
将输入的同组的人连起来,注意连的时候要把节点少的往节点大的树上连,不然可能会退化成链表;然后再搜索和0同一棵树上的人有多少;
代码如下:
#include<stdio.h>
int pre[30005];
int n,m,k,a,b;
int find(int x)
{
if(pre[x]==x) return x;
else
return find(pre[x]);
}
int Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fy>fx)
{
pre[fy]=fx;
}
if(fy<fx)
{
pre[fx]=fy;
}
}
void ini()
{
for(int i=0;i<n;i++)
{
pre[i]=i;
}
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n||m))
{
ini();
for(int i=0;i<m;i++)
{
scanf("%d",&k);
scanf("%d",&a);
for(int j=1;j<k;j++)
{
scanf("%d",&b);
Union(a,b);
}
}
int ans=0;
for(int i=0;i<n;i++)
{
if(find(i)==0)
{
ans++;
}
}
printf("%d\n",ans);
}
}