Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 24s
Count source-to-sink paths in a DAG via Kahn's topological sort
plus accumulation:
paths[source] = 1
for u in topological order:
for v in adj[u]: paths[v] += paths[u]
Same 6-node DAG as topo_sort.ml:
0 -> {1, 2} 1 -> {3} 2 -> {3, 4} 3 -> {5} 4 -> {5}
The three witnesses 0 -> 5:
0 -> 1 -> 3 -> 5
0 -> 2 -> 3 -> 5
0 -> 2 -> 4 -> 5
Tests Queue-driven Kahn order + List.rev to recover topological
order, module-level mutable arrays (in_deg, paths), accumulation
in topological traversal.
191 baseline programs total.
43 lines
781 B
OCaml
43 lines
781 B
OCaml
let n = 6
|
|
let adj = [|
|
|
[1; 2];
|
|
[3];
|
|
[3; 4];
|
|
[5];
|
|
[5];
|
|
[]
|
|
|]
|
|
|
|
let in_deg = Array.make n 0
|
|
let paths = Array.make n 0
|
|
|
|
let count_paths () =
|
|
for u = 0 to n - 1 do
|
|
List.iter (fun v -> in_deg.(v) <- in_deg.(v) + 1) adj.(u)
|
|
done;
|
|
let order = ref [] in
|
|
let q = Queue.create () in
|
|
for v = 0 to n - 1 do
|
|
if in_deg.(v) = 0 then Queue.push v q
|
|
done;
|
|
while not (Queue.is_empty q) do
|
|
let u = Queue.pop q in
|
|
order := u :: !order;
|
|
List.iter (fun v ->
|
|
in_deg.(v) <- in_deg.(v) - 1;
|
|
if in_deg.(v) = 0 then Queue.push v q
|
|
) adj.(u)
|
|
done;
|
|
paths.(0) <- 1;
|
|
let topo = List.rev !order in
|
|
List.iter (fun u ->
|
|
List.iter (fun v ->
|
|
paths.(v) <- paths.(v) + paths.(u)
|
|
) adj.(u)
|
|
) topo;
|
|
paths.(n - 1)
|
|
|
|
;;
|
|
|
|
count_paths ()
|