UnionFind

怎么拥抱它终究要飞翔

/**
 * @Classname UnionFind
 * @Description
 * @Date 2020/1/14 6:28
 * @Author SonnSei
 */
public class UnionFind {
    private int[] rank;
    private int[] parent;
    int groups;

    public UnionFind(int size) {
        rank = new int[size];
        parent = new int[size];
        groups = size;
        for (int i = 0; i < size; i++) {
            parent[i] = i;
            rank[i] = 1;
        }
    }
    
    private int find(int p) {
        return parent[p] == p ?p: (parent[p] = find(parent[p]));
    }

    public boolean isConnected(int p, int q) {
        return find(p) == find(q);
    }

    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[pRoot] > rank[qRoot])
            parent[qRoot] = pRoot;
        else {
            parent[pRoot] = qRoot;
            rank[qRoot] += 1;
        }
        groups--;
    }
    
    public int groups() {
        return groups;
    }
}
发布了140 篇原创文章 · 获赞 2 · 访问量 1878

猜你喜欢

转载自blog.csdn.net/weixin_40602200/article/details/103966970