Union-Find 并查集模版

并查集模版

参考书籍: 《算法4》《Alogorithms Fourth Edition》

class UnionFind{
     
    private int[] parent;//存储每个点对应的根结点
    private int[] sz;//每个点的权重
    private int count;//连通分量
    //n:点数
    public UnionFind(int n){
     
        parent = new int[n];
        sz = new int[n];
        count = n;

        for(int i = 0;i < n;i++){
     
            parent[i] = i;
            sz[i] = 1;
        }
    }
    
    //寻找结点的根结点
    public int find(int p){
     
        while(parent[p] != p) p = parent[p];
        return p;
    }

    //点与点之间的连通
    public void union(int p,int q){
     
        int i = find(p);
        int j = find(q);
        //已经连通了
        if(i == j) return;
        
        if(sz[i] < sz[j]){
     
            parent[i] = j;
            sz[i] += sz[j];
        }else{
     
            parent[j] = i;
            sz[j] += sz[i];
        }
        //连通分量 - 1
        count--;
    }
}

你可能感兴趣的:(JAVA,算法)