目的:解决等价问题。
表示方法:森林,底层实现用数组
主要操作: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;
}
}
}
解决问题:迷宫生成问题、树节点的最近祖先、连通回路等