【Python实现】Dijkstra算法

参考 《大话数据结构》第七章 图

算法思想说明:

迪杰特斯拉算法一般用来求最短路径问题,给定一个初始化矩阵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搜索。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值