在网上很难找到能通过弗洛伊德输出路径的方法,大多是 仅仅输出了节点之间的最小值,没有路径,所以咋这里添加一个可以输出路径的工具。
package Backup;
import java.util.ArrayList;
import java.util.List;
/**
* 我将遇到的用于计算路径的算法集中记录在这里
*/
public class Road {
public static void main(String[] args){
int[][] matrix={{0,2,6,4},{1000000,0,3,1000000},{7,1000000,0,1},{5,1000000,12,0}};
int[][] path=new int[4][4];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++) {
path[i][j]=j;
}
}
Road road=new Road();
//初始路径
road.showArray(path);
//初始邻接矩阵
road.showArray(matrix);
road.findFloydRoad(matrix,path);
//计算过后的路径
road.showArray(path);
// 计算过后的距离
road.showArray(matrix);
//挑一对节点,输出路径
System.out.println(road.findTheRoad(path,1,0).toString());
}
private void showArray(int arr[][]){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
System.out.println();
}
/**
* *************************************************************************************************************
* 能够得到任意两个点之间的最短距离的Floyd算法 可以有负权边,但是不能有负权环
* @param dist 最初的节点之间的距离矩阵,注意当两个节点之间不能到达是,初始值要设置 大于INF
* @param path 不想要中间路径的时候,可以直接去掉,中间路径的初始是 :"顶点i"到"顶点j"的最短路径是经过顶点j。
*/
private void findFloydRoad(int[][] dist,int[][] path){
int INF=1000000;
int mVex=dist.length;
for (int k = 0; k <mVex; k++) {
for (int i = 0; i < mVex; i++) {
for (int j = 0; j < mVex; j++) {
if(dist[i][j]>(dist[i][k]+dist[k][j])){
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j] = path[i][k];
}
}
}
}
}
/**
* 用于输出弗洛伊德算法的路径
* @param path 得到的路径矩阵
* @param start 开始点,注意这个点是从零开始计数的 例如从 0到3
* @param end 结束点,也是从零开始计数的
* @return List数组 返回的值也是从零开始计数的。
*/
private List<Integer> findTheRoad(int[][] path, int start, int end){
List<Integer> list=new ArrayList<Integer>();
list.add(start);
int temp=path[start][end];
while(temp!=end){
list.add(temp);
temp=path[temp][end];
}
list.add(end);
return list;
}
}
主要看其中的两个方法:floyd算法和输出路径算法,
main函数中只是使用了一个测试例子,其中1000000代表很远。