Dijkstra最短路径算法

落日映苍穹つ 2022-08-07 08:50 444阅读 0赞

Dijkstra算法的运算步骤可以看下图:

Center

即第一次选取最小的,第二次选取次小的,共需要支行 n-1次。

在上面的运算过程中需要注意几个问题:

1 已经得出结果的集合 指 visit[n] 中 visit[x] = 1的那些元素,对于已经得出的结果的结点不需要再迭代。

  1. 用一个结构保存 最短路径的距离,即 shortDistance[n]

  2. 用一个结构保存 具体的路径是什么 即 path[n]

如果一个图的邻接矩阵是 G[n][n] ,则最后的最短路径结果可以保存在 G[n][n] 的相应单元中,但这样就使 G[n][n] 发生了变化。

下面是一个具体的实现,思路还是比较明确的:

  1. //算法要对照图进行理解
  2. /*
  3. 输入:
  4. G[][] 是图的邻接矩阵;
  5. v: 算法求 v 到其它结点的最短距离及路径
  6. paths: 存放求得的最短路径,在方法中进行设置
  7. 输出:
  8. shortDistances: v到其它各点的最短路径距离
  9. */
  10. public static double[] dijkstra(double G[][], int v, ArrayList<Integer>[] paths) {
  11. int n = G.length; //图的结点个数
  12. boolean[] visited = new boolean[n]; //是否到此结点已经求出最短路径 true 表示已经求出
  13. double[] shortDistances = new double[n]; //存放到各点的最短路径
  14. for(int i = 0; i < n; i++) {
  15. shortDistances[i] = G[v][i];
  16. paths[i] = new ArrayList<Integer>();
  17. paths[i].add(v);paths[i].add(i);
  18. }
  19. visited[v] = true;
  20. //需要 n-1 次循环
  21. for(int count = 0; count < n-1; count++) {
  22. double minD = Double.MAX_VALUE;
  23. int k = -1;
  24. //先求得本次循环的最短路径
  25. for(int i = 0; i < n; i++) {
  26. if(visited[i] == false && shortDistances[i] < minD) {
  27. minD = shortDistances[i];
  28. k = i;
  29. }
  30. }
  31. visited[k] = true;
  32. //修改其它结点
  33. for(int i = 0; i < n; i++) {
  34. if(visited[i] == false && shortDistances[i] > shortDistances[k] + G[k][i]) {
  35. shortDistances[i] = shortDistances[k] + G[k][i];
  36. paths[i] = new ArrayList<Integer>(paths[k]);
  37. paths[i].add(i);
  38. }
  39. }
  40. }
  41. return shortDistances;
  42. }
  43. /*在上面的运算过程中需要注意几个问题:
  44. 1 已经得出结果的集合 指 visit[n] 中 visit[x] = 1的那些元素,对于已经得出的结果的结点不需要再迭代。
  45. 2. 用一个结构保存 最短路径的距离,即 shortDistance[n]
  46. 3. 用一个结构保存 具体的路径是什么 即 path[n]
  47. */

发表评论

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

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

相关阅读

    相关 路径Dijkstra算法

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

    相关 路径Dijkstra算法 java

    思路:设置一个基点集合 S ,并不断地作贪心选择来扩充这个集合。一个顶点属于集合 S 当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设 u 是 G 的某一个顶点