1. 程式人生 > >Floyd-Warshall演算法

Floyd-Warshall演算法

本次使用方法:引入中轉點k,如果i到k的距離 + k到j的距離 < i到j的距離,更新i到j的最短距離,將每個點做為中轉點更新距離後就可以得到任意兩點最短距離。遞迴解:https://blog.csdn.net/ideaqjx/article/details/78881044

import java.util.*;
public class Floyd {
    public static void main(String args[]){
        int array[][]=new int[][]{{0,1,26,44},{99,0,2,33},{6,8,0,4},{5,7,10,0}};
        int pre[][]=new int[4][4];
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                pre[i][j]=j;  //注意初始化前驅的方式
            }
        }
        //FLoyd 演算法求任意一對點最短路徑,三層迴圈是關鍵
        for(int k=0;k<4;k++){
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    if(array[i][k]+array[k][j]<array[i][j]){
                        array[i][j]=array[i][k]+array[k][j];
                        pre[i][j]=pre[i][k];
                    }
                }
            }
        }
        System.out.println("最短路徑");
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println("前驅");
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                System.out.print(pre[i][j]+" ");
            }
            System.out.println();
        }
        //列印中間節點,即路徑
        int v=0,w=3;
        int k=pre[v][w];
        System.out.print(v+" ");
        while(k!=w){
            System.out.print(k+" ");
            k=pre[k][w];
        }
        System.out.println(w);
    }
}