这位大哥真厉害,图文讲解Dijkstra
根据他的讲解,python实现如下
import math
class Graph:
def __init__(self,vexs,matrix):
self.vexs = vexs
self.vexNum = len(self.vexs)
self.matrix = matrix
class ShortestPath:
def dijstra(self,v,G:Graph):
#顶点个数
n = G.vexNum
#是否已处理
flag = [0 for i in range(G.vexNum)]
#路径数组
pre = [0 for i in range(G.vexNum)]
#距离
dist = g.matrix[v]
flag[v] = 1
dist[v] = 0
"""
开始n-1次循环
1. 找dist中未访问的最小点k
2. 更新经过k点的最短路径
"""
for i in range(1,n):
_min = math.inf
# 1. 找dist中未访问的最小点k
for j in range(n):
## 未访问且最小的点k
if not flag[j] and dist[j] < _min:
_min = dist[j]
k = j
## 将k标记为已访问
flag[k] = 1
# 更新经过k点的最短路径
for j in range(n):
#未访问且经过k点的话dist会减小
if not flag[j] and G.matrix[k][j] + _min < dist[j]:
#更新到j的距离为到k的距离+k到j的距离
dist[j] = G.matrix[k][j] + _min
pre[j] = k
return pre, dist
vexs = [0,1,2,3]
matrix = [[0,2,1,5],[2,0,math.inf,1],[1,math.inf,0,5],[5,1,5,0]]
g = Graph(vexs,matrix)
s = ShortestPath()
pre, dist = s.dijstra(2,g)
print(pre,dist)