最短路徑演算法

2021-10-08 21:15:15 字數 1042 閱讀 3418

單源點路徑演算法的核心:根據鬆弛原理,在兩個頂點之間查詢第三個頂點,使其距離最短。用到的都是dp的思想

以出發點為中心,向四周進行擴散,每次將當層的節點作為(i,j)最短距離的第三個頂點k,若加入第三個頂點k後滿足(i,j) > (i,k) + (k,j),則更新(i,j) = (i,k) + (k,j).

核心:每次查詢最短距離的點

跟dijkstra演算法的思路一致,不過,該演算法以查詢最短邊為核心

弗洛伊德演算法的本質也是鬆弛原理,整體時間的複雜度為o(n^3),不管是單源點還是多源點問題,個人比較喜歡直接採用弗洛伊德演算法直接求解,演算法的整體思路比較簡單。

注意:中間點的迴圈部分必須放在最外層,原因在於:如果放在內層,極有可能出現當我們利用第三個點k更新兩個點(i,j)之間的距離時,之前的(i,k)和(k,j)之間的最短路徑還未優化。最外層的迴圈實際上是更新狀態轉移的點

具體原因可以參考floyd演算法為什麼把k放在最外層

具體應用:網路延遲時間,我之前將k放在第二層,除錯了半天也搞不清楚啥原因導致無法ac,後來才知道k一定要放在最外層,這是狀態轉移的點,可以確保在更新兩個點之間的最短距離之前,之前的最短距離已經更新到。

我採用比較直觀的寫法,空間複雜度比較高。大家可以在我的基礎上,將z放在中間層,就會發現是無法ac的,其實就是前面所說的:更新兩個點之間的最短距離之前,之前的最短距離還未更新到。

class solution 

int floyd(vector>& times, int n, int k)

for (int z = 1; z <= n; ++z) }}

}int go_time = int_min;

for (int vex = 1; vex <= n; ++vex)

return go_time;}};

[1]網路延遲時間

[2]bellman-ford和dijkstra演算法

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...

最短路徑演算法

個人覺得下面 有代表性 最短路徑演算法原始碼 vb 本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔...