java实现的floyd算法

来源:互联网 发布:网络配线架mdf 编辑:程序博客网 时间:2024/05/18 03:51

/***********源程序****************/   /******   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));}}

原创粉丝点击