最短路 SPFA演算法實現

2022-05-10 07:42:08 字數 1274 閱讀 9190

感謝caioj scy老師通俗易懂的講解,非常可惜小白菜要登出了,學oi太晚,還妹有來得及做多少裡面的題,遺憾。

(題目是caioj1088)

#include#include

using

namespace

std;

struct bian//

表示有向邊的結構體,構建編目錄;

bian a[

210000

]; int len,n,last[11000];//

a的個數是邊的個數,last的個數是點的個數。 //

last[i]表示最後一條和點i相連的邊的編號。

int d[11000];//

d[i]表示目前i和出發點的最短距離

int list[11000],head,tail;//

list用來存排隊準備更新其他人的點,head表示頭,tail表示尾

void ins(int x,int y,int d)//

ins函式的功能是建立一條邊

bool v[11000];//

v[i]等於true表示點i在佇列list中,等於false表示點i不再佇列list中

int main()

//1:初始化d,這樣後面才有更新的必要

st=1;ed=n;

for(int i=1;i<=n;i++) d[i]=999999999

; d[st]=0;//

出發點為0

//2:初始化v, 一開始所有點都沒有

memset(v,false,sizeof(v)); v[st]=true;//

點1作為出發點已經進入list

//3:初始化佇列list

list[1]=st; head=1;tail=2;//

佇列的頭是有人的,佇列的尾tail指的位置是沒人的

while(head!=tail)//

只要頭不等於尾,就表示還有人需要更新別人}}

//x已經完成更新別人的任務,就要退出佇列list,那麼需要做什麼呢?

list[head]=0

; head++; if(head==n+1) head=1; //

如果head超過佇列的最後乙個,則變為第乙個

v[x]=false

; }

printf(

"%d\n

",d[n]);//

最後輸出終點到出發點的距離

return0;

}

最短路 SPFA演算法

spfa 是bellman ford的佇列優化,時效性相對好,時間複雜度o ke 與bellman ford演算法類似,spfa演算法採用一系列的鬆弛操作以得到從某乙個節點出發到達圖中其它所有節點的最短路徑。所不同的是,spfa演算法通過維護乙個佇列,使得乙個節點的當前最短路徑被更新之後沒有必要立刻...

最短路演算法 SPFA

單源最短路徑,不可以處理含負權邊的圖但可以用來判斷是否存在負權迴路 複雜度o ke k 2,e 為邊數 bellman ford 演算法的優化,實質與前演算法一樣,但優化的關鍵之處在於 只有那些前面被鬆弛過的點才有可能去鬆弛它們的鄰接點。include include include include...

最短路 spfa演算法

板子補完計畫絕讚繼續中 這篇部落格就來寫一寫spfa 這我居然板子都打錯了一次,我太弱啦!先來看一下定義 引自 首先說明,spfa是一種單源最短路徑演算法,所以以下所說的 某點的最短路徑長度 指的是 某點到源點的最短路徑長度 我們記源點為s,由源點到達點i的 當前最短路徑 為d i 開始時將所有d ...