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

2022-09-18 11:03:31 字數 1513 閱讀 4507

**:

dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,這個演算法我主動學了三遍,第一主動學的時候,是看嚴蔚敏的《資料結構》,當時應該是學懂了,有點透徹地理解了這個演算法,但是沒有記錄下來,後來就忘記了,

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演算法

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

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

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

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搜...