并查集学习

并查集的定义:

        并查集是一种维护集合的数据结构。

int father[N] = father_element;
/*
    N为元素
    father_element为父亲节点的元素,父亲节点本身也是这个集合内的元素
    **例如father[2] = 1,则表明2的父亲节点是1
    **father[1] = 1,则表明1的父亲节点是它本身,因此1是集合的根节点
    因此可见当father[i] = i时,i为根节点
*/

        对同一个集合来说只存在一个根结点,且将其作为所属集合的标识。

基本操作:

        初始化:

for(int i = 1, i <= N; i++){
    father[i] = i; //一开始令每一个数组都是一个独立集合
}

        查找:

        查找操作就是对给定的结点寻找其根节点的操作,有递推和递归两种写法。

                递推:

//递推
int findFather(int x){
    while(x != father[x]) { // 如果不是根节点,继续循环
        x = father[x]; // 获得自己的父亲结点
    }
    return x;
}

                递归:

int findFather(int x) {
    if(x == father[x]) return x;
    else return findFather(father [x]);
}

        合并:

        合并是指把两个集合合并成一个集合。

        ①通过判断根节点是否相同,先判断两个元素是否属于同一个集合。

        ②在①中已经获得两个元素的根节点rootA和rootB,合并的方法就是将其中一个的父亲节点指向另一个节点,如father[rootA] = rootB;

void Union(int a, int b) {
    int rootA = findFather(a);
    int rootB = findFather(b);
    if(rootA != rootB) {
        father[rootA] = rootB;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值