首页 > 代码库 > spfa floyd 最短路径模板

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)


附件列表

     

    spfa floyd 最短路径模板