Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
open Graphics (* union - find *) type t = { rank : int array; parent : int array; } let create n = { rank = Array.make n 0; parent = Array.init n (fun i -> i) } let rec find t i = let p = t.parent.(i) in if p = i then i else begin let r = find t p in t.parent.(i) <- r; r end let union t i j = let ri = find t i in let rj = find t j in if ri <> rj then begin if t.rank.(ri) < t.rank.(rj) then t.parent.(ri) <- rj else begin t.parent.(rj) <- ri; if t.rank.(ri) = t.rank.(rj) then t.rank.(ri) <- t.rank.(ri) + 1 end end (* Knuth shuffle *) let knuth_shuffle t = for j = Array.length t - 1 downto 1 do let k = Random.int (j+1) in let v = t.(j) in t.(j) <- t.(k); t.(k) <- v done (* labyrinthe *) let () = Random.self_init () let n = 30 let gr i = 600 * i / n let () = open_graph " 600x600"; for i = 0 to n do moveto (gr i) 0; lineto (gr i) 600; moveto 0 (gr i); lineto 600 (gr i) done let edges = let l = ref [] in for i = 0 to n-1 do for j = 0 to n-1 do if i < n-1 then l := ((i, j), (i+1, j)) :: !l; if j < n-1 then l := ((i, j), (i, j+1)) :: !l done; done; Array.of_list !l let () = knuth_shuffle edges let u = create (n * n) let () = set_color white; let f ((i, j), (i', j')) = let k = i * n + j in let k' = i' * n + j' in if find u k <> find u k' then begin moveto (gr i') (gr (j')) ; lineto (gr (i+1)) (gr (j+1)) ; union u k k'; end in Array.iter f edges let () = ignore (read_key ())