Prim Prim算法

问题

用Prim算法求无向图UGUG的最小生成树。

解法

Prim算法是一种贪心算法,按照以下步骤操作:

(1)(1) 初始时设生成树为空,边集合为Etree=E_{tree} = \varnothing,点集合为Vtree=V_{tree} = \varnothing。将任意顶点v0v_0作为初始顶点加入生成树的点集合中,得到Vtree=[v0]V_{tree} = [ v_0 ]

(2)(2)VtreeV_{tree}的所有临边(生成树的临边ei,je_{i,j}是一个顶点属于生成树viVtreev_i \in V_{tree},另一个顶点不属于生成树vjVtreev_j \notin V_{tree}的边)中找到权值最小的临边ei,je_{i,j}。设边ei,je_{i,j}viVtreev_i \in V_{tree}vjVtreev_j \notin V_{tree},将该边加入生成树中:将顶点vjv_j加入生成树点集合VtreeV_{tree},将边ei,je_{i,j}加入生成树边集合EtreeE_{tree}

重复上述操作,直到Vtree=VV_{tree} = V为止,算法结束。这时EtreeE_{tree}即为无向图UGUG的最小生成树。

上图演示了无向图使用Prim算法求最小生成树的过程,从顶点00开始。需要注意每次选择新的边时,是从VtreeV_{tree}的所有顶点的临边中选择,不是仅仅从最近一个访问的顶点的临边中选取。

Prim算法的时间复杂度为O(Vlog2V)O(\| V \| \cdot log_2 \| V \|),其中log2Vlog_2 \| V \|表示平均每个顶点的邻节点数量。

Introduction To Algorithms

源码

Prim.h

Prim.cpp

测试

PrimTest.cpp

Last updated