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

如果不清楚原理的话,看下这个视频(简单易懂,只有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]
  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值