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)