数据结构与算法之最小生成树

最小生成树的概念

生成树概念

连通图生成树包含图中全部顶点的一个极小连通子图

边尽可能的少,但要保持连通

若图中顶点数为 n,则它的生成树含有 n − 1 n-1 n1条边。对于生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。

最小生成树 (最小代价树)

如下图,思考:道路规划要求:所有地方都连通,且成本尽可能的低

下面是提供的两种方案,看图:

此处引出最小生成树的概念,又称为最小代价树。

最小生成树概念

对于一个带权连通无向图 G = ( V , E ) G=(V,E) G=(V,E),生成树不同,每颗树的权 (即树中所有边上的权值之和) 也可能不同。设 R 为 G 的所有生成树的集合,若 T 为 R 中边的权值之和最小的生成树,则 T 称为 G 的最小生树 (Minimum-Spanning-Tree,MST)

  1. 最小生成树可能有多个,但边的权值之和总是唯一且最小的

  2. 最小生成树的边数=顶点数 -1.砍掉一条则不连通,增加一条边则会出现回路。

  3. 若果连通图本身就是一棵树,则其最小生成树就是它本身

    1. 在这里插入图片描述
  4. 只有连通图才有生成树,非连通图只有森林

    1. 而求最小生成树就需要用到:Prim算法和Kruskal 算法

Prim 算法

算法思想:

  1. 从某一顶点开始构建生成树;
  2. 每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。

  1. 时间复杂度: O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)
  2. 适合用于边稠密图

算法实现

  1. 从 V_0 开始,总共需要 n-1 轮循环。
  2. 每一轮处理:循环遍历所有结点,找到 lowCase 最低的,且还没加入树的顶点。
  3. 再次循环遍历,更新还没加入的各个顶点的 lowCase 值

以下面这个连通图为例:

  1. 初始:从 V 0 V_0 V0开始

    1. 标记各节点是否已经加入树

    2. 各节点加入树的最低代价 (没有边连通,就是无穷)

  2. 第一轮:循环遍历所有结点,找到 lowCast 最低的,且还没有加入树的顶点。

    1. 在这里插入图片描述

    2. 再次循环遍历,更新还没加入各个顶点的 lowCast 值。

  3. 第一轮:循环遍历所有结点,找到 lowCast 最低的,且还没有加入树的顶点。

Kruskal 算法

算法思想:

  1. 每次选择一条权值最小的边,使者条边的两头连通 (原本已经连通的就不选)
  2. 直到所有结点都连通

  1. 时间复杂度: O ( ∣ E ∣ l o g 2 ∣ E ∣ ) O(|E|{log}_2|E|) O(Elog2E)
  2. 适合用于边稀疏图

算法实现

如下图,进行Kruskal算法获取最小生成树

  1. 初始:将各条边按权值排序,结果如下图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDSfle3A-1655368451525)(https://pic-space-1303847498.cos.ap-guangzhou.myqcloud.com/img/20220616155453.png)]

  2. 第一轮:检查第一条边的两个顶点是否连通(是否属于同一个集合) ^ac06e2

    1. 不连通,连起来
  3. 后序几轮依次进行1操作
    共执行e[边数]轮,每轮判断两个顶点是否属于同一集合,需要 O ( l o g 2 e ) O({log}_2e) O(log2e)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

five-five

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值