/** * 统计最短路径的算法 * 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]); } }