gpt4 book ai didi

java - 如何列出在 Floyd-Warshall 算法中传递的顶点

转载 作者:行者123 更新时间:2023-11-30 11:44:44 25 4
gpt4 key购买 nike

我似乎无法找到一种方法来列出在我的算法 (floyd-warshall) 计算最短路径时传递的顶点。有人告诉我必须使用递归,但我不知道如何使用递归。请给出伪代码/例子,不胜感激!

    import java.util.*;
public class Main{
public static final int INF = 9999999;
public static int[][] path;
public static int[] tax;
public static void main(String[] adsf){
Scanner pp = new Scanner(System.in);
int testCases = pp.nextInt();
pp.nextLine();
pp.nextLine();
while(testCases-- >0){
String[] s1 = pp.nextLine().split(" ");
int size = s1.length;
path = new int[size][size];
for(int i = 0; i < path.length; i++)
Arrays.fill(path[i],INF);
tax = new int[size];
for(int j = 0; j < path[0].length; j++){
path[0][j] = Integer.parseInt(s1[j]);
if(path[0][j]==-1)path[0][j]=INF;
}
for(int i = 1; i < path.length;i++){
s1 = pp.nextLine().split(" ");
for(int j = 0; j < path[0].length; j++){
path[i][j] = Integer.parseInt(s1[j]);
if(path[i][j]==-1)path[i][j]=INF;
}
}
for(int k=0; k<tax.length;k++){
tax[k] = pp.nextInt();
} pp.nextLine();
sssp();
}
int x,y;
while(pp.hasNextInt()){
x=pp.nextInt();
y=pp.nextInt();
int cost = path[x-1][y-1];
System.out.println((x-1)+" "+(y-1)+" "+cost);
}
}
}
public static void sssp(){
for(int k=0;k<path.length;k++){
for(int i=0;i<path.length;i++){
for(int j=0;j<path.length;j++){
path[i][j] = Math.min(path[i][j],path[i][k]+path[k][j]);
}
}
}
}
}

最佳答案

你不需要使用递归来重建路径(事实上,你永远必须在Java中使用递归,它只是恰好用它来解决某些问题更方便,包括这个)。

为了能够计算除长度之外的最短路径,您需要第二个二维数组来存储路径中节点的后继节点。看看this article ,我正在谈论的数组在他们的伪代码中称为 next

回想一下算法的逻辑如下:“如果你能比从 ijk 更快通过任何先前发现的路径从 ij,然后使用通过 k 的路径作为您当前的最短路径”。现在您需要做的就是将通过 k 的决定存储在其他数组中,如下所示:

if (path[i][k] + path[k][j] < path[i][j]) {
path[i][j] = path[i][k]+path[k][j];
next[i][j] = k;
}

一旦 Floyd-Warshal 完成,您可以通过首先重建从 i 的路径来重建从 ij 的路径k 然后从 kj

String GetPath (int i, int j) {
if (path[i][j] == INF) return "no path";
int intermediate = next[i][j];
if (intermediate < 0) return " ";
return GetPath(i,intermediate) + intermediate + GetPath(intermediate,j);
}

关于java - 如何列出在 Floyd-Warshall 算法中传递的顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638750/

25 4 0
文章推荐: javascript - Google图表,我想在图表中每个点的右侧写一些文字
文章推荐: javascript - 在 jQuery 中单击更改