我想使用Floyd-Warshall算法查找两个顶点之间的最短路径。矩阵位于ArrayList >中。它总是很小,例如4x4或8x8矩阵。
在我的课堂上,我已经有了一个距离矩阵。我只是试图创建“最短路径”矩阵。但这是行不通的。它填补了我的矩阵错误。
我真的希望有人可以看一下并解释问题所在。
我的距离矩阵是:
0 0 256 411
556 0 558 0
250 0 0 431
0 0 431 0
测试输出为:
0 0 0 0
556 556 556 556
250 250 250 250
0 0 0 0
预期:
500 0 842 681
556 0 806 967
0 0 500 681
581 0 0 862
我已经注释掉了我的测试输出。
distance
是我的矩阵,其顶点之间的距离为整数。在我的矩阵中,i
为y,j
为x。public ArrayList<ArrayList<Integer>> calcShortest() {
//String test = "";
ArrayList<ArrayList<Integer>> shortest = distance;
for (int k = 0; k < airports.size(); k++) {
for (int i = 0; i < airports.size(); i++) {
for (int j = 0; j < airports.size(); j++) {
shortest.get(j).add(i, Math.min(shortest.get(k).get(i) + shortest.get(j).get(k),
shortest.get(j).get(i)));
}
}
}
/*for (int j = 0; j < airports.size(); j++) {
for (int i = 0; i < airports.size(); i++) {
test += shortest.get(j).get(i) + " ";
}
System.out.println(test);
test = "";
}*/
return shortest;
}
最佳答案
您的代码和数据有很多问题。
add
操作shortest.get(j).add(i, ...)
将元素插入ArrayList
中。您实际上要设置一个值:shortest.get(j).set(i, ...)
shortest[j][i] = min(shortest[k][i] + shortest[j][k], shortest[j][i])
,但是Floyd-Warshall要求使用shortest[i][j] = min(shortest[i][k] + shortest[k][j], shortest[i][j])
。 shortest[2][2]
怎么可能是500?我们已经知道它是0。如何计算shortest[3][0]
是581?您无法从给出的距离矩阵中获得581。 distance[1][3]
为0。那么从节点1到节点3的距离为0?真? shortest
引用distance
?由于您正在修改distance
,为什么不只使用distance
而不是假装您拥有另一个名为shortest
的矩阵?还是您打算复制distance
? 下面的代码正确运行Floyd-Warshall,因为它调用
set
修改ArrayList
,并且使用正确的索引。但是,它不会产生您所说的距离矩阵的“预期”结果,因为正如我所解释的,您的预期结果没有意义,并且距离矩阵本身是可疑的。 int n = shortest.size();
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
shortest.get(i).set(j,
Math.min(shortest.get(i).get(k) + shortest.get(k).get(j),
shortest.get(i).get(j)));
}
}
}