【图论算法】最小生成树 (Prim 算法、Kruskal 算法)

一个无向图G 的最小生成树(minimum spanning tree) 就是由该图的那些连接 G 的所有顶点的边构成的树,即在最小生成树中边的条数为 |V| - 1,且其总的值最低。最小生成树存在当且仅当 G 是连通的。虽然一个强壮的算法应该指出 G 不连通的情况,但是我们还是假设 G 是连通的。

对于最小生成树问题,贪婪的做法是成立的,这里介绍两种算法,它们的区别在于最小(值的)边如何选取上。

Prim 算法

在该算法的任一时刻,我们都可以看到一组已经添加到树中的顶点,而其余顶点尚未加到树上。此时,算法在每一阶段都可以通过选择边(u, v),使得(u, v) 的值是所有 u 在树上但 v 不在树上的边的最小值,从而找出一个新的顶点并将它添加到这棵树中。
在这里插入图片描述

图1 无向图G

对于图1 中的无向图 G,图2 指出了该算法如何从 v1 开始构建最小生成树。开始时,v1 在构建中的树上,它作为树的根但是没有边。每一步添加一条边和一个顶点到树上。

在这里插入图片描述

图2 在每一步之后的 Prim 算法

我们可以看到,Prim 算法基本上与求最短路径的 Dijkstra 算法相同。因此,和前面一样,我们对每一个顶点保留值 dv 和 pv 以及一个指标,标示该顶点是 known 的还是 unknown 的。这里,dv 是连接 v 到一个 known 顶点的最短边的权,而 pv 则是导致 dv 改变的最后的顶点。算法其余部分完全一样,只有一点不同:由于 dv 的定义不同,因此它的更新法则也不同:在每一个顶点 v 被选取之后,对于每一个邻接到 v 的unknown 的 w,dw = min(dw, vw,v)

表的初始配置由图3 指出,其中 v1 被选取,而 v2、v<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhugenmi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值