Floyd算法java實現demo


Floyd算法java實現,如下:

https://www.cnblogs.com/Halburt/p/10756572.html

 

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++){
if(i == j){
continue;
}
// 判斷如果 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]) ){
System.out.println("路徑{" + i +"->" + j +"}在點"+k +"處可中轉(原先中轉點為"+path[i][j]+"),距離由"+ dist[i][j]+"縮短為"+(dist[i][k] + dist[k][j]));
path[i][j]= k;
dist[i][j]= dist[i][k] + dist[k][j];
}else{
System.out.println("路徑{" + i +"->" +j +"}在點"+k +"中轉不合適");
}
}
}
}
}
// 查找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(matrix[0].length);
demo.floyd(matrix);
System.out.println("算法執行之后:");
FloydDemo.print(demo.dist);
FloydDemo.print(demo.path);
demo.findPath(0,3);



}


}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM