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無法處理負權邊的狀況 這個我這篇部落格不細講 而貝爾曼 福特...