Dijkstra算法(单源非负权最短路径算法)

算法思想

Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。

 

时间复杂度分析

O(V2+E)=O(V2)

如果用二叉最小堆实现,则为O((V+E)lgV)。

 

python代码实现

import sys
from queue import PriorityQueue

class Node(object):
    def __init__(self, k, w):
        self.k = k
        self.w = w
    def __lt__(self, other):
        return self.w < other.w

def dijkstra(matrix, root):   #maps是图的邻接矩阵,没有边的值设为最大值
    if len(matrix) == 0:
        return None
    dist = [sys.maxsize] * len(matrix)
    dist[root] = 0
    pq = PriorityQueue()
    pq.put(Node(root, 0))
    while not pq.empty():
        h = pq.get()
        for i in range(len(matrix)):
            if dist[i] == sys.maxsize or dist[i] > dist[h.k] + matrix[h.k][i]:
                dist[i] = dist[h.k] + matrix[h.k][i]
                pq.put(Node(i, dist[i]))

    return dist

if __name__ == '__main__':
    matrix = [[0,1,3,sys.maxsize],[1,0,1,8],[3,1,0,2],[sys.maxsize,8,2,0]]
    a = dijkstra(matrix, 0)
    print(a)

 

参考博客

https://www.cnblogs.com/linxiyue/p/3833971.html

posted @ 2019-07-10 21:33  xd_xumaomao  阅读(238)  评论(0编辑  收藏  举报