(* Baseline: graph BFS using Queue + Hashtbl visited set.
   Returns the count of reachable nodes. *)

(* Adjacency as an assoc list of (node, neighbors). *)
let graph =
  [ ("A", ["B"; "C"])
  ; ("B", ["D"])
  ; ("C", ["D"; "E"])
  ; ("D", ["F"])
  ; ("E", ["F"])
  ; ("F", [])
  ]
;;

let neighbors n =
  match List.assoc_opt n graph with
  | None -> []
  | Some ns -> ns
;;

let bfs start =
  let visited = Hashtbl.create 16 in
  let q = Queue.create () in
  Queue.push start q ;
  Hashtbl.add visited start true ;
  let rec loop () =
    if Queue.is_empty q then ()
    else
      let v = Queue.pop q in
      List.iter
        (fun n ->
          if not (Hashtbl.mem visited n) then begin
            Hashtbl.add visited n true ;
            Queue.push n q
          end)
        (neighbors v) ;
      loop ()
  in
  loop () ;
  Hashtbl.length visited
;;

bfs "A"
