該演算法是一種計算有向無環圖最短路徑的演算法。
加權圖
其中每個數字表示時間。要計算非加權圖中的最短路徑,可使用廣度優先搜尋。要計算加權圖中的最短路徑,可使用狄克斯特拉演算法。
演算法步驟
狄克斯特拉演算法包含4個步驟。
(1) 找出最便宜的節點,即可在最短時間內前往的節點。
(2) 對於該節點的鄰居,檢查是否有前往它們的更短路徑,如果有,就更新其開銷。
(3) 重複這個過程,直到對圖中的每個節點都這樣做了。
(4) 計算最終路徑。
演算法實現:
思路草稿圖:
資料結構圖:
**實現:
#第乙個雜湊表記錄圖結構:記錄了每個節點的鄰居和前往鄰居的開銷。f代表終點,s代表起點
graph =
graph[
's']
=graph[
's']
['a']=
5graph[
's']
['b']=
2graph[
'a']
=graph[
'a']
['c']=
4graph[
'a']
['d']=
2graph[
'b']
=graph[
'b']
['a']=
8graph[
'b']
['d']=
7graph[
'c']
=graph[
'c']
['d']=
6graph[
'c']
['f']=
3graph[
'd']
=graph[
'd']
['f']=
1graph[
'f']
=#第二個雜湊表:記錄從起點到每個節點的開銷.無法確定的計作無窮大
infinit =
float
('inf'
)costs =
costs[
'a']=5
costs[
'b']=2
costs[
'c']
=infinit
costs[
'd']
=infinit
costs[
'f']
=infinit
#第三個雜湊表用於記錄 每個節點的父節點
parents =
parents[
'a']
='s'
parents[
'b']
='s'
parents[
'f']
=none
#計算時,將不斷更新 costs和parents雜湊表 ,並將處理過的節點記錄在該陣列
processed =
#查詢當前離起點最近的乙個未處理的節點
deffind_lowerest_node
(costs)
: lowerst_cost =
float
('inf'
) lowerst_cost_node =
none
for node in costs:
if costs[node]
< lowerst_cost and node not
in processed:
lowerst_cost = costs[node]
lowerst_cost_node = node
return lowerst_cost_node
node = find_lowerest_node(costs)
#只要還有未處理的節點,就迴圈處理
while node is
notnone
: cost = costs[node]
#對於該節點的鄰居,檢查是否有前往它們的更短路徑,如果有,就更新其開銷。並更新父節點為該節點。
neighbors = graph[node]
for n in neighbors:
new_costs = cost + neighbors[n]
if new_costs < costs[n]
: costs[n]
= new_costs
parents[n]
= node
node = find_lowerest_node(costs)
print
(costs)
適用場景:
要計算非加權圖中的最短路徑,可使用廣度優先搜尋。要計算加權圖中的最短路徑,可使用狄克斯特拉演算法。圖還可能有環,而環類似右面這樣。該演算法並不能處理有環圖。
負權邊負權邊是指加權為負數,這樣可能會導致狄克斯特拉演算法失效。因此,不能將狄克斯特拉演算法用於包含負權邊的圖。在包含負權邊的圖中,要找出最短路徑,可使用另一種演算法——貝爾曼-福德演算法(bellman-ford algorithm)。
狄克斯特拉演算法
廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...
狄克斯特拉演算法
是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。示例 找出從起點到終點的最短路徑 當前起點到各點的花費,選擇最小且沒有被檢...
(原創)狄克斯特拉演算法
1.廣度優先搜尋用於計算非加權圖中的最短路徑 2.狄克斯特拉演算法用於計算加權圖中的最短路徑 不能帶有負權邊 備註 當圖的每條邊都帶有乙個數字時,這些數字成為權重。帶權重的圖稱為加權圖,反之稱為非加權圖。1.從起點開始。2.找到該點最便宜的鄰居節點。3.若該節點的開銷優於之前記錄的開銷,則更新該節點...