目的:解决等价问题。
表示方法:森林,底层实现用数组
主要操作:find()、union()
优化手段:
①find()时路径压缩
②union()时按规模合并、按树高合并(依据情况而定)
Java实现:
class DisjointSet { int father[]; DisjointSet(){ } DisjointSet(int n) { this.father = new int[n]; for (int i = 0; i < n; i++) father[i] = i; } int find(int x) { if (x != father[x]) father[x] = find(father[x]); // 回溯、压缩路径 return father[x]; } void union(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (x < y) { if (father[y] == y) father[x] = father[x] == x ? -2 : father[x] - 1; else father[x] += father[y]; father[y] = x; } else { if (father[x] == x) father[y] = father[y] == y ? -2 : father[y] - 1; else father[y] += father[x]; father[x] = y; } } }
解决问题:迷宫生成问题、树节点的最近祖先、连通回路等