1. 程式人生 > >Dijkstra 算法,用於對有權圖進行搜索,找出圖中兩點的最短距離

Dijkstra 算法,用於對有權圖進行搜索,找出圖中兩點的最短距離

我們 全部 保持 blog 短路徑 找到 gif動畫 信息 初始

Dijkstra 算法,用於對有權圖進行搜索,找出圖中兩點的最短距離,既不是DFS搜索,也不是BFS搜索。
把Dijkstra 算法應用於無權圖,或者所有邊的權都相等的圖,Dijkstra 算法等同於BFS搜索。

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

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

http://blog.csdn.net/mu399/article/details/50903876

Dijkstra 算法,用於對有權圖進行搜索,找出圖中兩點的最短距離