关闭

并查集

标签: 并查集
123人阅读 评论(0) 收藏 举报
分类:

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



并查集的实现:

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);}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6624次
    • 积分:264
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:10篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档