Parcours en profondeur
Contents
Parcours en profondeur#
Graphe utilisé pour les exemples :
let g_mat = [|
[|0; 0; 0; 0; 0; 0; 1|];
[|0; 0; 1; 1; 1; 0; 0|];
[|0; 1; 0; 0; 1; 1; 0|];
[|0; 1; 0; 0; 1; 0; 0|];
[|0; 0; 1; 1; 0; 0; 0|];
[|0; 0; 1; 0; 1; 0; 0|];
[|1; 0; 0; 0; 0; 0; 0|];
|]
let g_list = [|[6]; [2; 3; 4]; [1; 4; 5]; [1; 4]; [1; 2; 3; 5]; [4; 2]; [0]|]
val g_mat : int array array =
[|[|0; 0; 0; 0; 0; 0; 1|]; [|0; 0; 1; 1; 1; 0; 0|];
[|0; 1; 0; 0; 1; 1; 0|]; [|0; 1; 0; 0; 1; 0; 0|];
[|0; 0; 1; 1; 0; 0; 0|]; [|0; 0; 1; 0; 1; 0; 0|];
[|1; 0; 0; 0; 0; 0; 0|]|]
val g_list : int list array =
[|[6]; [2; 3; 4]; [1; 4; 5]; [1; 4]; [1; 2; 3; 5]; [4; 2]; [0]|]
Parcours en profondeur sur liste d’adjacence#
let dfs g r =
let n = Array.length g in
let seen = Array.make n false in
let rec aux v =
if not seen.(v) then (
seen.(v) <- true;
Printf.printf "Sommet %d visité\n%!" v;
List.iter aux g.(v)
) in
aux r
val dfs : int list array -> int -> unit = <fun>
let () = dfs g_list 0
Sommet 0 visité
Sommet 6 visité
let () = dfs g_list 3
Sommet 3 visité
Sommet 1 visité
Sommet 2 visité
Sommet 4 visité
Sommet 5 visité
Parcours en profondeur sur matrice d’adjacence#
let dfs g r =
let n = Array.length g in
let seen = Array.make n false in
let rec aux v =
if not seen.(v) then (
seen.(v) <- true;
Printf.printf "Sommet %d visité\n%!" v;
for j = 0 to n - 1 do
if g.(v).(j) = 1 then aux j
done
) in
aux r
val dfs : int array array -> int -> unit = <fun>
let () = dfs g_mat 0
Sommet 0 visité
Sommet 6 visité
let () = dfs g_mat 3
Sommet 3 visité
Sommet 1 visité
Sommet 2 visité
Sommet 4 visité
Sommet 5 visité
Recherche de cycle#
Graphe non-orienté#
let has_cycle g = (* g : graphe non orienté représenté par liste d'adjacence *)
let n = Array.length g in
let pred = Array.make n (-1) in
let ans = ref false in
let rec aux p u = (* p a permis de découvrir u *)
if pred.(u) = -1 then (
pred.(u) <- p;
List.iter (aux p) g.(u)
)
else if pred.(p) <> u then ans := true in
for i = 0 to n - 1 do
aux i i (* cherche un cycle depuis le sommet i *)
done;
!ans;;
has_cycle g_list
val has_cycle : int list array -> bool = <fun>
- : bool = true
Graphe orienté#
let has_cycle g = (* g : graphe orienté représenté par liste d'adjacence *)
let n = Array.length g in
let visited = Array.make n 0 in
let ans = ref false in
let rec aux v = match visited.(v) with
| 0 -> visited.(v) <- 1;
List.iter aux g.(v);
visited.(v) <- 2
| 1 -> ans := true
| _ -> () in
for i = 0 to n - 1 do
aux i (* cherche un cycle depuis le sommet i *)
done;
!ans
val has_cycle : int list array -> bool = <fun>