求解最短路径(任意两个节点之间的最短距离)
核心思想:dis[i][j] = min{dis[i][k] + dis[k][j],dis[i][j]}
从头开始遍历结点,以这些结点作为中间结点,比较距离,直到遍历结束。
dis数组中存放的就是任意两个结点之间的最短距离。
java代码实现:
public class Floyd {
public static void main(String[] args) {
char[] vertex={'A','B','C','D','E','F','G'};
int [][]matrix=new int[vertex.length][vertex.length];
final int N=65535;
matrix[0]=new int[]{0,5,7,N,N,N,2};
matrix[1]=new int[]{5,0,N,9,N,N,3};
matrix[2]=new int[]{7,N,0,N,8,N,N};
matrix[3]=new int[]{N,9,N,0,N,4,N};
matrix[4]=new int[]{N,N,8,N,0,5,4};
matrix[5]=new int[]{N,N,N,4,5,0,6};
matrix[6]=new int[]{2,3,N,N,4,6,0};
Mgraph mgraph=new Mgraph(vertex,matrix);
mgraph.floyd();
mgraph.show();
}
}
class Mgraph{
char[] vertex;
int length;
private int[][] dis;
private int[][] pre;
public Mgraph(char[] vertex, int[][] matrix) {
this.vertex = vertex;
this.dis = matrix;
this.length = vertex.length;
this.pre=new int[length][length];
}
public void floyd(){
int len;
for(int k=0;k<length;k++){
for (int i=0;i<length;i++){
for (int j=0;j<length;j++){
len=dis[i][k]+dis[k][j];
if (len<dis[i][j]){
dis[i][j]=len;
pre[i][j]=k;
}
}
}
}
}
public void show(){
for (int i=0;i<length;i++){
for (int j=0;j<length;j++){
System.out.print(vertex[pre[i][j]]+" ");
}
System.out.println();
for (int k=0;k<length;k++){
System.out.print(vertex[i]+"到"+vertex[k]+"的最短路径"+dis[i][k]+" ");
}
System.out.println();
System.out.println();
}
}
}
打印结果
A A A G G G A
A到A的最短路径0 A到B的最短路径5 A到C的最短路径7 A到D的最短路径12 A到E的最短路径6 A到F的最短路径8 A到G的最短路径2
A A A A G G A
B到A的最短路径5 B到B的最短路径0 B到C的最短路径12 B到D的最短路径9 B到E的最短路径7 B到F的最短路径9 B到G的最短路径3
A A A F A E A
C到A的最短路径7 C到B的最短路径12 C到C的最短路径0 C到D的最短路径17 C到E的最短路径8 C到F的最短路径13 C到G的最短路径9
G A F A F A F
D到A的最短路径12 D到B的最短路径9 D到C的最短路径17 D到D的最短路径0 D到E的最短路径9 D到F的最短路径4 D到G的最短路径10
G G A F A A A
E到A的最短路径6 E到B的最短路径7 E到C的最短路径8 E到D的最短路径9 E到E的最短路径0 E到F的最短路径5 E到G的最短路径4
G G E A A A A
F到A的最短路径8 F到B的最短路径9 F到C的最短路径13 F到D的最短路径4 F到E的最短路径5 F到F的最短路径0 F到G的最短路径6
A A A F A A A
G到A的最短路径2 G到B的最短路径3 G到C的最短路径9 G到D的最短路径10 G到E的最短路径4 G到F的最短路径6 G到G的最短路径0