如何列出Floyd-Warshall算法中传递的顶点

时间:2012-05-17 15:29:52

标签: java recursion shortest-path floyd-warshall

我似乎无法找到一种方法来列出传递的顶点,因为我的算法(floyd-warshall)计算最短路径。我被告知我必须使用递归,但我不知道如何使用递归。请给出伪代码/例子,非常感谢!

    import java.util.*;
    public class Main{
        public static final int INF = 9999999;
        public static int[][] path;
        public static int[] tax;
        public static void main(String[] adsf){
            Scanner pp = new Scanner(System.in);
            int testCases = pp.nextInt();
            pp.nextLine();
            pp.nextLine();
            while(testCases-- >0){
                String[] s1 = pp.nextLine().split(" ");
                int size = s1.length;
                path = new int[size][size];
                for(int i = 0; i < path.length; i++)
                    Arrays.fill(path[i],INF);
                tax = new int[size];
                for(int j = 0; j < path[0].length; j++){
                    path[0][j] = Integer.parseInt(s1[j]);
                    if(path[0][j]==-1)path[0][j]=INF;
                }
                for(int i = 1; i < path.length;i++){
                    s1 = pp.nextLine().split(" ");
                    for(int j = 0; j < path[0].length; j++){
                        path[i][j] = Integer.parseInt(s1[j]);
                        if(path[i][j]==-1)path[i][j]=INF;
                    }
                }
                for(int k=0; k<tax.length;k++){
                    tax[k] = pp.nextInt();
                } pp.nextLine();    
                sssp();
                }
                int x,y;
                while(pp.hasNextInt()){
                    x=pp.nextInt();
                    y=pp.nextInt();
                    int cost = path[x-1][y-1];
                    System.out.println((x-1)+" "+(y-1)+" "+cost);
                }
            }
        }
        public static void sssp(){
            for(int k=0;k<path.length;k++){
                for(int i=0;i<path.length;i++){
                    for(int j=0;j<path.length;j++){
                        path[i][j] = Math.min(path[i][j],path[i][k]+path[k][j]);
                    }
                }   
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

你不需要使用递归来进行路径重建(事实上,你永远不会在Java中使用递归使用它来解决某些问题会更加方便,包括这个)。

为了能够找出除长度之外的最短路径,您需要第二个2D阵列,用于在路径中存储节点的后继路径。看一下this article,我所说的数组在它们的伪代码中称为next

回想一下,该算法的逻辑如下:“如果你从ijk的速度比从i到{{1}的速度快通过任何先前发现的路径,然后使用路径j作为当前最短路径“。现在您需要做的就是将决定存储在其他数组中k,如下所示:

k

一旦Floyd-Warshal完成,您可以首先重建从if (path[i][k] + path[k][j] < path[i][j]) { path[i][j] = path[i][k]+path[k][j]; next[i][j] = k; } i然后从{{1}的路径,重建从ji的路径} k

k