题目链接

题目描述

  1. 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,
  2. 则输出花费最少的。
  3. 最后一行是两个数 s,t;起点s,终点。nm0时输入结束。(1<n<=1000, 0<m<100000, s != t)

Spfa模板题:

  1. #include <set>
  2. #include <map>
  3. #include <cmath>
  4. #include <queue>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <algorithm>
  9. using namespace std;
  10. typedef pair<int, int> pa;
  11. typedef long long LL;
  12. const int inf=1e9;//INT_MAX;
  13. //SPFA
  14. const int maxn=1000+5;
  15. struct node
  16. {
  17. int ed;
  18. int len;
  19. int cast;
  20. };
  21. struct node2
  22. {
  23. int i;
  24. int sum;
  25. };
  26. node2 dis[maxn];
  27. int inque[maxn];
  28. int n,m;
  29. vector<node>E[maxn];
  30. queue<int>que;
  31. void Spfa(int st,int ed)
  32. {
  33. for(int i=1;i<=n;i++)
  34. dis[i].i=inf,dis[i].sum=inf,inque[i]=false;
  35. while(!que.empty())
  36. que.pop();
  37. que.push(st);
  38. inque[st]=true;
  39. dis[st].i=0;
  40. dis[st].sum=0;
  41. while(!que.empty())
  42. {
  43. int pos=que.front();
  44. que.pop();
  45. inque[pos]=false;
  46. int l=int(E[pos].size());
  47. for(int i=0;i<l;i++)
  48. {
  49. int en=E[pos][i].ed;
  50. int le=E[pos][i].len;
  51. int ca=E[pos][i].cast;
  52. int x=dis[pos].i+le;
  53. //int c=dis[pos].cast+ca;
  54. if(dis[en].i>=x)//关键点,要考虑优先级
  55. {
  56. if(dis[en].i>x)
  57. {
  58. dis[en].i=x;
  59. dis[en].sum=dis[pos].sum+ca;
  60. }
  61. else if(dis[en].sum>dis[pos].sum+ca)
  62. {
  63. dis[en].i=x;
  64. dis[en].sum=dis[pos].sum+ca;
  65. }
  66. if(!inque[en])
  67. que.push(en);
  68. }
  69. }
  70. }
  71. }
  72. int main ()
  73. {
  74. while(~scanf("%d%d",&n,&m))
  75. {
  76. if (n==0&&m==0)
  77. break;
  78. for(int i=0;i<=n;i++)
  79. E[i].clear();
  80. int st,ed,len,cast;
  81. for(int i=0;i<m;i++)
  82. {
  83. scanf("%d%d%d%d",&st,&ed,&len,&cast);
  84. node x1={ed,len,cast};
  85. E[st].push_back(x1);
  86. node x2={st,len,cast};
  87. E[ed].push_back(x2);
  88. }
  89. int s,d;
  90. scanf("%d%d",&s,&d);
  91. Spfa(s, d);
  92. printf("%d %d\n",dis[d].i,dis[d].sum);
  93. }
  94. return 0;
  95. }

最短路径问题/Spfa的更多相关文章

  1. [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)

    单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...

  2. HDU 3790 最短路径问题 (SPFA)

    转载请注明出处:http://blog.csdn.net/a1dark 分析:比一般最短路多了一个花费.多加一个判断即可.用的SPFA.这道题让我搞清楚了以前定义INF为啥爆的问题.受益颇多. #in ...

  3. 【最短路径】 SPFA算法优化

    首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...

  4. 【最短路径】 SPFA算法

    上一期介绍到了SPFA算法,只是一笔带过,这一期让我们详细的介绍一下SPFA. 1 SPFA原理介绍 SPFA算法和dijkstra算法特别像,总感觉自己讲的不行,同学说我的博客很辣鸡,推荐一个视频讲 ...

  5. 图论最短路径算法——SPFA

    为了不要让太多人被害,我还是说一下这种算法,它实际上很简单,但被人讲着讲着绕晕了. 主要思想 有人说,SPFA是Bellman-Ford的队列优化.这个算法我也懂了,但是还没试过.我不管是什么算法的优 ...

  6. SPFA解决单源最短路径

    SPFA(Shortest Path Faster Algorithm): 一:基本算法 在求解单源最短路径的时候,最经典的是 Dijkstra 算法,但是这个算法对于含有负权的图就无能为力了,而 B ...

  7. 【Tarjan】+【SPFA】APIO2009 Atm

    一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...

  8. SPFA 原理剖析代码实现分析比较

    算法简介 SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 算法流程 算法大致流程是用一个队列来进行维护. ...

  9. 觉得一篇讲SPFA还不错的文章

    我觉得他整理的有一些乱,我都改成插入代码了,看的顺眼一些 转载自http://blog.csdn.net/juststeps/article/details/8772755 下面的都是原文: 最短路径 ...

随机推荐

  1. hdu_5354_Bipartite Graph(cdq分治+并查集判二分图)

    题目链接:hdu_5354_Bipartite Graph 题意: 给你一个由无向边连接的图,问对于每一个点来说,如果删除这个点,剩下的点能不能构成一个二分图. 题解: 如果每次排除一个点然后去DFS ...

  2. 在线用户管理--ESFramework 4.0 进阶(05)

    无论我们采用何种通信框架来构建我们的分布式系统,在服务端进行用户管理都是非常重要的一个环节.然而用户管理是否应该隶属于通信框架了?这个并不一定,通常来说,用户管理是与具体应用紧密相关的,应该是由应用解 ...

  3. 优化SQLServer数据库加快查询速度

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...

  4. Excel教程(7) - 工程函数

    BESSELI 用途:返回修正 Bessel 函数值,它与用纯虚数参数运算 时的 Bessel 函数值相等. 语法:BESSELI(x,n)     参数:X 为参数值.N 为函数的阶数.如果 n 非 ...

  5. Openjudge-计算概论(A)-大象喝水

    描述 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数).问大象至少要喝多少桶水才会解渴. 输入输入有一行:包行两个整数,以一个空格分开,分别表示 ...

  6. 如何将编译出来的images拷贝到windows下面刷机

    由于SPRD的刷机工具ResearchDownload运行在window环境下:这样,我们平时在开发环境下编译出来的镜像文件就不能直接用于刷机了. 这里涉及到一个双系统中文件共享的方法.由于企业信息安 ...

  7. erlang调试技术之etop

    etop是erlang进程信息查看工具,类似于UNIX的top. 一.配置参数 node The measured node. Value: atom() Mandatory setcookie Co ...

  8. Entity Framework 6.x Code First 基础

    安装扩展工具 "Entity Framework Power Tools Beta4" 可选, 主要用于数据库变结构反向生成C#的对象和对应的mapping类.如果你熟悉mappi ...

  9. PHP验证码类

    通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数 ...

  10. CSS传统布局之布局模型

    刚开始准备这篇文章的时候,查到的有很多包含“布局模型”的中文博客或是资料,但是google上并未找到类似字眼,google到的是“flex layout module”“grid layout mod ...