Advertisement
PearlyXD

Topol

Jan 10th, 2021
2,934
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 0.90 KB | None | 0 0
  1. (*autor: Wiktor Chmielewski grupa 5*)
  2. (*code review: Mikołaj Uzarski grupa 5*)
  3. open PMap;;
  4.  
  5. exception Cykliczne;;
  6.  
  7. type stan = Odwiedzony | Nieodwiedzony | Przetwarzany;;
  8.  
  9. let topol lst =
  10.   (* przetwarzamy listę sąsiedztwa w mapę *)
  11.   let mapa = ref (List.fold_left (fun acc (v, lista) ->
  12.     let (stan, last) =
  13.       try find v acc
  14.       with Not_found -> (ref Nieodwiedzony, [])
  15.     in add v (stan, last @ lista) acc) empty lst)
  16.   and wynik = ref [] in
  17.   let rec odwiedz v (stan, l) =
  18.     if !stan = Przetwarzany then raise Cykliczne
  19.     else if !stan = Nieodwiedzony then begin
  20.       stan := Przetwarzany;
  21.       List.iter (fun x -> if mem x !mapa then odwiedz x (find x !mapa) else begin
  22.         wynik := x :: (!wynik);
  23.         mapa := add x (ref Odwiedzony, []) !mapa
  24.       end) l;
  25.       stan := Odwiedzony;
  26.       wynik := v :: (!wynik)
  27.     end in iter odwiedz !mapa;
  28.     !wynik
  29. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement