從起點到終點的路徑如上圖所示,每條路徑的長度都不相同(權重),如何從起點找到一條路徑,長度最短?
建模: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.縮短,則...