Dijkstra演算法詳解 單源最短路 堆優化

2021-10-10 16:52:19 字數 663 閱讀 5693

用途:

用於求圖中指定兩點之間的最短路徑,或者是指定一點到其它所有點之間的最短路徑。實質上是貪心演算法。

基本思想:

1.將圖上的初始點看作乙個集合s,其它點看作另乙個集合

2.根據初始點,求出其它點到初始點的距離d[i] (若相鄰,則d[i]為邊權值;若不相鄰,則d[i]為無限大)

3.選取最小的d[i](記為d[x]),並將此d[i]邊對應的點(記為x)加入集合s

(實際上,加入集合的這個點的d[x]值就是它到初始點的最短距離)

4.再根據x,更新跟 x 相鄰點 y 的d[y]值:d[y] = min,因為可能把距離調小,所以這個更新操作叫做鬆弛操作。

(仔細想想,為啥只更新跟x相鄰點的d[y],而不是更新所有跟集合 s 相鄰點的 d 值? 因為第三步只更新並確定了x點到初始點的最短距離,集合內其它點是之前加入的,也經歷過第 4 步,所以與 x 沒有相鄰的點的 d 值是已經更新過的了,不會受到影響)

5.重複3,4兩步,直到目標點也加入了集合,此時目標點所對應的d[i]即為最短路徑長度。

(注:重複第三步的時候,應該從所有的d[i]中尋找最小值,而不是只從與x點相鄰的點中尋找。想想為什麼?)

原理:這裡不進行嚴格證明,dijkstra的大致思想就是,根據初始點,挨個的把離初始點最近的點乙個乙個找到並加入集合,集合中所有的點的d[i]都是該

單源最短路 Dijkstra演算法

前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...

單源最短路演算法 Dijkstra

dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...

單源最短路 Dijkstra演算法

本文 自王陸的文字,僅作學習使用。dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點 v0 到...