SPFA的两个优化
评测题:洛谷【模板】单源最短路径
不加任何优化:
queue<int>q;
void spfa(ll s)
{
for(ll i=;i<=n;i++) d[i]=(ll)();
d[s]=;q.push(s);v[s]=;
while(!q.empty())
{
ll ff=q.front();q.pop();v[ff]=;
for(ll i=h[ff];i;i=e[i].ne)
{
ll rr=e[i].v;
if(d[rr]>d[ff]+e[i].c)
{
d[rr]=d[ff]+e[i].c;
if(!v[rr]) q.push(rr),v[rr]=; }
}
}
}

==================================================
优化1(SLF:Small Label First):
使用双端队列(详见代码注释)
证明:显然定理
deque<ll>q;
void spfa(ll s)
{
for(ll i=;i<=n;i++) d[i]=(ll)(),v[i]=;
d[s]=;q.push_back(s);v[s]=;//双端队列
while(!q.empty())
{
ll ff=q.front();q.pop_front();v[ff]=;
for(ll i=h[ff];i;i=e[i].ne)
{
ll rr=e[i].v;
if(d[rr]>d[ff]+e[i].c)
{
d[rr]=d[ff]+e[i].c;
if(!v[rr])
{
if(q.empty() || d[rr]>=d[q.front()]) q.push_back(rr);
else q.push_front(rr);
//如果当前点的dis<队列首的dis,就把当前点放在队列首
//让它优先去更新其他点,减少入队次数
//注意,特殊情况,如果队列为空的话,要放在队列为,不然会RE
v[rr]=;
}
}
}
}
}

==================================================================================
优化2(LLL:Large Label Last):
使用双端队列,sum为队列中所以元素的dis和,o为队列中元素个数
即x=sum/o;
对于当前点i,如果dis[i]>=x 则将点i插入到队列尾,否则放到队列首。
证明:不会。
deque<int>q;
void spfa(ll s)
{
for(ll i=;i<=n;i++) d[i]=(ll)();
d[s]=;q.push_back(s);v[s]=;
sum+=d[s];o++;
while(!q.empty())
{
ll ff=q.front();q.pop_front();v[ff]=;
sum-=d[ff];o--;
for(ll i=h[ff];i;i=e[i].ne)
{
ll rr=e[i].v;
if(d[rr]>d[ff]+e[i].c)
{
d[rr]=d[ff]+e[i].c;
if(!v[rr])
{
v[rr]=;
if(q.empty() || o*d[rr]>=sum) q.push_back(rr);
else q.push_front(rr);
//注意,特殊情况,如果队列为空的话,要放在队列为,不然会RE
} }
}
}
}

=====================================================
两个优化一起上:
bool v[];
deque<int>q;
void spfa(ll s)
{
for(ll i=;i<=n;i++) d[i]=(ll)();
d[s]=;q.push_back(s);v[s]=;
sum+=d[s];o++;
while(!q.empty())
{
ll ff=q.front();q.pop_front();v[ff]=;
sum-=d[ff];o--;
for(ll i=h[ff];i;i=e[i].ne)
{
ll rr=e[i].v;
if(d[rr]>d[ff]+e[i].c)
{
d[rr]=d[ff]+e[i].c;
if(!v[rr])
{
v[rr]=;
if(q.empty() || d[rr]>=d[q.front()] || o*d[rr]>=sum)
q.push_back(rr);
else q.push_front(rr);
} }
}
}
}

至此,完。
腐草无光,化为萤而跃彩于夏月。
SPFA的两个优化的更多相关文章
- SPFA 的两个优化
From NOCOW SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将 ...
- SPFA的两个优化:SLF与LLL
先举出个例题:洛谷P3371 [模板]单源最短路径 一眼扫去:最短路径. spfa不接受反驳... 附上代码: #include<iostream> #include<algorit ...
- SPFA的两种优化
SPFA是可以优化的,这个大家都是晓得的吧. 下面介绍两种SPFA的神奇优化(我只代码实现了的一种) SLF:Small Label First策略,设要加入的节点是j,队首元素为i,若dist(j) ...
- SPFA的两个(卡时)优化
SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队 ...
- poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)
/** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...
- WebGPU学习(十一):学习两个优化:“reuse render command buffer”和“dynamic uniform buffer offset”
大家好,本文介绍了"reuse render command buffer"和"dynamic uniform buffer offset"这两个优化,以及Ch ...
- 2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)
职务地址:HDU 4725 这题卡了好长时间了,建图倒是会建,可是不会最短路的算法优化,本以为都须要堆去优化的,打算学了堆之后再来优化.可是昨晚CF的一道题..(那题也是不优化过不了..)然后我就知道 ...
- SPFA算法的SLF优化 ——loj#10081. 「一本通 3.2 练习 7」道路和航线
今天做到一道最短路的题,原题https://loj.ac/problem/10081 题目大意为给一张有n个顶点的图,点与点之间有m1条道路,m2条航线,道路是双向的,且权值非负,而航线是单向的,权值 ...
- ACM/ICPC 之 SPFA练习两道(ZOJ3088-ZOJ3103)
两道题都需要进行双向SPFA,比范例复杂,代码也较长,其中第二题应该可以用DFS或者BFS做,如果用DFS可能需要的剪枝较多. ZOJ3088-Easter Holydays //利用SPFA找出下降 ...
随机推荐
- UI自动化之日志的处理
写自动化时,我们常常希望打印出浏览器的操作记录,也同时希望报错的记录能够保留并用于问题的排查,这时候可以用到loggging模块 目录 1.logging文件 2.调用日志 1.logging文件 # ...
- DlgResToDlgTemplate 的代码,提取EXE中的资源,然后转化成C的字符串数组
代码来源:https://www.codeproject.com/Articles/13330/Using-Dialog-Templates-to-create-an-InputBox-in-C #i ...
- PMBOK
项目章程的内容1. 基于项目干系人的需求和期望提出的要求.2. 项目必须满足的业务要求或产品需求.3. 项目的目的或项目立项的理由.4. 委派的项目经理及项目经理的权限级别.5. 概要的里程碑进度计划 ...
- 【ABAP系列】SAP 销售订单的行项目里条件的增强
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 销售订单的行项目里条件的 ...
- <编译原理 - 函数绘图语言解释器(3)解释器 - python>
<编译原理 - 函数绘图语言解释器(3)解释器 - python> <编译原理 - 函数绘图语言解释器(2)词法分析器 - python> <编译原理 - 函数绘图语言解 ...
- day16 django 笔记
一 jQuery是什么? [1] jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. [2] jQuery是继prototy ...
- spring aop实现数据库的读写分离
为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库 ...
- vue+element Form键盘回车事件页面刷新解决
问题描述:如下代码所示,使用element-ui 中的el-form组件对table进行条件查询,当查询条件仅有一项时,使用@keyup.enter.native事件绑定回车事件,出现点击回车后,浏览 ...
- 引入maven以外的jar包
这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...
- echarts柱状图个数多,横坐标名称过长显示不全解决方法
当echarts柱状图个数多,横坐标名称过长时横坐标名称显示不全,网上并没有搜到太好的方法,于是自己加工了下,将横坐标名称显示前六位,当鼠标放到上面的时候显示全名,下面是示例代码,可以直接拷贝测试 代 ...