图论 最小生成树

 

最小生成树:在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即 (u, v)\in E),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即 T\subseteq E)且为无循环图,使得

w(T) = \sum_{(u,v)\in T} w(u,v)

的 w(T) 最小,则此 T 为 G 的最小生成树

最小生成树其实是最小权重生成树的简称。

 性质:

  • 最小生成树的边数必然是顶点数减一,|E| = |V| - 1。
  • 最小生成树不可以有循环。
  • 最小生成树不必是唯一的。

算法:

          Prim算法,Kruskal算法;prim算法于Dijkstra算法类似、

   Prim算法      

 描述

从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。

  1. 输入:一个加权连通图,其中顶点集合为V,边集合为E;
  2. 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {};
  3. 重复下列操作,直到Vnew = V:
    1. 在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
    2. 将v加入集合Vnew中,将(u, v)加入集合Enew中;
  4. 输出:使用集合Vnew和Enew来描述所得到的最小生成树。

时间复杂度

最小边、权的数据结构时间复杂度(总计)
邻接矩阵、搜索O(V2)
二叉堆(后文伪代码中使用的数据结构)、邻接表O((V + E) log(V)) = O(E log(V))
斐波那契堆、邻接表O(E + V log(V))

通过邻接矩阵图表示的简易实现中,找到所有最小权边共需O(V2)的运行时间。使用简单的二叉堆与邻接表来表示的话,普里姆算法的运行时间则可缩减为O(E log V),其中E为连通图的边数,V为顶点数。如果使用较为复杂的斐波那契堆,则可将运行时间进一步缩短为O(E + V log V),这在连通图足够密集时(当E满足Ω(V log V)条件时),可较显著地提高运行速度。

 例示

图例说明不可选可选已选
Prim Algorithm 0.svg此为原始的加权连通图。每条边一侧的数字代表其权值。---
Prim Algorithm 1.svg顶点D被任意选为起始点。顶点ABEF通过单条边与D相连。A是距离D最近的顶点,因此将A及对应边AD以高亮表示。C, GA, B, E, FD
Prim Algorithm 2.svg下一个顶点为距离DA最近的顶点。BD为9,距A为7,E为15,F为6。因此,FDA最近,因此将顶点F与相应边DF以高亮表示。C, GB, E, FA, D
Prim Algorithm 3.svg算法继续重复上面的步骤。距离A为7的顶点B被高亮表示。CB, E, GA, D, F
Prim Algorithm 4.svg在当前情况下,可以在CEG间进行选择。CB为8,EB为7,GF为11。E最近,因此将顶点E与相应边BE高亮表示。C, E, GA, D, F, B
Prim Algorithm 5.svg这里,可供选择的顶点只有CGCE为5,GE为9,故选取C,并与边EC一同高亮表示。C, GA, D, F, B, E
Prim Algorithm 6.svg顶点G是唯一剩下的顶点,它距F为11,距E为9,E最近,故高亮表示G及相应边EGGA, D, F, B, E, C
Prim Algorithm 7.svg现在,所有顶点均已被选取,图中绿色部分即为连通图的最小生成树。在此例中,最小生成树的权值之和为39。A, D, F, B, E, C, G

证明

设prim生成的树为G0

假设存在Gmin使得cost(Gmin)<cost(G0)

则在Gmin中存在(u,v)不属于G0

将(u,v)加入G0中可得一个环,且(u,v)不是该环的最长边

这与prim每次生成最短边矛盾

故假设不成立,命题得证.

 

Kruskal算法:

 

建立两个边集合, 设集合1为空,从集合2中挑选一条权值最小的边,若加入此边后,集合1中生成环 这删除此边,重复N-1次 即当集合1中含有N-1一条边时,集合1中的边

形成最小生成树;

 

 

 

总结: 感觉 Prim算法 和 Kruskal算法 在策略上都是一样的,都是找到权值最小的边。Prim算法 利用顶点集合 使得 新加入的边不可能形成环,而Kruskal算法是判断 加入边 是否形成环。即 在不形成环的情况下 加入N-1条边;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值