最短路徑演算法

2021-04-30 12:56:29 字數 1051 閱讀 7001

一,動態規劃:

設起點為st,終點為ed。

用dis(v)表示v到st的距離。

動態規劃方程:dis(v)=$min_$

初值dis(st)=0。

偽**:(帶open標記,省略了追蹤陣列per)

dis(st)=0

open(st)=true;

for all v!=st

dis(v)=∞

open(v)=false

for 1:|v|-1//推進|v|-1次

for v中所有open=true的節點u

open(u)=false;//關閉

for (u,v)∈e

dis(v)=min;

open(v)=true;//開啟

時間複雜度o(n^3)

注:此演算法即所謂的bellman-ford演算法(但新增了open標記),對於含負邊的圖也有效,如果要檢測負環只需在|v|-1次推進後再推進一次,如果本次推進中某個dis值減小,則存在負環。

二,dijkstra演算法:

若圖中所有邊權非負,則open=true的點中dis最小者只有刷別人的份,而自身永遠不會再被別人刷,所以其dis值必已無可改進,所以此時bellman演算法可改進為dijkstra演算法。

偽**:(省略per)

dis(st)=0

open(st)=true

for all v!=st

dis(v)=∞

open(v)=false

while open(ed)!=false//終點未關閉

;open(v)=true;//開啟} }

注:由於open=false的點的dis值必已達終態,故只要open(ed)==false即可斷定計算已完成。

時間複雜度o(|v|^2)。

三,dag(有向無環圖)中的最短路徑

1,對頂點拓撲排序。

2,對頂點拓撲序列進行一遍掃瞄,用每個頂點刷其所有後繼。

兩步時間複雜度均為o(e),故總時間複雜度o(e)。

注:此演算法也適用於含負邊的情況並且也可用於求dag中的最長路徑(關鍵路徑)。

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的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 檔...