天天看点

java并查集_Java实现并查集

本文实例为大家分享了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;

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。