python
狄克斯特拉演算法
三:**實現:
break
goto
使用區別
跳出一層迴圈
直接跳轉至指定處,適用於:1.跳出多重迴圈;2.跳向共同的出口位置,進行退出前的處理工作。
找出當前未處理的最便宜節點
計算前往該節點的各鄰居的開銷(等於起點到此點的開銷加上此點到鄰居點的開銷)
將該點視為已處理點,回頭處理此時未處理的最便宜的節點
對比後續點的新舊開銷,更新資料。
題目來自《演算法**》練習
以第一題為例:
list item
一:程式目標:找出加權有向圖從起點到終點的最短路徑的總權重。
二:設計方案:
處理演算法:
使用狄克斯特拉演算法; 資料
我們需要儲存各節點的鄰居以及到他們的開銷,適合用雜湊表(字典)neighbours來實現,;
我們還需要儲存各點的開銷,我們建立相應的雜湊表costs來實現,其中我們以給點名為key,再建立乙個雜湊表,其中儲存從起點到此點的最小開銷,對此資料我們會在不斷對比中更新,最後保留終點的最短路徑的開銷;
最後為了明確我們最後得來的權重到底是經過怎樣的路線得來的,我們得記錄好最短路徑下每一節點的上一節點是誰,我們把他們稱為父級節點,對此我們同樣可以用雜湊表parents來實現同樣這裡我們始終保持更新父級為最短路徑的情況;
乙個列表,用來儲存已經被處理裡的節點,使之不再被二次處理。
三:**實現:
# 定義處理鄰居們時尋找最便宜的函式
operated_nodes =
# 用於存放已經被處理過的節點
neighbours =
,'a':,
'b':
,'c':,
'd':
,'e':}
costs =
parents =
deffind_lowest_cost_node
(costs)
: lowest_cost =
float
("inf"
) lowest_cost_node =
none
# 此處none用於當costs遍歷完之後,無節點可遍歷時作為標識停止迴圈
for node in costs.keys():
cost = costs[node]
if cost < lowest_cost and node not
in operated_nodes:
lowest_cost = costs[node]
lowest_cost_node = node
return lowest_cost_node
defmain()
: node = find_lowest_cost_node(costs)
while node is
notnone
: cost = costs[node]
neighbour = neighbours[node]
for theneighbour in neighbour.keys():
new_cost = cost + neighbour[theneighbour]
if new_cost < costs[theneighbour]
: costs[theneighbour]
= new_cost
parents[theneighbour]
= node # 更新該節點的父級節點
if node ==
'e':
return costs[
'e']
node = find_lowest_cost_node(costs)
if __name__ ==
"__main__"
: num = main(
)print
(num)
這段**花了我很長時間去除錯,問題在於執行到最後,我原來並沒有寫被調出的node與『e』判等,使程式陷入了死迴圈。 3月30日 4月3日課程表
請各位家長注意翻看課程表下方學習指導 時間周一 周二週三 周四周五 9 00 9 25 語文數學 數學語文 英語9 30 9 40 眼操眼操 眼操眼操 眼操9 40 10 00 運動運動 運動運動 運動10 00 10 25 數學語文 語文數學 數學午休 3 00 3 25 生命 美術 體育體育 3...
10月29日10月30日
蜷縮著,蜷縮著,便是四年。丟去的是光陰,丟不去的是你。接連幾天看了一部網路 很久沒這樣看網路 了,原因是室友在看網路 的網劇 實在無聊就去翻了翻 結果 後面 癮就來了 3w 的txt檔案一天晚上看到了3點 第二天起來 搬工作室 頭也沒洗 任自己邋遢 狂躁 第二天晚上看到了1點 早上起來接著看 終於 ...
3月30日 4月3日三年級課程
請各位家長注意翻看課程表下方學習指導 時間周一 周二週三 周四周五 9 00 9 25 數學語文 數學英語 語文9 30 9 40 眼操眼操 眼操眼操 眼操9 40 10 00 運動運動 運動運動 運動10 00 10 25 語文數學 數學 數學午休 3 00 3 25 英語體育 英語體育 美術3 ...