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

不加任何优化:

 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. RocketMQ 创建和删除 topic,以及 broker 和 nameserver 之间的心跳

    命令行主类:org.apache.rocketmq.tools.command.MQAdminStartup 客户端创建 topic 程序参数:updateTopic -n localhost:987 ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_3_对象的反序列化流_ObjectInputStream

    声明了IO异常,这里还是红色的 转换为Person对象

  3. 阶段1 语言基础+高级_1-2 -面向对象和封装_14private关键字的作用及使用

    新建一个类Person代表人 创建demo03Person类去调用Person这个类 年龄设置为负数.虽然可以设置为负数.但是这个数值不合理 外部访问这个age就会报错 负数设置不进来.正数也设置不了 ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_16-ArrayList练习一_存储随机数

    循环6次就是6.fori 循环子在外部+1就是得到的1到33的数字 list.fori遍历集合 自动生for循环的代码

  5. B-/B+树 MySQL索引结构

    索引 索引的简介 简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构” 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁 ...

  6. 整理那些用于基本生存的shell命令

    变量定义相关的 export export可以将临时定义的变量定义成环境变量 比如在一个shell中临时定义的一个变量就没法在新打开的那个shell中继续再使用 使用export之后 这个变量就变成了 ...

  7. SpringBoot(一) -- SpringBoot入门

    一.简介 Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用. 1.快速创建独立运行的Spring项目以及与主流框架集成; 2 ...

  8. Maven-maven安装、Eclipse配置maven

    1.下载maven安装包,下载完成,解压到安装路径. 2.配置环境变量 3.修改setting.xml配置本地库,阿里云中央仓库 路径:C:\fyliu\software\apache-maven-3 ...

  9. 创建Spring Boot微服务项目

    创建一个测试用的微服务项目HelloWorld 创建项目 编写服务代码 @RestController public class HelloWorld { @RequestMapping(" ...

  10. 【洛谷 p2672】推销员

    推销员[题目链接] 好了为了凑字数先把题目复制一下: 好了题解第一篇正解: 首先输入,莫得什么好说的: scanf("%d",&n); ;i<=n;i++) scan ...