评测题:洛谷【模板】单源最短路径

不加任何优化:

 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的两个优化的更多相关文章

  1. SPFA 的两个优化

    From NOCOW SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将 ...

  2. SPFA的两个优化:SLF与LLL

    先举出个例题:洛谷P3371 [模板]单源最短路径 一眼扫去:最短路径. spfa不接受反驳... 附上代码: #include<iostream> #include<algorit ...

  3. SPFA的两种优化

    SPFA是可以优化的,这个大家都是晓得的吧. 下面介绍两种SPFA的神奇优化(我只代码实现了的一种) SLF:Small Label First策略,设要加入的节点是j,队首元素为i,若dist(j) ...

  4. SPFA的两个(卡时)优化

    SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队 ...

  5. poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)

    /** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...

  6. WebGPU学习(十一):学习两个优化:“reuse render command buffer”和“dynamic uniform buffer offset”

    大家好,本文介绍了"reuse render command buffer"和"dynamic uniform buffer offset"这两个优化,以及Ch ...

  7. 2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)

    职务地址:HDU 4725 这题卡了好长时间了,建图倒是会建,可是不会最短路的算法优化,本以为都须要堆去优化的,打算学了堆之后再来优化.可是昨晚CF的一道题..(那题也是不优化过不了..)然后我就知道 ...

  8. SPFA算法的SLF优化 ——loj#10081. 「一本通 3.2 练习 7」道路和航线

    今天做到一道最短路的题,原题https://loj.ac/problem/10081 题目大意为给一张有n个顶点的图,点与点之间有m1条道路,m2条航线,道路是双向的,且权值非负,而航线是单向的,权值 ...

  9. ACM/ICPC 之 SPFA练习两道(ZOJ3088-ZOJ3103)

    两道题都需要进行双向SPFA,比范例复杂,代码也较长,其中第二题应该可以用DFS或者BFS做,如果用DFS可能需要的剪枝较多. ZOJ3088-Easter Holydays //利用SPFA找出下降 ...

随机推荐

  1. UI自动化之日志的处理

    写自动化时,我们常常希望打印出浏览器的操作记录,也同时希望报错的记录能够保留并用于问题的排查,这时候可以用到loggging模块 目录 1.logging文件 2.调用日志 1.logging文件 # ...

  2. DlgResToDlgTemplate 的代码,提取EXE中的资源,然后转化成C的字符串数组

    代码来源:https://www.codeproject.com/Articles/13330/Using-Dialog-Templates-to-create-an-InputBox-in-C #i ...

  3. PMBOK

    项目章程的内容1. 基于项目干系人的需求和期望提出的要求.2. 项目必须满足的业务要求或产品需求.3. 项目的目的或项目立项的理由.4. 委派的项目经理及项目经理的权限级别.5. 概要的里程碑进度计划 ...

  4. 【ABAP系列】SAP 销售订单的行项目里条件的增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 销售订单的行项目里条件的 ...

  5. <编译原理 - 函数绘图语言解释器(3)解释器 - python>

    <编译原理 - 函数绘图语言解释器(3)解释器 - python> <编译原理 - 函数绘图语言解释器(2)词法分析器 - python> <编译原理 - 函数绘图语言解 ...

  6. day16 django 笔记

    一 jQuery是什么? [1]   jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. [2]   jQuery是继prototy ...

  7. spring aop实现数据库的读写分离

    为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库 ...

  8. vue+element Form键盘回车事件页面刷新解决

    问题描述:如下代码所示,使用element-ui 中的el-form组件对table进行条件查询,当查询条件仅有一项时,使用@keyup.enter.native事件绑定回车事件,出现点击回车后,浏览 ...

  9. 引入maven以外的jar包

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  10. echarts柱状图个数多,横坐标名称过长显示不全解决方法

    当echarts柱状图个数多,横坐标名称过长时横坐标名称显示不全,网上并没有搜到太好的方法,于是自己加工了下,将横坐标名称显示前六位,当鼠标放到上面的时候显示全名,下面是示例代码,可以直接拷贝测试 代 ...