#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;
}
并查集
最新推荐文章于 2025-05-05 10:00:00 发布
本文介绍了一个使用并查集数据结构解决的问题实例。通过定义并查集的基本操作,包括查找和合并,实现了对一系列节点的有效管理和连接判断。该程序能够处理多个测试案例,通过输入节点之间的连接关系来确定最终的最大集合大小。
1847

被折叠的 条评论
为什么被折叠?



