算法设计与分析课程复习笔记10——最小生成树

算法设计与分析课程复习笔记10——最小生成树

最小生成树MST

修路问题
一个小镇有一些房子和一些路,每条路连接且仅连接2座房子,连接u和v房子的路的维修代价为w(u,v),
现在要维修仅够需求的道路,使得:每两座房子之间保持连通,维修代价最小。

图为连通无向图,顶点为房子,边为路,维修费用为边的权。
找到一个T,T为E的子集,并且w(T)= ∑ ( u , v ) ∈ T w ( u , v ) \displaystyle \sum_{(u,v)∈T}w(u,v) (u,v)Tw(u,v)

最小生成树特性

  • 非唯一
  • 没有回路
  • MST边的数目为顶点数目减1

MST生成
一般方法:
创建一个边的集合A,起始时为空
逐渐向A中添加边并保持A属于某个MST
当且仅当A ∪ {(u, v)}是MST的子集,我们说边(u, v)对于A是安全的

MST一般算法
A ← 空集
while A is not a spanning tree(没有形成生成树)
 do find an edge(u,v) that is safe for A(寻找对A安全的边(u, v))
  A ← A ∪ {(u,v)}
return A

如何找到对A安全的边?
一些定义:

  • 切割:将图的顶点分成两个互不相连的两个集合S和V – S
  • 如果一个边的两个端点分别在切割的两个集合S和V - S中,我们说该边横跨该切割
  • 一个切割不干预集合A ↔ \leftrightarrow 集合A中没有边与该切割相交
  • 横跨切割的轻边 ↔ \leftrightarrow 所有横跨切割的边中权值最小的边

定理:
A是MST的子集, (S, V - S)是不干预A的一个切割, (u, v)是横跨该切割的轻边,那么, (u, v)对于A是安全的。

Kruskal算法

  1. 从每个顶点开始,每个顶点即是个组件
  2. 通过选择轻边LE,不断的将两个组件连接起来
  3. 依权值递增顺序检查边的集合
  4. 利用不相关集合的数据结构判断边是否连接不同的组件

不相关集合的操作

  1. MAKE-SET(u)创建集合,仅含元素u
  2. FIND-SET(u)包含u,返回代表元素
  • 集合的任何元素具有某个特定的属性
  • 集合 S u S_u Su的特性是按字母顺序的第一个字母
    E.g.: S u S_u Su = {r, s, t, u},FIND-SET(u) = r,FIND-SET(s) = r
  • 对于给定的集合,返回同样的值
  1. UNION(u,v)合并操作
    E.g.: S u S_u Su = {r, s, t, u}, S v S_v Sv = {v, x, y}
    UNION (u, v) = {r, s, t, u, v, x, y}

Kruskal(V,E,w)
 A ← 空集
 for each vertex v ∈ V
  do MAKE-SET(v)
 sort E into non-decreasing order by weight w(权值递增排序)
 for each (u, v) taken from the sorted list
  do if FIND-SET(u) ≠ FIND-SET(v) (属于不同的组件)
   then A ← A ∪ {(u, v)}
    UNION(u, v)
 return A

运行开销: O ( E l g V ) O(ElgV) O(ElgV)
最小生成树
Prim算法

  1. 集合A中的边形成一棵树
  2. 从任意选定的根开始
  3. 每次
  • 确定切割( V A V_A VA, V - V A V_A VA)的LE
  • 将LE加入A
  • 重复直到树包含所有顶点
  1. 贪婪策略:每次加入的边使树的边的权值和增加最小

如何快速确定LE?
利用优先队列

  • 包含所有不在树中的顶点(V – V A V_A VA)
  • 每个顶点赋予一个关键值,即树中连接至v的任何边(u, v)的最小权值
    如果v与 V A V_A VA任何的顶点不相连,则关键值为 ∞ \infty
    增加节点后,所有与之相连的节点的关键值要做调整

Prim(V,E,w,r)
 Q ← 空集
 for each u ∈ V
  do key[u] ← ∞ \infty
    π[u] ← NIL
 key[r] ←0
 Q ← V
 while Q ≠ 空集
   do u ← EXTRACT-MIN(Q)
   for each v ∈ Adj[u]
    do if v ∈ Q and w(u, v) < key[v]
      then π[v] ← u
        key[v] ← w(u, v)

PRIM1
PRIM2
PRIM3
PRIM4
算法分析
PRIM分析

参考:任课教师邱德红教授的课件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值