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

Posted

技术标签:

【中文标题】Floyd-Warshall 算法返回具有相同权重的每条最短路径【英文标题】:Floyd-Warshall Algorithm returns every single shortest path that has the same weight 【发布时间】:2018-09-27 18:36:39 【问题描述】:

如何使用 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];

【问题讨论】:

可以添加copy方法的实现吗? 我刚刚添加了复制功能。 【参考方案1】:

使用该算法一次,找出从 v1 开始的最短路径的每个顶点的加权长度。

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

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

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

【讨论】:

感谢您的回答。如果我遇到任何问题,我会编写代码并回来

以上是关于Floyd-Warshall 算法返回具有相同权重的每条最短路径的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra 算法随机选择具有相同最小权重的相邻节点

计算具有相同汉明权重的二进制数的所有排列的最快算法是啥?

为啥全对最短路径算法使用负权重?

弗洛伊德算法介绍 弗洛伊德算法资料

Floyd最短路(带路径输出)

Dijkstra 的最短路径算法不返回权重最小的最短路径