Spfa單源最短路徑演算法

2021-07-16 14:29:26 字數 1079 閱讀 4339

spfa 全稱shortest path faster algorithm,是求單源最短路徑的一種演算法.跟dijkstra類似,但是有一些不一樣。(由於本人弱,不知道**有區別,請各位大神補充)

我們來建乙個圖。

首先,我們用e陣列表示各邊的關係,如下是初始狀態。

我們開乙個dis陣列來儲存1號點到各點的最短距離。

1.我們來建乙個佇列d,每一次取隊頭作為起點,然後去更新能夠改變最短距離的點。

2.鬆弛操作:如果能夠更新2號點的最短距離,那麼當且僅當dis[3]+e[3][2]< dis[2]。

然後變成這樣:

就這樣,最後答案如下:

void spfa(int x)

u[隊頭]=false(出隊)}}

while tdo

begin

inc(t);

now:=head[d[t]];

while

now<>0

do begin

if f[d[t]]+v[now]now]] then

begin

f[go[now]]:=f[d[t]]+v[now];

ifnot u[go[now]] then

begin

inc(w);

d[w]:=go[now];

u[go[now]]:=true;

end;

end;

now:=next[now];

end;

u[d[t]]:=false;

end;

spfa對於很多問題很實用,掌握它能夠更容易解出很多題目。

單源最短路徑 SPFA演算法

求單源最短路徑的spfa演算法在bellman ford演算法的基礎上進行了改進,使其在能夠計算帶負權圖的單源最短路徑的基礎上,時間複雜度大幅度降低。時間複雜度 o k e k 2 基本演算法 設立乙個先進先出的佇列來儲存待優化的節點,優化時每次取出隊首節點u,並且用u點當前的最短路徑估計值對離開u...

單源最短路徑 SPFA

給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短路徑長...

單源最短路徑之SPFA演算法實現

這裡來簡單介紹下spfa演算法。1 spfa演算法是求解單源最短路徑的,時間複雜度為0 kn 一般k 2。所以該演算法高效。2 以下的 借助stl中的vector,用臨界表來儲存圖的。3 如果要輸出一條最短路徑對應的路線,我們可以用source表來記錄。例如source a b,表示a的前驅為b。這...