SPFA及其優化 他復活了

2021-09-11 17:56:24 字數 1353 閱讀 8571

spfa算是一種比較萬能的最短路演算法了

時間複雜度:o(mn)

特點:1.每個點可以入隊多次

2.不能處理負環,但可以判斷負環

3.佇列優化減少一些冗餘的鬆弛操作

貼乙個模板題

#include#include#include#include#include#include#includeusing namespace std;

struct node

t[1000000];

int n,m,tot,a,b,c;

bool v[10000];

int d[10000],head[10000],times[10000];

void init()

}void add(int x,int y,int z)

bool spfa(int start)}}

}return 1;

}int main()

if(spfa(1))printf("%d\n",d[n]);

else printf("impossible!\n");

}return 0;

}

當然這只是樸素的spfa,做題中有好多題是專門用來卡spfa的(有點慘哦)

所以可以加優化

slf 雙端佇列 極值優化:即將入隊的點dist(i)若比隊頭元素dist(j)大,就從後面入隊,否則從前面入隊

llf 平均值優化:佇列中所有dist值的平均值為x,若即將入隊的點dist(i)>x則將i插入到隊尾,否則從前面入隊

優先佇列優化:每次入隊都從小到大自動排序,看起來每次都選取最優的,但實際每次都要維護佇列,也增加了一些不必要的操作,複雜度並不敢保證

還是這個題

#include#include#include#include#include#include#includeusing namespace std;

struct node

t[1000000];

int n,m,tot,a,b,c,sum,ts;

bool v[10000];

int d[10000],head[10000],times[10000];

void init()

sum = 0;

}void add(int x,int y,int z)

bool spfa(int start)}}

}return 1;

}int main()

if(spfa(1))printf("%d\n",d[n]);

else printf("impossible!\n");

}return 0;

}

SPFA演算法以及其優化

spfa演算法 shortest path faster algorithm 是經佇列優化的單源最短路bellman ford演算法通常用於求含負權邊的單源最短路徑,以及判負權環。spfa演算法最壞情況下複雜度和樸素的bellman ford演算法相同,為o ve 一般情況為o ke 其中k為常數,...

SPFA演算法及其應用和優化

spfa演算法及其應用和優化 by mps 問題引入 又是一年春運時,因為睡懶覺而導致搶不到票的你,只能打車回家了,而無疑會消耗許多錢財 黑車.為了盡可能的節省錢,你希望走的是最短路,路途中會經過n個城市,而你每次經過兩個城市之間的高速公路時,都會損耗ci元,假設其中包含了所有的價錢 郵費,過橋費之...

貝爾曼 福特最短路演算法及其優化(SPFA)

日常膜拜dalao 財神萬歲!日常凌晨水題解。我發誓這是我今天最後一篇部落格了。話說,我的部落格一般解釋全在 注釋裡面,而且講的不細緻。真的想詳細看模擬的話參見dalao的部落格 為什麼我們不用dijkstra演算法?因為,dijkstra無法處理負權邊的狀況 這個我這篇部落格不細講 而貝爾曼 福特...