参考 《大话数据结构》第七章 图
迪杰特斯拉算法一般用来求最短路径问题,给定一个初始化矩阵equations[n][n],矩阵中的每个元素equations[i][j]表示顶点i到顶点j的最短距离,我们应该很容易想到这个矩阵的对角元素是0,表示自己到自己的路径是0。
先来看代码:
# graph是表示各顶点距离的矩阵,v0是起始点,P[v]的值为前驱点坐标,D[v]表示v0到v的最短路径长度和
def shortPath_Dijkstra(graph, v0):
n = len(graph)
final, P, D = [0]* n, [0] * n, [0] * n
for i in range(n): # 初始化
D[i] = graph[v0][i]
D[v0] = 0
final[v0] = 1
for v in range(1,n):
min = float("Inf")
for w in range(0,n):
if not final[w] and D[w] < min:
k = w
min = D[w]
final[k] = 1
for w in range(0,n):
if not final[w] and min + graph[k][w] < D[w]:
D[w] = min + graph[k][w]
P[w] = k
return D
代码说明:这里需要特别解释的三个数组分别是final,P和D。
final[v]
: 取值为0或1,初始化为0,如果已经找到了初始点v0到顶点v的最短路径,则final[v]置1,由此可见,当程序运行完成,final数组的值应该是全1.
P[v]
: 表示的是前驱点的坐标,比如P[v] = 3, 表示初始点v0到顶点v路径最短时,前一个顶点走的是3(有点类似动态规划的思想,v0-顶点3的距离 + 顶点3-顶点v的距离是最短的)。
D[v]
: 存的是初始点v0到顶点v的最短路径,
循环从v1到v_n-1(假设一共n个顶点,v0~v_n-1),每一轮循环的到来,相当于新加入一个可以前驱的顶点,比较D中原来存放的最短路径,和加入新顶点之后的最短路径(因为加入了新顶点之后,有可能从新顶点过来会得到更短的路径),不断的更新D和P数组的值。
当循环完成之后,也就是说所有顶点都遍历了一遍,D中存放的最短路径就是“全局”意义下的最短路径了。
测试:
# 前面这部分都是在构造equations矩阵
equations = [[10000] * 9 for _ in range(9)]
equations[0][0],equations[0][1],equations[0][2] = 0,1,5
equations[1][0],equations[1][1],equations[1][2],equations[1][3],equations[1][4] = 1,0,3,7,5
equations[2][0],equations[2][1],equations[2][2],equations[2][4],equations[2][5] = 5,3,0,1,7
equations[3][1],equations[3][3],equations[3][4],equations[3][6] = 7,0,2,3
equations[4][1],equations[4][2],equations[4][3],equations[4][4],equations[4][5],equations[4][6],equations[4][7] = 5,1,2,0,3,6,9
equations[5][2],equations[5][4],equations[5][5],equations[5][7] = 7,3,0,5
equations[6][3],equations[6][4],equations[6][6],equations[6][7],equations[6][8] = 3,6,0,2,7
equations[7][4],equations[7][5],equations[7][6],equations[7][7],equations[7][8] = 9,5,2,0,4
equations[8][6],equations[8][7],equations[8][8] = 7,4,0
res = shortPath_Dijkstra(equations, 0)
print('最短路径',res)
#输出结果:[0, 1, 4, 7, 5, 8, 10, 12, 16]
透彻理解迪杰特斯拉算法 https://blog.csdn.net/mu399/article/details/50903876
Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索。
把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于BFS搜索。