Floyd算法

Floyd算法适用于APSP(AllPairsShortestPaths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法

优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单

缺点:时间复杂度比较高,不适合计算大量数据。

时间复杂度:O(n^3);空间复杂度:O(n^2);

任意节点i到j的最短路径两种可能:

  1. 直接从i到j;
  2. 从i经过若干个节点k到j。

map(i,j)表示节点i到j最短路径的距离,对于每一个节点k,检查map(i,k)+map(k,j)小于map(i,j),如果成立,map(i,j) = map(i,k)+map(k,j);遍历每个k,每次更新的是除第k行和第k列的数

 

 1 public class FloydTest {
 2 
 3     static char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
 4     static int[][] matrix = new int[vertex.length][vertex.length];
 5     static final int N = 65535;
 6     static int[][] path = new int[vertex.length][vertex.length];
 7 
 8     public static void main(String[] args) {
 9         matrix[0] = new int[]{0,1,7,N,N,N,1};
10         matrix[1] = new int[]{1,0,N,9,N,N,3};
11         matrix[2] = new int[]{7,N,0,N,8,N,N};
12         matrix[3] = new int[]{N,9,N,0,N,4,N};
13         matrix[4] = new int[]{N,N,8,N,0,5,4};
14         matrix[5] = new int[]{N,N,N,4,5,0,6};
15         matrix[6] = new int[]{1,3,N,N,4,6,0};
16         calculate();
17         int start = 0,end = 5;
18         System.out.println(vertex[start]+ " - " + vertex[end] + "最短距离:"+matrix[start][end]);
19         System.out.print("路径:"+vertex[start]+",");
20         print(0,5);
21         System.out.println(vertex[end]);
22     }
23 
24     public static void calculate(){
25 
26         for (int i = 0; i < vertex.length; i++) {
27             for (int j = 0; j < vertex.length; j++) {
28                 path[i][j] = -1;
29             }
30         }
31         for (int i = 0; i < vertex.length; i++) {
32             for (int j = 0; j < vertex.length; j++) {
33                 for (int k = 0; k < vertex.length; k++) {
34                     if(matrix[j][i]!=N && matrix[i][k]!=N && j!=k && matrix[j][i]+matrix[i][k]<matrix[j][k]){
35                         matrix[j][k] = matrix[j][i]+matrix[i][k];
36                         path[j][k] = i;
37                     }
38                 }
39             }
40         }
41 
42     }
43 
44     public static void print(int i,int j){
45         int k = path[i][j];
46         if(k==-1){
47             return ;
48         }
49         print(i,k);
50         System.out.print(vertex[k]+",");
51         print(k,j);
52     }
53 
54 }

 

posted @ 2020-09-23 17:23  gavinwu_bk  阅读(186)  评论(0)    收藏  举报