一、核心性质:三角不等式。最短路满足d[v]<=d[u]+w(u,v)

二、SPFA两种实现:

  常见的是基于bfs的,这是直接对bellman-ford用队列维护。根据最短路的长度最长为(n-1),以点入队n次判负环。适用于拓扑关系较强的环境。

  基于dfs的实现与前者本质相同。但实现了迭代的连续性,从而可以以搜到栈内的点来判正负环。但因迭代而导致耗时较多,易超时。

  精髓:只保存有用的状态。

三、求解最短路中两种实现方法的分析:

  bfs:某个点出队前可以被二次更新,从而使更优解替代次解,并用优解对其他值更新。

  dfs:构架形式灵活。不进行优化的情况下,次解会对其他值更新,浪费了时间。采用迭代加深,利用贪心初始解的原理,限制节点的递归深度并逐步放宽限制要求。此法在网格图上表现突出。

四、SPFA求最短路与判正(负)环的区别:(负环条件:沿环上路径可以使最短路不断减小;正环条件与之对应)

  求最短路即常见的bellman-ford的队列实现,之前又讨论了dfs实现。

  而在判环时,忽略其求最短路的作用,将dis[]初始化为0,并将全部点入队列(这里要注意,正是因为dis[]赋值为0,导致一些更新无法进行,所以要先把所有点入队)。已知存在正环,必然是由正边权引起的,那么沿环上路径一旦(d[u]+w(u,v))<0,d[v]<d[u]+w(u,v)不进行松弛。即初始化直接取边界状态,通过减少迭代次数优化算法。

五、判定正负环中两种实现方法的分析:

  bfs:1、以n次入队为判定条件,但可以在出队前进行二次更新,所以最多进行NM级更新,最大值=N*M*MaxEdge>maxlongint。借此提出:当dis[]>N*MaxEdge,可以判正环。(类比于入队n次)

    2、环构成了连通分量,那么缩点后去掉连通分量之间的边,不影响判正(负)环。

    3、牺牲程序正确性来判正(负)环。已知SPFA的平均运行时间为O(KM);而在存在环时,会因不断迭代使程序效率低下。借此提出:当程序效率低下时,存在正(负)环。表现形式为所有点入队总次数>T*(M+N),就判定存在,T一般取2,具体根据题目时限修改。分析:事实上,正是因为bfs迭代的不连续性,导致不能直接找到正环,退而求次,以n次入队判定。而n次入队其实包含了大量的冗余计算。

    注:前两条效果不明显,又以第二条代码实现复杂度高;而第三条,优化效果明显,却因为影响正确性,需灵活使用。

  dfs:正是在求解最短路中bfs的优势——二次更新,导致迭代不能连续进行,不可能找到同一个环上仍在队列中的节点。而dfs的劣势——连续迭代导致的时间复杂度较高,在判正负环时,却因对dis[]数组直接赋值0,而使效率大大提高。又因是连续迭代,很容易找到已标记的点,判定正负环。

六、小结

  求解最短路的常用形式:bfs。优化核心:用更优解代替次解进行迭代(或入队操作)。

  判定正负环的常用形式:dfs

《SPFA算法的优化及应用》——姜碧野(学习笔记)的更多相关文章

  1. 关于SPFA算法的优化方式

    关于SPFA算法的优化方式 这篇随笔讲解信息学奥林匹克竞赛中图论部分的求最短路算法SPFA的两种优化方式.学习这两种优化算法需要有SPFA朴素算法的学习经验.在本随笔中SPFA朴素算法的相关知识将不予 ...

  2. 并不对劲的图论专题(三):SPFA算法的优化

    1.bzoj1489-> 这是个新套路. 我们希望找到最小的x,那么可以二分x,然后判断是否存在圈的边权的平均值小于等于x. 设圈的边权依次为w1,w2,w3,…,wk,平均值为p, 则有p= ...

  3. 蓝书3.3 SPFA算法的优化

    T1 最小圈 bzoj 1486 题目大意: 一个环的权值平均值为定义为一个这个环上所有边的权值和除以边数 求最小的环的权值平均值 思路: 二分一个值 把所有边减去这个值 判断是否有负环 #inclu ...

  4. 基于Oracle的SQL优化(崔华著)-学习笔记

    201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...

  5. 《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇

    平均负载 指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,即平均活跃进程数 可运行状态:正在使用CPU或者正在等待CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态 (Run ...

  6. [转]SPFA算法的玄学方法

    最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2​ 优化 对一些数组的定义: di ...

  7. 队列优化dijsktra(SPFA)的玄学优化

    转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2​ 优化 对一些数 ...

  8. BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】

    传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...

  9. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

随机推荐

  1. FZU 2016 summer train I. Approximating a Constant Range 单调队列

    题目链接: 题目 I. Approximating a Constant Range time limit per test:2 seconds memory limit per test:256 m ...

  2. 使用SpringMVC+mybatis+事务控制+JSON 配置最简单WEB

    最近在总结一些项目的基础知识,根据公司最近的一些意向和技术路线,初步整理了一个简单的配置例子     1.使用springmvc代替strutsMVC     2.使用请求json数据串的方式代替传统 ...

  3. 针对谷歌默认最小字体12px的正确解决方案 (css、html)

    今天晨会,产品要求把以前12px的字体改小一点,我心想这有什么难的,就随口答应了.哪知,改css的时候,谷歌浏览器中font-size小于12px时,字体就不会再缩小了.当时我的第一反应就是会不会是其 ...

  4. 【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛

    组合计数/乘法逆元 排列组合求总方案数 这个可以用一个一维的动态规划解决: f[i][0]表示第i头牛是牝牛的方案数 f[i][1]表示第i头牛是牡牛的方案数 则转移为:f[i][0]=f[i-1][ ...

  5. 指针强转和void*

    C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的 ...

  6. ssh连接慢

    suse刚装完,开始用ssh的时候,总会遇到这样的问题:输入了用户名以后,等半天才出输入密码的框,很是急人.这是dns反查造成的.解决方法:编辑 /etc/ssh/sshd_conf , 将 #Use ...

  7. hdu 1195 Open the Lock(广搜,简单)

    题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...

  8. JsRender系列demo(9)自定义函数

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. java基础知识回顾之javaIO类--File类应用:递归深度遍历文件

    代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * ...

  10. Oracle 10 - 数据库表

    Oracle数据库表类型 1.堆表 2.索引组织表 3.索引clustered表 4.散列clustered表 5.有序散列clustered表 6.嵌套表 7.临时表 8.对象表 9.外部表 Ora ...