Java迪杰斯特拉算法(Dijkstra算法)求最短路径
来源:互联网 发布:php curl 的使用 编辑:程序博客网 时间:2024/06/08 04:12
以图片为例实现代码:
算法步骤图解请参考
http://www.cnblogs.com/skywang12345/p/3711516.html
输出结果
import java.util.Arrays;import java.util.Stack;public class dijkstraShortestPath { private static char[] points; // 顶点集合 private static int[][] arc; // 邻接矩阵 private static final int INF = Integer.MAX_VALUE; // 表示不相连两点间距离为无穷大 //迪杰斯特拉算法 private void dijkstra( int start ) { boolean[] flag = new boolean[points.length]; //标记节点是否获取最短路径 int[] distence = arc[start] ; //标记节点与起点的距离 int[] prev = new int[points.length]; //存储每个节点的前驱 //初始化所有节点的前驱都为起点,为了防止与起点直接相连的点在计算中不更新前驱表 //(这一步很重要,因为每次标记一个点时 更新的是未标记的点前驱,再理解一下) for( int i=0;i<points.length;i++ ) { prev[i] = start; } flag[ start ] = true; prev[start] = start; Stack path = new Stack(); //最后用栈输出路径 int currentSmall = 0 ; //currentSmall记录每次迭代中最小值下标 //迭代points.length-1次,每次标记一个最短距离的点 for( int j=1;j<points.length;j++ ) { int minDistence = INF; //标记起点 for( int i=0;i<points.length;i++ ) { //在未获取最短路径的顶点中,找到离起点最近的节点 if( !flag[i] && distence[i]<minDistence ) { minDistence = distence[i]; currentSmall = i; //记录最小距离点的下标 } } flag[currentSmall] = true; //设置最小距离点的下标为已标记 //更新未标记节点的前驱以及与起点间的最小距离 for( int i=0;i<points.length;i++ ) { if( !flag[i] ) //若i还没有标记过 { int temp = ( arc[currentSmall][i]==INF ? INF : ( minDistence + arc[currentSmall][i] ) ); if( temp<distence[i] ) //若更新后距离比原先小 { distence[i] = temp; //更新距离 prev[i] = currentSmall; //更新前驱 } } } } //输出各个节点与起点的最短距离,以及最短路径 System.out.printf("dijkstra(%c): \n", points[start]); for (int i=0; i < points.length; i++) { //倒叙取出前驱直到起点结束 int j = prev[i]; while( j!=start ) { path.push(points[j]); //前驱入栈 j = prev[j]; //前驱的前驱 } System.out.print( "shortestDistenct("+points[start]+","+points[i]+") = "+distence[i]+" "); System.out.print("path = " + points[start] + " "); while( !path.isEmpty() ) { System.out.print(path.pop()+" "); } System.out.println(points[i]); } } public static void main( String[] args ) { dijkstraShortestPath dsp = new dijkstraShortestPath(); points = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G'}; arc = new int[][] { /*A*//*B*//*C*//*D*//*E*//*F*//*G*/ /*A*/ { 0, 12, INF, INF, INF, 16, 14}, /*B*/ { 12, 0, 10, INF, INF, 7, INF}, /*C*/ { INF, 10, 0, 3, 5, 6, INF}, /*D*/ { INF, INF, 3, 0, 4, INF, INF}, /*E*/ { INF, INF, 5, 4, 0, 2, 8}, /*F*/ { 16, 7, 6, INF, 2, 0, 9}, /*G*/ { 14, INF, INF, INF, 8, 9, 0} }; dsp.dijkstra(3); }}
本文图片和数据来源:
http://www.cnblogs.com/skywang12345/
0 0
- Java迪杰斯特拉算法(Dijkstra算法)求最短路径
- Dijkstra算法求最短路径(java)
- Dijkstra算法求最短路径(java)
- dijkstra 求最短路径算法
- Dijkstra算法求最短路径
- Dijkstra 算法求最短路径
- Dijkstra算法求最短路径
- Dijkstra算法求最短路径
- Dijkstra 求最短路径算法
- Dijkstra算法 ---求最短路径
- Dijkstra算法求最短路径
- dijkstra算法求最短路径
- dijkstra算法求最短路径
- Dijkstra算法求最短路径
- dijkstra算法求最短路径
- 【算法】Dijkstra 求最短路径算法
- JAVA实践Dijkstra算法求最短路径距离
- 单源最短路径( Dijkstra算法)JAVA实现
- 一对多的查询排序ui
- 基因光线
- 转载博客
- linux下c程序访问mysql小例子
- C语言中的基本数据类型--数据之间的混合运算
- Java迪杰斯特拉算法(Dijkstra算法)求最短路径
- 标准模板库
- 数论常用内容——欧拉函数
- Hibernate的hbm2ddl.auto=update的内幕
- 控件禁止滚动
- (课程)基于Spark的机器学习经验
- 0426-属性选择器
- bzoj4878: [Lydsy2017年5月月赛]挑战NP-Hard
- 01-复杂度1 最大子列和问题 (20分)