概念理解
并查集是集合,能够快速合并,能够快速查询两个节点是否在同一集合中的一种数据结构。一般用树(数组)实现。
两个结点若是在相同的集合中,会拥有相同的最高父节点。
a合并b,a合并c,结果是a的父节点是b,b的父节点是c,三个结点连接起来了,并不是a连接c把a连接b给覆盖掉。
代码
//创建存储父节点的数组
int[] parent = new int[n];
//初始化, 默认父节点都是结点本身
for (int i = 0; i < n; i++) {
parent[i] = i;
}
//find查结点i的父节点
public int find(int[] parent, int i) {
//如果i的父节点不是其本身,则递归find继续找父节点的父节点,直到父节点等于本身
if (parent[i] != i) {
//让所有的孩子结点都指向同一个父节点,压缩树的高度为2
parent[i] = find(parent, parent[i]);
}
return parent[i];
}
//合并结点i和j
//注意左侧一定得是i的父节点,不能是i!
parent[find(parent,i)] = find(parent,j);
题型总结
求连通量
- AAAAA547. 省份数量
- AAAA1319. 连通网络的操作次数
本质是求出连通量的个数然后减一就是答案
是否处于同一集合
- AAAA785. 判断二分图
使用并查集判断两个结点是不是同一集合 - AAA684. 冗余连接
- 0AAAA886. 可能的二分法
一个数字与他对应的数字不能相连接,一个数字所有的对应数字一定在相同小组,即相互连接。
有权重的并查集
- AAA399. 除法求值
有权重的并查集