(* your code goes here *)
let dfs graph visited start_node =
let rec explore path visited node =
if List.mem node visited
then visited
else let new_path = node :: path in
let edges
= List.assoc node graph
in let visited
= List.fold_left
(explore new_path
) visited edges
in node :: visited
in explore [] visited start_node
let toposort graph =
List.fold_left
(fun visited
(node,_
) -> dfs graph visited node
) [] graph
type recipe = Eggs | Milk | Wheat | Mix | Cook | Serve
module Node = struct
type t = recipe
end
let graph = [ Wheat, [Eggs;Milk;Mix] ;
Milk, [Mix] ;
Eggs, [Mix] ;
Mix, [Cook] ;
Cook, [Serve] ;
Serve, [] ]
let sorted = toposort graph
let str_recipe = function
| Eggs -> "Eggs"
| Milk -> "Milk"
| Wheat -> "Wheat"
| Mix -> "Mix"
| Cook -> "Cook!"
| Serve -> "Serve"
let () = List.iter
(fun i
-> Printf.printf
"%s -> " (str_recipe i
)) sorted
KCogeW91ciBjb2RlIGdvZXMgaGVyZSAqKQoKbGV0IGRmcyBncmFwaCB2aXNpdGVkIHN0YXJ0X25vZGUgPSAKICBsZXQgcmVjIGV4cGxvcmUgcGF0aCB2aXNpdGVkIG5vZGUgPSAKICAgIGlmIExpc3QubWVtIG5vZGUgdmlzaXRlZCB0aGVuIHZpc2l0ZWQgZWxzZSAgICAgCiAgICAgIGxldCBuZXdfcGF0aCA9IG5vZGUgOjogcGF0aCBpbiAKICAgICAgbGV0IGVkZ2VzICAgID0gTGlzdC5hc3NvYyBub2RlIGdyYXBoIGluCiAgICAgIGxldCB2aXNpdGVkICA9IExpc3QuZm9sZF9sZWZ0IChleHBsb3JlIG5ld19wYXRoKSB2aXNpdGVkIGVkZ2VzIGluCiAgICAgIG5vZGUgOjogdmlzaXRlZAogIGluIGV4cGxvcmUgW10gdmlzaXRlZCBzdGFydF9ub2RlCgpsZXQgdG9wb3NvcnQgZ3JhcGggPSAKICBMaXN0LmZvbGRfbGVmdCAoZnVuIHZpc2l0ZWQgKG5vZGUsXykgLT4gZGZzIGdyYXBoIHZpc2l0ZWQgbm9kZSkgW10gZ3JhcGgKICAKdHlwZSByZWNpcGUgPSBFZ2dzIHwgTWlsayB8IFdoZWF0IHwgTWl4IHwgQ29vayB8IFNlcnZlCgptb2R1bGUgTm9kZSA9IHN0cnVjdCAKICB0eXBlIHQgPSByZWNpcGUgCmVuZAoKbGV0IGdyYXBoID0gWyBXaGVhdCwgW0VnZ3M7TWlsaztNaXhdIDsKICAgICAgICAgICAgICBNaWxrLCAgW01peF0gOwogICAgICAgICAgICAgIEVnZ3MsICBbTWl4XSA7CiAgICAgICAgICAgICAgTWl4LCAgIFtDb29rXSA7CiAgICAgICAgICAgICAgQ29vaywgIFtTZXJ2ZV0gOwogICAgICAgICAgICAgIFNlcnZlLCBbXSBdCgoKbGV0IHNvcnRlZCA9IHRvcG9zb3J0IGdyYXBoCgoKbGV0IHN0cl9yZWNpcGUgPSBmdW5jdGlvbgp8IEVnZ3MgLT4gIkVnZ3MiCnwgTWlsayAtPiAiTWlsayIKfCBXaGVhdCAtPiAiV2hlYXQiCnwgTWl4IC0+ICJNaXgiCnwgQ29vayAtPiAiQ29vayEiCnwgU2VydmUgLT4gIlNlcnZlIgoKbGV0ICgpID0gTGlzdC5pdGVyIChmdW4gaSAtPiBQcmludGYucHJpbnRmICIlcyAtPiAiIChzdHJfcmVjaXBlIGkpKSBzb3J0ZWQ=