并查集

并查集应用实例
本文介绍了一个使用并查集解决的问题实例,通过定义并实现基本的并查集操作,包括查找和合并,来处理一系列的连接请求。最终,程序能够找出最大的连通组件的大小。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值