python数据结构与算法——图的最短路径(Dijkstra算法)

 1 # Dijkstra算法——通过边实现松弛
 2 # 指定一个点到其他各顶点的路径——单源最短路径
 3 
 4 # 初始化图参数
 5 G = {1:{1:0,    2:1,    3:12},
 6      2:{2:0,    3:9,    4:3},
 7      3:{3:0,    5:5},
 8      4:{3:4,    4:0,    5:13,   6:15},
 9      5:{5:0,    6:4},
10      6:{6:0}}
11     
12 
13 # 每次找到离源点最近的一个顶点,然后以该顶点为重心进行扩展
14 # 最终的到源点到其余所有点的最短路径
15 # 一种贪婪算法
16 
17 def Dijkstra(G,v0,INF=999):
18     """ 使用 Dijkstra 算法计算指定点 v0 到图 G 中任意点的最短路径的距离
19         INF 为设定的无限远距离值
20         此方法不能解决负权值边的图
21     """
22     book = set()
23     minv = v0
24     
25     # 源顶点到其余各顶点的初始路程
26     dis = dict((k,INF) for k in G.keys())
27     dis[v0] = 0
28     
29     while len(book)<len(G):
30         book.add(minv)                                  # 确定当期顶点的距离
31         for w in G[minv]:                               # 以当前点的中心向外扩散
32             if dis[minv] + G[minv][w] < dis[w]:         # 如果从当前点扩展到某一点的距离小与已知最短距离      
33                 dis[w] = dis[minv] + G[minv][w]         # 对已知距离进行更新
34         
35         new = INF                                       # 从剩下的未确定点中选择最小距离点作为新的扩散点
36         for v in dis.keys():
37             if v in book: continue
38             if dis[v] < new: 
39                 new = dis[v]
40                 minv = v
41     return dis
42 
43 
44 dis = Dijkstra(G,v0=1)
45 print dis.values()    
原文地址:https://www.cnblogs.com/hanahimi/p/4692638.html