關於Dijkstra演算法的鬆弛操作的一些想法

2021-10-03 16:50:59 字數 478 閱讀 5046

每次用dijkstra演算法解決問題都會有個對於鬆弛操作的小疑問,每次都要困擾一會才能想通,為了防止自己再次忘記,特此記錄一下

假設共有12345678910一共十個點,其中點1,2,3是已經加入走過點的集合的點,此時經過計算發現點4是距離最短的點,於是將點4加入集合,並通過點4「鬆弛」各點與原點的距離即

dis[i]=min(dis[i],dis[4]+map[4][i])

那麼為什麼這個鬆弛的公式長這樣呢?為什麼不能是以點4為中間節點,點4再通過幾個點到達集合外的點呢?

不妨假設1->3->4->2->5的距離比1->3->4->5的距離要短,而1->3->4->2顯然不是點1到點2的最短距離(點2已經加入走過的點集合,最短距離不含點4),因此1->3->4->2->5的距離大於【點1到點2的最短距離再加上2->5】,而這個【點1到點2的最短距離再加上2->5】不經過點4,那麼這個距離必大於未加入點4時的最短距離。所以這個鬆弛公式長這樣!

Dijkstra 演算法 通過邊實現鬆弛

乙個點 源點 到其餘哥哥頂點的最短路徑 單元最短路徑。演算法步驟如下 1。將所有的頂點分為兩部分 已知最短路程的頂點集合p和未知最短路徑的集合頂點集合q。最開始,已知最短路徑的頂點集合p只有源點乙個頂點,我們這裡可以用乙個book陣列來記錄哪些頂點在集合p中哪些頂點在集合q中。book i 1,表示...

Dijkstra演算法 通過邊實現鬆弛

演算法思想 每次找到離源點最近的頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑.時間複雜度是o n 2 基本步驟 將所有的頂點分為兩部分,已知最短路程的頂點集合s和未知最短路徑的頂點集合v.最開始,已知最短路徑在集合s中只有源點乙個頂點,用book陣列來標記哪些點在集合s中...

6 2Dijkstra演算法 通過邊實現鬆弛

includeusing namespace std int main else e i j inf 讀入邊 cout 請依次輸入m條邊,每條邊起點為b1,終點為b2,權重為z3。即b1 b2 z3 b1 b2 z3 e b1 b2 z3 初始化dis陣列,這裡是1號頂點到其餘各個頂點的初始路程 f...