首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无递归的Floyd-Warshall路径重建

无递归的Floyd-Warshall路径重建
EN

Stack Overflow用户
提问于 2018-05-25 05:06:38
回答 1查看 515关注 0票数 3

我正在使用here的这个弗洛伊德-沃肖尔算法。

代码语言:javascript
复制
import static java.lang.String.format;
import java.util.Arrays;



public class FloydWarshall {


    public static void main(String[] args) {
        int[][] weights = {{1, 3, -2}, {2, 1, 4}, {2, 3, 3}, {3, 4, 2}, {4, 2, -1}};
        int numVertices = 4;

        floydWarshall(weights, numVertices);
    }

    static void floydWarshall(int[][] weights, int numVertices) {

        double[][] dist = new double[numVertices][numVertices];
        for (double[] row : dist)
            Arrays.fill(row, Double.POSITIVE_INFINITY);

        for (int[] w : weights)
            dist[w[0] - 1][w[1] - 1] = w[2];

        int[][] next = new int[numVertices][numVertices];
        for (int i = 0; i < next.length; i++) {
            for (int j = 0; j < next.length; j++)
                if (i != j)
                    next[i][j] = j + 1;
        }

        for (int k = 0; k < numVertices; k++)
            for (int i = 0; i < numVertices; i++)
                for (int j = 0; j < numVertices; j++)
                    if (dist[i][k] + dist[k][j] < dist[i][j]) {
                        dist[i][j] = dist[i][k] + dist[k][j];
                        next[i][j] = next[i][k];
                    }

        printResult(dist, next);
    }

    static void printResult(double[][] dist, int[][] next) {
        System.out.println("pair     dist    path");
        for (int i = 0; i < next.length; i++) {
            for (int j = 0; j < next.length; j++) {
                if (i != j) {
                    int u = i + 1;
                    int v = j + 1;
                    String path = format("%d -> %d    %2d     %s", u, v,
                            (int) dist[i][j], u);
                    do {
                        u = next[u - 1][v - 1];
                        path += " -> " + u;
                    } while (u != v);
                    System.out.println(path);
                }
            }
        }
    }
}

算法本身非常清晰,但我不理解的是next矩阵。根据我对i,j的理解,索引应该是从节点i到节点j的路径上的最后一个前面的节点。然后递归打印打印路径。但是这段代码在打印语句printResult中使用了某种不同的方法。所以我的问题是,矩阵next到底是什么,打印是如何工作的?

EN

回答 1

Stack Overflow用户

发布于 2018-05-25 08:54:53

dist[i][j] = dist[i][k] + dist[k][j]说:当从i到j时,通过k,从i到k的最短路径,然后是从k到j的最短路径,这里:next[i][j] = next[i][k]它说的是从i到j的时候,首先去你想去的地方,如果从i到k。

因此,行u = next[u - 1][v - 1];表示:u现在是从u到v的路径上的下一个节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50518175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档