Files
rose-ash/lib/ocaml/baseline/dijkstra.ml
giles 42a506faff
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 23s
ocaml: phase 5.1 dijkstra.ml baseline (5-node SSSP, dist(0,4) = 7)
Array-based O(n^2) Dijkstra on a small directed weighted graph:

  edges = [|
    [(1, 4); (2, 1)];   (* 0 -> 1 (w=4), 2 (w=1) *)
    [(3, 1)];           (* 1 -> 3 (w=1)         *)
    [(1, 2); (3, 5)];   (* 2 -> 1 (w=2), 3 (w=5) *)
    [(4, 3)];           (* 3 -> 4 (w=3)         *)
    []                  (* 4 sink              *)
  |]

Optimal path 0->2->1->3->4 has weight 1+2+1+3 = 7.

Tests: array-of-list-of-int-pair literal, List.iter with tuple
destructuring closure, in-place dist mutation, nested for + ref.

141 baseline programs total.
2026-05-10 04:20:47 +00:00

38 lines
672 B
OCaml

let n = 5
let edges = [|
[(1, 4); (2, 1)];
[(3, 1)];
[(1, 2); (3, 5)];
[(4, 3)];
[]
|]
let dijkstra src =
let dist = Array.make n 1000000 in
dist.(src) <- 0;
let visited = Array.make n false in
for _ = 0 to n - 1 do
let u = ref (-1) in
let best = ref 1000000 in
for v = 0 to n - 1 do
if (not visited.(v)) && dist.(v) < !best then begin
best := dist.(v);
u := v
end
done;
if !u >= 0 then begin
visited.(!u) <- true;
List.iter (fun (v, w) ->
if dist.(!u) + w < dist.(v) then
dist.(v) <- dist.(!u) + w
) edges.(!u)
end
done;
dist
;;
let d = dijkstra 0 in
d.(4)