(* 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"