透徹理解迪傑斯特拉演算法

2021-07-10 12:56:50 字數 2171 閱讀 9262

dijkstra 演算法,用於對有權圖進行搜尋,找出圖中兩點的最短距離,既不是dfs搜尋,也不是bfs搜尋。

把dijkstra 演算法應用於無權圖,或者所有邊的權都相等的圖,dijkstra 演算法等同於bfs搜尋。

2.演算法描述

1)演算法思想:設g=(v,e)是乙個帶權有向圖,把圖中頂點集合v分成兩組,第一組為已求出最短路徑的頂點集合(用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 , 就將加入到集合s中,直到全部頂點都加入到s中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(用u表示),按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度。此外,每個頂點對應乙個距離,s中的頂點的距離就是從v到此頂點的最短路徑長度,u中的頂點的距離,是從v到此頂點只包括s中的頂點為中間頂點的當前最短路徑長度。

例子

不要看演算法的動畫,理解演算法的時候,思維更不上gif動畫的速度,這兩張圖對理解演算法最管用

重點需要理解這句拗口的"按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度"

實際上,dijkstra 演算法是乙個排序過程,就上面的例子來說,是根據a到圖中其餘點的最短路徑長度進行排序,路徑越短越先被找到,路徑越長越靠後才能被找到,要找a到f的最短路徑,我們依次找到了

a --> c 的最短路徑 3

a --> c --> b 的最短路徑 5

a --> c --> d 的最短路徑 6

a --> c --> e 的最短路徑 7

a --> c --> d --> f 的最短路徑 9

dijkstra 演算法執行的附加效果是得到了另乙個資訊,a到c的路徑最短,其次是a到b, a到d, a到e, a到f

為什麼dijkstra 演算法不適用於帶負權的圖?

就上個例子來說,當把乙個點選入集合s時,就意味著已經找到了從a到這個點的最短路徑,比如第二步,把c點選入集合s,這時已經找到a到c的最短路徑了,但是如果圖中存在負權邊,就不能再這樣說了。舉個例子,假設有乙個點z,z只與a和c有連線,從a到z的權為50,從z到c的權為-49,現在a到c的最短路徑顯然是a --> z --> c

對帶負權的圖,應該用floyd演算法

再舉一例, 初點a到b最短有權10,b到c有權50,a到d有權30,d到c有權20,求a到c的最短路徑。

迪傑斯特拉演算法的執行過程是乙個排序的過程,既不是深度優先也不是廣度優先演算法。 就這個簡單的例子而言,a和b都被加入s集合後,這時下乙個要加入s集合結點,並不一定是c節點。 請把a和b節點組成的集合作為乙個整體來考慮,當演算法執行到 a和b 都被加入s集合後,你甚至都可以把 a 和 b在圖中去掉用乙個虛擬的s節點來表示,a 和 b 作為乙個整體後,和這個整體相連線的邊,最短的就是 a 到 d 這條邊,但是,這時並不能直接因為這條邊的權最小 就將d 加入 s 集合; 現在,再來假設 b 到 c的權不是50,而是25; 現在和 s 集合相連線的邊有a到d 30, b到c 25; 這時,b到c的權值最小,但卻不能加入s集合, 因為 a 到 b 再到 c的權是 10 + 25 已經大於 a 到 d的權 30, 所以 d 應該加入 s 集合,而不是 c; 如果b 到 c的權值小於20,就是 c先加入 s 集合,而不是 d 了; b 到 c的權值恰好等於20,那麼隨便,先把d加入 s 還是 先把 c 加入 s,都是一樣的,沒有區別。

另外,任意一點k,加入s集合後,就已經找到了從源點a到k的最短路徑,前提條件是圖中不能有帶負數的權值邊。 我這樣表述可以讓演算法更清楚,還是這個例子, a和b都被選入 s 集合後,去更新整個圖,把a和b都去掉,用新節點 s 代替a和b,s 到 d 有權30, s 到 c 有權 10+50, 下一步該選哪個節點併入 s 集合一目了然了吧。 d點選入 s 集合後,再把d點從圖中抹去,更新虛擬的節點 s到c的權

透徹理解迪傑斯特拉演算法

dijkstra 演算法,用於對有權圖進行搜尋,找出圖中兩點的最短距離,既不是dfs搜尋,也不是bfs搜尋。把dijkstra 演算法應用於無權圖,或者所有邊的權都相等的圖,dijkstra 演算法等同於bfs搜尋。2.演算法描述 1 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成...

透徹理解迪傑斯特拉演算法

透徹理解迪傑斯特拉演算法 2016年03月16日 12 04 51 閱讀數 50661 dijkstra 演算法,用於對有權圖進行搜尋,找出圖中兩點的最短距離,既不是dfs搜尋,也不是bfs搜尋。把dijkstra 演算法應用於無權圖,或者所有邊的權都相等的圖,dijkstra 演算法等同於bfs搜...

透徹理解迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,這個演算法我主動學了三遍,第一主動學的時候,是看嚴蔚敏的 資料結構 當時應該是學懂了,有點透徹地理解了這個演算法,但是沒有記錄下來,後來就忘記了,dijkstra 演算法,用於對有權圖進行搜尋,找出圖中兩點的最短距離,既不是dfs搜尋,...