【发布时间】:2016-01-27 12:02:30
【问题描述】:
我在将 Bellman-Ford 算法应用于 2D 数组(不是图形)时遇到问题
输入数组有 m x n 个维度:
s[1,1] s[1,2] ... s[1,n] -> Exit
s[2,1] s[2,2] ... s[2,n]
...
Entry -> s[m,1] s[m,2] ... s[m,n]
它与房间相似(每个条目都是一个房间,具有 s[x,y] 进入成本)。每个房间也可能有一个负成本,我们必须找到从入口到所选房间再到出口的最便宜的路径。
例如,我们有一系列房间和费用:
1 5 6
2 -3 4
5 2 -8
我们想走过房间[3,2],s[3,2] = 4。我们从5开始> 在 [1,3] 并且必须经过 [3,2] 才能到达 [3,3]。
我的问题是,在 Bellman-Ford 算法中实现它的最佳方法是什么?我知道 Dijkstry 算法不会因为负成本而工作。
对于从 [0, maxHeight] 开始的每个房间并放松所有邻居是否正确?像这样:
for (int i = height-1; i >= 0; --i) {
for (int j = 0; j < width; ++j) {
int x = i;
int y = j;
if (x > 0) // up
Relax(x, y, x - 1, y);
if (y + 1 < width) // right
Relax(x, y, x, y + 1);
if (y > 0) // left
Relax(x, y, x, y - 1);
if (x + 1 < height) // down
Relax(x, y, x + 1, y);
}
}
但是我如何才能读取所选房间以及从房间到出口的费用?
【问题讨论】:
-
如果你想知道最后的最优成本,你必须不断保存最优路径。你已经知道你要去哪个方向(你的 if 语句)所以在你去的时候保存那个信息......我认为你不能只使用你的二维数组来保存数据,你必须使用另一个二维数组或只添加字段到您当前的二维数组。你基本上需要保持前任值
-
二维数组是表示图形的一种方式,称为邻接矩阵。
-
@turingcomplete 邻接矩阵可以存储在二维数组中,但并非所有二维数组都是邻接矩阵。 s 是 not 图的邻接矩阵。它甚至不是正方形的。
-
@turingcomplete 虽然这会给你 a 邻接矩阵,但它仍然不是与这个问题相关的。问题的邻接矩阵为(m·n)×(m·n),不包含s作为子矩阵。
-
您的示例中存在负循环。 Belman-ford(也不是任何其他算法)不会解决它。潜在地,您可以在 -8 和 -3 分数的房间之间永远走动以获得 -inifinity,