最短路演算法總結

2022-07-15 18:00:18 字數 2324 閱讀 6692

1.floyd演算法 (n^3複雜度)

基本思想:開始設集合s的初始狀態為空,然後依次將0,1,。。n-1定點加入,同時用d[i][j]儲存從i到j,僅經過s中的定點的最短路徑,在初始時刻,d[i][j] = a[i][j]中間不經過任何節點,然後依次向s中插入節點,並進行如下更新

d(k)[i][j] = min

還可以使用乙個二維陣列path指示最短路徑。

path[i][j]給出從定點i到j的最短路徑上,定點i的前乙個頂點

**相當簡單,最容易的實現方法:

for (k = 0;k < n;k++)

for (i = 0;i < n;i++)

for (j = 0;j < n;j++)

}

view code

然後可以通過遞迴得出路徑的。。

2.dijstra演算法

單源最短路問題,先加入源,維持一張表來儲存此時到源中的最短距離,選取最小的加入,然後更新表,不斷的加入直到目的地在源中。僅適用於正邊權的時侯,因為這時我們可以保證任意加入的點已經找到了源到該點的距離。

3.bellman-ford演算法

最優性原理

最優性原理介紹及簡單證明見:

它是最優性原理的直接應用,演算法基於以下事實:

如果最短路存在,則每個頂點最多經過一次,因此不超過n-1條邊;

長度為k的路由長度為k-1的路加一條邊得到;

由最優性原理,只需依次考慮長度為1,2,…,k-1的最短路。

適用條件&範圍

單源最短路徑(從源點s到其它所有頂點v);

有向圖&無向圖(無向圖可以看作(u,v),(v,u)同屬於邊集e的有向圖);

邊權可正可負(如有負權迴路輸出錯誤提示);

差分約束系統(需要首先構造約束圖,構造不等式時》=表示求最小值,作為最長路,<=表示求最大值,作為最短路。<=構圖時,有負環說明無解;求不出最短路(為inf)為任意解。>=構圖時類似)。  

演算法描述

1)對每條邊進行|v|-1次relax操作;

2)如果存在(u,v)∈e使得dis[u]+w

for i:=1 to |v|-1

do//

進行|v|-1次鬆弛得最短距離

for 每條邊(u,v)∈e do

relax(u,v,w);

for每條邊(u,v)∈e

do//

判斷是否存在負權環

if dis[u]+w

then exit(false)

view code

演算法時間複雜度o(ve)。因為演算法簡單,適用範圍又廣,雖然複雜度稍高,仍不失為乙個很實用的演算法。  

改進和優化  如果迴圈n-1次以前已經發現不存在緊邊則可以立即終止;

4.spfa演算法

spfa(shortest path faster algorithm)是bellman-ford演算法的一種佇列實現,減少了不必要的冗餘計算。它可以在o(ke)的時間複雜度內求出源點到其他所有點的最短路徑,可以處理負邊。

演算法流程  

spfa對bellman-ford演算法優化的關鍵之處在於意識到:只有那些在前一遍鬆弛中改變了距離估計值的點,才可能引起他們的鄰接點的距離估計值的改變。因此,演算法大致流程是用乙個佇列來進行維護,即用乙個先進先出的佇列來存放被成功鬆弛的頂點。初始時,源點s入隊。當佇列不為空時,取出隊首頂點,對它的鄰接點進行鬆弛。如果某個鄰接點鬆弛成功,且該鄰接點不在佇列中,則將其入隊。經過有限次的鬆弛操作後,佇列將為空,演算法結束。spfa演算法的實現,需要用到乙個先進先出的佇列 queue 和乙個指示頂點是否在佇列中的標記陣列mark。為了方便查詢某個頂點的鄰接點,圖採用臨界表儲存。

procedure spfa;

begin

initialize-single-source(g,s);

initialize-queue(q);

enqueue(q,s);

while not empty(q) do

begin

u:=dequeue(q);

for each v∈adj[u] do

begin

tmp:=d[v];

relax(u,v);

if (tmp<>d[v]) and (not v in

q) then enqueue(q,v);

end;

end;

end;

view code

注意:spfa演算法只有在不存在負權環的情況下可以正常的結束,如果存在負權環,那麼將總有頂點在入隊和出隊往返,佇列無法為空,這種情況下spfa無法正常結束。可以通過新增乙個變數表示每個頂點進入佇列的次數,如果大於|v|那麼就可以說明存在負權環

最短路演算法總結

1.floyd演算法 n 3複雜度 基本思想 開始設集合s的初始狀態為空,然後依次將0,1,n 1定點加入,同時用d i j 儲存從i到j,僅經過s中的定點的最短路徑,在初始時刻,d i j a i j 中間不經過任何節點,然後依次向s中插入節點,並進行如下更新 d k i j min 還可以使用乙...

最短路演算法總結

藉著usaco 3.26搞了幾天最短路。不得不說usaco真是菜鳥學習演算法的利器啊,有資料可以查錯。題上是乙個800 800的稀疏圖,需要求全源最短路 先用floyd試了一下。畢竟就三行,很好寫。時間o n3 裸交第九個點果然tle了,不過看題解有人水過了 就把邏輯語言改了一下,無向圖時間又可以優...

最短路演算法總結

dijkstra演算法 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。最常見的問題就是 給你一張地圖,讓你求出指定的點到其餘各定點的最短路徑。演算法核心 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終的到源點到其餘所有點...