数据结构与算法分析--最小支撑树(图解Prim算法、Kruskal算法)

本文介绍了图论中的最小生成树(MST)概念,它用于找到连通无向图中权值最小的边集,形成一棵包含所有顶点的树。Prim算法从一个顶点开始逐步扩展,每次添加与当前树中顶点相连的最小边。而Kruskal算法按边权排序,逐条添加边,通过避免回路来构建MST。两种算法各有适用场景,Prim适合稠密图,Kruskal则适用于稀疏图。检查回路的关键在于避免连接已存在于同一等价类的顶点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个连通无向图G,且他的每条边有相应的长度或权值,则MST(最小生成树)是一个包括G的所有顶点机器边子集的图,边的自己满足下列条件:

 

1)这个子集中所有边的权之和为所有子集中最小的。

2)子集中的边能够保证图是连通的

MST中没有回路,因为如果有回路的话显然可以通过去掉回路某条边而得到开销更小的MST,因此,MST是一颗有|V|-1条边的自由树。之所以称为最小支撑树,是因为一方面满足MST的边集所构成的树支撑起了所有的顶点,另一方面此边集的代价最小。

下面介绍求最小支撑树的两种算法

Prim算法-生成

由途中任意一个顶点N开始,初始化MST为N,选出与N相关连的边中权最小的一条,设其连接N与另一顶点M,把M和边(N,M)加入MST中,然后选出与N或M相关联的边中权最小的一条,设其连接另一个新顶点,将此边和新顶点添加到MST中,反复进行这样的处理,每一步都通过选出连接当前已在MST中的某个顶点以及另一个不在MST中顶点的代价最小的边而扩展MST。

 

Kruskal算法--将森林合并成树 

 如果图比较稀疏,很多结点但边较少,基本和顶点一个数量级,适用Kruskal算法。贪心算法,每次选择权重最小的边,形成子树,且不生成回路

首先将顶点集分为|V|个等价类,每个等价类包括一个顶点,然后以权的大小为顺序处理各条边,如果某条边连接两个不同等价类的顶点,就把这条边添加到MST,并把两个等价类合并为一个,重复直到只剩下一个等价类。

总时间代价为Θ(|E|log|E|),一般情况下的代价则接近Θ(|V|log|E|)

检查是否形成回路的方法:判断两结点的终点是否相同

eg:起点       终点

        C              F

        D               F

        E              F

故c、d、e三点若相连会构成回路,终点相同不予连接。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值