图的最小生成树是指一颗连接图中所有顶点,具有权重最小的树,树的权重为所有树边的权重之和。最小生成树可以应用在电路规划中,规划出既能连接各个节点又能使材料最为节省的布局。计算最小生成树有两个经典算法,分别是Kruscal算法和Prim算法。本文将会介绍Prim算法的原理以及实现。
Prim算法基于贪心算法设计,其从一个顶点出发,选择这个顶点发出的边中权重最小的一条加入最小生成树中,然后又从当前的树中的所有顶点发出的边中选出权重最小的一条加入树中,以此类推,直到所有顶点都在树中,算法结束。
下面举一个例子来说明。
上图是一个无向图,假设我们从顶点a出发使用Prim算法计算最小生成树,其算法运行过程如下。
① 顶点a发出的边包括<a,b>和<a,d>和<a,f>,其中权重最小的边为<a,f>,于是我们将边<a,f>加入到最小生成树中,此时最小生成树包括下图中的阴影边和灰色顶点。
② 接下来我们继续从当前最小生成树中的顶点发出的所有边中寻找权重最小的一条,即边<a,b>、<a,d>、<f,c>中的边<a,d>,于是我们将边<a,d>加入到树中,如下图所示。