本次使用方法:引入中转点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);
}
}