Kruskal算法与并查集

Kruskal算法与并查集

一、Kruskal算法

1、 概念

    Kruskal算法就是按照图中各个边上的权值大小进行递增排序,以此来构造最小生成树。

2、重点解析

    在由Kruskal实现最小生成树的过程中,难以理解的就是其中的判断边与边是否形成环路的问题,本文主要对此进行一定的介绍。
    首先我们要知道,在Kruskal实现最小生成树的算法中利用到了并查集的概念,这个概念搞不懂是很难理解此算法的。

在Krusal算法中,parent(判断边与边是否形成环路的数组)就像是个并查集,如果边起始顶点在树中找到的根和终点在树中找到的根是相等的,说明他们都在同一个并查集中,不能连接(树已经有顶点到这两顶点的路径了,就不需要加入了,否则就形成了环),反之则需要将该边的关系存入数组parent。

二、并查集

1、并查集的概念

并查集(Union Find)是一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组。

2、并查集的实现

算法思路:
假如有编号为1,2,3,…, n的n个元素,我们用一个数组node[]来存储每个元素的父节点。一开始,我们先将它们的父节点设为自己。

int node[i]; //存储每个元素的父节点
 
//初始化n个节点,初始时,每个元素的父节点是自己!!!!!
void Init(int n){
    for(int i = 0; i < n; i++){
        node[i] = i;
    }
}
//查找当前元素所在树的根节点(代表元素)
int find(int x){
    if(x == node[x])
        return x;
    return find(node[x]);//父节点的父节点肯定是其本身,node[x]内存储的是x的父节点!!!!!
}
//合并元素x, y所处的集合
void Unite(int x, int y){
    //查找到x,y的根节点
    x = find(x);
    y = find(y);
    if(x == y)    //如果找到的两个元素的父节点是相同的就说明他们两个是在同一棵树下(并查集中),不用合并
        return ;
    //将x的根节点与y的根节点相连
    node[x] = y;
}

参考文章:
https://blog.csdn.net/luomingjun12315/article/details/47373345

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值