当前位置:   article > 正文

Dijkstra算法(C/C++简明注释详解版: 代码实现 & 测试数据)_dijkstra c++代码

dijkstra c++代码

算法思想简述(From C知道):

Dijkstra算法是一种求解最短路径的贪心算法,它能够找到两点之间的最短路径。C语言实现Dijkstra算法需要以下步骤:

1. 创建一个数组用于记录起始点到其他节点的距离,初始化为无穷大。
2. 创建一个数组用于记录节点是否已经被访问过,初始化为false。
3. 将起始点到自身的距离设为0。
4. 遍历图中所有节点,对于每个节点:
   1) 找到起始点到该节点距离最短的节点(即未被访问过且距离最小的节点)。
   2) 标记该节点已经被访问过。
   3) 遍历该节点的所有邻居节点,更新起始点到邻居节点的距离。
5. 最终得到起始点到其他所有节点的最短距离。

dijkstra函数代码实现:

  1. int n, m, s, e; // 节点数, 有向线段数, 起点, 终点
  2. int graph[size][size]; // 图的邻接矩阵
  3. int dist[size]; // 起点到各点的最短距离
  4. bool visited[size]; // 记录节点是否被访问过
  5. void dijkstra(int s)
  6. {
  7. for(int i=1; i<=n; i++) // 初始化距离和访问状态
  8. {
  9. dist[i] = max;
  10. visited[i] = false;
  11. }
  12. dist[s] = 0; // 起点到自身的距离为0
  13. for(int i=1; i<=n; i++) // 遍历所有节点
  14. {
  15. int min = max, u = -1;
  16. for(int j=1; j<=n; j++) // 找到未访问节点中距离起点最近的节点
  17. {
  18. if(dist[j] < min && !visited[j])
  19. {
  20. u = j; min = dist[j];//可以用i=1的情况来理解,找到离原点最近的一个节点
  21. }
  22. }
  23. if(u == -1) return; // 若未找到可达节点,退出循环
  24. visited[u] = true; // 标记节点u为已访问
  25. for(int v=1; v<=n; v++) // 更新起点到各节点的距离
  26. {
  27. //从原点先到u再到v的路径 < 原先记录的从原点到v的路径 //u,v之间有通路
  28. if(dist[v] > dist[u] + graph[u][v] && !visited[v] && graph[u][v] != max)
  29. { //v尚未访问过
  30. dist[v] = dist[u] + graph[u][v];
  31. }
  32. }
  33. }
  34. }

整体程序代码实现

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define size 1000 // 定义图的最大节点数
  4. #define max 1000000000 // 定义最大值
  5. int n, m, s, e; // 节点数, 有向线段数, 起点, 终点
  6. int graph[size][size]; // 图的邻接矩阵
  7. int dist[size]; // 起点到各点的最短距离
  8. bool visited[size]; // 记录节点是否被访问过
  9. void dijkstra(int s)
  10. {
  11. for(int i=1; i<=n; i++) // 初始化距离和访问状态
  12. {
  13. dist[i] = max;
  14. visited[i] = false;
  15. }
  16. dist[s] = 0; // 起点到自身的距离为0
  17. for(int i=1; i<=n; i++) // 遍历所有节点
  18. {
  19. int min = max, u = -1;
  20. for(int j=1; j<=n; j++) // 找到未访问节点中距离起点最近的节点
  21. {
  22. if(dist[j] < min && !visited[j])
  23. {
  24. u = j; min = dist[j];//可以用i=1的情况来理解,找到离原点最近的一个节点
  25. }
  26. }
  27. if(u == -1) return; // 若未找到可达节点,退出循环
  28. visited[u] = true; // 标记节点u为已访问
  29. for(int v=1; v<=n; v++) // 更新起点到各节点的距离
  30. {
  31. //从原点先到u再到v的路径 < 原先记录的从原点到v的路径 //u,v之间有通路
  32. if(dist[v] > dist[u] + graph[u][v] && !visited[v] && graph[u][v] != max)
  33. { //v尚未访问过
  34. dist[v] = dist[u] + graph[u][v];
  35. }
  36. }
  37. }
  38. }
  39. int main()
  40. {
  41. cout<<"依次输入节点数, 有向线段数, 起点, 终点(数字间以空分隔): ";
  42. cin>>n>>m>>s>>e; // 输入节点数, 有向线段数, 起点, 终点
  43. for(int i=1; i<=n; i++) // 初始化图的邻接矩阵
  44. {
  45. for(int j=0; j<=n; j++)
  46. {
  47. graph[i][j] = i==j ? 0: max;
  48. }
  49. }
  50. int u, v, wt;
  51. for(int i=1; i<=m; i++) // 输入有向线段的起点、终点和权重
  52. {
  53. cin>>u>>v>>wt;
  54. graph[u][v] = wt;
  55. graph[v][u] = wt; // 无向图,对称设置权重
  56. }
  57. dijkstra(s); // 调用Dijkstra算法求最短路径
  58. cout<<"min_track_length: "<<dist[e]; // 输出起点到终点的最短距离
  59. return 0;
  60. }

送上测试数据一份:

  1. /*
  2. 测试数据:
  3. 5 6 1 5
  4. 1 2 4
  5. 2 5 10
  6. 1 3 5
  7. 3 2 1
  8. 3 4 2
  9. 4 5 6
  10. */

~~ 希望对你有帮助 ~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/711021
推荐阅读
相关标签
  

闽ICP备14008679号