带权并查集讲解

一、带权并查集讲解

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之间的关系)//符合题干的操作,更新子链操作(再图解中)
    }
}

发布了33 篇原创文章 · 获赞 33 · 访问量 6161

猜你喜欢

转载自blog.csdn.net/acm_durante/article/details/104122394