マトリックスを使用しd
てグラフを表示します。d.(i).(j)
と の間の距離を意味しi
ますj
。v
グラフ内のノード数を示します。
このグラフには負のサイクルがある可能性があります。
負のサイクルが存在するかどうかを確認したいと思います。Floyd-Warshallのバリエーションから次のように書きました。
let dr = Matrix.copy d in
(* part 1 *)
for i = 0 to v - 1 do
dr.(i).(i) <- 0
done;
(* part 2 *)
try
for k = 0 to v - 1 do
for i = 0 to v - 1 do
for j = 0 to v - 1 do
let improvement = dr.(i).(k) + dr.(k).(j) in
if improvement < dr.(i).(j) then (
if (i <> j) then
dr.(i).(j) <- improvement
else if improvement < 0 then
raise BreakLoop )
done
done
done;
false
with
BreakLoop -> true
私の質問は
- 上記のコードは正しいですか?
part 1
便利ですか?
私はこの関数を頻繁に呼び出すので、できる限り高速にしたいと考えています。だから私の3)質問は、他のアルゴリズム(特にBellman-Ford
)がそれよりも速くなるかどうかです。