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

不加任何优化:

 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. free pascal

    https://freepascal.org/ free pascal OPEN SOURCE COMPILER FOR PASCAL AND OBJECT PASCAL GENERAL HomeNe ...

  2. MM理论

    最初的MM理论,即由美国的Modigliani和Miller(简称MM)教授于1958年6月份发表于<美国经济评论>的“资本结构.公司财务与资本”一文中所阐述的基本思想.该理论认为,在不考 ...

  3. 分享:陆行鸟BGM合集

    第39首是原版哦 https://pan.baidu.com/mbox/homepage?short=pMkAqhX

  4. 简单DP入门(一) 数字三角形

    数字三角形

  5. Java集合概括总结及集合选用

    Collection 1. List ArrayList :Object数组,是一个数组队列,相当于动态数组.它由数组实现,随机访问效率高,随机插入.随机删除效率低. LinkedList :是一个双 ...

  6. [APIO 2010] [LOJ 3144] 奇怪装置 (数学)

    [APIO 2010] [LOJ 3144] 奇怪装置 (数学) 题面 略 分析 考虑t1,t2时刻坐标相同的条件 \[\begin{cases} t_1+\lfloor \frac{t_1}{B} ...

  7. ES6精解:变量的解构赋值

    1.数组的解构赋值 我们知道以前我们给一个变量赋值要这样如下: let a = 1; let b = 2; let c = 3; 但是ES6出来之后,我们可以这样: let [a, b, c] = [ ...

  8. Webpack4、iView、Vue开发环境的搭建

    导读 项目使用了 yarn ,一个快速.可靠.安全的依赖管理工具.yarn 是一个类似于npm的包管理工具,它是由 facebook 推出并开源,它在速度,离线模式,版本控制的方面具有独到的优势.此项 ...

  9. POJ3321[苹果树] 树状数组/线段树 + dfs序

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:39452   Accepted: 11694 Descr ...

  10. LOJ 3175. 「IOI2019」排列鞋子

    传送门 考虑如果能确定每个鞋子最终交换到的位置,那么答案容易算出 具体地,如果原位置为 $i$ 的鞋子要交换到 $pos[i]$ 那么最终答案就是 $pos$ 的逆序对数量 如果不懂可以先去写 NOI ...