spfa floyd 最短路径模板

  1. #include <stdio.h>
  2. #include <queue>
  3. #include <iostream>
  4. using namespace std;
  5. #define INF 0xfffff //因为为了辨别是否有负权,所以INF不能开太大
  6. #define MAX 1100
  7. int dist[MAX], pre[MAX], path[MAX][MAX];
  8. bool sign[MAX];
  9. void initialize(int n) //初始化
  10. {
  11. for(int i=1; i<=n; i++)
  12. {
  13. {
  14. //pre[i] = 0;
  15. dist[i] = INF; //将距离开始全变为最大
  16. sign[i] = false;
  17. }
  18. for(int j=1; j<=n; j++)
  19. path[i][j] = INF; //图初始
  20. }
  21. }
  22. void spfa(int n, int start) //无法计算负权,对边较多的更快速
  23. {
  24. /* for (int i=1; i<=n; ++i)//初始化
  25. {
  26. dist[i] = INF;
  27. sign[i] = false;
  28. }*/
  29. queue<int> Q;
  30. dist[start] = 0;
  31. sign[start] = true;
  32. Q.push(start);
  33. while (!Q.empty()){
  34. int temp = Q.front();
  35. Q.pop();
  36. for (int i=0; i<=n; ++i)
  37. {
  38. if (dist[temp] + path[temp][i] < dist[i])//存在负权的话,就需要创建一个COUNT数组,当某点的入队次数超过V(顶点数)返回。
  39. {
  40. dist[i] = dist[temp] + path[temp][i];
  41. if (!sign[i])
  42. {
  43. Q.push(i);
  44. sign[i] = true;
  45. }
  46. //这个内循环可以判断所要权值相对应条件的值如dist[start];
  47. }
  48. }
  49. sign[temp] = false;
  50. }
  51. }
  52. void floyd (int n) //边较为少而稀疏,能一次性求出所有的顶点到顶点的最短路径
  53. {
  54. int i, j, k;
  55. for (k = 1; k <= n; k++)
  56. for (i = 1; i <= n; i++)
  57. for (j = 1; j <= n; j++)
  58. if (path[i][k] + path[k][j] < path[i][j])
  59. path[i][j] = path[i][k] + path[k][j];
  60. }
  61. void input(int line)
  62. {
  63. int a, b, weight;
  64. for(int i=0; i<line; i++)
  65. {
  66. scanf("%d%d%d", &a, &b, &weight);
  67. if(path[a][b] > weight) //有多条路,保存最短的那条
  68. {
  69. path[a][b] = weight;
  70. path[b][a] = weight; //无向图双向
  71. }
  72. }
  73. }
  74. int main()
  75. {
  76. int n, line;
  77. scanf("%d%d", &n, &line);
  78. initialize(n);
  79. input(line);
  80. spfa(n, 1);
  81. printf("%d\n\n", dist[n]);
  82. return 0;
  83. }

来自为知笔记(Wiz)

附件列表

时间: 2024-10-14 03:58:22

spfa floyd 最短路径模板的相关文章

Floyd算法模板

Floyd可以求出任意两点间的最短距离,代码也相对简单,对于稀疏图来说效率也还是不错的,但由于三个for循环导致时间复杂度较高,不适合稠密图. Floyd算法模板(精简版): void Floyd() { int dist[maxn][maxn]; // dist存储i到j的最短距离 for(int k = 1; k <= n; k++) for(int i = 1;i <= n; i++) for(int j = 1; j <= n; j++) if(dist[i][k] + dist

Floyd最短路径算法

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为“多源最短路径”问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[1][2]

迪杰斯特拉算法 最短路径模板题 hdu 2544

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 36954    Accepted Submission(s): 16091 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

1.topology: 1 #include <fstream> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cstring> 6 #include <cmath> 7 #include <cstdlib> 8 9 using namespace std; 10 11 #define EPS 1e-6 12 #de

四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)

什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPFA算法 多源最短路算法:求任意两点之间的最短路径. 常用算法:floyd算法 单源最短路径——Dijkstra Dijkstra算法是经典的最短路径算法,用于计算一个节点到其他所有节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 时间复杂度:O(n^2) 处理问题:单源.

hdoj-1869 六度分离【最短路径--dijkstra&amp;&amp;spfa&amp;&amp;floyd】

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1869 解题思路: 转化成最短路径问题,如果两人认识,把两者之间距离看成1      如果任意两人之间隔着7个人及其以上 (即距离>7)   则不满足六度分离 spfa: #include<cstdio> #include<cstring> #include<queue> #define INF 0x3f3f3f3f #define MAXN 100+10//点数 #def

【Spfa/最短路模板】遍历所有点的最短路径

题目描述 明明暑假来济南旅游旅游,他打算游玩N个旅游景点,N-1条双向连接的道路将它们联通起来,每一条道路有固定长度.一开始明明位于1号景点.现在希望你能够求出旅行长度最小的方案,使得每个景点至少被访问到一次. 输入 第一行两个整数N,代表景点数目.接下来N-1行,每行三个整数s, t, w,表示有一条从s到t的双向道路,长度为w.s和t的编号从1开始. 输出 一行一个整数,代表能够访问每个景点至少一次的方案的最小旅行长度. #include<bits/stdc++.h> #define ll

P1339 热浪 最短路径模板题

这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 int a[2501][2501]; 6 int main() 7 { 8 int m,n,c,b; 9 memset(a,0x3f,sizeof(a)); 10 scanf (&qu

POJ1932 HDU1317 ZOJ1935 UVA10557 XYZZY【SPFA+Floyd】

XYZZY Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4217 Accepted: 1203 Description The prototypical computer adventure game, first designed by Will Crowther on the PDP-10 in the mid-1970s as an attempt at computer-refereed fantasy gamin