快速查找
public class UnionFind_QF {
int nums[];
public UnionFind_QF(int k) {
nums=new int[k];
for (int i = 0; i < nums.length; i++) {
nums[i]=i;
}
}
public void Union(int x,int y){
int xParent=Find(x);
int yParent=Find(y);
if(yParent!= xParent){
for (int i = 0; i < nums.length; i++) {
if(nums[i]==xParent){
nums[i]=yParent;
}
}
}
}
private int Find(int x){
return nums[x];
}
public boolean isUnion(int x,int y){;
return Find(x)==Find(y);
}
}
快速合并
public class UnionFind_QU {
int nums[];
public UnionFind_QU(int k) {
nums = new int[k];
for (int i = 0; i < nums.length; i++) {
nums[i] = i;
}
}
public void Union(int x, int y) {
int xParent = Find(x);
int yParent = Find(y);
if (xParent != yParent)
nums[xParent] = yParent;
}
public int Find(int x) {
while (x != nums[x]) {
x = nums[x];
}
return x;
}
public boolean isUnion(int x, int y) {
return Find(x) == Find(y);
}
}
快速合并&基于节点数量
public class UnionFind_QU_S {
int nums[];
int size[];
public UnionFind_QU_S(int k) {
nums = new int[k];
size = new int[k];
for (int i = 0; i < nums.length; i++) {
nums[i] = i;
size[i] = 1;
}
}
public void Union(int x, int y) {
int xParent = Find(x);
int yParent = Find(y);
if (xParent != yParent)
if (size[xParent] <= size[yParent]) {
size[yParent]+=size[xParent];
nums[xParent] = yParent;
} else {
size[xParent]+=size[yParent];
nums[yParent] = xParent;
}
}
public int Find(int x) {
while (x != nums[x]) {
x = nums[x];
}
return x;
}
public boolean isUnion(int x, int y) {
return Find(x) == Find(y);
}
}
快速合并&基于节点深度
public class UnionFind_QU_D {
int nums[];
int deep[];
public UnionFind_QU_D(int k) {
nums = new int[k];
deep = new int[k];
for (int i = 0; i < nums.length; i++) {
nums[i] = i;
deep[i] = 1;
}
}
public void Union(int x, int y) {
int xParent = Find(x);
int yParent = Find(y);
if (xParent != yParent)
if (deep[xParent] < deep[yParent]) {
nums[xParent] = yParent;
} else if (deep[xParent] > deep[yParent]) {
nums[yParent] = xParent;
} else {
deep[yParent]++;
nums[xParent] = yParent;
}
}
public int Find(int x) {
while (x != nums[x]) {
x = nums[x];
}
return x;
}
public boolean isUnion(int x, int y) {
return Find(x) == Find(y);
}
}
快速合并&基于节点深度&路径分裂
public class UnionFind_QU_D_PS {
int nums[];
int deep[];
public UnionFind_QU_D_PS(int k) {
nums = new int[k];
deep = new int[k];
for (int i = 0; i < nums.length; i++) {
nums[i] = i;
deep[i] = 1;
}
}
public void Union(int x, int y) {
int xParent = Find(x);
int yParent = Find(y);
if (xParent != yParent)
if (deep[xParent] < deep[yParent]) {
nums[xParent] = yParent;
} else if (deep[xParent] > deep[yParent]) {
nums[yParent] = xParent;
} else {
deep[yParent]++;
nums[xParent] = yParent;
}
}
public int Find(int x) {
while (x != nums[x]) {
int v=nums[x];
nums[x]=nums[nums[x]];
x=v;
}
return x;
}
public boolean isUnion(int x, int y) {
return Find(x) == Find(y);
}
}
快速合并&基于节点深度&路径分裂&通用版
import java.util.HashMap;
import java.util.Objects;
public class UnionFind_Universal<V> {
public UnionFind_Universal() {
}
private static class Node<V> {
V value;
Node<V> parent;
int deep;
Node(V v) {
value = v;
parent = this;
deep = 1;
}
}
private HashMap<V, Node<V>> set = new HashMap<>();
private V Find(V v) {
Node<V> vnode = set.get(v);
while (vnode.parent != vnode) {
Node<V> temp = vnode.parent;
vnode.parent = vnode.parent.parent;
vnode = temp;
}
return vnode.value;
}
public void Union(V x, V y) {
if (!set.containsKey(x)) {
set.put(x, new Node<>(x));
}
if (!set.containsKey(y)) {
set.put(y, new Node<>(y));
}
V xParent = Find(x);
V yParent = Find(y);
Node<V> xNode = set.get(xParent);
Node<V> yNode = set.get(yParent);
if (xNode.deep > yNode.deep) {
yNode.parent = xNode;
} else if (xNode.deep < yNode.deep) {
xNode.parent = yNode;
} else {
yNode.deep++;
xNode.parent = yNode;
}
}
public boolean isUnion(V x, V y) {
V xParent = Find(x);
V yParent = Find(y);
return Objects.equals(xParent, yParent);
}
}