Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Floyd Warshall算法返回每个具有相同权重的最短路径_Java_Algorithm_Floyd Warshall - Fatal编程技术网

Java Floyd Warshall算法返回每个具有相同权重的最短路径

Java Floyd Warshall算法返回每个具有相同权重的最短路径,java,algorithm,floyd-warshall,Java,Algorithm,Floyd Warshall,如何使用Floyd Warshall算法获得从顶点1到顶点10的每个最短路径,该路径具有相同的权重? 我设法得到了从顶点1到顶点10的所有最短路径的总数 public static int[][] shortestpath(int[][] adj, int[][] path, int[][] count) { int n = adj.length; int[][] ans = new int[n][n]; copy(ans, adj); // Compute

如何使用Floyd Warshall算法获得从顶点1到顶点10的每个最短路径,该路径具有相同的权重? 我设法得到了从顶点1到顶点10的所有最短路径的总数

public static int[][] shortestpath(int[][] adj, int[][] path, int[][] count) {

    int n = adj.length;
    int[][] ans = new int[n][n];

    copy(ans, adj);

    // Compute incremently better paths through vertex k.
    for (int k = 0; k < n; k++) {

        // Iterate through each possible pair of points.
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {

                // Check if it is better to go through k as an intermediate vertex.
                if (ans[i][k] + ans[k][j] < ans[i][j]) {
                    ans[i][j] = ans[i][k] + ans[k][j];
                    path[i][j] = path[k][j];
                    count[i][j] = count[i][k]*count[k][j];
                } else if ((ans[i][j] == ans[i][k]+ans[k][j]) && (k!=j) && (k!=i)) {
                    count[i][j] += count[i][k]*count[k][j];
                }
            }
        }
    }

    // Return the shortest path matrix.
    return ans;
}

public static void copy(int[][] a, int[][] b) {
    for (int i = 0; i < a.length; i++)
        for (int j = 0; j < a[0].length; j++)
            a[i][j] = b[i][j];
}
公共静态int[][]最短路径(int[][]adj,int[][]路径,int[][]计数){
int n=调整长度;
int[]ans=新的int[n][n];
副本(ans,adj);
//计算通过顶点k的增量更好的路径。
对于(int k=0;k
使用该算法一次,从v1开始计算最短路径每个顶点的加权长度

再次使用该算法查找到v10的最短路径的每个顶点的加权长度

位于最短路径上的所有顶点的这两个加权长度之和将等于从v1到v10的加权长度。当且仅当两个顶点都位于最短路径上且原始边的权重是加权长度与v1的差值时,有向边位于最短路径上


这将为您提供最短路径上所有内容的有向子图,其中大部分成本是基本算法的两次运行。您可以递归地枚举它。请注意,可能存在很多最短路径,因此枚举本身可能需要指数级的时间才能运行。

您可以添加
copy
方法的实现吗?我刚刚添加了copy函数。谢谢您的回答。我会把它编好,如果有什么问题就回来