对于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上

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">if dis[b[x,i]]<dis[d[head]] then  
  2.                                 begin  
  3.                                         dec(head,2);  
  4.                                         d[head+1]:=b[x,i];  
  5.                                 end  
  6.                                 else  
  7.                                 begin  
  8.                                         inc(tail);  
  9.                                         d[tail]:=b[x,i];  
  10.                                 end;</span>  

优化20%左右

优化二LLL:

我们可以算出所有队列(head~tail))的元素的dis值的和,然后求出平均数

如果当前的队头i的dis值比这个平均值大,也就是说,后面有存在比这个点更加有可能为最短路的值

那么把队头的数放到队尾

每次如此,知道有一个小于等于平均值

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">inc(head);  
  2.                 ans:=0;  
  3.                 for i:=head to tail do  
  4.                         ans:=ans+dis[d[i]];  
  5.                 ans:=ans/(tail-head+1);  
  6.                 while dis[d[head]]>ans do  
  7.                 begin  
  8.                         inc(tail);  
  9.                         d[tail]:=d[head];  
  10.                         inc(head);  
  11.                 end;  
  12.                 x:=d[head];//后面继续进行SPFA</span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值