一、核心性质:三角不等式。最短路满足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. vim插件介绍

    代码补全 http://blog.sina.com.cn/s/blog_a6559d920101acv3.html这个牛逼.************************************** ...

  2. json封装与解析

    #include <iostream> #include <boost/property_tree/ptree.hpp> #include <boost/property ...

  3. 01-07-01【Nhibernate (版本3.3.1.4000) 出入江湖】并发控制

    Nhibernate 并发控制 [1]悲观并发控制 正在使用数据的操作,加上锁,使用完后解锁释放资源. 使用场景:数据竞争激烈,锁的成本低于回滚事务的成本 缺点:阻塞,可能死锁 [2]乐观并发控制: ...

  4. Unity3D脚本中文系列教程(十六)

    Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocess ...

  5. Web Server 和 HTTP协议(转)

    转自:http://www.kuqin.com/shuoit/20150809/347488.html 一直在找实习,有点什么东西直接就在evernote里面记了,也没时间来更新到这里.找实习真是个蛋 ...

  6. 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)

      定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...

  7. SilverLight页面跳转(转载)

    // Silverlight页面的跳转 // (Application.Current.RootVisualasIContent).Content=newDragControl(); //Silver ...

  8. *[codility]MinAvgTwoSlice

    https://codility.com/demo/take-sample-test/min_avg_two_slice 此题要求一个数组子段的最小的平均数(返回第一个数字的index).刚开始想记录 ...

  9. SQL Server数据导入导出的几种方法

    在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,结合我在做项目时的经历做一下汇总: 1. SQL Server导入导出向导,这种方式是最方便的. 导入向导 ...

  10. VirtualUI - Convert your Windows App to HTML5

    http://www.cybelesoft.com/thinfinity/virtualui/