通过stl的queue实现的spfa(vector实现邻接表存图)

本模板没有考虑存在两点不连通的情况

如果需要判断则需要用到并查集或者遍历整个邻接表

  1. #include<iostream>
  2. #include<queue>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<vector>
  6. using namespace std;
  7. int d[10001];//存储起始点到点的最短距离
  8. int v[10001];//标记是否已经入队
  9. int c[10001];//记录入队次数
  10. int n,m,s;
  11. int x,y,z;
  12. struct edge
  13. {
  14. int to,w;
  15. };
  16. queue<int> q;
  17. vector<edge> map[10001];
  18. int spfa(int u)
  19. {
  20. memset(d,0x7f,sizeof(d));//初始化
  21. q.push(u);//将点加入队列
  22. v[u]=0;
  23. d[s]=0;//起始点的距离为0
  24. while(!q.empty())//队列不为空时
  25. {
  26. int x;
  27. x=q.front();//取出队首点
  28. q.pop();
  29. v[x]=0;//已经不在队列中
  30. for (vector<edge> ::iterator k=map[x].begin();k!=map[x].end();k++)
  31. {//遍历每一个与其连接的点
  32. edge o=*k;
  33. int y=o.to;
  34. if (d[x]+o.w<d[y])//图的松弛
  35. {
  36. d[y]=d[x]+o.w;
  37. if (!v[y])//如果此点没入队
  38. {
  39. v[y]=1;//将其入队
  40. c[y]++;//入队次数++
  41. q.push(y);
  42. if (c[y]>n) return 0;//如果入队次数超过点数则存在环
  43. }
  44. }
  45. }
  46. }
  47. return 1;
  48. }
  49. int main ()
  50. {
  51. edge e;
  52. cin>>n>>m>>s;
  53. for (int i=1;i<=m;i++)
  54. {
  55. cin>>x>>y>>z;
  56. e.to=y;
  57. e.w=z;
  58. map[x].push_back(e);
  59. }
  60. spfa(s);
  61. for (int i=1;i<=n;i++)
  62. {
  63. cout<<d[i]<<' ';
  64. }
  65. return 0;
  66. }

spfa模板的更多相关文章

  1. SPFA模板 Bellmanford优化版

    SPFA模板: queue<int>Q; ]; ],sumv[]; *],__next[*],e,w[*],first[],cnts[]; void AddEdge(int U,int V ...

  2. floyed dij spfa 模板

    /* SPFA模板 */ const int inf=0x3f3f3f3f; inline int SPFA(int s){ memset(dis,inf,sizeof(dis)); queue< ...

  3. spfa(模板)

    spfa作为图论中的常用算法,深受各类出题人和各位OIer的喜爱: so,为了给大众创造福利,宝宝在此奉上spfa大发的思路和模板:以感谢社会, 感谢CCF,感谢CCTV, 感谢我的老师,感谢同学们, ...

  4. 最短路算法 -- SPFA模板

    一.算法步骤 建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[]).然后执行松弛操 ...

  5. hdu-2544-最短路(SPFA模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

  6. spfa模板+讲解

    zz http://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.html Spfa算法 (模板源代码) 这是Bellman Ford的改进算法.    算法介绍: ...

  7. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  8. UVA 558 判定负环,spfa模板题

    1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...

  9. Dijkstra堆优化与SPFA模板

    Dijkstra+优先队列 #include<cstdio> #include<cctype> #include<queue> #include<cstrin ...

随机推荐

  1. Linux如何进行文件管理

    Linux中的所有数据都被保存在文件中,所有的文件被分配到不同的目录.目录是一种类似于树的结构,称为文件系统.当你使用Linux时,大部分时间都会和文件打交道,通过本节可以了解基本的文件操作,如创建文 ...

  2. 使用django开发博客过程记录4——Category分类视图

    在写点击博客的所属分类,显示所有该分类的文章时真是让我想了好一会,为什么呢?因为我使用的是cbv模式开发的而不是简单的视图处理逻辑的,所以,有些操作会被包装好了,你并不知道它的细节,那么我们今天要实现 ...

  3. 移动端自适应:flexible.js可伸缩布局使用

    http://caibaojian.com/flexible-js.html 阿里团队开源的一个库.flexible.js,主要是实现在各种不同的移动端界面实现一稿搞定所有的设备兼容自适应问题. 实现 ...

  4. stackoverfow访问 ajax.googleapis.com

    本文实验环境:Fedora 23 先用nslookup 查看stackoverflow.com的ip -vc参数,表示用强制用TCP 查到的stackoverflow的地址似乎没错, 用本地的DNS解 ...

  5. Oracle交易流水号问题

    需求:生成交易流水号,每次新增一条记录时都自动加1,且流水号形式为000000001形式的10位数字. 思路:利用序列可以生成自增的流水号,只需要在前面添加N个0即可,同时,由于数字的长度一定,因此可 ...

  6. DEDEcms 在php5.4以上 后台登录空白解决办法

    本次环境php5.5 首先确定 dede data文件夹已经有写入权限 775 777都可以 然后再远程桌面或者FTP修改 include/userlogin.class.php 文件 注释掉下面六句 ...

  7. Download Excel file with Angular

    源码连接(编写中) 用Angular下载后台返回的Excel文件,用Blob实现,引用FileSaver.js 后台C#代码: [WebMethod] public static byte[] Cal ...

  8. 室内定位系列(二)——仿真获取RSS数据

    很多情况下大家都采用实际测量的数据进行定位算法的性能分析和验证,但是实际测量的工作量太大.数据不全面.灵活性较小,采用仿真的方法获取RSS数据是另一种可供选择的方式.本文介绍射线跟踪技术的基本原理,以 ...

  9. 如何让vim自动显示函数声明-使用 echofunc.vim插件

    echofunc.vim可以显示函数的declaration, 默认的是针对c/c++, 对于php, 只要 启用了 ctags都可以, 因为echofunc是从tags file中获取数据的... ...

  10. 用R做逻辑回归之汽车贷款违约模型

    数据说明 本数据是一份汽车贷款违约数据 application_id    申请者ID account_number 账户号 bad_ind            是否违约 vehicle_year  ...