I use a matrix d
to present a graph. d.(i).(j)
means the distance between i
and j
; v
denotes the number of nodes in the graph.
It is possible that there is negative cycle in this graph.
I would like to check if a negative cycle exists. I have written something as follows from a variation of 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
My questions are
- Is the code above correct?
- Is the
part 1
useful?
Because I call this function very often, I really want to make it as fast as possible. So my 3) question is if other algorithms (especially Bellman-Ford
) can be quicker than that?
for each edge (u, v) with weight w in edges:
still needs to be realized by two loopsfor i = 0 to v - 1 do for j = 0 to v - 1 do ...
. So for my case,|E|
and|V|^2
are quite same, no? – Welloff