spfa優化時間複雜度及判負環

2022-08-18 07:00:14 字數 1226 閱讀 7338

noi2018 day1 t1有許多人用spfa被卡掉25分。

注意:寫spfa絕對不用stl,因為出題人會不懷好意的卡掉它。

我也是願意寫spfa的人.(畢竟簡單)。在這裡總結一下spfa的優化

1.普通spfa會開乙個陣列。可以用迴圈佇列優化.(教程書中都有).

2.我們在把點加入佇列時,隨機從隊首或隊尾加入(幾乎沒人會卡掉)。

如果嫌麻煩,可以開成棧。

3.設要加入的節點是j,隊首元素為i,若dist(j) < dist(i),則將j插入隊首,否則插入隊尾。

4.設隊首元素為i,每次彈出時進行判斷,佇列中所有dist值的平均值為x,若dist(i)>x則將i插入到隊尾,查詢下一元素,直到找到某一i使得dist(i)<=x,則將i出對進行鬆弛操作。

這幾種方法選一種或兩種就夠了。

普通spfa就不說了。

負環就是在普通spfa上加一句話,若擴充套件的點已經被擴充套件n次就說明有負環了。

題目:vijos p1053 easy sssp

**如下:

#include#include#define n 101000

int n,m,s;

int to[n];

int head[n];

int nex[n];

int val[n];

int f[n];

int que[n];

int cnt[n];

int is[n];

int inq[n];

int a,b,c,idx;

void push(int &x)

void addedge(int a,int b,int c)

bool spfa(int s)

}} }

return 1;

}int main()

if(a!=b)

addedge(a,b,c);

} memset(f,0x3f,sizeof(f));

memset(que,0,sizeof(que));

int maxn=n+1;//建乙個空節點,用這個點跑spfa

for(int i=1;i<=n;i++)

addedge(maxn,i,0);

if(!spfa(maxn))

spfa(s);

for(int i=1;i<=n;i++)

return 0;

}

spfa演算法及判負環詳解

spfa shortest path faster algorithm 是一種單源最短路徑的演算法,基於bellman ford演算法上由佇列優化實現。也就是說,bellman ford是一種無腦,瘋狂鬆弛的演算法。其複雜度為o nm 可想而知,對於上萬的資料會炸的一塌糊塗。相對而言,spfa顯得就...

預處理優化時間複雜度

開始,我認為需要列舉所有的子串來判斷是否包括列表中的某個字串。因為給定字串包括l個字元,就會有l 個子串,依次列舉列表中所有的字串,就會有n種可能,再執行kmp。在每個子串單拿出來做kmp時,每個子串的均攤最好平均複雜度是l 3,因為從0 1中隨機選兩個數,它們的平均距離是1 3。而最壞平均複雜度是...

時間複雜度及空間複雜度

一.時間複雜度 時間複雜度實際就是乙個函式,該函式計算的是執行基本操作的次 數,而不是程式執行時間。1.在實際中通常關注的是演算法的最壞運 況。乙個演算法的最壞情況的執行時間是在任意輸入下的執行時間上界。一般情況下使用o漸進表示法來計算演算法的時間複雜度。2.書寫方式 例1 void test in...