最短路径算法-Dijkstra(迪杰斯特拉)-python

如果不清楚原理的话,看下这个视频(简单易懂,只有4分钟)
B站:dijkstra算法求最短路径
看过之后就知道基本原理了。

算法实现步骤
① 每次找出当前图中距离源点1最近的点k,
② 计算源点1经过该点k到达某个点j是否比原来更近,如果更近,则把源点1到某个点j的距离,替换为这个更近的距离。
③ 经过n-1次查找(把除了源点之外的点都遍历一遍,每个点都当一次中介值),即可得出源点到每个点最近的距离。

最短路径算法-Dijkstra(迪杰斯特拉)-python_第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]

你可能感兴趣的:(算法,Python)