并查集(用于给信息划分等价类)例题实现

使用father数组,为根时存放权值的相反数(为了区分成员的根),不为根时存放father,f区分根和非根:father为正或者为负

  1. makeset:获得n颗树,权值

  2. find:寻找成员根结点,如果该成员不是根(避免误伤权值)就并将成员链接到根节点上

  3. union:比较权值,将权值小的链接到权值大的上面去,维护权值

下面用一道例题来展现并查集的makeset,find,union和寻找两个元素是否在同一个等价类中的基本实现

有n台计算机,编号为1到n。设定如果计算机a和计算机b可以通信,则计算机b和计算机a亦可以通信;如果计算机a和计算机b可以相互通信,计算机b和计算机c可以相互通信,则计算机a和计算机c亦可以相互通信。现给定某些计算机的可通信情况,请编写程序判断任意两台计算机是否可以通信。

#include<stdio.h>
int father[1000];        //存放所有人信息的并查集

int unioned(int m;)
{
    int i;
    int mem1,mem2;
    for(i=0;i<m;i++)        //按秩union
    {
        scanf("%d%d",&mem1,&mem2);
        father1=find(mem1);     
        father2=find(mem2);
        if(father[father1]<=father[father2])//父亲结点存放子树的秩的相反数来区分正数的成员
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值