Floyd算法java實現demo
阿新 • • 發佈:2019-04-23
算法 class cti 表示 arr scrip dde 不一致 author
Floyd算法java實現,如下:
package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ┃ ┃ + * ┃ ┻ ┃ * ┃ ┃ + + * ┗━┓ ┏━┛ * ┃ ┃ * ┃ ┃ + + + + * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ + 神獸保佑,代碼無bug * ┃ ┃ * ┃ ┃ + * ┃ ┗━━━┓ + + * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ + + + + * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛+ + + + * * @Author:Halburt * @Date:2019-04-23 下午 1:52 * @Description: Floyd算法demo */ public class FloydDemo { // 表示無窮大 即不可達 public static int MAX = Integer.MAX_VALUE; // 距離矩陣 public int[][] dist; // 路徑Path矩陣 public int[][] path; /** * 按點初始化 * * @param size */ public FloydDemo(int size) { this.path = new int[size][size]; this.dist = new int[size][size]; } public static void print(int[][] arrs) { System.out.println("------------------------"); for (int[] arr : arrs) { for (int a : arr) { if (a == FloydDemo.MAX) { System.out.print("∞ "); } else { System.out.print(a + " "); } } System.out.println(); } System.out.println("------------------------"); } /**核心算法 * 構建距離矩陣和路徑矩陣 * @param matrix */ public void floyd(int[][] matrix) { // matrix和path length不一致可處理異常 int size = matrix.length; //初始化 dist 和 path for(int i = 0;i< size;i++){ for(int j = 0;j < size; j++){ path[i][j]=-1; dist[i][j]=matrix[i][j]; } } // 核心算法 for(int k = 0 ; k < size ; k++){ for(int i = 0;i < size;i++){ for(int j = 0 ;j < size;j++){ // 判斷如果 ik距離可達且 kj距離可達 且 i和j的距離是否大於 i-> k 與 k->j的距離和 if( dist[i][k] != MAX && dist[k][j] != MAX && dist[i][j] > (dist[i][k] + dist[k][j]) ){ path[i][j]= k; dist[i][j]= dist[i][k] + dist[k][j]; } } } } } // 查找i到j的路徑 public void findPath(int i ,int j){ // i = j 0 // i < size && j < size StringBuffer pathStr = new StringBuffer(i+" -> "); // List list = new ArrayList(); 也可以存儲list裏 tofind(i,j,pathStr); pathStr.append(j); System.out.println(i+"到"+j +":"); System.out.println("最終路徑:"+pathStr.toString()); System.out.println("最終距離:"+ dist[i][j]); } public void tofind(int i ,int j ,StringBuffer pathStr ){ if(path[i][j] != -1){ pathStr .append(path[i][j] + " -> "); // list.add(path[i][j]) tofind( path[i][j],j , pathStr); } } public static void main(String[] args) { int[][] matrix = { {0, 5, MAX, 7}, {MAX, 0, 4, 2}, {3, 3, 0, 2}, {MAX, MAX, 1, 0} }; FloydDemo.print(matrix); FloydDemo demo = new FloydDemo(4); demo.floyd(matrix); FloydDemo.print(demo.dist); FloydDemo.print(demo.path); demo.findPath(1,0); demo.findPath(2,0); } }
Floyd算法java實現demo