基础课 && 提高课中并查集的常见用法和题型总结
As is known to everyone,并查集中有三个常用的数组,分别是:f[N]
、cnt[N]
、d[N]
f[i] //代表了节点i的祖宗节点、是所有并查集必备的核心数组(一定要记得初始化)
cnt[i] //代表了节点i所在的并查集块中所有的元素数量(该并查集的大小)、常用于求并查集(连通块)的大小
d[i] //代表了节点i与其祖宗节点直接的距离(权值)、常用于带权并查集之间
一般并查集的简单题目都是基于这三种数组进行操作的,简单并查集的分类例题:
1. 普通并查集:
普通并查集
(一般只会用到一个f[N]数组。一般支持的的操作也很简单:合并两个集合、判断两个元素是否在一个集合当中)
普通并查集: AcWing 836. 合并集合
2. 需要询问并查集(连通块)的大小:
需要询问并查集(连通块)的大小时,就需要用到cnt[N]数组了
这种问题一般都是又增加一个询问:求出该并查集(连通块)的大小(其中元素的个数)
需要询问并查集(连通块)的大小:837.连通块中点的数量、3579.数字移动
3. 带权并查集(当然,一般也可用扩展域并查集):
带权并查集:
一般用带权并查集来维护边权两边的两个点之间的相对关系(两个点即:一个点与其根节点之间的关系)
因为d[i]数组主要维护的是一个点与其根节点之间的距离
(用不同的距离取模,来表示关系(一般%的值的大小就表示关系的种类的多少))
通过知道每个点与根节点之间的关系,就可以(通过加减)知道集合之间任意两点的相对关系了
(信息具有相互性、传递性;类似于无向边)