/***********源程序****************/
/****** from GUET L迁客 2012-10-26 **************/
package algorithm;
public class floyd {
int[][] minLength = null;//记录的就是最短路径长度。
String path ="";//记录最短路径。
int[][] spot = null;//定义任意两点经过的点。
/**
* 通过构造函数来构建最短路径算法
* @param G
*/
public floyd(int[][] G){
int MAX = 99;//表示无穷,相当于没有边连接
int row = G.length;//图G的行数
spot = new int[row][row];
minLength = new int[row][row];
//初始化任意两个点之间没有路径。
//初始化最短路径长度就是邻接矩阵的值
for(int i = 0;i < row;i++){
for(int j = 0;j <row;j++){
spot[i][j] = -1;
minLength[i][j] = G[i][j];
}
}
/**
* 主要算法:三 层 循 环(外层循环是判断加入新的点后最短距离的改变)
* MAX等于99相当于无穷,表示相应的两个结点间没有变相连
*/
for(int i = 0;i < row;i++){
for(int j = 0;j < row;j++){
for (int k = 0; k < row; k++) {
if (minLength[j][i] != MAX
&& minLength[i][k] != MAX
&& minLength[j][k] > minLength[j][i]+ minLength[i][k]) {
minLength[j][k] = minLength[j][i] + minLength[i][k];
spot[j][k] = i;// 把经过的点加入
}
}
}
}
}
/**
* 打印各点之间的最短距离
*
*/
public void print(){
for(int i =0;i<minLength.length;i++){
for(int j = 0;j<minLength.length;j++){
System.out.print(minLength[i][j]+" ");
}
System.out.println();
}
}
/**
* 利用的是递归算法实现寻找一条最短路径。
* @param i
* @param j
* @return 最短路径
*/
public String findPath(int i ,int j){
int k = spot[i][j];
if(k == -1){
return path;
}
findPath(i,k);
path += k +" ";
return path;
}
public static void main(String[] args) {
//初始化一个邻接矩阵
int[][] matrix = new int[][]{
{ 0,99,8,7,6,5,4,3,2,1 },
{ 99,0,99,8,7,6,5,4,3,2},
{ 8,99,0,99,8,7,6,5,4,3},
{ 7,8,99,0,99,8,7,6,5,4},
{ 6,7,8,99,0,99,8,7,6,5},
{ 5,6,7,8,99,0,99,8,7,6},
{ 4,5,6,7,8,99,0,99,8,7},
{ 3,4,5,6,7,8,99,0,99,8},
{ 2,3,4,5,6,7,8,99,0,99},
{ 1,2,3,4,5,6,7,8,99,0},
};
floyd f = new floyd(matrix);
f.print();
//System.out.println("从第一个结点到第十个结点的最短路径为:");
//System.out.println(f.findPath(0,9));
}
}
java实现的floyd算法
最新推荐文章于 2024-05-08 14:06:31 发布