標籤:
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 = v024 25 # 源頂點到其餘各頂點的初始路程26 dis = dict((k,INF) for k in G.keys())27 dis[v0] = 028 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: continue38 if dis[v] < new: 39 new = dis[v]40 minv = v41 return dis42 43 44 dis = Dijkstra(G,v0=1)45 print dis.values()
python資料結構與演算法——圖的最短路徑(Dijkstra演算法)