图的最短路径-Dijkstra算法
2018-01-21 00:00
113 查看
/** * 统计最短路径的算法 * Dijkstra.统计图中顶点v到其他各顶点的最短路径 * * @param vs 起始顶点,即计算顶点vs到其他顶点的最短路径 * @param prev 前驱顶点数组,即prev[i]的值是顶点vs到顶点i的最短路径所经历的全部顶点中,位于顶点i之前的那个顶点 * @param dist 长度数组,即dist[i]是顶点vs到顶点i的最短路径长度 */ public void dijkstra(int vs, int[] prev, int[] dist) { //flag[i]=true表示顶点vs到顶点i的最短路径已成功获取 boolean[] flag = new boolean[mVexs.length]; //初始化 for (int i = 0; i < mVexs.length; i++) { flag[i] = false; prev[i] = 0; dist[i] = getWeight(vs, i); } //对顶点vs自身进行初始化 flag[vs] = true; dist[vs] = 0; int k = 0; for (int i = 1; i < mVexs.length; i++) { /** * 寻找最小的路径,即在未获取路径的顶点中,寻找离vs最近的顶点k */ int min = INF; for (int j = 0; j < mVexs.length; j++) { if (flag[j] == false && dist[j] < min) { min = dist[j]; k = j; } } //标记k为已获取到最短路径 flag[k] = true; for(int j=0;j<mVexs.length;j++){ int tmp = getWeight(k,j); tmp = (tmp==INF?INF:(tmp+min)); if(flag[j]==false&&tmp<dist[j]){ dist[j]=tmp; prev[j]=k; } } } //打印dijkstara最短路径的结果 System.out.println("dijkstra:"+mVexs[vs].data); for(int i=0;i<mVexs.length;i++){ System.out.println(mVexs[vs].data+"->"+mVexs[i].data+" : "+dist[i]); } }
相关文章推荐
- 每日一题 No.48 单源最短路径问题2(Dijkstra算法)
- PKU1062(昂贵的聘礼)单源点最短路径-Dijkstra算法
- 单源最短路径(Dijkstra算法)
- 最短路径算法设计与实现(Dijkstra算法和Floyd算法)
- poj2387 Til the Cows Come Home 最短路径dijkstra算法
- 最短路径—Dijkstra算法和Floyd算法
- 图_单源最短路径_ Dijkstra算法
- 最短路径—Dijkstra算法和Floyd算法
- woj 1009 最短路径 dijkstra算法
- 最短路径—Dijkstra算法和Floyd算法
- Dijkstra算法求最短路径
- HDU3790 最短路径问题【Dijkstra算法】
- 最短路径—Dijkstra算法
- DijKstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)C#版
- 最短路径问题---Dijkstra算法详解
- 最短路径之Dijkstra算法详细讲解
- Dijkstra算法(单源最短路径) C++
- 无向图的最短路径求解算法之——Dijkstra算法【转】
- C++ 求最短路径问题之Dijkstra算法(一)