并查集模板

class UF{
    vector<int> pre, size;//pre存储的是当前节点的根节点;size存储所属树的节点数量,用于小树向大树合并
public:
    UF(int n):pre(n), size(n, 1){
        iota(pre.begin(), pre.end(), 0);//初始化数组为0到n-1
    }
    int Find1(int x){
        return x == pre[x]? x : (pre[x]=Find(pre[x]));//后面的pre[x]=find(pre[x])路径压缩,下次查找更快
    }
    int Find(int x){
        while (x != pre[x]) {
            pre[x] = pre[pre[x]]; // 路径压缩,使得下次查找更快
            x = pre[x];
        }
        return x;
    }
    void Union(int x, int y){
        int px=Find(x), py=Find(y);
        if(px != py){
            if(size[px] < size[py]){
                pre[px] = py;
                size[py] += size[px];
            }else{
                pre[py] = px;
                size[px] += size[py];
            }
        }
    }
    bool isConnected(int x, int y){
        return Find(x) == Find(y);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值