转载并总结:并查集
并查集(Disjoint set,Union-Find):一种用来解决集合查询合并的数据结构 支持 O(1) find 查找 O(1) union 集合
- 初始化(Init):将每个元素所在集合初始化为其自身。
- 合并(Union):将两个元素所属的集合合并为一个集合。
- 查找(Find):查找元素所在的集合,即根节点。
应用
- 最小生成树:Kruskal 算法
- 图的连通分量
- 静态连通性
- 动态连通性:判断图的最早连通时间
局限:
- 不支持拆分(split)操作:任何节点一旦成为其他节点的子节点后,将永远不可能再成为树根。
- 集合必须是不相交的(disjoint):同一个元素不能属于多个集合。
- 代表元不记录集合成员信息:
~ 父节点不记录子节点的信息。
~ 找图中某节点所在的连通分量的所有节点需要再次扫描或者维护额外信息。
模版
包含路径压缩和按秩合并
class UnionFind{
int[] parent;
int[] rank; // unnecessary
int count; // unnecessary
UnionFind(int x){
this.parent = new int[x];
this.rank = new rank[x];
this.count = x;
for(int i = 0; i < x;i++){
parent[i] = i;
rank[i