如果不清楚原理的话,看下这个视频(简单易懂,只有4分钟)
B站:dijkstra算法求最短路径
看过之后就知道基本原理了。
算法实现步骤:
① 每次找出当前图中距离源点1最近的点k,
② 计算源点1经过该点k到达某个点j是否比原来更近,如果更近,则把源点1到某个点j的距离,替换为这个更近的距离。
③ 经过n-1次查找(把除了源点之外的点都遍历一遍,每个点都当一次中介值),即可得出源点到每个点最近的距离。
如上图:
实现代码如下:(注释非常详细)
# -*- coding: utf-8 -*-
def get_shortest_route(mgraph):
n = len(mgraph) # 顶点个数
dp = [float('inf')]*n # 一维数组保存到各点的最短距离
dpp = [[]]*n # 二维数组保存到各点的最短距离的路径
seen = [0]*n # 一维数组记录各顶点是否访问
# 到各点的初始化最短距离
for i in range(n):
dp[i] = mgraph[0][i]
dpp[i] = [i+1]
print('到各点的初始化最短距离:', dp)
# n-1次查找
for i in range(1, n):
min_ = float('inf')
# 当前图中距离源点1最近的点k
for j in range(1, n):
if dp[j] < min_ and seen[j] == 0:
min_ = dp[j]
k = j
seen[k] = 1
# 计算点1经过点k到达某个点j是否比原来更近
for j in range(1, n):
if dp[j] > dp[k]+mgraph[k][j] and seen[j] == 0:
dp[j] = dp[k]+mgraph[k][j]
dpp[j] = [k+1, j+1]
return dp, dpp
if __name__ == "__main__":
inf = float('inf')
mgraph = [[0, 5, 2, inf, inf],
[inf, 0, 2, 6, 1],
[inf, inf, 0, 7, 6],
[inf, inf, 7, 0, 2],
[inf, inf, inf, inf, 0]]
dp, dpp = get_shortest_route(mgraph)
for i in range(len(dp)):
print('到点', i+1 ,'的最短距离:',dp[i],'路径:', dpp[i])
运行结果:
runfile('E:/Dijkstra.py', wdir='E:/')
到各点的初始化最短距离: [0, 5, 2, inf, inf]
到点 1 的最短距离: 0 路径: [1]
到点 2 的最短距离: 5 路径: [2]
到点 3 的最短距离: 2 路径: [3]
到点 4 的最短距离: 9 路径: [3, 4]
到点 5 的最短距离: 6 路径: [2, 5]