例如:W[0][5]=9 代表vo->v5的最短路径为9
W=:
0 1 3 7 4 9
1 0 2 6 3 8
3 2 0 4 1 6
7 6 4 0 3 2
4 3 1 3 0 5
9 8 6 2 5 0
package com.xh.Floyd; import java.util.ArrayList; public class Floyd_01 { public static int M = Integer.MAX_VALUE; public static int MAXSUM(int a,int b){ return (a!=M&&b!=M)?(a+b):M; } public static ArrayList<Integer[][]> flody(Integer[][] dist){ Integer[][] path=new Integer[6][6];//存储的是从i->j经过的最后一个节点 for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { path[i][j]=i; } } for(int k=0;k<6;k++){ for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { if(dist[i][j]>MAXSUM(dist[i][k], dist[k][j])){ path[i][j]=path[k][j];//存储的是从i->j经过的最后一个节点 dist[i][j]=MAXSUM(dist[i][k], dist[k][j]); } } } } ArrayList<Integer[][]> list =new ArrayList<Integer[][]>(); list.add(dist); list.add(path); return list; } public static Integer[] reverse(Integer[] chain,int count){ int temp; for(int i=0,j=count-1;i<j;i++,j--){ temp=chain[i]; chain[i]=chain[j]; chain[j]=temp; } return chain; } public static void display_path(ArrayList<Integer[][]> list){ Integer[][] dist=list.get(0); Integer[][] path=list.get(1); Integer[] chain=new Integer[6]; System.out.println("orign->dist"+" dist "+" path"); for (int i = 0; i <6; i++) { for (int j = 0; j < 6; j++) { if(i!=j){//只是避免了vi->vi的输出 //输出源到目的地 System.out.print("\n "+(i)+"->"+(j)+" "); //输出最短路径的长度 if(dist[i][j]==M){ System.out.print(" NA "); }else{ System.out.print(dist[i][j]+" "); int count=0; int k=j; do { k=chain[count++]=path[i][k]; } while (i!=k); chain=reverse(chain,count); //输出路径 System.out.print(chain[0]+""); for(k=1;k<count;k++){ System.out.print("->"+(chain[k])); } System.out.print("->"+j); } } } } } public static void main(String[] args) { Integer[][] dist = { { 0, 1, 4, M, M, M }, { 1, 0, 2, 7, 5, M }, { 4, 2, 0, M, 1, M }, { M, 7, M, 0, 3, 2 }, { M, 5, 1, 3, 0, 6 }, { M, M, M, 2, 6, 0 } };// 建立一个权值矩阵 ArrayList<Integer[][]> list=flody(dist); display_path(list); } }