狄克斯特拉演算法

2021-08-29 04:07:35 字數 2225 閱讀 8717

是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。

狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

示例:找出從起點到終點的最短路徑

當前起點到各點的花費,選擇最小且沒有被檢查的點

起點至當前花費

父節點b

5startc1

startd?

?e??

fin?

?第一步,選擇c擴充套件,更新花費,父節點

起點至當前花費

父節點b

5startc1

startd31

ce36c

fin?

?第二步,選擇b擴充套件,更新花費,父節點

起點至當前花費

父節點b

5start

c(已檢查)

1startd20

be25b

fin?

?第三步,選擇d擴充套件,更新花費,父節點

起點至當前花費

父節點b(已檢查)

5start

c(已檢查)

1startd20

be25b

fin40

d第四步,選擇e擴充套件,更新花費,父節點

起點至當前花費

父節點b(已檢查)

5start

c(已檢查)

1start

d(已檢查)20b

e25bfin35e

第五步,選擇fin擴充套件,更新花費,父節點

起點至當前花費

父節點b(已檢查)

5start

c(已檢查)

1start

d(已檢查)20b

e(已檢查)25b

fin35

e**實現:

#無窮大

infinity = float('inf')

#結點圖

graph = {}

graph['start'] = {}

graph['start']['b'] = 5

graph['start']['c'] = 1

graph['b'] = {}

graph['b']['d'] = 15

graph['b']['e'] = 20

graph['c'] = {}

graph['c']['d'] = 30

graph['c']['e'] = 35

graph['d'] = {}

graph['d']['fin'] = 20

graph['e'] = {}

graph['e']['fin'] = 10

graph['fin'] = {}

costs = {}

costs['b'] = 5

costs['c'] = 1

costs['d'] = infinity

costs['e'] = infinity

costs['fin'] = infinity

parents = {}

parents['b'] = 'start'

parents['c'] = 'start'

parents['d'] = none

parents['e'] = none

parents['fin'] = none

proessed =

#找出最小花費結點

def find_lowest_cost_node(costs):

#最小花費初始值為無窮大

lowest_cost = float('inf')

lowest_cost_node = none

#遍歷costs,找出最小花費結點

for node in costs:

cost = costs[node]

if cost')

if __name__ == '__main__':

dijkstra(costs, graph, parents)

result(costs,parents)

結果:

狄克斯特拉演算法

廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...

(原創)狄克斯特拉演算法

1.廣度優先搜尋用於計算非加權圖中的最短路徑 2.狄克斯特拉演算法用於計算加權圖中的最短路徑 不能帶有負權邊 備註 當圖的每條邊都帶有乙個數字時,這些數字成為權重。帶權重的圖稱為加權圖,反之稱為非加權圖。1.從起點開始。2.找到該點最便宜的鄰居節點。3.若該節點的開銷優於之前記錄的開銷,則更新該節點...

Dijkstra 狄克斯特拉 演算法

該演算法是一種計算有向無環圖最短路徑的演算法。加權圖 其中每個數字表示時間。要計算非加權圖中的最短路徑,可使用廣度優先搜尋。要計算加權圖中的最短路徑,可使用狄克斯特拉演算法。演算法步驟 狄克斯特拉演算法包含4個步驟。1 找出最便宜的節點,即可在最短時間內前往的節點。2 對於該節點的鄰居,檢查是否有前...