SPFA的优化一览
序
spfa,是一个早已没人用的算法,就像那些麻木的人,
可谁有知道,他何时槃涅
一个已死的算法 ,重生
内容
关于\(NOI2018D1T1\)的惨案,为了以防spfa被卡。
关于简单的\(SLF\)优化和\(LLL\)优化,再此不在多戍,算了,还是说说吧。
LLL 同样使用双端队列,维护目前队列中元素到起点的距离的平均值(即 \(∑^{tail}_{i =head}dis[que[i]]/q.size()\)设该数为 k ,若 dis[now]>k ,则从队尾插入,否则从队首插入。
评:十分容易卡掉,加上一条权值巨大的边直接崩了
SLF 在使用queue作为spfa的辅助数据结构时,将队列替换为双端队列,每当插入元素 now 时,与队首进行比较,若 \(dis[q.front()] > dis[now]\),将 now从队首插入,否则从队尾插入。
评,这个算法,能让你,避免陷入求了很多次优解
这两个优化实际上没什么用,太过于与简单,稍微有心的出题人都会卡掉
我们再开看强一点的优化
容错后的SLF 定义容错值val,当满足 \(dis[now]-val>=dis[q.front()]\)时从队尾插入,否则从队首插入。
评:我一般将val,定为-1,大了就没用了
在此就不用deque的*begin()了,实际实现时注意即好。
MCFX 定义区间 [l,r] ,当入队节点的入队次数属于这个区间的时候,从队首插入,否则从队尾插入。
评:在某些毒瘤数据,真的很有用。
(这几个优化已经能过数据不刁钻的卡spfa的题,至于luogu的模板...fst qwq就是看着这几个优化来卡的...)
但是只要你val =-1 并且 加上MCFX,就能过了luogu的模板了
评:具体我也没有在网上找到,我说说自己理解的吧。容错SLF可以让你的程序不陷入局部最优解,与模拟退火类似;而mcfx优化是这样的,如过某个节点出发的大多数边都只能更新一个次解(说白了就是这个点如果是出题人用来故意让你经过多次的节点,并且每次更新会导致一次特别长的迭代,类似菊花图的根),那么它在队列中的优先级就会降低,就像你知道出题人用这个点来卡你,你竟然还把它最先拿来最先更新,肯定是不够好的。
至于 玄学优化,跳过好吗,我非
嵬
能不用 ,还是别用SPFA的,毕竟不要拿自己的命运做赌注
没有负权时,还是dijkstra吧
SPFA的优化一览的更多相关文章
- SPFA 小优化*2
/* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> ...
- HDU 1535 Invitation Cards(SPFA,及其优化)
题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...
- [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- 【最短路径】 SPFA算法优化
首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...
- SPFA队列优化
spfa队列优化(用来求最短路) 实现方法: 1.存入图.可以使用链式前向星或者vocter. 2.开一个队列,先将开始的节点放入. 3.每次从队列中取出一个节点X,遍历与X相通的Y节点,查询比对 ...
- spfa + slf优化
最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...
- 最短路--spfa+队列优化模板
spfa普通版就不写了,优化还是要的昂,spfa是可以判负环,接受负权边和重边的,判断负环只需要另开一个数组记录每个结点的入队次数,当有任意一个结点入队大于点数就表明有负环存在 #include< ...
- CDOJ 1287 MC挖矿世界(Spfa+set优化)
题目大意:原题链接 解题思路:此题要求多点最短距离,但是直接套用floyd会超时. 然后我们想直接从每一个点开始bfs就好了,但是还是会TLE,为什么呢? 因为你访问了很多次没有意义的地方,因为有些点 ...
- 初识费用流 模板(spfa+slf优化) 餐巾计划问题
今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...
随机推荐
- tmobst4
(单选题)HTML代码: <table> <tr><td>Value 1</td><td></td></tr> &l ...
- Affinity Propagation
1. 调用方法: AffinityPropagation(damping=0.5, max_iter=200, convergence_iter=15, copy=True, preference=N ...
- 基于TensorFlow的MNIST手写数字识别-深入
构建多层卷积神经网络时需要多组W和偏移项b,我们封装2个方法来产生W和b 初级MNIST中用0初始化W和b,这里用噪声初始化进行对称打破,防止产生梯度0,同时用一个小的正值来初始化b避免dead ne ...
- 基于MXNet的im2rec.py的debug
1.im2rec.py调试错误:multiprocessing not available, fall back to single threaded encoding imread 经过查找发现是程 ...
- Ansible:roles初始化系统
简介 本文介绍ansible的roles,通过roles来实现系统的初始化,其相当于将ansible的playbook拆分.本文通过Jenkins,传参,调用playbook来初始化系统. Githu ...
- HTML兼容问题及解决办法
标准浏览器子元素不会撑开父元素设置好的宽度,IE6下会的: <style> .box{ width:400px;} .left{ width:200px;height:300px;back ...
- 大文件切割(split)
split提供两种方式对文件进行切割: 根据行数切割,通过-l参数指定需要切割的行数 根据大小切割,通过-b参数指定需要切割的大小 1.1 根据行数切割 如下以一个3.4G大小的日志文件做切割演示,每 ...
- 不重启 清空tomcat日志
1.重定向方法清空文件 [root@localhost logs]# du -h catalina.out 查看文件大小17M catalina.out[root@localhost logs]# ...
- Shell脚本 一键重启
有个程序必须用 kill -9 pid号 关闭后,才能重新启动,每次都要手动查找pid号,麻烦容易出错,写个shell脚本 就三行很方便,自动查找pid号-关闭程序-重启程序 #!/bin/bas ...
- Android 6.0(棉花糖)新特性
1.支持4K显示 Android 6.0本身已经支持4K显示,会通过一定优化形式使4K内容更加清晰. 2. 启动验证 (更完整的应用权限管理) Android 6.0在开机时会自动运行验证代码,检测设 ...