Java Floyd Warshall算法返回每个具有相同权重的最短路径
如何使用Floyd Warshall算法获得从顶点1到顶点10的每个最短路径,该路径具有相同的权重? 我设法得到了从顶点1到顶点10的所有最短路径的总数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
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函数。谢谢您的回答。我会把它编好,如果有什么问题就回来