并查集升级版

并查集升级版

主要讲解内容:加权并查集,扩展域并查集(种类并查集)

例题及根据题目的不同更细节的讲解整合在这里

加权并查集

并查集实际上是由许多颗树组成的除了记录集合的包含关系之外,我们还可以添加更多数组以保存更多信息。

就比如,我们可以附加一个\(dis[]\)数组来保存每个节点到他的父亲的权值,每次路径压缩都顺手把这根枝条上的边权整合起来。

这样我们就维护了一个边权数组,保存了每个节点到树根的一些信息,这就是加权并查集

扩展域并查集

又称种类并查集

并查集的一大特点就是能保存关系的传递性,比如朋友的朋友是朋友,但有的时候还会出现敌人的敌人是朋友这种关系。对于这种关系,一般的并查集就难以维护了,所以就要用到扩展域并查集。

对于\(n\)个人中的一个人\(i\),我们可以把\(i\)所在的集合定义为\(i\)的朋友域,把\(i+n\)所在的集合定义为\(i\)的敌人域。

这样当给出两个人\(i,j\)时:

  • 如果他们是朋友,而且根据题目我们可以推断出“朋友的朋友是朋友”那么我们就可以把\(i,j\)所在的集合合并
  • 如果他们是敌人,而且根据题目我们可以推断出“敌人的朋友是敌人”那么我们就可以把\(i,j+n\)\(i+n,j\)所在集合分别合并

实际做题中肯定不止这几种传递性关系,不光朋友关系(敌人域、朋友域),奇偶性(奇数域、偶数域)啦,捕食关系(猎物域、同类域、捕食域)啦这些可以分成不同域的带有传递性的都可以使用扩展域并查集

最后,算法思路不难,但真正难的是把思路转换成代码以及算法在程序中的具体实现,例题解析请关注这个文章

posted @ 2023-12-05 20:44  某谦  阅读(16)  评论(0编辑  收藏  举报