最小生成树

本文详细介绍了最小生成树的概念,包括Kruskal和Prim两种经典算法。Kruskal算法通过找到连接森林中不同树的最轻边进行构建,Prim算法则从一个根节点出发逐步扩展最小生成树。两者都是贪心策略的实例,具有O(ElgE)和O(VlgV + ElgV)的时间复杂度。
摘要由CSDN通过智能技术生成

1.理论

首先还是要搞清研究对象,简单说最小生成树问题就是找一个无环子集,它既能把所有的节点连接起来,又具有最小的权重

下面介绍一些定义

切割:无向图G=(V,E)的一个切割(S,V-S)是集合V的一个划分。

如果一条边(u,v) in E的一个端点位于S,另一个端点位于V-S,则称该边横跨切割(S,V-S)。

如果集合A中不存在横跨该切割的边,则称该切割尊重集合A。

在横跨一个切割的所有边中,权重最小的边称为轻量级边

伪代码:

GENERIC-MST(G,w)

1.A = Empty Set

2.while A does not form a spanning tree

3.      find an edge(u,v) that is safe for A

4.      A = A U {(u,v)}

5. return A

如果一条边加入到A中,A仍然是某棵最小生成树的子集,就称这样的边为集合A的安全边

伪代码中涉及到的循环不变式

1.初始化: 在算法第1行之后,集合A直接满足循环不变式

2.保持: 算法第2到4行通过只加入安全边来维护循环不变式

3.终止: 所有加入到集合A中的边都属于某棵最小生成树,因此算法地行返回的集合A必然是一棵最小生成树。

可以看到整个过程简单明了,最主要的问题还是如何寻找安全边上。下面的定理和推论可以帮助我们。

定理1:设 G = (V,E) 是一个在边E上定义了实数值权重函数w的连通无向图。设集合A为E的一个子集,且A包括在图G的某棵最小生成树中,设(S,V-S)是图G中尊重集合A的任意一个切割,又设(u,v)是横跨切割(S,V-S)的一条轻量级边。那么边(u,v)对于集合A是安全的。

推论1:设 G = (V,E) 是一个连通无向图,并有定义在边集合上的实数值权重函数w。设集合A为E的一个子集,且该子集包

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值