问题
用Prim算法求无向图UG的最小生成树。
解法
Prim算法是一种贪心算法,按照以下步骤操作:
(1) 初始时设生成树为空,边集合为Etree=∅,点集合为Vtree=∅。将任意顶点v0作为初始顶点加入生成树的点集合中,得到Vtree=[v0];
(2) 在Vtree的所有临边(生成树的临边ei,j是一个顶点属于生成树vi∈Vtree,另一个顶点不属于生成树vj∈/Vtree的边)中找到权值最小的临边ei,j。设边ei,j中vi∈Vtree,vj∈/Vtree,将该边加入生成树中:将顶点vj加入生成树点集合Vtree,将边ei,j加入生成树边集合Etree;
重复上述操作,直到Vtree=V为止,算法结束。这时Etree即为无向图UG的最小生成树。
上图演示了无向图使用Prim算法求最小生成树的过程,从顶点0开始。需要注意每次选择新的边时,是从Vtree的所有顶点的临边中选择,不是仅仅从最近一个访问的顶点的临边中选取。
Prim算法的时间复杂度为O(∥V∥⋅log2∥V∥),其中log2∥V∥表示平均每个顶点的邻节点数量。
Introduction To Algorithms
源码
Prim.h
Prim.cpp
测试
PrimTest.cpp