2 つの頂点間の最短経路を見つけるために Floyd-Warshall のアルゴリズムを使用して、Java で実装するときに無限をどのように表現すればよいですか? ここで無限を使用して、2 つの頂点間にパスがないことを示しています。
ありがとう
2 つの頂点間の最短経路を見つけるために Floyd-Warshall のアルゴリズムを使用して、Java で実装するときに無限をどのように表現すればよいですか? ここで無限を使用して、2 つの頂点間にパスがないことを示しています。
ありがとう
答えは、重みを表すために使用するデータ型によって異なります。そうであればdouble
、安全に使用できますDouble.POSITIVE_INFINITY
。整数の場合は、使用しない値を選択します。たとえば、グラフで負のエッジが許可されていない場合は負の値を選択します。
これの残念な結果は、3 つのループ内の無限要素に注意を払う必要があるということです。「単純な」加算を使用するのではなく、それが特別な「無限」値であるかどうかを確認してから、添加:
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;
}
}
}
}
/または/を使用し、 Integer
/Long
またはFloat
/を使用Double
しない場合、値で無限を表すことができます。int
long
float
double
null