prim算法和dijkstra算法基本思路一模一样,都是贪婪。都是从costs边数组里面找最短边,把这个最短边的结点加入t(已经确定好最短边的点)中。然后再遍历这个结点的邻边,更新costs。
但是prim和dijkstra的区别在哪里呢?
- dijkstra的costs,costs的每个值存的是开始点到该点的路径权值总和
- 而prim的costs,costs的每个值存的是该点到该点父结点的边权,只有一条边的权值,不像dijkstra那样把之前走过的路径加上。
- 最后生成的生成树也不一样,dijkstra生成的是单源最短路径生成树,就是一个点到其他点的路径树,一般应用于运输;prim生成的是总路径最短生成树,就是这种树既把所有点连在一起,而且该树的总权值最小,一般应用于建造铺设。
- 后面的更新costs的时候,判断条件不一样。dijkstra在结点里面找边的时候,边权值加上该结点小于之前的costs就更新;而prim找边的时候,直接用边权值和之前的costs比,小于就更新。
图:
python代码
# 最小生成树python实现
def prim(graph):
n = len(graph)
costs = [99999 for _ in range(n)] # 父结点到该结点的边权值
costs[0] = 0
parents = [-1 for _ in range(n)]
visited = [False for