題目大意
這道題是一道并查集的題,大概意思就是編號為0的人被認(rèn)為帶有SARS病毒,與他同一組的人有可能被傳染,而他們被傳染后可能再次傳染和他們同組的人;所以題目要求求出有多少人可能被傳染?
思路
將輸入的同組的人連起來,注意連的時候要把節(jié)點(diǎn)少的往節(jié)點(diǎn)大的樹上連,不然可能會退化成鏈表;然后再搜索和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);
}
}