Advertisement
Guest User

Untitled

a guest
Jan 8th, 2019
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 0.96 KB | None | 0 0
  1.  
  2. let safe_find k m =
  3.     try find k m with
  4.     Not_found -> 0;;
  5.  
  6. let add_v_count in_map (ver, v_list) =
  7.     add ver (safe_find ver in_map) (List.fold_left (fun acc v -> (add v (1 + safe_find v acc) acc)) in_map v_list);;
  8.  
  9. let f (acc_zero, acc_map) v =
  10.     let in_num = find v acc_map in
  11.     ((if in_num = 1 then v::acc_zero else acc_zero), (add v (in_num - 1) acc_map))
  12.  
  13. let topol l =
  14.     let out_map, in_map = List.fold_left (fun (o_acc, i_acc) (ver, v_list) ->( add ver v_list o_acc, add_v_count i_acc (ver, v_list))) (empty, empty) l in
  15.     let zero_in = foldi (fun v v_list acc -> match v_list with 0 -> v::acc | _ -> acc) in_map in
  16.     let rec remove_vertex o_map i_map zero_i acc =
  17.         match zero_i with
  18.         | [] -> if is_empty o_map then acc
  19.                 else raise Cykliczne
  20.         | h::t ->
  21.             let new_zero, new_i_map = List.fold_left (f) (t, i_map) (find h o_map) in
  22.             remove_vertex (remove h o_map) (remove h new_i_map) new_zero h::acc
  23.     in
  24.         List.rev remove_vertex out_map in_map zero_in [];;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement