并查集

并查集

并查集模板

// 该模板结合了size和rank和优化,使用时自取即可
class DSU {
    // p : parents数组
    // sz:size数组,代表的是当前圈子里的数量
    // rank:rank数组,用于合并时降低树的高度
    int[] p, sz, rank;

    DSU(int N) {
        p = new int[N];
        for(int i = 0; i < N; i++)
            p[i] = i;

        sz = new int[N];
        Arrays.fill(sz, 1);
        rank = new int[N];  // rank初始值是0
    }
    
    // 递归降低树的高度
    public int find(int x) {
        if (p[x] != x)
            p[x] = find(p[x]);
        return p[x];
    }

    public void union(int x, int y) {
        int xr = find(x);
        int yr = find(y);
        if(xr == yr) return;
        
        if(rank[xr] > rank[yr]){
            p[yr] = xr;
            sz[xr] += sz[yr];
        } else if(rank[xr] < rank[yr]){
            p[xr] = yr;
            sz[yr] += sz[xr];
        } else {
            p[xr] = yr;
            rank[yr]++;
            sz[yr] += sz[xr];
        }
    }

    public int size(int x) {
        return sz[find(x)];
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值