/** * 統計最短路徑的算法 * 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]); } }