狄克斯特拉演算法是用於在加權圖中查詢到最短路徑的演算法,所以你就需要找到從出發點到終止點的路徑,比較出最短的一條,這是我們不妨利用逆向思維的方法,要想找到最短的終止節點,那麼你就必須要是在它的上乙個最短的節點(稱為父節點),用相同的思想找到每個節點的父節點直到出發節點,所以我們要明確一下幾點
1.怎麼用**講圖實現出來
2.怎麼記錄每個節點的開銷(也就是節點到開始點的距離)
3.怎麼表示父節點是什麼
以下我將從這三方面出發,利用**實現狄克斯特拉演算法
# 用雜湊表實現圖的關係
graph = {}
graph['start'] = {}
graph['start']['a']=6
graph['start']['b']=2
graph['a']={}
graph['a']['fin']=1
graph['b']={}
graph['b']['a']=3
graph['b']['fin']=5
graph['fin'] = {}
# 開銷
costs={}
costs['a']=6
costs['b']=2
costs['fin']=float('inf')
# 父節點
parents={}
parents['a']='start'
parents['b']='start'
parents['fin']=none
# 處理訪問過的節點
processed=
# 在未處理的點中找到開銷最小的值
def find_lowest_cost_node(costs):
lowest_cost=float('inf')
lowest_cost_node = none
for node in costs:
cost = costs[node]
if cost < lowest_cost and node not in processed:
lowest_cost = cost
lowest_cost_node = node
return lowest_cost_node
# 找到最短路徑
def find_shortset_path():
node='fin'
shortest_path=['end']
while node != 'start':
node = parents[node]
shortest_path.reverse()
return shortest_path
if __name__ == '__main__':
node = find_lowest_cost_node(costs)
while node is not none:
cost = costs[node]
neighbors = graph[node]
for n in neighbors.keys():
new_cost = cost + neighbors[n]
if costs[n] > new_cost:
costs[n] = new_cost
parents[n] = node
node = find_lowest_cost_node(costs)
shortset_path = find_shortset_path()
print(shortset_path)
狄克斯特拉演算法
廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...
狄克斯特拉演算法
是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。示例 找出從起點到終點的最短路徑 當前起點到各點的花費,選擇最小且沒有被檢...
python實現狄克斯特拉演算法
一 簡介 是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止 二 步驟 1 找出 最便宜 的節點,即可在最短時間內到達的節點。2 更新該節點的鄰居的開銷,其含義將稍後介紹。3 重複這個過程,直到對圖...