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

最小生成树(MST)

连通图的生成树包含图的所有顶点,并且只含有尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路。

例如:

G
2
1
3
4
A
B
C
D

它的生成树可以是:

G1
2
1
3
A
B
C
D

也可以是

G2
1
3
4
A
B
C
D

定义

对于一个带权连通无向图G来说,生成树不同,每棵树的权(树中所有边上的权值之和)也不同。权值之和最小的那棵生成树称为G的最小生成树(Minimum-Spanning-Tree,MST)。

例如,上文中,G1是G的最小生成树。

不难看出,最小生成树具有以下性质:

  1. 若图G中存在权值相同的边,则G的最小生成树可能不唯一。当图G中的各边权值互不相等时,最小生成树是唯一的。
  2. 若无向连通图G的边数比定点数少1,则G的最小生成树就是它本身。
  3. 虽然图G最小生成树可能不唯一,但权值之和总是唯一的,而且是最小的。
  4. 最小生成树的边数为顶点树减1

构造最小生成树

构造最小生成树的方法有很多,但大多都使用了贪心思维,其中最典型的就是Prim算法和Kruskal算法。

(由于考研对这部分代码的要求并不高,因此实现代码略过)

Prim算法

Prim算法的核心是选择与已构造的生成树连接的权值最小、未被选择过的且另一端结点不在生成树内的边加入到已构造的生成树中。

例如:

在这里插入图片描述

假设我们以1为起点进行构造。

那么我们将1作为已构造的最小生成树。

第一次:选择与1连接的最小的边,有1–2

在这里插入图片描述

第二次,选择与{1,2}连接的最小的边,有2–4

在这里插入图片描述

第三次,选择与{1,2,4}连接的最小的边,有4–7

在这里插入图片描述

第四次,选择与{1,2,4,7}连接的最小的边,有7–6

在这里插入图片描述

第五次,选择与{1,2,4,7,6}连接的最小的边,有6–3

在这里插入图片描述

第六次,选择与{1,2,4,7,6,3}连接的最小的边,有4–5

在这里插入图片描述

第七次,选择与{1,2,4,7,6,3,5}连接的最小的边,有5–8

在这里插入图片描述

所以根据Prim算法得到的最小生成树为:

在这里插入图片描述

Kruskal算法

Kruskal算法的核心是每次选择权值最小的、未被选择过的且两端结点属于两个不同的集合的边。

例如:

在这里插入图片描述

第一次:选择权值最小的、未被选择的且两端属于不同集合的边,有5–8

在这里插入图片描述

第二次,选择权值最小的、未被选择的且两端属于不同集合的边,有2–4

在这里插入图片描述

第三次,选择权值最小的、未被选择的且两端属于不同集合的边,有3–6

在这里插入图片描述

第四次,选择权值最小的、未被选择的且两端属于不同集合的边,有,4–7

在这里插入图片描述

第五次,选择权值最小的、未被选择的且两端属于不同集合的边,有7–6

在这里插入图片描述

第六次,选择权值最小的、未被选择的且两端属于不同集合的边,有1–2

在这里插入图片描述

第七次,选择权值最小的、未被选择的且两端属于不同集合的边,有4–5

在这里插入图片描述

所以根据Kruskal算法得到的最小生成树为:

在这里插入图片描述

全篇结束,感谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值