Floyd-Warshall演算法
阿新 • • 發佈:2018-11-09
本次使用方法:引入中轉點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); } }