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 算法返回具有相同权重的每条最短路径的主要内容,如果未能解决你的问题,请参考以下文章