5

使用 Floyd-Warshall 的算法来查找两个顶点之间的最短路径,在 Java 中实现时我应该如何表示无穷大?我在这里使用无穷大来表示两个顶点之间没有路径。

谢谢

4

2 回答 2

5

答案取决于您用来表示权重的数据类型。如果是double,您将可以安全使用Double.POSITIVE_INFINITY。如果它是一个整数,请选择一个您不使用的值,例如,如果您的图形不允许负边,则为负值。

一个不幸的结果是您需要注意三个循环中的无穷大元素:而不是使用“直接”加法,您需要检查它是否是特殊的“无穷大”值,然后才执行添加:

final int INFINITY = -1;
...
for (int k = 0 ; k != N ; k++) {
    for (int i = 0 ; i != N ; i++) {
        for (int j = 0 ; j != N ; j++) {
            if (g[i][k] == INFINITY || g[k][j] == INFINITY) continue;
            int total = g[i][k] + g[k][j];
            if (g[i][j] != INFINITY) {
                g[i][j] = Math.min(g[i][j], total);
            } else {
                g[i][j] = total;
            }
        }
    }
}
于 2014-05-10T21:48:39.297 回答
1

如果您使用Integer/LongFloat/Double而不是int/longfloat/ double,那么您可以使用null代表无穷大的值。

于 2014-05-10T21:48:32.090 回答