最小生成树之Prim(普里姆)算法
最小生成树:是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。
如上图给出了一个图G及其最小生成树T,其中红色的线即为最小生成树的边。最小生成树T包含了图G中所有的顶点,且由它们生成的树的边权之和为15,是所有生成树中权值最小的。
最小生成树有3个性质:
(1)最小生成树是树,因此其边数等于定点数减1,且树内一定不会有环;
(2)对给定的图G(V,E),其最小生成树可以不唯一,但是其边权之和一定是唯一的;
(3)由于最小生成树是无向图上生成的,因此其根结点可以是这棵树上的任意一个结点。
Prim算法
Prim算法是用来解决最小生成树问题的。
基本思想:对图G(V,E)设置集合S,存放已经被访问的顶点,然后每次从集合V-S中选择与集合S的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令顶点u为中介点,优化所有从u能到达的顶点v与集合S之间的最短距离。这样的操作执行n次(n为顶点个数),直到集合S已包含所有顶点。
注意:可以发现,prim算法的思想和最短路径中Dijkstra算法的思想几乎完全相同,只是在涉及最短距离时使用了集合S代替Dijkstra算法中的起点s。
下面举例来说明一下prim是如何求最小生成树的。
假设从顶点V0开始,
当前集合V={V0,V1,V2,V3,V4,V5}(蓝色),集合S={}(黄色),顶点V0与集合S之间的距离为0,其它均为INF(一个很大的数)
:
(1)如图(a),选择与集合S距离最小的顶点V0,将其加入到集合S中,并连接顶点V0与其它顶点的边,此时
集合V={V1,V2,V3,V4,V5},集合S={V0};
(2)如图(b),选择与集合S距离最小的顶点V4,
将其加入到集合S中,并连接顶点V4与其它顶点的边,此时
集合V={V1,V2,V3,V5},集合S={