#include<stdio.h>#defineMAX30000
intf[MAX];//这里的1001只是一个示意性的数字代表初始状态下的分支数目
intr[MAX];
intflag;
//由于不知道应该将子树挂到那个集合上面去,故需要一个准则,这里的准则是将子树挂到
//r值大的集合上面去,初始状态下r数组的值均为一,代表每个分支下只有一个数字
intfind(intn)
{
if(f[n]==n)
returnn;
else
f[n]=find(f[n]);
returnf[n];
}//查找函数,并压缩路径
intUnion(intx,inty)
{
inta=find(x);
intb=find(y);
if(a==b)
return0;
elseif(r[a]<=r[b])
{
f[a]=b;
r[b]+=r[a];
if(a==flag)
flag=b;
}
else
{
f[b]=a;
r[a]+=r[b];
if(b==flag)
flag=a;
}
return1;
}//合并函数,如果属于同一分支则返回0,成功合并返回1
intmain()
{
intn,m;
inti,j;
intnum;
intmaxnum=0;
while(scanf("%d%d",&n,&m))
{
flag=0;
maxnum=0;
inttemp1,temp2;
if(n==0&&m==0)
break;
for(i=0;i<n;i++)
{
f[i]=i;
r[i]=1;
}
for(j=1;j<=m;j++)
{
scanf("%d",&num);
for(i=0;i<num;i++)
{
if(i==0)
scanf("%d",&temp1);
else
{
scanf("%d",&temp2);
Union(temp1,temp2);
}
}
}
printf("%d/n",r[flag]);
}
return0;
}
并查集

最新推荐文章于 2024-08-19 22:30:22 发布
