spfa乙個很快很短適合稀疏圖的單元最短路的演算法。
但是有時用優化,在稠密圖中跑的很快。
優化1:slf
如果當前要入隊乙個點i,如果d[i] < d[head] (比隊首要優)就放入隊首,否則就放入隊尾。這個本來要用乙個雙端佇列來實現的,但是要乙個超級好實現的方法,但是比較水,但是實測很快,加進來乙個tail後,如果d[data[head+1]]>d[data[tail]] (d表示距離),那麼swap(data[head+1],data[tail])。
if(d
[last[i]][data[head+1]])swap(data
[tail],data
[head+1]);
優化2:lll
如果當前的出隊的數(data[head]),他的d[data[head]]大於佇列中所有d的平均值,那麼就把data[head]入隊,然後continue。
if(len*d[now]>z)
z-=d[now];len--;
優化3:兩點最短路優化
如果只用求s到t的最短路,那麼如果當前的d[now]>=d[t]就continue。
if(d[now]>=ans)
if(now==t&&ans>d[now])
用優化跑的速度很明顯。
過河不優化之前1271ms,三個優化打了之後338ms。
Spfa優化小結
spfa是bellman ford的優化。但是spfa還有優化餘地 一 空間優化,用迴圈佇列 要點 1 判斷隊列為空 只能用if f r if f2 取餘操作 只要加到f r操作的 所有地方就行了 二 簡單而有效的優化slf 如果隊首元素較大,則將新元素插到隊首,否則插到隊尾 slf優化 341.c...
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為常數,...