数据结构:最短路径算法之Dijkstra算法

心已赠人 2022-05-31 12:56 412阅读 0赞

Dijkstra算法

Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

dijkstra算法是解决带权重的单元最短路径问题,要求权重是非负,和Bellman-Ford算法很像,但是不一样,注意Bellman-Ford算法是可以处理负边,但是Dijkstra不可以

代码如下

  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <unordered_map>
  5. #include <set>
  6. #include <unordered_set>
  7. #include <queue>
  8. #include <stack>
  9. #include <string>
  10. #include <climits>
  11. #include <algorithm>
  12. #include <sstream>
  13. #include <functional>
  14. #include <bitset>
  15. #include <numeric>
  16. #include <cmath>
  17. #include <regex>
  18. #include <iomanip>
  19. #include <cstdlib>
  20. #include <ctime>
  21. using namespace std;
  22. //dijkstra 是解决带权重的单元最短路径问题,要求权重是非负
  23. const int MAX = 1000000;
  24. /*
  25. 6 个节点
  26. 1000000 1000000 10 100000 30 100
  27. 1000000 1000000 5 1000000 1000000 1000000
  28. 1000000 1000000 1000000 50 1000000 1000000
  29. 1000000 1000000 1000000 1000000 1000000 10
  30. 1000000 1000000 1000000 20 1000000 60
  31. 1000000 1000000 1000000 1000000 1000000 1000000
  32. 结果
  33. D[0] D[1] D[2] D[3] D[4] D[5]
  34. 0 1000000 10 50 30 60
  35. //节点0到节点5的最短路径是0 4 3 5
  36. */
  37. void dijkstra()
  38. {
  39. const int n = 6;
  40. int mat[6][6] =
  41. {
  42. 0, 1000000, 10, 1000000, 30, 100,
  43. 1000000, 0, 5, 1000000, 1000000, 1000000,
  44. 1000000, 1000000, 0, 50, 1000000, 1000000,
  45. 1000000, 1000000, 1000000, 0, 1000000, 10,
  46. 1000000, 1000000, 1000000, 20, 0, 60,
  47. 1000000, 1000000, 1000000, 1000000, 1000000, 0 };
  48. //初始化部分,dis[n]表示源节点0到其余节点的最短距离
  49. int dis[n] = { 0 };
  50. //前驱节点设置
  51. int pre[n] = { 0 };
  52. //访问标志
  53. int visit[n] = { 0 };
  54. //dis初始化
  55. for (int i = 0; i<n; i++)
  56. {
  57. //前驱节点初始化,-1表示无前驱
  58. dis[i] = mat[0][i];
  59. if (dis[i] == MAX)
  60. pre[i] = -1;
  61. else
  62. pre[i] = 0;
  63. }
  64. pre[0] = -1;
  65. //源节点0的初始化
  66. visit[0] = 1;
  67. //由于源节点0已经处理过了,所以处理其余的n-1个节点,也就是循环n-1次
  68. for (int i = 1; i<n; i++)
  69. {
  70. int minDis = MAX;
  71. int tmp = 0;
  72. //选择未访问过的节点中距离最短的
  73. for (int j = 0; j<n; j++)
  74. {
  75. if (visit[j] == 0 && dis[j] < minDis)
  76. {
  77. tmp = j;
  78. minDis = dis[j];
  79. }
  80. }
  81. //加入访问
  82. visit[tmp] = 1;
  83. //松弛更新
  84. for (int j = 0; j<n; j++)
  85. {
  86. if (visit[j] == 0 && minDis + mat[tmp][j] < dis[j])
  87. {
  88. dis[j] = minDis + mat[tmp][j];
  89. pre[j] = tmp;
  90. }
  91. }
  92. }
  93. for (int i = 0; i<n; i++)
  94. cout << dis[i] << " ";
  95. cout << endl;
  96. //可以打印每一个节点到源节点0的最短路径的节点信息
  97. //下面是打印节点0到-1的最短路径信息
  98. int i = n - 1;
  99. while (i != -1)
  100. {
  101. cout << i << " ";
  102. i = pre[i];
  103. }
  104. }
  105. int main()
  106. {
  107. dijkstra();
  108. system("pause");
  109. }

发表评论

表情:
评论列表 (有 0 条评论,412人围观)

还没有评论,来说两句吧...

相关阅读

    相关 路径Dijkstra算法

    最短路径之Dijkstra算法(看到i,j,k三个变量可以理解为需要三个for循环,方便记忆) 本节来学习指定一个点(源点)到其余各个顶点的最短路径,也称为”单源最短路径”。