3.1最短路之单源最短路(SPFA)

松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离。

邻接表:表示与一个点联通的所有路。

如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0,

就说这条路是一个负权回路。

回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出。它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环。

SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的,dfs的话判断负环很快(我也看不懂,推介宽艘)。

  1. int n; //表示n个点,从1到n标号
  2. int s,t; //s为源点,t为终点
  3. int d[N]; //d[i]表示源点s到点i的最短路
  4. bool vis[N]; //vis[i]=1表示点i在队列中
  5. queue<int>q; //队列
  6. int spfa_dfs(int u)
  7. {
  8. vis[u]=true;
  9. ;k=e[k].next)
  10. {
  11. int v=e[k].v,w=e[k].w;
  12. if(d[v]>d[u]+w)
  13. {
  14. d[v]=d[u]+w;
  15. if(vis[v]) return true;
  16. else if(spfa_dfs(v)) return true;
  17. }
  18. }
  19. vis[u]=false;
  20. }

Bfs版:

/*

给出一个有N个节点,M条边的带权有向图.判断这个有向图中是否存在负权回路.

如果存在负权回路, 只输出一行-1;

如果不存在负权回路,再求出一个点S到每个点的最短路的长度.

约定:S到S的距离为0,如果S与这个点不连通,则输出NoPath.

点数N,边数M,源点S;以下M行,每行三个整数a,b,c表示点a,b之间连有一条边,权值为c

如果存在负权环,只输出一行-1,否则按以下格式输出共N行,第i行描述S点到点i的最短路:

如果S与i不连通,输出NoPath;如果i=S,输出0;其他情况输出S到i的最短路的长度

INPUT:

6 8 1

1 3 4

1 2 6

3 4 -7

6 4 2

2 4 5

3 6 3

4 5 1

3 5 4

OUTPUT:

0 6 4 -3 -2 7*/

  1. #include<cstdio>
  2. using namespace std;
  3. struct point
  4. {
  5. int ans; //距离源点的最短距离
  6. int lson; //最后的儿子
  7. int p; //被放进序列(list)的次数统计
  8. int v; //是否在序列(list)中
  9. }a[];
  10. struct road
  11. {
  12. int x,y,c,g;//起点、终点、长度和哥哥
  13. }b[];
  14. void BuildRoad(void);
  15. void ShortRoad(int);
  16. ],n,m,s,k;//路的数量
  17. bool bo;
  18. int main()
  19. {
  20. scanf("%d %d %d",&n,&m,&s);
  21. k=;
  22. ;i<=n;i++) a[i].lson=;//放在建路之前
  23. ;i<=m;i++) BuildRoad();
  24. bo=true;
  25. ;i<=n;i++)
  26. {
  27. ShortRoad(i);//寻找负权回路
  28. if(bo==false)
  29. {
  30. printf("-1");
  31. ;
  32. }
  33. }
  34. ShortRoad(s);
  35. ;i<=n;i++)
  36. ) printf("NoPath\n");
  37. else printf("%d\n",a[i].ans);
  38. }
  39.  
  40. void BuildRoad(void)
  41. {
  42. int x,y,c;
  43. scanf("%d %d %d",&x,&y,&c);
  44. k++;
  45. b[k].x=x;
  46. b[k].y=y;
  47. b[k].c=c;
  48. b[k].g=a[x].lson;
  49. a[x].lson=k;
  50. }
  51.  
  52. void ShortRoad(int st)
  53. {
  54. ;i<=n;i++)
  55. {
  56. a[i].ans=;
  57. a[i].p=;a[i].v=;
  58. }
  59. a[st].ans=; a[st].p=;
  60. a[st].v=]=st;
  61. //放入序列中
  62. ,wei=;
  63. ) wei=;//循环数组
  64. while(tou!=wei)
  65. {
  66. int x=list[tou];
  67. ;i=b[i].g)
  68. {
  69. int y=b[i].y;
  70. if(a[y].ans>a[x].ans+b[i].c)
  71. {
  72. a[y].ans=a[x].ans+b[i].c;//松弛
  73. if(a[y].v==false)//如果还没有放入
  74. {
  75. a[y].p++;
  76. if(a[y].p>n)
  77. {
  78. bo=false;return;
  79. }
  80. a[y].v=;list[wei++]=y;
  81. ) wei=;
  82. }
  83. }
  84. }
  85. a[x].v=false; tou++;
  86. ) tou=;
  87. }
  88. }

进阶:

  1. 【宽搜高级利用】最后的战犯
  1. 【两个人,一步一步。。。。】
  1.  
  1. 最短路变例
  1. 【坐标计算】
  1.  
  1. 【宽搜变例】【按照一定次序】密室逃脱
  1. bfs+dfs
  1.  
  1. [JSOI2008]星球大战StarWar
  1. 【并查集+最短路】

模板C++ 03图论算法 1最短路之单源最短路(SPFA)的更多相关文章

  1. 模板C++ 03图论算法 2最短路之全源最短路(Floyd)

    3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...

  2. Fire-Fighting Hero(多源最短路和单源最短路)

    题:https://nanti.jisuanke.com/t/41349 分析:对于hero来说,走单源最短路,然后遍历dis数组中的最大值即可找到,对于消防员来说,走多源最短路,只需要建个超级起点连 ...

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

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

  4. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  5. 图论-单源最短路-SPFA算法

    有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...

  6. 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结

    刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...

  7. 单源最短路模板(dijkstra)

    单源最短路(dijkstra算法及堆优化) 弱化版题目链接 n^2 dijkstra模板 #include<iostream> #include<cstdio> #includ ...

  8. 用scheme语言实现SPFA算法(单源最短路)

    最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...

  9. 【算法】单源最短路——Dijkstra

    对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...

随机推荐

  1. Keepalived高可用集群实践

    (1)实践的硬件环境准备 准备4台物理服务器或者4台VM虚拟机,其中两台用来做Keepalived服务器,两台做web测试站点 HOSTNAME I  P 解    释 lb01 10.0.0.7 K ...

  2. EXCEL数据导入数据库实例(NPOI)

    Default.aspx 页面代码: 引用了:    <script src="../../js/jquery.easyui.min.js" type="text/ ...

  3. Zepto 添加手势判断拓展方法(思路+原理)

    一.前言 这几个月事情比较多,写了一些博客都没有来得及整理发布,今天刚好有一位同事在开发前端页面的时候用到了手势判断.所以翻出了之前写的 demo,顺便整理一下作为记录. 手势判断在各种应用中都十分常 ...

  4. TomCat杀进程

    有时候当你的tomcat启动时会发现 因为报以下的错误: "Several ports ( 8080, 8009) required by Tomcat v6.0 Server at loc ...

  5. LINQ to XML编程之编程基础

    1.声明,LINQ to XML让xml的创建变得非常简单. XDocument myDocument = new XDocument( new XDeclaration("1.0" ...

  6. PHP运算符与表达式

    一.概述: 在我们平时的开发中,最离不开的就是运算,在编写比较复杂的后台程序的时候,算法更是必不可少的.涉及到运算就应该了解PHP的运算符,下面我们来一起看一下PHP中常见的运算符,以及和其他语言的区 ...

  7. const常量类型

    1.定义:const常量类型表示一个”常值变量“,其值是不能被修改的变量.即一旦变量被声明为const类型,编译器将禁止任何试图修改该变量的操作. 2.声明:const <声明数据类型> ...

  8. Excel 中使用sql语句查询

    将Excel连接Oracle数据库 Excel选项板中"数据"—"自其他来源"下拉菜单中有有个可以连接其它数据库的选项"来自数据连接向导"和 ...

  9. python自动化开发-[第一天]-基础数据类型与编码

    1.Python与其他语言对比 - C语言的解释方式  代码-->机器码-->计算机 - python,java,php等高级语言的解释方式  代码-->字节码-->机器码-- ...

  10. 《分布式Java应用之基础与实践》读书笔记三

    对于大型分布式Java应用与SOA,我们可以从以下几个方面来分析: 为什么需要SOA SOA是什么 eBay的SOA平台 可实现SOA的方法 为什么需要SOA   第一个现象是系统多元化带来的问题,可 ...