CS61B 数据结构与算法笔记 20 最小生成树

热身:

给定一个无向图,寻找它是否有一个环。

方法1:从某个节点开始做深度优先搜索。

  • 如果在搜索的过程中发现已经搜索过的节点则有环。
  • 不要算上刚刚路过的节点。
  • 最坏情况运行时间:Θ(V+E)。

方法2:用加权快速联合对象(Quick weighed union-find)

对于每一条边,检查两端点是否相连。

  • 如果不相连,就把他们union。
  • 如果相连,就说明有环。

例如4-5,5-6,6-4,将4-5,5-6union后,4和6就被连接,遍历到6-4边的时候发现已经连接,说明图中有环。

最小生成树

最小生成树包含无向图的所有顶点,没有环,且所有边的权重之和最小。

割集

边割集:将图的节点分配给两个非空集。

交叉边:将一个集合中的节点连接到另一个集合中的节点的边。

定理(切割属性)最小权重的交叉边在最小生成树(MST)中。

证明如下: 假设(为了矛盾起见)最小交叉边缘 e 不在 MST 中。由于它不是 MST 的一部分,如果我们添加该边缘,将创建一个循环。因为存在循环,这意味着其他一些边 f 也必须是交叉边(对于一个循环,如果 e 从一个集合交叉到另一个集合,则必须有另一条边交叉回第一个集合)。因此,我们可以删除 f 并保持 e,这将给我们一个权重更低的生成树。但这是一个矛盾,因为我们应该从 MST 开始,但现在我们有一个边的集合,它是一个生成树,但重量更轻,因此最初的 MST 实际上并不是最小的。因此,切割属性必须成立。

prim's算法

prim's算法可用于在图中查找最短生成树。

步骤如下:

1. 从某个任意的起始节点开始。
2. 重复添加连接在已遍历子图和未遍历子图之间的最短边
3. 重复,直到有 V-1 条边。

实现:类似于Dijkstra's,用优先队列。

CS61B 19 最短路-CSDN博客

实现如下:

开始和Dijkstra's完全相同:

一开始,随便找一个初始节点,距离设为0,其他节点距离为正无穷,且将所有节点存到优先队列fringe中。不同的是distTo和Fringe的“距离”是节点距离已遍历的树的最短距离:

接下来和Dijkstra's一样,对两个可选边分别做relax。1,2两节点更新。2优先级最低,将2弹出fringe,标记1-0为已遍历(有distTo,有edgeTo),同时标记2-0边作为最小生成树的边(无distTo, 有edgeTo):

三个边需要relax,然后4和5需要更新,而1不需要更新。将4弹出,标记4-2:

relax四个边,更新三个顶点,弹出3,标记3-4:

接下来面临一个问题:有两个距离2的边都为最小,该弹出哪个?答案是随便弹哪个都可以,最后得到的结果都是最小生成树。不妨弹出1,标记1-0

没有更短的边可relax,直接弹出3,标记3-4:

得到最小生成树:1-0,2-0,3-4,4-2,5-6,6-3。

Prim's算法时间复杂度:

插入:V次,每次花费O(logV)

删除最小:V次,每次花费O(logV)

降低优先级:O(E)次,每次花费O(logV)。

总时间:O(V*log(V)+V*log(V)+E*log(V)).

        假设E>V,则结果为O(ElogV).

Kruskal's算法

Prim's算法只是众多最小生成树算法之一。

算法如下:
1.将所有边从低权重到高权重排序。
2.每次取一条边(按排序顺序),如果加入边后不会产生环的话,就将其添加到正在构建的 MST 中,否则跳过该边看下一条边。
3.重复上述步骤,直到最小生成树有V-1条边为止。

实现如下:

使用优先队列加权快速联合(WQU)来实现。

fringe存储所有边及其权重,从权重最低开始,fringe将边挨个弹出,存入WQU。WQU用于判断加入该边是否有环,只需调用isConnected(x,y)就能判断。如果无环就存入MST,MST用于存储最终的最小生成树的边。

0-2不生成环,存入。按照fringe的权重从小到大顺序挨个遍历即可,非常简单,后面步骤略。

运行时间:

O(ElogE)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值