并查集模板
提供一个并查集模板
版本一:加权快速合并
int[] father;
int[] s;//权值
int num;
public int find(int p) {
if (p != father[p]) {
p = find(father[p]);
}
return p;
}
public void union(int p, int q) {
int i = find(p);
int j = find(q);
if (i == j) return;
num -= 1;
if (s[i] < s[j]) {
father[i] = j;
s[j] += s[i];
} else {
father[j] = i;
s[i] += s[j];
}
}
public void initUF(int n) {
father = new int[n];
s = new int[n];
num = n;
for (int i = 0; i < n; i++) {
father[i] = i;
s[i] = 1;
}
}
版本二:路径压缩的加权快速合并
int[] father;
int[] z;
int num;
public int find(int p) {//简单点说就是就是每一个的上级都是他的源节点,全部都只有两层结构,这样能够方便的找出有多少源节点
if (p != father[p]) {
father[p] = find(father[p]);
}
return father[p];
}
public void union(int p, int q) {
int i = find(p);
int j = find(q);
if (i == j) return;
num -= 1;
if (s[i] < s[j]) {
father[i] = j;
s[j] += s[i];
} else {
father[j] = i;
s[i] += s[j];
}
}
public void initUF(int n) {
father = new int[n];
s = new int[n];
num = n;
for (int i = 0; i < n; i++) {
father[i] = i;
s[i] = 1;
}