單源點路徑演算法的核心:根據鬆弛原理,在兩個頂點之間查詢第三個頂點,使其距離最短。用到的都是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 檔...