本文实例为大家分享了Java实现并查集的具体代码,供大家参考,具体内容如下
自下而上的树结构
接口
public interface UF {
int size();
boolean isConnected(int p, int q);
void unionElements(int p, int q);
}
使用路径压缩的并查集
public class UnionFind5 implements UF {
private int[] parent;
//rank[i]表示以i为根的集合中树的层数
private int[] rank;
public UnionFind5(int size) {
parent = new int[size];
rank = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
rank[i] = 1;
}
}
@Override
public int size() {
return parent.length;
}
private int find(int p) {
if (p < 0 && p >= parent.length) {
throw new IllegalArgumentException("p is illegal");
}
if (p != parent[p]) {
parent[p] = find(parent[p]);
}
return parent[p];
}
@Override
public boolean isConnected(int p, int q) {
return find(p) == find(q);
}
@Override
public void unionElements(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot) {
return;
}
//败者食尘
if (rank[pRoot] < rank[qRoot]) {
parent[pRoot] = qRoot;
} else if (rank[qRoot] < rank[pRoot]) {
parent[qRoot] = pRoot;
} else {
parent[qRoot] = pRoot;
rank[pRoot] += 1;
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。