求被0号学生感染人数,即0号学生为根节点,下面的分支sum值总数。用sum[ ]标记每个根节点,用union合集,求根节点的sum值。
#include<iostream>
#include<cstdio>
#define maxn 30010
using namespace std;
int ufs[maxn];
int sum[maxn];
int Init(int n)//初始化
{
int i;
for(int i=0;i<n;i++)
{
ufs[i]=i;
sum[i]=1;//注意,每个点原先只有一人
}
}
int Getroot(int a)//查找根节点
{
if(ufs[a]!=a)
ufs[a]=Getroot(ufs[a]);
return ufs[a];
}
int Merge(int a,int b)//a,b合集
{
int x=Getroot(a);
int y=Getroot(b);
if(x!=y)
{
ufs[y]=x;
sum[x]+=sum[y];
}
}
int main()
{
int n,m;
int one,two;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
Init(n);//初始化
while(m--)
{
int t;
scanf("%d",&t);//t个数
scanf("%d",&one);
t--;//去掉one这个数
while(t--)
{
scanf("%d",&two);
Merge(one,two);//将t个数合集
}
}
printf("%d\n",sum[Getroot(0)]);//0号学生底下的人数
}
return 0;
}
简单并查集第一题,加油,(ง •_•)ง