带权并查集讲解

本文深入解析带权并查集的概念与应用,对比普通并查集,介绍其在维护不同属性集合时的优势,如性别、上下级关系等。通过路径压缩与合并操作的伪代码,阐述了更新子与根间关系的难点与解决策略。

一、带权并查集讲解

1、简介:

  • 带权并查集是一种储存子与根之间的特定关系的数组,应用范围比普通的并查集更为广泛。这时需要设立个数组D[] 来维护 子与根之间的关系。

不多说,直接上图更好理解。
在这里插入图片描述

2、普通并查集与带权并查集的区分:

  1. 普通并查集是用来维护相同属性集合的。
  2. 带权并查集可以用来维护不同属性集合,比如性别,上下级关系,食物链关系等等(下面会有例题的讲解)。

3、难点:

问题:

  1. 如何在路径压缩的时候更新子与根之间的关系呢?
  2. 如何在合并的时候更新两棵树之间同深度的分支之间的关系呢?

解决:

  1. 路径压缩时:在这里插入图片描述
    在这里插入图片描述
    伪代码:
int find_set(int x)
{
    if (x != s[x])
    {
        int t=s[x];//x的父
        s[x]=find_set(s[x]);
        d[x]=d[x]与d[t]关系的变化。
    }
    return s[x];
}
  1. 合并时:
    在这里插入图片描述

这个时候,来一手向量法求子链之间的关系:
在这里插入图片描述
伪代码:

void union_set(int x, int y)
{
    int rootx = find_set(x), rooty = find_set(y);
    if (rootx == rooty)//根相同时
    {
        //符合题干的操作,比如判断正确与否
    }
    else//根不同时
    {
        s[rootx]=rooty;//合并
        d[x]=d[rootx]-d[rooty]+(rootx和rooty之间的关系)//符合题干的操作,更新子链操作(再图解中)
    }
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值