public class MyUF5 implements MyUnionFind {
//简单的并查集实现
//添加属性 当前节点有多少个元素 初始值为1
private int[] parent;
private int[] rank;
public MyUF5(int size){
rank = new int[size];
parent = new int[size];
//初始化数组 假设 每个数组属于对应索引的组
for(int i = 0;i<size;i++){
parent[i]=i;
rank[i]=1;
}
}
//查找节点的根节点
private int find(int id){
//校验id合法性
if(id<0 || id>=parent.length)
throw new IllegalArgumentException("index erro");
//递归找到根节点 并将根节点返回给路径上的所有对象
if(id!=parent[id])
//如果不是根节点 递归查找根节点
parent[id]=find(parent[id]);
//是根节点 返回根节点
return parent[id];
}
@Override
public int getSize() {
return parent.length;
}
@Override
public void unionE(int p, int q) {
int pf=find(p);
int qf = find(q);
if(pf==qf)
return;
//判断谁的树深 将深度浅的指向深度深的
if(rank[pf]<rank[qf])
//qf元素多余pf 让pf指向qf
parent[pf]=qf;
else if(rank[pf]>rank[qf])
parent[qf]=pf;
else{
//相等
parent[pf]=qf;
rank[qf]+=1;
}
}
@Override
public boolean isConnected(int p, int q) {
return find(p)==find(q);
}
}