1. queue <int> Q;
  2. void SPFA (int s)
  3. {
  4. int i, v;
  5. for(int i=0; i<=n; i++)
  6. dist[i]=INF; //初始化每点i到s的距离
  7. dist[s] = 0;
  8. visit[s] = true;
  9. Q.push(s); //队列初始化,s为起点
  10. while ( !Q.empty() ) //队列非空
  11. {
  12. v=Q.front();
  13. Q.pop(); //取队首元素
  14. visit[v]=false; //释放队首结点,因为这节点可能下次用来松弛其它节点,重新入队
  15. for(i=0; i<=n; i++) //对所有顶点
  16. if ( g[v][i] > 0 && dist[i] > dist[v] + g[v][i] )
  17. {
  18. dist[i] = dist[v] + g[v][i]; //修改最短路
  19. if ( visit[i] == false ) //如果扩展结点i不在队列中,入队
  20. {
  21. Q.push(i);
  22. visit[i] = true;
  23. }
  24. }
  25. }
  26. }

图的邻接表表示可以看这篇博客,尤其理解next数组作用;

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<queue>
  5. #define oo 0x3fffffff
  6. using namespace std;
  7. const int N = 10005, M = 200005; //N表示最大点的个数 ,M表示最大边的个数
  8. struct Edge
  9. {
  10. int to;
  11. int wei;
  12. int next; //邻接链表的套路,to邻接顶点,wei表边的权重,next表链表指针
  13. };
  14. Edge edge[M]; //储存边的信息
  15. int head[N], k, dist[N]; //dist【i】表示起点到 i的最短距离
  16. bool visit[N];
  17. queue<int> Q;
  18. void Addedge(int x,int y,int c) //存图 ,x到y有一条权重为c的边
  19. {
  20. edge[k].to=y;
  21. edge[k].wei=c;
  22. edge[k].next=head[x];
  23. head[x]=k++;
  24. }
  25. void Init( int n, int m )
  26. {
  27. int x, y, c;
  28. memset( head, -1, sizeof(head) ); //清零,作为每个点dfs的终止标志
  29. fill( visit, visit+n+1, false); //一开始都不在队列中
  30. while ( m-- )
  31. {
  32. cin >> x >> y >> c;
  33. Addedge( x, y, c );
  34. Addedge( y, x, c );
  35. }
  36. fill( dist, dist+n+1, oo ); //先初始化为无穷大
  37. }
  38. void Spfa( int s ) //这是套路
  39. {
  40. Q.push(s);
  41. dist[s]=0;
  42. visit[s]=true;
  43. while ( !Q.empty() )
  44. {
  45. int v = Q.front();
  46. Q.pop();
  47. visit[v] = false;
  48. for (int i = head[v]; i != -1; i = edge[i].next)
  49. { //遍历整张图
  50. int w = edge[i].to;
  51. if (dist[w] > dist[v] + edge[i].wei) //如果到v的距离大于到u再加上u到v的距离,就更新
  52. {
  53. dist[w] = dist[v] + edge[i].wei;
  54. if (visit[w] != true)
  55. {
  56. Q.push(w);
  57. visit[w]=true; //指标记,防止重复进入,否则队列没有意义
  58. }
  59. }
  60. }
  61. }
  62. }
  63. void Output( int n )
  64. {
  65. cout << dist[n] << endl; //输出到终点的距离就行了,其实你想输出到哪点的最短距离都可以
  66. }
  67. int main()
  68. {
  69. int n, m, s;
  70. while( cin >> n >> m )
  71. {
  72. Init( n, m ); //输入存图
  73. s = 1; //起点
  74. Spfa( s ); //算法核心
  75. Output( n ); //输出答案
  76. }
  77. return 0;
  78. }

最短路径SPFA算法(邻接表存法)的更多相关文章

  1. POJ 1511 Invitation Cards (spfa的邻接表)

    Invitation Cards Time Limit : 16000/8000ms (Java/Other)   Memory Limit : 524288/262144K (Java/Other) ...

  2. 最短路径--SPFA 算法

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  3. 最短路径——SPFA算法

    一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...

  4. 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)

    这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...

  5. hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)

    题目链接 畅通工程,可以用dijkstra算法实现. 听说spfa很好用,来水一发 邻接矩阵实现: #include <stdio.h> #include <algorithm> ...

  6. 最短路径----SPFA算法

    求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...

  7. poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)

    最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #inclu ...

  8. nyoj 239 月老的难题【匈牙利算法+邻接表】

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...

  9. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

随机推荐

  1. Python基础学习七 Excel操作

    python操作excel,python操作excel使用xlrd.xlwt和xlutils模块, xlrd模块是读取excel的,xlwt模块是写excel的,xlutils是用来修改excel的. ...

  2. jenkins 学习记录1

    主题 以前自己做些小玩意儿比如博客(http://blogv3.labofjet.com/)的时候,在远程服务器上的tomcat发布工程用的是目录的结构,而不是war.原因很简单.用目录结构的话每次只 ...

  3. 关于windows的jdk

    扯淡工作从web开发转向build automation,不知不觉已经一个半月了,各种学习熟悉build相关的流程和知识,比如ant, maven, jenkins 等CI技能.因为这一个半月学的东西 ...

  4. Jquery缩放

    $(document).mousemove(function(e) {     if (!!this.move) {         var posix = !document.move_target ...

  5. oracle数据库导入导出数据

    导出命令 exp username/password@192.168.x.xx/orcl file='D:\20170126.dmp' log='D:\20170126.log' 导入命令 imp u ...

  6. SpringMVC简单的文件上传

    引入依赖包: <!-- 文件上传的依赖 --> <dependency> <groupId>commons-fileupload</groupId> & ...

  7. solrcloud使用问题记录

    Solr Ping query caused exception: undefined field text [java] view plaincopy <span style="fo ...

  8. 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式

    Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...

  9. hibernate 一对一(级联关系)

    hibernate 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hiber ...

  10. c# 下实现ping 命令操作

    1>通过.net提供的类实现 using System; using System.Collections.Generic; using System.Linq; using System.Te ...