最小生成树的算法,网上有详细的介绍,这里简单谈一下关键的几个步骤:
1:prim算法和单源最短路径中的迪杰斯特拉算法很相识,也在其中借鉴了部分算法。总的来说将图上的顶点分成两部分。一部分
为树顶点(已被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,然后从剩
下的非树顶点中选择一个距离生成树最近的顶点加入到生成树中,并且更新其它非树顶点到生成树的距离,再选择一个距离生成
树最短顶点,再更新剩下的顶点,然后依次类推,重复操作n-1次(n为顶点数)。
2:那么问题的关键来了,如何从非树顶点中选择出距离生成树最近的顶点。如果把非树中的每个顶点和树中的每个顶点的距离进行比较的话,效率太低。这里就要借鉴迪杰斯特拉算法中的思想,迪杰斯特拉算法中采用一个dist数组,该数组记录各个顶点到源点的距离,然后每次扫描数组dist从中选出离顶点最近的顶点。然后通过该顶点的所有的边能否更新源点到各个顶点的距离,如果能则更新。
3:prim算法中借鉴使用dist数组这一思想,但是记录的最短距离不是到源点的距离,而是每个顶点到任意一个树顶点的距离。因为我们的目标不是非得靠近源点而是,靠近生成树就可以。也就是说只要靠近生成树中的任意一个树顶点就行。
参考博客:https://blog.csdn.net/qq_35644234/article/details/59106779
代码如下: