Prim算法以点的角度来解决问题;Kruskal算法以边的角度来解决问题。Prim算法适合解决边数较多的情况,Kruskal算法适合解决边数较少的情况。
Prim算法
dist[v]表示一个顶点v到这棵生成树的最小距离
,这和Dijkstra算法的思想相同。
Prim算法的具体内容以及和Dijkstra算法的区别:
- Prim算法不能处理有向图,而Dijkstra可以处理
- DijKstra算法和Prim算法的主要区别在于path[v]数组的记录机制。如下:
(1).初始化时,Dijkstra算法的path数组只有起点初始化为0,其余都初始化为正无穷;Prim的path都初始化为正无穷。
(2).在顶点在未被收录前,Dijkstra算法的path[v]记录从一个出发点开始记录,记录的实际上是v的父节点到出发点的最短距离+v节点到父节点所在的图的最短距离
;而Prim随便从一个节点开始记录,记录的实际上是v节点到父节点所在的图的最短距离
。
(3).如果该顶点被收录之后,Dijkstra需要一个专门的收录数组collected来记录已收录状态,同时更新dist[v]为起始点距离当前顶点v的最短路径长度
;而Prim的path[v]数组可以直接置0(path[v]=0
)表示该顶点处于已收录状态,因为收录后的path不需要记录任何东西了,所以可以用来替代collected功能。 - 同时在path[v]和parent[v]的更新上,Prim每次更新都是选择离整个图最近的点更新(
dist[v]+E<v,w> < dist[w]
),而Dijkstra每次更新都是选择离出发点更近的点更新(E<v,w> < dist[w]
)。 - Prim利用并查集的树存储记录方式来记录,首先初始化parent[]全部为-1,最后parent为-1的节点就是根节点。同时,Prim算法的dist设置为0代表当前节点已收录
Prim算法的代码模板如下: