基础-11:最小生成树(MST)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础-11:最小生成树(MST)相关的知识,希望对你有一定的参考价值。
参考技术A最小生成树(minimum spanning tree)是图计算中基本的问题,背后的问题非常直接,假设无向连通图G(V, E),且E中的每条边e有权值(可以表示距离、价值等),找出一颗树,连接G中所有的边,且连接这棵树的所有边的权值之和最小。在电子制造中,如何以最低的成本连接多个针管便是这一问题。
下面以一个图来对此进行说明:
前面两课中介绍了动态规划和贪心算法,都是用来解决最值问题,本文中的最小生成树很显然也属于此类。最小生成树使用贪心算法,文中会对贪心算法的使用进行说明。
假设mst是最终要求的最小生成树,若A是最小生成树mst边集的子集,如果每次选择一条边(u, v)加入A,并且确保A始终是mst边集的子集,则最终得到的A必然是mst最小生成树的边集。这样的边(u, v)称为A的 安全边 。安全边即为可以选择的边。
为了得到安全边,下面介绍一些概念。无向图G=(V,E)的一个切割(S, V-S)是节点集V的一个划分,如图2所示:
显然,一个切割将图划分为两部分。如果一条边(u,v),u在S中,v在S-V中,则称边(u,v)横跨切割(S, V-S)。如果集合A中不存在横跨该切割的边,则称该切割尊重A;在横跨切割的所有边中,权重最小的边称为轻量级边(注:轻量级边可能不是唯一的)。
下面的定理和推论保证了Kruskal和Prim算法的正确性,感兴趣的童鞋可以自己证明或参考算法导论中的说明。
根据定理1和推论1,构造最小生成树可以有两种方式,一种是切割的角度,一种是森林的角度。切割的角度:先从图中选取一个点n 1 ,划一个切割(n 1 , V-n 1 ),然后找这个切割的轻量级边以及这个边在 V-n 1 的节点n 2 ;然后再划一个切割(n 1 , n 2 , V-n 1 , n 2 ),再找出对应的轻量级边,...,直到所有的节点,每一步中找到的轻量级边组成的集合为最小生成树中的边。
森林的方式是:首先将每个节点都看成一个连通分量(此时有n个连通分量),寻找连通连接连通分量权值最小的边(u, v),(u, v)连接的连通分量为C 1 和C 2 ,则(u, v)连接后,合成一个更大的连通分量C 12 (此时有n-1个连通分量);然后对n-1个连通分量继续实施上述类似的动作,直至最后变成一个连通分量。
切割的角度对应的是Prim算法,森林的方式对应的是Kruskal算法,算法本身都很简单,在此不再赘述,下面两组从算法导论中摘取的图很好地解释了对应的算法。
最小生成树是图计算中的基本算法,理解算法的关键是切割基础上的轻量级边,上文的说明中野间接解释了利用贪心算法的正确性,相对而言,最小生成树是较为简单和基础的算法,是其他算法的基础。
MST性质(用于构造最小生成树)
描述:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。
证明:
假设网N的任何一棵最小生成树都不包含(u,v)。设T是连通网上的一棵最小生成树,当边(u,v)加入到T中时,由生成树的定义,T中必存在一天包含(u,v)的回路。另一方面,由于T是生成树,则在T上必存在另一条边(u’,v’),其中u’∈U,v’∈V-U,且u和u’之间,v和v’之间均有路径相通。删去边(u’,v’),便可消除上述回路,同时得到另一棵生成树T’。因为(u,v)的代价不高于(u’,v’),则T’的待机亦不高于T,T’是包含(u,v)的一棵最小生成树。由此和假设矛盾。
以上是关于基础-11:最小生成树(MST)的主要内容,如果未能解决你的问题,请参考以下文章
The Unique MST——最小生成树(判断最小生成树的唯一性)
数据结构一道题 根据最小生成树的Mst性质,可以得出 A最长边不包含于任一棵最小生成树 B最短边闭