查并集

今天来补之前刷过的专题,查并集是一个比较简单的专题:查并集有三种类型,第一种类型是普通查并集,第二个就带权查并集 第三种就是种类查并集

第一种简单查并集主要就是那两个函数:

int find(int x)  
{  
    return x == pre[x] ? x : find(pre[x]);  
}  
  
void join(int x, int y)  
{  
    int root1, root2;  
    root1 = find(x);  
    root2 = find(y);  
    if(root1 != root2)  
    {  
            pre[root2] = root1;  
    }  
}  

 通过找根节点是否相同,然后再进行合并树。查询他们是否相关的时候就是查询他们的根节点是否相等。

带权并查集:就是通过计算不同顶点到达根节点的距离,然后将他们的差%rand来判断两个顶点之间的关系,sum[i]数组就是计算顶点i到达根节点的距离。也可以直接取余rand 余数为0就是和根节点相同类型,余数为1就是根节点下一个类型,以此类推

 

 每次查找根节点时候都要跟新一下sum数组因为合并两棵树的时候只跟新了父亲节点的sum,子节点没有跟新

合并的时候利用y,x的关系来确定fx,fy的关系,father[fy]=0,然后就可以求出sum[fx]

 逻辑如图所示,曾经想过做这种题目有一种莽夫行为,就是有多少种类型就开多个并查集树。当fathet[i]=i时候就说明他没有插入过,就安排在下一个没有安排过的类中,这种行为比较恶习,判断语句实在太多,所以说他有点莽夫。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值