Dijkstra最短路径算法
2015-03-26 22:27
363 查看
Dijkstra算法的运算步骤可以看下图:
即第一次选取最小的,第二次选取次小的,共需要支行 n-1次。
在上面的运算过程中需要注意几个问题:
1 已经得出结果的集合 指 visit
中 visit[x] = 1的那些元素,对于已经得出的结果的结点不需要再迭代。
2. 用一个结构保存 最短路径的距离,即 shortDistance
3. 用一个结构保存 具体的路径是什么 即 path
如果一个图的邻接矩阵是 G
,则最后的最短路径结果可以保存在 G
的相应单元中,但这样就使 G
发生了变化。
下面是一个具体的实现,思路还是比较明确的:
即第一次选取最小的,第二次选取次小的,共需要支行 n-1次。
在上面的运算过程中需要注意几个问题:
1 已经得出结果的集合 指 visit
中 visit[x] = 1的那些元素,对于已经得出的结果的结点不需要再迭代。
2. 用一个结构保存 最短路径的距离,即 shortDistance
3. 用一个结构保存 具体的路径是什么 即 path
如果一个图的邻接矩阵是 G
,则最后的最短路径结果可以保存在 G
的相应单元中,但这样就使 G
发生了变化。
下面是一个具体的实现,思路还是比较明确的:
//算法要对照图进行理解 /* 输入: G[][] 是图的邻接矩阵; v: 算法求 v 到其它结点的最短距离及路径 paths: 存放求得的最短路径,在方法中进行设置 输出: shortDistances: v到其它各点的最短路径距离 */ public static double[] dijkstra(double G[][], int v, ArrayList<Integer>[] paths) { int n = G.length; //图的结点个数 boolean[] visited = new boolean ; //是否到此结点已经求出最短路径 true 表示已经求出 double[] shortDistances = new double ; //存放到各点的最短路径 for(int i = 0; i < n; i++) { shortDistances[i] = G[v][i]; paths[i] = new ArrayList<Integer>(); paths[i].add(v);paths[i].add(i); } visited[v] = true; //需要 n-1 次循环 for(int count = 0; count < n-1; count++) { double minD = Double.MAX_VALUE; int k = -1; //先求得本次循环的最短路径 for(int i = 0; i < n; i++) { if(visited[i] == false && shortDistances[i] < minD) { minD = shortDistances[i]; k = i; } } visited[k] = true; //修改其它结点 for(int i = 0; i < n; i++) { if(visited[i] == false && shortDistances[i] > shortDistances[k] + G[k][i]) { shortDistances[i] = shortDistances[k] + G[k][i]; paths[i] = new ArrayList<Integer>(paths[k]); paths[i].add(i); } } } return shortDistances; } /*在上面的运算过程中需要注意几个问题: 1 已经得出结果的集合 指 visit 中 visit[x] = 1的那些元素,对于已经得出的结果的结点不需要再迭代。 2. 用一个结构保存 最短路径的距离,即 shortDistance 3. 用一个结构保存 具体的路径是什么 即 path */
相关文章推荐
- Dijkstra最短路径算法
- 迪杰斯特拉(Dijkstra)算法求图的最短路径
- Dijkstra单源最短路径算法; 优先队列+静态数组邻接表; STL优先队列还是没想明白排序原则;
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 最短路径算法——Dijkstra and Floyd算法
- Dijkstra最短路径算法
- 最短路径——迪科斯彻算法(Dijkstra)算法
- Dijkstra算法求解单源最短路径
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 高性能最短路径算法 Dijkstra
- [贪心]Dijkstra最短路径算法
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)(转)
- 单源最短路径:Dijkstra 算法 Bellman_Ford 算法 SPFA 算法
- Dijkstra's Shortest Path Algorithm(最短路径算法)
- 最小生成树算法(Prime、Kruskal)和最短路径算法(Dijkstra、Floyd)
- Dijkstra最短路径算法
- 单源最短路径(1):Dijkstra 算法
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 最短路径-迪杰斯特拉(Dijkstra)算法
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍