并查集模板


  

引言:

关于“并查集”的解释和使用场景网上有很多教程,这里就不在啰嗦了。仅提供代码模板方便知情人快速使用。

并查集的java实现

// 开启了路径压缩和按秩合并的并查集
class UnionFind {
    int n;//顶点数目
    int[] parent;//每个顶点所在连通分量的代表
    int[] size;//可以简单地理解为每个连通分量中的顶点个数
    int branchCount;// 当前连通分支数目

    public UnionFind(int n) {
    	this.n = n;
        this.branchCount = n;
        this.parent = new int[n];
        this.size = new int[n];
        Arrays.fill(size, 1);
        for (int i = 0; i < n; ++i) {
            parent[i] = i;
        }
    }

    public int find(int x) {
        // 路径压缩
        return parent[x] == x ? x : (parent[x] = find(parent[x]));
    }

    public boolean unite(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        // 按秩合并
        if (size[x] < size[y]) {
            int temp = x;
            x = y;
            y = temp;
        }
        parent[y] = x;
        size[x] += size[y];
        --branchCount;
        return true;
    }

    public boolean connected(int x, int y) {
        return find(x) == find(y);
    }

    public int branchCount() {
        return branchCount;
    }
}

文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
二进制状态压缩枚举子集 二进制状态压缩枚举子集
   引言: 二进制数可以用来表示一个状态,比如当我们需要去表示一个集合的子集时,可以用二进制数来表示该子集。 问题  比如有一个集合,集合中的元素为 {1, 5, 7, 9, 12},如何快速找到其所有的子集合呢。这就可以采用二进制来压
2021-02-27
下一篇 
滑动窗口的最大值 滑动窗口的最大值
   引言: LeetCode中遇到的一道题,记录一下。转自 求滑动窗口的最大值 问题定义  给定一个数组 nums 和滑动窗口的大小 k,要求找出所有滑动窗口中的最大值。(可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k
2021-02-04
  目录