python 迪克斯特拉(Dijkstra)

2022-06-20 19:18:15 字數 2450 閱讀 1544

從起點到終點的路徑如上圖所示,每條路徑的長度都不相同(權重),如何從起點找到一條路徑,長度最短?

建模:graph儲存了整張圖的結構;costs儲存了從起點開始,到每個點的最短距離(從起點到a是6,但是從 起點-> b -> a 是5,所以後面a的路徑其實會變成5);parents記錄了每個地點的父節點,譬如開始時 a 的父節點是 起點,但是從 起點->b->a 更近,所以 a 的父節點會變成 b)

遍歷所有的節點

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

not none: #

這個while迴圈在所有節點都被處理過後結束

print('

\n花費節點:

',costs)

cost =costs[node]

print('

最低花費節點:%s , 花費:

' %node,cost)

neighbors =graph[node]

for n in neighbors.keys(): #

遍歷當前節點的所有鄰居

new_cost = cost +neighbors[n]

print('

鄰居:'

,neighbors)

print('

鄰居:',n,'

總花費:

',new_cost)

print('

%s 原本花費

'%n,costs[n])

if costs[n] > new_cost: #

如果經當前節點前往該鄰居更近,

costs[n] = new_cost #

就更新該鄰居的開銷

parents[n] = node #

同時將該鄰居的父節點設定為當前節點

print('

%s cost -> %s , parents -> %s

' %(n,new_cost,node))

else

:

print('

%s 原本的費用更小,不用改

'%n)

#將當前節點標記為處理過

node = find_lowest_cost_node(costs) #

找出接下來要處理的節點,並迴圈

print(costs["

fin"])

演算法 迪克斯特拉演算法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...

迪克斯特拉演算法詳解及C 實現

演算法步驟如下 g 1.初始時令 s t v s t中頂點對應的距離值 若存在,d v0,vi 為 弧上的權值 若不存在 d v0,vi 為 2.從t中選取乙個與s中頂點有關聯邊且權值最小的頂點w,加入到s中 3.對其餘t中頂點的距離值進行修改 若加進w作中間頂點,從v0到vi的距離值 4.縮短,則...