当前位置: 代码迷 >> 综合 >> Floyd-最短路径(java)
  详细解决方案

Floyd-最短路径(java)

热度:94   发布时间:2023-09-22 09:25:33.0

Floyd算法:用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离,其初始化了2个矩阵分别为

  • matrix(图的邻接举证)
  • path(保存最短路径的矩阵)
    算法的时间复杂度是O(n^3)
    ——单源最短路径算法Dijkstra的时间复杂度是O(n^2);
    如图:
    Floyd-最短路径(java)
import java.util.Stack;public class ShortestPathFloyd {int n;int[][] matrix;int[][] path;int[][] path2;int MAX_DISTANCE=Integer.MAX_VALUE;public void floyd(int n,int[][] newMatrix){matrix=new int[n][n];path=new int[n][n];path2=new int[n][n];this.n = n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){this.path[i][j]=j;this.path2[i][j]=j;}}for (int i=0;i<n;i++){for(int j=0;j<n;j++){this.matrix[i][j]=newMatrix[i][j];if(newMatrix[i][j]<MAX_DISTANCE)path2[i][j]=i;}}//3for,这段是floyd的主要思想//表示以k为中间点,是否有i->k+k->j的长度小于i->j的长度,如果有,则优化路径;for (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int tmp=(matrix[i][k]==MAX_DISTANCE||matrix[k][j]==MAX_DISTANCE)?MAX_DISTANCE:(matrix[i][k]+matrix[k][j]);if(matrix[i][j]>tmp){matrix[i][j]=tmp;path[i][j]=path[i][k];//可以正向输出路径而非递归输出;path2[i][j]=k;//递归输出;}}}}}public void printPath2(){System.out.println("Print Path2[][]:");for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.print(path2[i][j]+" ");}System.out.println();}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.println("\n(" + i + "->" + j + ")的最短距离为:" + matrix[i][j]);int k = i;Stack<Integer> sta=new Stack<>();while(path2[k][j]!=k){sta.push(path2[k][j]);k=path2[k][j];}System.out.print(i);while(!sta.isEmpty()){System.out.print("->"+sta.pop());}System.out.println("->"+j);}}}private void printPath() {System.out.println("Print Path[][]:");for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.print(path[i][j]+" ");}System.out.println();}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.println("("+i+"->"+j+")"+"的最短距离为:"+matrix[i][j]);int k=i;System.out.print(i);while(path[k][j]!=j){System.out.print("->"+path[k][j]);k=path[k][j];}System.out.print("->"+j+"\n");}}}public static void main(String[] args) {//Floyd算法:用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离ShortestPathFloyd shortestPathFloyd = new ShortestPathFloyd();int INF=Integer.MAX_VALUE;int[][] matrix={{0,1,INF,INF,2,INF},{1,0,1,INF,INF,INF},{INF,1,0,1,INF,INF},{INF,INF,1,0,1,INF},{INF,INF,INF,1,0,1},{INF,INF,INF,1,1,0}};shortestPathFloyd.floyd(6,matrix);//shortestPathFloyd.printPath();shortestPathFloyd.printPath2();}
}

上述代码可以打印最短路径和最短路径长度,结果如下:

Print Path2[][]:
0 0 1 2 0 4 
1 1 1 2 0 4 
1 2 2 2 3 4 
2 2 3 3 3 4 
3 3 3 4 4 4 
3 3 3 5 5 5 
(0->0)的最短距离为:0
0->0
(0->1)的最短距离为:1
0->1
(0->2)的最短距离为:2
0->1->2
(0->3)的最短距离为:3
0->2->3
(0->4)的最短距离为:2
0->4
(0->5)的最短距离为:3
0->4->5
(1->0)的最短距离为:1
1->0
......
  相关解决方案