用java編寫的一個迪傑斯特拉算法(單源最短路徑算法,Dijkstra算法)。

[java] view plain copy
  1. package Test;  
  2.   
  3. import java.util.TreeMap;  
  4. import java.util.ArrayList;  
  5. import java.io.BufferedReader;  
  6. import java.io.InputStreamReader;  
  7. import java.io.IOException;  
  8.   
  9. class Point {  
  10.     private int id;// 點的id  
  11.     private boolean flag = false;// 標誌是否被遍歷  
  12.     int sum;// 記錄總的點個數  
  13.   
  14.     private TreeMap<Integer, Integer> thisPointMap = new TreeMap<Integer, Integer>();// 該點到各點的距離。  
  15.     BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  
  16.   
  17.     Point(int sum) { // 構造函數 帶有頂點個數  
  18.         this.sum = sum;  
  19.     }  
  20.   
  21.     public void setId(int id) {// 設置頂點id  
  22.         this.id = id;  
  23.     }  
  24.   
  25.     public int getId() {// 獲得頂點id  
  26.         return this.id;  
  27.     }  
  28.   
  29.     public void changeFlag() {// 修改訪問狀態。  
  30.         this.flag = true;  
  31.     }  
  32.   
  33.     public boolean isVisit() {// 查看訪問狀態  
  34.         return flag;  
  35.     }  
  36.   
  37.     public void setLenToOther()throws IOException{// 初始化改點到各頂點的距離。  
  38.         System.out.println("=======請輸入頂點" + (this.id + 1) + "至其他各頂點的邊距=======");  
  39.         for (int i = 0; i < sum; i++) {  
  40.             if (i == this.id)  
  41.                 thisPointMap.put(this.id, 0);  
  42.             else {  
  43.                 System.out.print("至 頂點" + (i + 1) + " 的距離 :");  
  44.                 boolean flag =true;  
  45.                 int len = 0;  
  46.                 while(flag){  
  47.                     try {  
  48.                         len = Integer.valueOf(bufr.readLine());  
  49.                         flag = false;  
  50.                     } catch (NumberFormatException e) {  
  51.                         System.out.print("輸入有誤,請重新輸入:");  
  52.                     }  
  53.                 };  
  54.                 thisPointMap.put(i, len);  
  55.             }  
  56.         }  
  57.     }  
  58.   
  59.     // 該點到頂尖id的 距離。  
  60.     public int lenToPointId(int id) {  
  61.         return thisPointMap.get(id);  
  62.     }  
  63. }  
  64.   
  65. class Dijkstra {  
  66.     public static void main(String[] args)throws IOException {  
  67.         ArrayList<Point> point_arr = new ArrayList<Point>();// 存儲點集合  
  68.         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  
  69.         System.out.print("請輸入頂點個數: ");  
  70.         int sum = 0;  
  71.         boolean flag =true;  
  72.         while(flag){  
  73.             try {  
  74.                 sum = Integer.valueOf(bufr.readLine());  
  75.                 flag = false;  
  76.             } catch (NumberFormatException e) {  
  77.                 System.out.print("輸入有誤,請重新輸入:");  
  78.             }  
  79.         };  
  80.         for (int i = 0; i < sum; i++) {// 初始化  
  81.             Point p = new Point(sum);  
  82.             p.setId(i);  
  83.             p.setLenToOther();  
  84.             point_arr.add(p);  
  85.         }  
  86.         System.out.print("請輸入起始頂點 id :");  
  87.         boolean flag2 =true;  
  88.         int start = 0;  
  89.         while(flag2){  
  90.             try {  
  91.                 start = Integer.valueOf(bufr.readLine())-1;  
  92.                 if(start > sum-1 || start < 0)  
  93.                     throw new NumberFormatException();  
  94.                 flag2 = false;  
  95.             }catch (NumberFormatException e) {  
  96.                 System.out.print("輸入有誤,請重新輸入:");  
  97.             }  
  98.         };  
  99.         showDijkstra(point_arr, start);// 單源最短路徑遍歷  
  100.     }  
  101.   
  102.     public static void showDijkstra(ArrayList<Point> arr, int i) {  
  103.         System.out.print("頂點" + (i + 1));  
  104.         arr.get(i).changeFlag();  
  105.         Point p1 = getTopointMin(arr, arr.get(i));  
  106.         if (p1 == null)  
  107.             return;  
  108.         int id = p1.getId();  
  109.         showDijkstra(arr, id);  
  110.   
  111.     }  
  112.   
  113.     public static Point getTopointMin(ArrayList<Point> arr, Point p) {  
  114.         Point temp = null;  
  115.         int minLen = Integer.MAX_VALUE;  
  116.         for (int i = 0; i < arr.size(); i++) {  
  117.             // 當已訪問 或 者是自身或者無該路徑時跳過。  
  118.             if (arr.get(i).isVisit() || arr.get(i).getId() == p.getId() || p.lenToPointId(i) < 0)  
  119.                 continue;  
  120.             else {  
  121.                 if (p.lenToPointId(i) < minLen) {  
  122.                     minLen = p.lenToPointId(i);  
  123.                     temp = arr.get(i);  
  124.                 }  
  125.             }  
  126.         }  
  127.         if (temp == null)  
  128.             return temp;  
  129.         else  
  130.             System.out.print("  @--" + minLen + "--> ");  
  131.         return temp;  
  132.     }  
  133. }  


 

[java] view plain copy
  1. <p>運行結果:</p>  
[java] view plain copy
  1. 請輸入頂點個數: 5  
  2. =======請輸入頂點1至其他各頂點的邊距=======  
  3. 至 頂點2 的距離 :15  
  4. 至 頂點3 的距離 :24  
  5. 至 頂點4 的距離 :33  
  6. 至 頂點5 的距離 :28  
  7. =======請輸入頂點2至其他各頂點的邊距=======  
  8. 至 頂點1 的距離 :16  
  9. 至 頂點3 的距離 :25  
  10. 至 頂點4 的距離 :18  
  11. 至 頂點5 的距離 :21  
  12. =======請輸入頂點3至其他各頂點的邊距=======  
  13. 至 頂點1 的距離 :29  
  14. 至 頂點2 的距離 :30  
  15. 至 頂點4 的距離 :25  
  16. 至 頂點5 的距離 :29  
  17. =======請輸入頂點4至其他各頂點的邊距=======  
  18. 至 頂點1 的距離 :31  
  19. 至 頂點2 的距離 :36  
  20. 至 頂點3 的距離 :22  
  21. 至 頂點5 的距離 :11  
  22. =======請輸入頂點5至其他各頂點的邊距=======  
  23. 至 頂點1 的距離 :-1  
  24. 至 頂點2 的距離 :-1  
  25. 至 頂點3 的距離 :30  
  26. 至 頂點4 的距離 :39  
  27. 頂點1  @--15--> 頂點2  @--18--> 頂點4  @--11--> 頂點5  @--30--> 頂點3  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章