1.找出"最便宜"的節點,即可在最短時間內到達的節點2.更新該節點的鄰居和開銷,檢查是否有前往他們的更短路勁,如果有,就更新其開銷
3.重複這個過程,直到對圖中的每個節點都這樣做
4.計算最短路徑
graph =
graph[
"start"]=
graph[
"start"][
"a"]=6
graph[
"start"][
"b"]=2
# print(graph["start"].keys())
# print(graph["start"]["a"])
graph[
"a"]
=graph[
"a"]
["fin"]=
1graph[
"b"]
=graph[
"b"]
["a"]=
3graph[
"b"]
["fin"]=
5graph[
"fin"]=
infinity =
float
("inf"
)costs =
costs[
"a"]=6
costs[
"b"]=2
costs[
"fin"
]= infinity
parents =
parents[
"a"]
="start"
parents[
"b"]
="start"
parents[
"fin"]=
none
processed =
deffind_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
node = find_lowest_cost_node(costs)
# 在未處理的節點中找出開銷最小的節點
while node is
notnone
:# 這個迴圈在所有節點都被處理過後結束
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)
# 找出接下來要處理的節點,並迴圈
print
(graph)
print
(costs)
print
(parents)
python 迪克斯特拉(Dijkstra)
從起點到終點的路徑如上圖所示,每條路徑的長度都不相同 權重 如何從起點找到一條路徑,長度最短?建模 graph儲存了整張圖的結構 costs儲存了從起點開始,到每個點的最短距離 從起點到a是6,但是從 起點 b a 是5,所以後面a的路徑其實會變成5 parents記錄了每個地點的父節點,譬如開始時...
演算法 迪克斯特拉演算法Dijkstra
定義 找出最短路徑的演算法。思想 按路徑長度遞增次序產生演算法 把頂點集合v分成兩組 1 s 已求出的頂點的集合 初始時只含有源點v0 2 v s t 尚未確定的頂點集合 將t中頂點按遞增的次序加入到s中,保證 1 從源點v0到s中其他各頂點的長度都不大於從v0到t中任何頂點的最短路徑長度 2 每個...
YTU 3029 迪克斯特拉演算法
time limit 1 sec memory limit 128 mb submit 70 solved 43 submit status web board 對於如圖所示的乙個帶權有向圖,採用迪克斯特拉演算法求出從頂點0到其他各頂點的最短路徑及其長度。to 1 1 1 to 2 4 2 incl...