并查集

本文章仅供作者复习代码,不提供教程(要说教程,小的真的不会啊),所以有小伙伴勿入请火速离开,以免寻砖砍死作者造成不必要的麻烦。



并查集的实现:

int par[MAX_N]; //父亲
int height[MAX_N];//树的高度


//初始化n个元素

void init(int n){
    for(int i=0; i<n; i++){
        par[i] = i; //将每个初始化的点的父亲设置为自己本身即代表该点为孤立的点
        height[i] = 0;//初始化时,每个点的高度均为0
    }
}

//查询树的根节点,并且在查询过程中,进行路径压缩

int find(int x){
    if(par[x] == x){
        return x;//如果x是孤立的点,那么它的根节点就是它本身
    }else{
        return par[x] = find(x); // 递归找x的根节点,找到之后,x的父节点直接设置为根节点
    }
}

//合并两个节点
void unite(int x,int y){
    x = find(x);
    y = find(y);
    if(x == y)return;//如果两点本来就连通,则返回。

    if(height[x]<height[y]){
        par[x] = y;     //如果x的树的高度比y的小,则把x附在y上
    }else{
        par[y] = x;
        if(height[x] == height[y])height[x]++; //如果两者高度相同的话,把么合并后,高度必增长1
    }
}


//判断x,y是否属于同一集合


bool same(int x, int y){return find(x) == find(y);}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值