let connected_components graph =
    let module Dfs = Graph.Traverse.Dfs(UGin
    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 []