并查集

并查集 #

一维并查集 #

一维并查集需要初始化两个数组,初始化一个容量信息。

  1. parent数组,用于存放每一个节点的祖先信息。并且使用路径压缩信息,每一个元素都是直接存放其祖先
  2. rank数组,用于标识每一棵树的高度,将小高度的树合并到大高度的树上,降低树的高度
class UnionFind{
  int[] parent;
  int[] rank;
  public UnionFind(int size){
		parent=new int[size];
    rank=new int[size];
    for(int i=0;i<size;i++){
			parent[i]=i;// 初始化每一个节点的祖先都是自己
      rank[i]=0; // 其实默认也是0
    }
  }
  public int find(int x){
    if(parent[x]!=x){
      parent[x]=find(parent[x]);
    }
    return parent[x];
  }
  public void union(int x,int y){
		int rootX=find(x);
    int rootY=find(y);
    if(rootX!=rootY){
      if(rank[rootX]<rank[rootY]){
          parent[rootX]=rootY;
      }else if(rank[rootX]>rank[rootY]){
          parent[rootY]=rootX;
      }else{
        parent[rootX]=rootY;
        rank[rootY]++; // Increment rank of rootY to maintain balance when ranks are equal
      }
    }
  }
}