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。這...