let connected_components graph =
let module Dfs = Graph.Traverse.Dfs(UG) in
let cc graph mark id =
let g = UG.create () in
let collect v1 =
Hashtbl.add mark v1 () ;
UG.iter_succ (fun v2 -> UG.add_edge g v1 v2) graph v1
in
Dfs.prefix_component collect graph id;
g
in
let mark = Hashtbl.create (UG.nb_vertex graph) in
UG.fold_vertex (fun v acc ->
if not(Hashtbl.mem mark v) then (cc graph mark v)::acc else acc
) graph []