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()