SPFA經典優化

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章