zoukankan      html  css  js  c++  java
  • 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 ", dist[n]);
    82. return 0;
    83. }





    附件列表

    • 相关阅读:
      day04用户交互和运算符
      day04垃圾回收机制
      day4
      B2. K for the Price of One (Hard Version)
      C. New Year and Permutation
      Rational Ratio
      C. Two Arrays
      D. MEX maximizing
      B. Infinite Prefixes
      C. Obtain The String
    • 原文地址:https://www.cnblogs.com/sober-reflection/p/83a93fc336fe2bf9cbbbb7090af2c932.html
    Copyright © 2011-2022 走看看