Floyd算法的基本思想:
(1)利用二维数组gra[1..n-1][1..n-1], A[i][j]记录当前vi到vj的最短路径长度,数组gra的初值等于图的代权临街矩阵;
(2)数组path记录当前允许的中间顶点,path初值等于该顶点;
(3)依次向path中加入v0 ,v1… vn-1,每加入一个顶点,对A[i][j]进行一次修正:设path={v0 v1… vk-1},加入vk,则A(k)[i][j] = min{ A(k-1)[i][j],A(k-1)[i][k]+A(k-1)[k][j]}。
A(k)[i][j]的含义:允许中间顶点的序号最大为k时从vi到vj的最短路径长度。
A(n-1)[i][j]就是vi到vj的最短路径长度。
import java.util.Scanner;
public class floyd {
public static int gra[][];
public static String path[][];
public static void main(String[] args) {
int p=Integer.MAX_VALUE;
Scanner s=new Scanner(System.in);
int n=s.nextInt();
gra=new int[n][n];
path=new String[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
gra[i][j]=s.nextInt();
path[i][j]=(i+1)+"";
if(i!=j&&gra[i][j]==0) gra[i][j]=p;
}
}
//Floyd核心算法,遍历图中所有结点j,遍历完所有结点之后,数组里储存的就是每两个点之间的最短路径
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(gra[i][j]!=0){
if(gra[i][j]>gra[i][k]+gra[k][j]&&gra[i][k]!=p&&gra[k][j]!=p){
gra[i][j]=gra[i][k]+gra[k][j];
path[i][j]+=(k+1)+"";
}
}
}
}
}
System.out.println(gra[0][3]);
System.out.println(path[0][3]);
for(int i=0;i<n;i++){//输出最短路径
for(int j=0;j<n;j++){
System.out.print(path[i][j]+" ");
}
System.out.println();
}
}
}