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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM