def Dijkstra(G, v0, INF = float('inf')):
""" 使用 Dijkstra 算法计算指定点 v0 到图 G 中任意点的最短路径的距离 INF 为设定的无限远距离值 此方法不能解决负权值边的图 """
book = set()
minv = v0
dis = dict((k, INF) for k in G.keys())
dis[v0] = 0
while len(book) < len(G):
book.add(minv)
for w in G[minv]:
if dis[minv] + G[minv][w] < dis[w]:
dis[w] = dis[minv] + G[minv][w]
new = INF
for v in dis.keys():
if v in book: continue
if dis[v] < new:
new = dis[v]
minv = v
return dis
if __name__ == '__main__':
G = {
1: {
1: 0, 2: 2, 4: 1, 6: 3},
2: {
2: 0, 3: 6, 5: 5},
3: {
3: 0, 8: 6},
4: {
2: 10, 4: 0, 7: 2},
5: {
5: 0, 3: 9, 8: 4},
6: {
6: 0, 4: 5, 7: 4},
7: {
2: 7, 5: 3, 8: 8, 7: 0},
8: {
8: 0}}
start = 1
dis = Dijkstra(G, v0 = start)
print(dis)
参考:
- 最短路径算法之Dijkstra算法
- 漫画:图的 “最短路径” 问题
- python如何实现Dijkstra算法–最短路径问题
- Github代码
- 算法数据结构 | 10行实现最短路算法——Dijkstra
- 最短路径 (优秀博客!!!)