Spfa優化小結

2021-06-01 02:49:48 字數 657 閱讀 5267

spfa是bellman-ford的優化。但是spfa還有優化餘地

一.空間優化,用迴圈佇列

要點:1、判斷隊列為空:只能用if (f!=r)

if(f2、取餘操作:只要加到f、r操作的

所有地方就行了

二.簡單而有效的優化slf

如果隊首元素較大,則將新元素插到隊首,否則插到隊尾

slf優化(341.cpp)要點:

1、比較新節點和隊首節點時隊首為que[l+1]

2、左開右閉的雙端佇列,插入隊首時要後遞減que[l--] = ths->index;

3、slf的原理見

(貌似網上都說用slf再加lll,反而會更慢)

三.前向星優化

速度比用鍊錶快,主要耗時在快排上,如果用鏈式前向星,幾乎就完美了,快排都不需要,前向星是個好東西啊。

前向星要點:

1、讀入邊表

2、根據起始點排序

3、計算以每個點為起始點的陣列中一段的邊

for(long i=1;iif(f[bian[i].f]==0)

f[bian[i].f]=i;

(優化:鏈式前向星

另外 heap+dijkstra也很高效,**實現複雜一些

(rqnoj341星門跳躍,裸spfa+鍊錶過不了,加上二或三優化均能ac)

SPFA優化總結

spfa乙個很快很短適合稀疏圖的單元最短路的演算法。但是有時用優化,在稠密圖中跑的很快。優化1 slf 如果當前要入隊乙個點i,如果d i d head 比隊首要優 就放入隊首,否則就放入隊尾。這個本來要用乙個雙端佇列來實現的,但是要乙個超級好實現的方法,但是比較水,但是實測很快,加進來乙個tail...

DIJ的優化,和spfa的優化

spfa和dij求最短路的演算法的坑點一直是很多的。經常會讓人搞不懂。用過載運算子來排序,如 struct cmp 這種做法是不對的,該dis值在堆裡不會更新甚至會堵住。目前只有兩種優化演算法最可靠,分別為優先佇列來優化spfa或dij。每次從堆中只需要取出到t的最短路最小的元素進行鬆弛,這樣便可以...

SPFA演算法以及其優化

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