Finally, it works
This commit is contained in:
parent
68f3e8d697
commit
b6953af967
BIN
graphs.cmi
BIN
graphs.cmi
Binary file not shown.
BIN
graphs.cmo
BIN
graphs.cmo
Binary file not shown.
650
graphs.ml
650
graphs.ml
|
@ -824,588 +824,112 @@ let another_type_of_bfs (gr : type2graph) r dx dy gwd ght dt =
|
||||||
with
|
with
|
||||||
| Stdlib.Queue.Empty -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
| Stdlib.Queue.Empty -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
||||||
|
|
||||||
|
type 'a dyna = {mutable memlen : int ; mutable len : int ; a : ('a * int) array};;
|
||||||
|
|
||||||
(* ------------------------------------------------------------*)
|
let create_d n i =
|
||||||
(* ------------------------------------------------------------*)
|
let res = {memlen = n; len = 0; a = Array.make n (i, 0)} in res ;;
|
||||||
(* ------------------------------------------------------------*)
|
|
||||||
(* ------------------------------------------------------------*)
|
|
||||||
(* ------------------------------------------------------------*)
|
|
||||||
|
|
||||||
type 'a dynamic_array = { mutable arr : 'a array ; mutable len : int } ;;
|
let is_empty_d da =
|
||||||
|
da.len = 0 ;;
|
||||||
|
|
||||||
|
let add_elt_d da elt p =
|
||||||
let create () =
|
if da.len = da.memlen then
|
||||||
{ arr = [||] ; len = 0 } ;;
|
failwith "Not yet"
|
||||||
|
|
||||||
let init a =
|
|
||||||
{ arr = a ; len = Array.length a } ;;
|
|
||||||
|
|
||||||
let length a = a.len ;;
|
|
||||||
|
|
||||||
let get a i =
|
|
||||||
assert(0 <= i && i < a.len) ;
|
|
||||||
a.arr.(i) ;;
|
|
||||||
|
|
||||||
|
|
||||||
let set a i x =
|
|
||||||
assert(0 <= i && i < a.len) ;
|
|
||||||
a.arr.(i) <- x ;;
|
|
||||||
|
|
||||||
let resize a newlen e =
|
|
||||||
a.arr <- Array.init newlen (fun i -> if i < a.len then a.arr.(i) else e) ;;
|
|
||||||
|
|
||||||
let append a e =
|
|
||||||
if a.len = Array.length a.arr then
|
|
||||||
resize a (a.len * 2 + 1) e ;
|
|
||||||
a.arr.(a.len) <- e ;
|
|
||||||
a.len <- a.len + 1 ;;
|
|
||||||
|
|
||||||
let pop a =
|
|
||||||
assert(a.len > 0) ;
|
|
||||||
a.len <- a.len - 1 ;
|
|
||||||
let x = a.arr.(a.len) in
|
|
||||||
if a.len < (Array.length a.arr) / 4 then
|
|
||||||
resize a (a.len * 2) a.arr.(0) ;
|
|
||||||
x ;;
|
|
||||||
|
|
||||||
module H = Hashtbl ;;
|
|
||||||
|
|
||||||
(*
|
|
||||||
'a : type for elements
|
|
||||||
'b : type for priorities (hypothesis : totally ordered type).
|
|
||||||
*)
|
|
||||||
type ('a, 'b) priority_queue = { heap : ('a * 'b) dynamic_array ; locate : ('a, int) H.t } ;;
|
|
||||||
|
|
||||||
|
|
||||||
let pq_create () =
|
|
||||||
{ heap = create () ; locate = H.create 200 } ;;
|
|
||||||
|
|
||||||
|
|
||||||
let pq_is_empty pq =
|
|
||||||
length pq.heap = 0 ;;
|
|
||||||
|
|
||||||
let pq_mem pq elt =
|
|
||||||
H.mem pq.locate elt ;;
|
|
||||||
|
|
||||||
(* SWAPS indexes i and j in the heap AND the hash table : *)
|
|
||||||
let pq_swap pq i j =
|
|
||||||
let elt1 = fst (get pq.heap i)
|
|
||||||
and elt2 = fst (get pq.heap j) in
|
|
||||||
|
|
||||||
let tmp = (get pq.heap i) in
|
|
||||||
set pq.heap i (get pq.heap j) ;
|
|
||||||
set pq.heap j tmp ;
|
|
||||||
|
|
||||||
H.replace pq.locate elt1 j ;
|
|
||||||
H.replace pq.locate elt2 i ;;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(* PERCOLATE UP AND DOWN *)
|
|
||||||
|
|
||||||
let pq_get_priority pq i =
|
|
||||||
snd (get pq.heap i) ;;
|
|
||||||
|
|
||||||
|
|
||||||
let rec pq_percolate_up pq i =
|
|
||||||
let father = ((i-1)/2) in
|
|
||||||
if i > 0 && (pq_get_priority pq i) < (pq_get_priority pq father) then begin
|
|
||||||
pq_swap pq i father ;
|
|
||||||
pq_percolate_up pq father
|
|
||||||
end ;;
|
|
||||||
|
|
||||||
let rec pq_percolate_down pq i =
|
|
||||||
let n = length pq.heap in
|
|
||||||
let left_child = 2*i+1 and right_child = 2*i+2 in
|
|
||||||
|
|
||||||
let m = ref (pq_get_priority pq i) in
|
|
||||||
let max_node = ref i in
|
|
||||||
|
|
||||||
if left_child < n && pq_get_priority pq left_child < !m then begin
|
|
||||||
m := pq_get_priority pq left_child ;
|
|
||||||
max_node := left_child
|
|
||||||
end ;
|
|
||||||
|
|
||||||
if right_child < n && pq_get_priority pq right_child < !m then begin
|
|
||||||
m := pq_get_priority pq right_child ;
|
|
||||||
max_node := right_child
|
|
||||||
end ;
|
|
||||||
|
|
||||||
if !max_node <> i then
|
|
||||||
pq_swap pq i !max_node ;;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(* ACTUAL FUNCTIONS *)
|
|
||||||
|
|
||||||
exception BreakOfLoop ;;
|
|
||||||
|
|
||||||
let pq_add elt pq prio =
|
|
||||||
append pq.heap (elt, prio) ;
|
|
||||||
H.add pq.locate elt (length pq.heap - 1) ;
|
|
||||||
pq_percolate_up pq (length pq.heap - 1) ;;
|
|
||||||
|
|
||||||
let pq_min pq =
|
|
||||||
assert(length pq.heap > 0 ) ;
|
|
||||||
get pq.heap 0 ;;
|
|
||||||
|
|
||||||
let pq_extract_min pq =
|
|
||||||
let n = length pq.heap in
|
|
||||||
if n <= 0 then raise BreakOfLoop;
|
|
||||||
pq_swap pq 0 (n-1) ;
|
|
||||||
let (elt, prio) = pop pq.heap in
|
|
||||||
H.remove pq.locate elt ;
|
|
||||||
|
|
||||||
if n > 1 then
|
|
||||||
pq_percolate_down pq 0 ;
|
|
||||||
(elt, prio) ;;
|
|
||||||
|
|
||||||
|
|
||||||
let pq_priority pq elt =
|
|
||||||
pq_get_priority pq (H.find pq.locate elt) ;;
|
|
||||||
|
|
||||||
let pq_update_priority pq elt prio =
|
|
||||||
let index = H.find pq.locate elt in
|
|
||||||
let p = pq_get_priority pq index in
|
|
||||||
set pq.heap index (elt, prio) ;
|
|
||||||
if p > prio then
|
|
||||||
pq_percolate_up pq index
|
|
||||||
else
|
else
|
||||||
pq_percolate_down pq index ;;
|
da.a.(da.len) <- (elt, p);
|
||||||
|
da.len <- da.len + 1;;
|
||||||
|
|
||||||
|
let swap da i j =
|
||||||
|
let temp = da.a.(i) in
|
||||||
|
da.a.(i) <- da.a.(j);
|
||||||
|
da.a.(j) <- temp ;;
|
||||||
|
|
||||||
let pq_init a default_priority =
|
let get_min_d da =
|
||||||
let pq = pq_create () in
|
let cmin = ref (snd da.a.(0)) in
|
||||||
Array.iter (fun x -> pq_add x pq default_priority) a ;
|
let idmin = ref 0 in
|
||||||
pq ;;
|
for i = 1 to da.len -1 do
|
||||||
|
if !cmin > snd da.a.(i) then begin
|
||||||
|
cmin := snd da.a.(i);
|
||||||
|
idmin := i
|
||||||
|
end
|
||||||
|
done;
|
||||||
|
(!idmin, !cmin) ;;
|
||||||
|
|
||||||
(* ------------------------------------------------------------*)
|
let remove_min_d da =
|
||||||
(* ------------------------------------------------------------*)
|
if da.len <= 0 then
|
||||||
(* ------------------------------------------------------------*)
|
failwith "Nothing to pop";
|
||||||
|
let (i, p) = get_min_d da in
|
||||||
|
let x = fst da.a.(i) in
|
||||||
|
swap da i (da.len -1);
|
||||||
|
da.len <- da.len - 1;
|
||||||
|
(x, p) ;;
|
||||||
|
|
||||||
let another_type_of_dijkstra (gr : type2graph) r dx dy dt gwd ght =
|
let get_p da elt =
|
||||||
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
|
let cp = ref (-1) in
|
||||||
for i = 0 to gr.width -1 do
|
let break = ref false in
|
||||||
for j = 0 to gr.height -1 do
|
for i = 0 to da.len -1 do
|
||||||
if (i*gr.width + j) mod 7 = 0 then
|
if !break = false && fst da.a.(i) = elt then begin
|
||||||
colors.(i).(j) <- rgb 0 0 200
|
cp := snd da.a.(i);
|
||||||
|
break := true
|
||||||
|
end
|
||||||
|
done;
|
||||||
|
!cp ;;
|
||||||
|
|
||||||
else if (i*gr.width + j) mod 7 = 1 then
|
let update_p da elt newp =
|
||||||
colors.(i).(j) <- rgb 0 200 0
|
let break = ref false in
|
||||||
|
for i = 0 to da.len -1 do
|
||||||
|
if !break = false && fst da.a.(i) = elt then begin
|
||||||
|
da.a.(i) <- (elt, newp);
|
||||||
|
break := true
|
||||||
|
end
|
||||||
|
done;;
|
||||||
|
|
||||||
else if (i*gr.width + j) mod 7 = 2 then
|
let me_out_of_this_thing (gr : type2graph) =
|
||||||
colors.(i).(j) <- rgb 0 200 200
|
let w = gr.width and h = gr.height in
|
||||||
|
let disttab = Array.make_matrix w h (-1) in
|
||||||
|
|
||||||
else if (i*gr.width + j) mod 7 = 3 then
|
let pq = create_d (w*h) (0, 0) in
|
||||||
colors.(i).(j) <- rgb 200 0 0
|
|
||||||
|
|
||||||
else if (i*gr.width + j) mod 7 = 4 then
|
for i = 0 to w-1 do
|
||||||
colors.(i).(j) <- rgb 200 0 200
|
for j = 0 to h-1 do
|
||||||
|
add_elt_d pq (i, j) 999999
|
||||||
else if (i*gr.width + j) mod 7 = 5 then
|
|
||||||
colors.(i).(j) <- rgb 200 200 0
|
|
||||||
|
|
||||||
else
|
|
||||||
colors.(i).(j) <- rgb 200 200 200
|
|
||||||
done
|
done
|
||||||
done;
|
done;
|
||||||
|
|
||||||
set_line_width 4;
|
let is_valid i j =
|
||||||
set_color black ;
|
(i >= 0) && (j >= 0) && (i < w) && (j < h)
|
||||||
for i = 0 to gr.width -1 do
|
|
||||||
for j = 0 to gr.height -1 do
|
|
||||||
let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
|
|
||||||
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
|
|
||||||
draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|] ;
|
|
||||||
end;
|
|
||||||
|
|
||||||
done
|
|
||||||
done;
|
|
||||||
|
|
||||||
let roff = (9*r)/8 in
|
|
||||||
let roff2 = (7*r)/5 in
|
|
||||||
let rsize = (3*r)/4 in
|
|
||||||
let wcolor = rgb 64 64 64 in
|
|
||||||
let bcolor = rgb 0 0 0 in
|
|
||||||
|
|
||||||
let is_weighted = true in
|
|
||||||
|
|
||||||
set_line_width 8;
|
|
||||||
for i = 0 to gr.width -1 do
|
|
||||||
for j = 0 to gr.height -1 do
|
|
||||||
let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
|
|
||||||
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy - roff) (snd node_xy - roff) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i).(j).edges.(0) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy - roff2) (snd node_xy) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i).(j).edges.(1) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy - roff) (snd node_xy + roff) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i).(j).edges.(2) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy) (snd node_xy + roff2) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i).(j).edges.(3) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy + roff) (snd node_xy + roff) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i).(j).edges.(4) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy + roff2) (snd node_xy) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i).(j).edges.(5) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy + roff) (snd node_xy - roff) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i).(j).edges.(6) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy) (snd node_xy - roff2) (3*rsize/4) ;
|
|
||||||
set_color wcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i).(j).edges.(7) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
done
|
|
||||||
done;
|
|
||||||
|
|
||||||
set_line_width 5;
|
|
||||||
for i = 0 to gr.width -1 do
|
|
||||||
for j = 0 to gr.height -1 do
|
|
||||||
set_color (rgb 48 48 48) ;
|
|
||||||
fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
|
||||||
set_color black ;
|
|
||||||
draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
|
||||||
set_color (rgb 48 48 48) ;
|
|
||||||
draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r
|
|
||||||
done
|
|
||||||
done ;
|
|
||||||
|
|
||||||
let draw_tile i j =
|
|
||||||
set_line_width 5;
|
|
||||||
set_color (rgb 48 48 48) ;
|
|
||||||
fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
|
||||||
set_color black;
|
|
||||||
draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
|
||||||
set_color colors.(i).(j);
|
|
||||||
draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r ;
|
|
||||||
|
|
||||||
let fcolor = rgb 255 0 0 in
|
|
||||||
|
|
||||||
let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
|
|
||||||
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy - roff) (snd node_xy - roff) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i).(j).edges.(0) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy - roff2) (snd node_xy) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i).(j).edges.(1) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy - roff) (snd node_xy + roff) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i).(j).edges.(2) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy) (snd node_xy + roff2) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i).(j).edges.(3) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy + roff) (snd node_xy + roff) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i).(j).edges.(4) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy + roff2) (snd node_xy) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i).(j).edges.(5) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy + roff) (snd node_xy - roff) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i).(j).edges.(6) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
|
|
||||||
if is_weighted then begin
|
|
||||||
set_color bcolor;
|
|
||||||
fill_circle (fst node_xy) (snd node_xy - roff2) (3*rsize/4) ;
|
|
||||||
set_color fcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i).(j).edges.(7) rsize;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
in
|
in
|
||||||
|
|
||||||
(* Actual Dijkstra *)
|
let offx = [|-1; -1; -1; 0; 1; 1; 1; 0|] in
|
||||||
|
let offy = [|-1; 0; 1; 1; 1; 0; -1; -1|] in
|
||||||
|
|
||||||
let pq = pq_create () in
|
update_p pq (w/2, h/2) 0;
|
||||||
|
|
||||||
pq_add (gr.width/2, gr.height/2, gr.width/2, gr.height/2, [||], [||]) pq 0 ;
|
while (is_empty_d pq) = false do
|
||||||
|
let ((i, j), p) = remove_min_d pq in
|
||||||
|
disttab.(i).(j) <- p;
|
||||||
|
|
||||||
let drawn = Array.make_matrix gr.width gr.height false in
|
for nb = 0 to 7 do
|
||||||
|
let ni = i + offx.(nb) in
|
||||||
|
let nj = j + offy.(nb) in
|
||||||
|
|
||||||
let loops = Array.make_matrix gr.width gr.height [||] in
|
if is_valid ni nj then
|
||||||
for i = 0 to gr.width-1 do
|
if disttab.(ni).(nj) = (-1) && gr.g.(ni).(nj).edges.(nb) <> (-1) then begin
|
||||||
for j = 0 to gr.height-1 do
|
let newdist = p + gr.g.(i).(j).edges.(nb) in
|
||||||
loops.(i).(j) <- Array.make 8 false;
|
let oldp = get_p pq (ni, nj) in
|
||||||
|
if oldp > newdist then
|
||||||
|
update_p pq (ni, nj) newdist
|
||||||
|
end
|
||||||
done
|
done
|
||||||
done;
|
done;
|
||||||
|
|
||||||
let dcolor = rgb 0 255 0 in
|
for j = h-1 downto 0 do
|
||||||
|
for i = 0 to w-1 do
|
||||||
let done_smth = ref true in
|
Printf.printf "{[%d %d] : %d} " i j disttab.(i).(j)
|
||||||
|
|
||||||
let mindists = Array.make_matrix gr.width gr.height 999 in
|
|
||||||
|
|
||||||
try
|
|
||||||
while true do
|
|
||||||
done_smth := false;
|
|
||||||
let ((i0, j0, i, j, path_arr, bigpath_arr), depth) = pq_extract_min pq in
|
|
||||||
|
|
||||||
if true then begin
|
|
||||||
if drawn.(i).(j) = false then begin
|
|
||||||
drawn.(i).(j) <- true;
|
|
||||||
draw_tile i j;
|
|
||||||
done_smth := true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if drawn.(i0).(j0) = false then begin
|
|
||||||
drawn.(i0).(j0) <- true;
|
|
||||||
draw_tile i0 j0;
|
|
||||||
done_smth := true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if mindists.(i).(j) > depth then begin
|
|
||||||
mindists.(i).(j) <- depth;
|
|
||||||
set_color (rgb 48 48 48) ;
|
|
||||||
fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
|
||||||
set_color black ;
|
|
||||||
draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
|
||||||
set_color colors.(i).(j);
|
|
||||||
draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) depth r
|
|
||||||
end;
|
|
||||||
|
|
||||||
let node_xy = ((r + (2*r + dx)*i0), (r + (2*r + dy)*j0)) in
|
|
||||||
let dxx = i - i0 and dyy = j - j0 in
|
|
||||||
if (dxx, dyy) = (1, 1) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(4) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (1, 0) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i0).(j0).edges.(5) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (1, -1) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(6) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (0, -1) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i0).(j0).edges.(7) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (-1, -1) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(0) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (-1, 0) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i0).(j0).edges.(1) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (-1, 1) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(2) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end
|
|
||||||
else if (dxx, dyy) = (0, 1) then begin
|
|
||||||
set_color dcolor;
|
|
||||||
set_line_width 3;
|
|
||||||
draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i0).(j0).edges.(3) rsize;
|
|
||||||
done_smth := true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
set_color white;
|
|
||||||
fill_circle (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) r;
|
|
||||||
set_color black;
|
|
||||||
draw_integer (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) depth r;
|
|
||||||
|
|
||||||
if !done_smth then
|
|
||||||
Unix.sleepf dt;
|
|
||||||
|
|
||||||
let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
|
|
||||||
|
|
||||||
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(0) = false then begin (* SO *)
|
|
||||||
loops.(i).(j).(0) <- true;
|
|
||||||
pq_add (i, j, i-1, j-1, [|node_xy; (r + (2*r + dxx)*(i-1)), (r + (2*r + dyy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(0));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(1) = false then begin (* O *)
|
|
||||||
loops.(i).(j).(1) <- true;
|
|
||||||
pq_add (i, j, i-1, j, [|node_xy; (r + (2*r + dxx)*(i-1)), (r + (2*r + dyy)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*j)/3|]) pq (depth+gr.g.(i).(j).edges.(1));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(2) = false then begin (* NO *)
|
|
||||||
loops.(i).(j).(2) <- true;
|
|
||||||
pq_add (i, j, i-1, j+1, [|node_xy; (r + (2*r + dxx)*(i-1)), (r + (2*r + dyy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(2));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(3) = false then begin (* N *)
|
|
||||||
loops.(i).(j).(3) <- true;
|
|
||||||
pq_add (i, j, i, j+1, [|node_xy; (r + (2*r + dxx)*i), (r + (2*r + dyy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*i)/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(3));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(4) = false then begin (* NE *)
|
|
||||||
loops.(i).(j).(4) <- true;
|
|
||||||
pq_add (i, j, i+1, j+1, [|node_xy; (r + (2*r + dxx)*(i+1)), (r + (2*r + dyy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(4));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(5) = false then begin (* E *)
|
|
||||||
loops.(i).(j).(5) <- true;
|
|
||||||
pq_add (i, j, i+1, j, [|node_xy; (r + (2*r + dxx)*(i+1)), (r + (2*r + dyy)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*j)/3|]) pq (depth+gr.g.(i).(j).edges.(5));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(6) = false then begin (* SE *)
|
|
||||||
loops.(i).(j).(6) <- true;
|
|
||||||
pq_add (i, j, i+1, j-1, [|node_xy; (r + (2*r + dxx)*(i+1)), (r + (2*r + dyy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(6));
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(7) = false then begin (* S *)
|
|
||||||
loops.(i).(j).(7) <- true;
|
|
||||||
pq_add (i, j, i, j-1, [|node_xy; (r + (2*r + dxx)*i), (r + (2*r + dyy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*i)/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(7));
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
done;
|
done;
|
||||||
()
|
print_char '\n'
|
||||||
with
|
done ;
|
||||||
| BreakOfLoop -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
Stdlib.print_endline "--" ;;
|
||||||
|
|
||||||
(* ------------------------------------------------------------*)
|
(* ------------------------------------------------------------*)
|
||||||
(* ------------------------------------------------------------*)
|
(* ------------------------------------------------------------*)
|
||||||
|
@ -1437,7 +961,7 @@ let main r =
|
||||||
|
|
||||||
if is_weighted = 1 then weighted := true;
|
if is_weighted = 1 then weighted := true;
|
||||||
|
|
||||||
Stdlib.print_endline "Enter the mode :\n0 for display\n1 for BFS\n2 for DFS\n3 for Dijkstra\n";
|
Stdlib.print_endline "Enter the mode :\n0 for display\n1 for BFS\n2 for DFS\n3 for (BROKEN) Dijkstra\n";
|
||||||
let choice = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in
|
let choice = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in
|
||||||
|
|
||||||
open_graph " 1500x1000" ;
|
open_graph " 1500x1000" ;
|
||||||
|
@ -1448,15 +972,19 @@ let main r =
|
||||||
let offset_x = (gwd - r)/(wd-1) - 2*r in
|
let offset_x = (gwd - r)/(wd-1) - 2*r in
|
||||||
let offset_y = (ght - r)/(ht-1) - 2*r in
|
let offset_y = (ght - r)/(ht-1) - 2*r in
|
||||||
|
|
||||||
let type2 = generate_type2_graph wd ht !density 1 60 in
|
let type2 = generate_type2_graph wd ht !density 1 10 in
|
||||||
|
|
||||||
let dt = 0.25 in
|
let dt = 0.25 in
|
||||||
|
|
||||||
|
me_out_of_this_thing type2;
|
||||||
|
|
||||||
if choice = 0 then begin another_type_of_graph_printing type2 r offset_x offset_y !weighted; close_graph () end
|
if choice = 0 then begin another_type_of_graph_printing type2 r offset_x offset_y !weighted; close_graph () end
|
||||||
else if choice = 1 then begin another_type_of_dfs type2 r offset_x offset_y dt ; close_graph () end
|
else if choice = 1 then begin another_type_of_dfs type2 r offset_x offset_y dt ; close_graph () end
|
||||||
else if choice = 2 then begin another_type_of_bfs type2 r offset_x offset_y gwd ght dt ; close_graph () end
|
else if choice = 2 then begin another_type_of_bfs type2 r offset_x offset_y gwd ght dt ; close_graph () end
|
||||||
else if choice = 3 then begin another_type_of_dijkstra type2 r offset_x offset_y dt gwd ght ; close_graph () end
|
else if choice = 3 then begin () end
|
||||||
else failwith "Error : invalid input";;
|
else failwith "Error : invalid input";
|
||||||
|
|
||||||
|
ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity);;
|
||||||
|
|
||||||
main 35;;
|
main 35;;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue