ocaml: phase 5.1 count_paths_dag.ml baseline (source-to-sink paths = 3)
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.
This commit is contained in:
2026-05-11 03:54:52 +00:00
parent 97a29c6bac
commit 3f00e62577
3 changed files with 54 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
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 ()

View File

@@ -31,6 +31,7 @@
"coin_change.ml": 6,
"coin_min.ml": 6,
"count_change.ml": 406,
"count_paths_dag.ml": 3,
"count_inversions.ml": 12,
"count_palindromes.ml": 9,
"count_subarrays_k.ml": 7,

View File

@@ -407,6 +407,17 @@ _Newest first._
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
'a tree`) with insert + in-order traversal. Tests parametric ADT,
recursive match, List.append, List.fold_left.
- 2026-05-11 Phase 5.1 — count_paths_dag.ml baseline (count
source-to-sink paths in the same 6-node DAG as topo_sort.ml,
paths 0→5 = 3). Topological sort via Kahn's (BFS), then relax
edges in topological order: paths[v] += paths[u] for each edge
u→v. paths[source] = 1. The three witnesses:
0 → 1 → 3 → 5
0 → 2 → 3 → 5
0 → 2 → 4 → 5
Tests Queue-driven Kahn order + List.rev to topological order,
module-level mutable arrays (in_deg / paths), accumulation in
topological traversal. 191 baseline programs total.
- 2026-05-11 Phase 5.1 — stock_two.ml baseline (max stock profit
with at most 2 transactions on [3;3;5;0;0;3;1;4] = 6). Two-pass
DP: left[i] = max single-transaction profit in prices[0..i]