```
(* exercice avec union-find *)

open Graphics
open Uf (* Programme 72 page 298 *)

let dim = 10 (* matrice dim * dim *)
let int_of_pixel (i, j) = i * dim + j

let calcul_parties_connexes uf t =
let p = Array.length t in
for i = 0 to p - 1 do
for j = 0 to p - 1 do
if i < p - 1 then
if t.(i).(j) =  t.(i+1).(j) then
union uf (int_of_pixel (i, j)) (int_of_pixel ((i+1), j));
if j < p - 1 then
if t.(i).(j) =  t.(i).(j+1) then
union uf (int_of_pixel (i, j)) (int_of_pixel (i, j + 1));
done
done

(* affichage graphique *)

let size = 200
let rp = size / dim

let gr i = rp * i

let () = open_graph (Printf.sprintf " %dx%d" size size)

let draw_pixel i j c = set_color c; fill_rect (gr i) (gr j) rp rp

let draw_BW_image t =
Array.iteri
(fun i ti ->
Array.iteri
(fun j b -> draw_pixel i j (if b then black else white)) ti) t

let inc_color = 83

let new_color =
let r = ref 10 in
let g = ref 10 in
let b = ref 10 in
fun () ->
let b' = !b + inc_color in
let g' = !g + (b' / 255 * inc_color) in
let r' = !r + (g' / 255 * inc_color) in
b := b' mod 256;
g := g' mod 256;
r := r' mod 256;
rgb !r !g !b

let draw_COLOR_image uf t =
let table = Hashtbl.create 200 in
let p = Array.length t in
for i = 0 to p - 1 do
for j = 0 to p - 1 do
let r = find uf (i * p + j) in
let c =
try
Hashtbl.find table r
with Not_found ->
let c = new_color () in Hashtbl.add table r c; c
in
draw_pixel i j c
done
done

(* test avec une matrice alĂ©atoire *)

let random_bool_matrix p n =
let random_BW () = Random.int 100 < n in
Array.init p (fun _ -> Array.init p (fun _ -> random_BW ()))

let t = random_bool_matrix dim 40
let uf = create (dim * dim)
let () = calcul_parties_connexes uf t

let () =
draw_BW_image t;