- /*
- *
- * 尋求最短路徑
- *
- */
- public class ShortPath {
- public static void main(String[] args) {
- int[][] am = {{1,2,10},{2,3,20},{2,4,25},{3,5,18}
- ,{4,5,22},{4,6,95},{5,6,77}};//每個邊
- Dijkstra d = new Dijkstra(am , 7);
- System.out.println("相鄰矩陣 : ");
- d.MatrixPrint();
- System.out.println("Dijkstra 頂點 1 至 個頂點最小距離 : ");
- d.shortestPath(1);
- System.out.println("Dijkstra 頂點 2 至 個頂點最小距離 : ");
- d.shortestPath(2);
- System.out.println("Dijkstra 頂點 3 至 個頂點最小距離 : ");
- d.shortestPath(3);
- System.out.println("Dijkstra 頂點 4 至 個頂點最小距離 : ");
- d.shortestPath(4);
- }
- }
- class Dijkstra extends Adjacency{
- int[] S ;//頂點集合
- int[] D ; //距離集合
- Dijkstra(int[][] M, int n) {
- super(M , n ) ;
- S = new int[n];
- D = new int[n];
- }
- void shortestPath(int vext){
- int shortv = 1;
- for(int i = 1 ; i < Matrix.length ; i++)
- D[i] = Matrix[vext][i] ; //D[i]為 vext 到 i 的距離
- S[vext] = 1 ; //加入起始頂點
- for(int i = 1 ; i < Matrix.length ; i++){
- int shortdistance = 999;
- for(int j = 1 ; j < Matrix.length ; j++)
- if(D[j] < shortdistance && S[j] == 0 ){ //為最小且沒加入至S集合
- shortdistance = D[j] ;
- shortv = j ;
- }
- S[shortv] = 1 ;//加入至S集合
- for(int j = 1 ; j < Matrix.length ; j++){
- if(S[j] == 0 && D[j] > D[shortv] + Matrix[shortv][j]) //假設未加入至S且與最短距離的頂點相鄰
- D[j] = D[shortv] + Matrix[shortv][j] ; //就把起始點到最短距離頂點相鄰點距離和加入至 D[j]
- }
- }
- //印出
- for(int i = 1 ; i < D.length ; i++)
- if(D[i] == 999)
- System.out.println(vext+" to "+i+"最短距離為 : ∞ " );
- else
- System.out.println(vext+" to "+i+"最短距離為 : "+D[i] );
- //重製
- S = new int[S.length];
- D = new int[D.length];
- }
- }
- abstract class Adjacency{ //相鄰矩陣
- int[][] Matrix ;
- int max = 999 ;
- Adjacency(int[][] M , int n){
- Matrix = new int[n][n] ;
- for(int i = 1 ; i < n ; i++){
- for(int j = 1 ; j < n ; j++){
- if(i == j) Matrix[i][j] = 0 ; //頂點相同代表沒距離
- else Matrix[i][j] = max ;//不是相鄰點頂給X
- }
- }
- for(int i = 0 ; i < M.length ; i++)
- Matrix[M[i][0]][M[i][1]] = M[i][2] ; //付值給Matrix
- }
- void MatrixPrint(){//印出
- for(int i = 1 ; i < Matrix.length ; i++){
- for(int j = 1 ; j< Matrix.length ; j++ )
- if(Matrix[i][j] == max) System.out.print( "X"+" ");
- else System.out.print(Matrix[i][j]+" ");
- System.out.println();
- }
- }
- }
2017年8月2日 星期三
(Java) 尋求最短路徑 -- Dijkstra公式運用
訂閱:
張貼留言 (Atom)

沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。