SPFA對於稀疏圖非常的有用,然而對於稠密圖就是辣雞。。(還是很厲害的)。
稠密圖可以使用dij,但是SPFA真的敗給了稠密圖了嗎?
答案是不是的,優化強着呢,槓槓滴~
優化一:SLF
怎麼做呢?
假設我們當前在跑SPFA的最短路(下面都是)。
設我們的隊頭爲i,要加進去隊列的數爲j,那麼我們就可以根據最短路,加出如下優化
若dis[j]小於dis[i],那麼j加進隊列的開頭,反之,加入隊尾。
爲什麼呢?因爲j比i更有可能是最短路的一個點,所以我們先進行如何?
實現怎麼弄?
因爲head=1必定不可能進行如上情況。
只有head>1纔有如上情況。
我們先把head-2,因爲當前隊頭爲head,下一次+1就到了head-1了
然後j放在head-1上:
優化20%左右
begin
if dis[b[x,i]]<dis[d[head]] then
begin
dec(head,2);
d[head+1]:=b[x,i];
end
else
begin
inc(tail);
d[tail]:=b[x,i];
end;
end;
優化二:LLL
我們可以算出所有隊列(head~tail))的元素的dis值的和,然後求出平均數
如果當前的隊頭i的dis值比這個平均值大,也就是說,後面有存在比這個點更加有可能爲最短路的值
那麼把隊頭的數放到隊尾
每次如此,知道有一個小於等於平均值。
inc(head);
ans:=0;
for i:=head to tail do
ans:=ans+dis[d[i]];
ans:=ans/(tail-head+1);
while dis[d[head]]>ans do
begin
inc(tail);
d[tail]:=d[head];
inc(head);
end;
x:=d[head];//後面繼續進行SPFA