最小生成树

本文深入探讨了最小生成树问题及其解决方案,详细介绍了Kruskal算法和Prime算法的实现过程与特点。通过具体实例,阐述了如何在给定图中寻找具有最小权重的树结构,以及这两种算法在不同场景下的应用。

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

最小生成树

最小生成树的定义

给定一个图 G=VE , 并且对于每条边 (u,v)E 的权重使用 ω(u,v) 来表示。我们希望找到一个无环子集 TE , 既能够将所有的节点连接起来,又具有最小的权重,即 ω(T)=(u,v)Tω(u,v) 的值最小。由于T是无环的,并且连通所有的节点。因此, T 必然是一颗树。我们称这样的树为生成树,我们称求取该生成树的问题为最小生成树问题

简单的描述为:
最小生成树

解决最小生成树问题的两种算法为: Kruskal 算法Prime 算法
假定有一个连通的图G=(V,E)和权重函数 ω:ER , 我们希望找出图 G 的一颗最小生成树。对于Kruskal算法和Prime算法都是使用贪心算来解决这个问题的,但是他们使用的贪心策略的方式却是有所不同。
这个贪心策略可以有下面通用的方法来表述。该通用的方法在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中。管理一个遵守下述循环不变式的边的集合A :

在每遍循环之前,A是某棵最小生成树的一个子集

在每一步,我们要做的事情是选择一条边 (u,v) , 将其加入到集合 A 中,使得A不违反循环不变式,及 A{(u,v)} 。由于我们可以安全的将这种边加入到结合 A 而不破坏A的循环不变式,因此称这样的边的集合 A 安全边

Kruskal 算法

在Kruaskal 算法中,集合A是一个深林,其节点就是给定图的节点。每次加入到集合 A 中的安全边永远都是权重最小的连接两个不同分量的边。
给定下面这个图,Kruaskal算法生成最小树的过程为:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述
step1: 在图中选择权值最小的边(v1,v4)(v6,v7), 加入到集合 A 中。
step2: 在剩下未选着的边中继续选着权值最小的边(v3,v4)(v1,v2)。所选择的边不能破坏A的循环不变式,及在A中的边不能师的所选着的顶点构成回路。
重复step2知道所有的顶点就相连接。
其伪代码为:
Kruskal
由于Kruskal算法是以边作为出发点的,因此该算法适合稀疏图。

Prime 算法

Prime 算法的工作原理与Dijkstra的最短路径算法相似。Prime算法所具有的一个性质是集合 A 中的边总是构成一棵树。这棵树从一个任意的根节点r开始,一直长大到覆盖 V 中所有节点时为止。算法每一步在连接A A 之外的顶点的所有边中,选择一条权重最小但是又不破坏构成最小生成树的规则(及选的边不能使得A中的顶点构成回路)。因此,当算法终止是,A中的边形成一颗最小生成树。
其Prime算法的计算过程为:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述
step1:假设我们选择顶点 v1 作为出发点。则选择与 v1 直接相连接权值最小的边 (v1,v4) 。则有 A={v1,v4}
step2: 在图未选着的边中选择与集合 A 中的顶点直接相连接具有权值最小的边,并且把顶点加入到集合A中。其中所选择的边不能使得集合 A 中的顶点构成回路。
step3: 重复step2知道所有的顶点都加入到了集合A中。
其伪代码为:
Prime

Reference:
(1). 《算法导论》第三版 Thomas H.Cormen et al.
(2). 数据结构–陈越、何钦铭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值