SPFA優化總結

2021-07-24 14:54:36 字數 792 閱讀 4576

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為常數,...