简介

  • 在图论中,最短路是十分重要的一部分,在很多问题中都有涉及

  • 而现在所讲的 SPFA 算法是十分优秀的算法,时间复杂度为 O(k∗E)O(k*E)

  • 其中 EE 是图的边数,而 kk 是一个常数,一般极小。

  • 事实上 SPFA 就是在 Bellman-ford 算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。

  • 而且 SPFA 还能判负环,这种情况下类似 Dijkstra 算法等便没有了用武之地!

用法

  • 在队列中进行,在点出队入队中更新值

  • SPFA算法(BFS)模板如下:

void spfa_bfs(int st)
{memset(dis,60,sizeof(dis));memset(bz,false,sizeof(bz));int l=0,r=1;dis[que[1]=st]=0;while(l<r){int now=que[++l];bz[now]=false;for(int i=first[now];i;i=next[i])if(dis[now]+w[i]<dis[en[i]]){dis[en[i]]=dis[now]+w[i];if(!bz[en[i]]) bz[que[++r]=en[i]]=true;}}return false;
}
  • 注释:其中 que[]que[] 为队列,dis[]dis[] 为点到源点距离,l,rl,r 分别左右指针,bz[]bz[] 为标志->点是否入队。

  • SPFA算法(DFS)模板如下:

void spfa_dfs(int x)
{bz[x]=true;for(int i=first[x];i;i=next[i])if(dis[now]+w[i]<dis[en[i]]){dis[en[i]]=dis[now]+w[i];if(!bz[en[i]]]) spfa(en[i]);}bz[x]=false;
}  

判负环

  • SPFA算法还有一个大优点是可以判负环

  • 利用 SPFA 算法判断负环有两种方法:

    1. SPFA算法 的 dfs 形式,判断条件是 存在一点在一条路径上出现多次
    2. SPFA算法 的 bfs 形式,判断条件是 存在一点入队次数大于总顶点数

总结

  • SPFA算法效率高,实用性强,是很有用的算法!

单源最短路 SPFA 算法模板相关推荐

  1. 单源最短路 dijkstra算法模板

    链接: 模板题 不能处理带负边权的情况 /* 邻接矩阵存图 1.从源点开始每次选取一个离点集距离最近的点t 添加到集合中 2.利用t点对集合中的点进行松弛操作,进行更新 时间复杂度o(n²) */ # ...

  2. 算法百题斩其三: 单源最短路与算法——其一

    算法百题斩其三: 单源最短路与算法--其一 写在前面:何所谓"斩"? 斩,即快速而有力地切断,指我们用最精简的语言,一针见血地点破算法题的核心难点.斩需三思而后行:斩需借助外力.旁 ...

  3. 单源最短路 Dijkstra算法 和 SPFA算法

    单源最短路 •从一个点出发,到达其他顶点的最短路径的长度. •基本操作:松弛 •d[u]+map[u, v]< d[v]这样的边(u,v)称为紧的(tense),可以对它进行松弛(relax): ...

  4. 单源最短路——dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...

  5. 【POJ - 2387】 Til the Cows Come Home(单源最短路Dijkstra算法)

    题干: Bessie is out in the field and wants to get back to the barn to get as much sleep as possible be ...

  6. 最短路问题之单源最短路-Dijkstra算法

    一个点(源点)到其余各个顶点的最短路径,叫做单源最短路经. 例如求下图中的1号顶点到2,3,4,5,6号顶点的最短路径. 使用二维数组e来存储顶点之间边的关系,初始值如下表. e 1 2 3 4 5 ...

  7. HDU 2066 一个人的旅行(单源最短路SPFA)

    Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...

  8. uva 10099 The Tourist Guide(单源最短路/spfa/dijkstra)

    题目: 链接:点击打开链接 题意: 思路: 代码: #include <iostream> #include <cstring> #include <cstdio> ...

  9. [hiho 23]单源最短路-Dijstra算法

    题目描述 维护一个集合,集合中的元素与点u的最短距离已经确定,求出集合内元素所能到达的点到点u的距离,取最短的距离对应的点加入集合直到集合包含点v. 每次更新距离只与新加入集合的点有关. #inclu ...

最新文章

  1. esp32 python-ESP32及其开发板介绍
  2. 兼容单片机的CRC32查表计算程序的C语言实现
  3. mysql设置停止二进制文件的操作_window下使用二进制文件对mysql数据库备份及恢复(再现用户操作)...
  4. 【js】JavaScript parser实现浅析
  5. 网口监视报文工具_真是神器!这款网络排查工具!
  6. 一大波问题解决和配置备份 WCF快炼成精了
  7. Flash游戏抓取,flash网站抓取,flash网站下载工具
  8. Android仿微信朋友圈发动态功能(相册图片多选)
  9. PHP如何获取当前域名
  10. 面经-毕马威南京-实习-算法-20191216
  11. 微信小游戏开发怎么选游戏引擎
  12. erp系统与mes集成:制造业信息化发展中必不可少的阶段
  13. [深度学习概念]·非极大值抑制解析
  14. fastlane二开java_iOS中使用Fastlane实现自动化打包和发布
  15. python查看mac的usb信息_Python实现的读取电脑硬件信息功能示例
  16. 啊哈添柴挑战1057向世界问好C++
  17. 全球案例 | 一家有着百年历史的航空公司如何扩展和转型,推动航空业创新
  18. 10.10 fplot绘图指令
  19. 顺丰测试开发面试总结
  20. 2010年01月读书单

热门文章

  1. C编程,随机数,排序
  2. R学习_multitaper包解析1:子函数centre,dpss
  3. 统计学习:方差分析(ANOVA2)
  4. RedHat Enterprise Linux6.4 使用CentOS yum源
  5. 多径信道理论的直观感受与MATLAB仿真
  6. 科大星云诗社动态20210428
  7. Pyinstall打包多个python脚本,包含DLL文件
  8. 小米wifi每天晚上准时断网_小米路由器遭恶意抹黑 官方回应:抵制这种下三滥...
  9. SiamNet: 全卷积孪生网络用于视频跟踪
  10. 如何编写一个Jquery插件