一、核心性质:三角不等式。最短路满足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. 2013 Asia Hangzhou Regional Contest

    Lights Against Dudely http://acm.hdu.edu.cn/showproblem.php?pid=4770 15个位置,所以可以暴力枚举那些放,对于放的再暴力枚举哪个转, ...

  2. Webbrowser 取消下载提示框

    在使用Webbrowser抓取网页信息时,碰到需要下载文件,这时需要用户介入操作,如何避免: 首先引进 [DllImport("urlmon.dll", CharSet = Cha ...

  3. 【redis】03list类型

    list类型 redis的list类型是一个链表结构,他的主要功能是push.pop.获取一个范围的所有值等等一些操作, 咱们push什么意思,push是不是相当于咱们php里面的array_push ...

  4. js和jquery获取文档对象以及滚动条位置

    <div style="width:120px;height:120px;border:1px solid red; position:absolute; left:800px; to ...

  5. JAVASCRIPT中的作用域和原型链,应该算是难点了,要好好多学学,练练

    今天初六,要上班啦... JAVASCRIPT,看来是丢不了了.. http://www.dengdeng90.com/wordpress/?p=241 http://www.cnblogs.com/ ...

  6. [SQL Server系] -- 基本概念

    以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有  一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...

  7. cojs 安科赛斯特 题解报告

    QAQ 从IOI搬了一道题目过来 官方题解貌似理论上没有我的做法优,我交到BZOJ上也跑的飞快 结果自己造了个数据把自己卡成了4s多,真是忧桑的故事 不过貌似原题是交互题,并不能离线 说说我的做法吧 ...

  8. 欧拉工程第58题:Spiral primes

    题目链接 Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; impo ...

  9. 2014-9-17二班----7 web project

    package cn.rwkj.servlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServle ...

  10. 手动安装UniDAC的过程

    每次安装都不一样,而且有时候挺麻烦的,所以记下来.我这次安装过程是这样的: 0. 修改Source\Delphi7\Make.bat,填入正确的IdeDir 1.找到source\delphi7目录, ...