算法与数据结构学习笔记(5):图的最小生成树(普里姆算法和克鲁斯卡尔算法)

最小生成树

定义:构造连通网的最小代价生成树

下面两种算法不能处理有向图,克鲁斯卡尔算法在边数少时效率高(适用与稀疏图),普里姆算法对于稠密图效率好一些。

1.普里姆算法(Prim)

(1) 算法思路
从连通网(带权连通图)的任意顶点A开始,将该顶点放入集合V中,然后从与A相连的顶点中找到一个顶点B,使得边的权值最小,将B也放入集合V中,边(A,B)就是最小生成树的一条边。接着再从顶点中找到顶点C使得C到集合V的边权值最小(即到A或B的权值最小)。按照这种步骤继续下去,直到所有的顶点都被访问过。

核心思想:MST中的顶点与非MST中顶点之间的边权重更新(由于每次递归后,总有新的顶点加入MST,此时MST顶点与非MST顶点的边权值可能会有更小值的存在,所以lowcost[i]需要更新)(必须是直连,否则权重为∞)

(2)举例说明
在这里插入图片描述
设置两个数组:

  • lowcost[i]: 表示以i为终点的边的最小值(当lowcost[i]=0时,说明顶点i加入了最小生成树)
  • mst[i]: 表示对应lowcost[i]的起点(说明边(mst[i],i)是最小生成树的一条边,mst[i]=a表示起点i加入最小生成树

(3)算法步骤

  1. 首先选则V0为起始顶点,则两个数组分别如下(mst[i]全为0是因为默认起点为V0),此时MST中的顶点有{V0}。
lowcost[1] = 10 lowcost[2] = ∞ lowcost[3] = ∞ lowcost[4] = ∞ lowcost[5] = 11 lowcost[6] = ∞ lowcost[7] = ∞ lowcost[8] = ∞
mst[1] = 0 mst[2] = 0 mst[3] = 0 mst[4] = 0 mst[5] = 0 mst[6] = 0 mst[7] = 0 mst[8] = 0
  1. 显然,在所有lowcost[i]中,i = 1时边的权重最小为10(边权重为0的不计),所以V1加入MST。更新后的两个数组如下。此时MST中的顶点有{V0、V1},更新MST中的所有顶点到非MST中的顶点的边权重。(此时由于V1加入了MST,所以MST到V8的边权重不再是∞,而是12,所以lowcost[8] = 12,而且这个12是从V1到V8,所以mst[8] = 1。数组其他数值的改变同理)

在这里插入图片描述

lowcost[1] = 0 lowcost[2] = 18 lowcost[3] = ∞ lowcost[4] = ∞ lowcost[5] = 11 lowcost[6] = 16 lowcost[7] = ∞ lowcost[8] = 12
mst[1] = 0 mst[2] = 1 mst[3] = 0 mst[4] = 0 mst[5] = 0 mst[6] = 1 mst[7] = 0 mst[8] = 1
  1. 此时,在更新后的lowcost[i]中,i = 5时的边权重最小,所以将V5,此时的MST顶点集合为{V0、V1、V5}.再用这个新的MST继续更新这两个数组。(此时,由于MST中的V5到非MST中的V4的边权重为26,比之前的∞小,故lowcost[4] = 26,mst[4] = 5。数组其他数值的改变同理)

在这里插入图片描述

lowcost[1] = 0 lowcost[2] = 18 lowcost[3] = ∞ lowcost[4] = 26 lowcost[5] = 0 lowcost[6] = 16 lowcost[7] = ∞ lowcost[8] = 12
mst[1] = 0 mst[2] = 1 mst[3] = 0 mst[4] = 5 mst[5] = 0 mst[6] = 1 mst[7] = 0 mst[8] = 1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值