Finally fixed Dijkstra
This commit is contained in:
parent
b6953af967
commit
9e68e9bbd7
BIN
graphs.cmi
BIN
graphs.cmi
Binary file not shown.
BIN
graphs.cmo
BIN
graphs.cmo
Binary file not shown.
310
graphs.ml
310
graphs.ml
|
@ -824,6 +824,10 @@ let another_type_of_bfs (gr : type2graph) r dx dy gwd ght dt =
|
|||
with
|
||||
| Stdlib.Queue.Empty -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
||||
|
||||
(* --------------------------------------------------------------- *)
|
||||
(* ---AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--- *)
|
||||
(* --------------------------------------------------------------- *)
|
||||
|
||||
type 'a dyna = {mutable memlen : int ; mutable len : int ; a : ('a * int) array} ;;
|
||||
|
||||
let create_d n i =
|
||||
|
@ -884,8 +888,266 @@ let update_p da elt newp =
|
|||
end
|
||||
done;;
|
||||
|
||||
let me_out_of_this_thing (gr : type2graph) =
|
||||
let me_out_of_this_thing (gr : type2graph) r dx dy dt =
|
||||
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
|
||||
for i = 0 to gr.width -1 do
|
||||
for j = 0 to gr.height -1 do
|
||||
if (i*gr.width + j) mod 6 = 0 then
|
||||
colors.(i).(j) <- rgb 0 0 200
|
||||
|
||||
else if (i*gr.width + j) mod 6 = 1 then
|
||||
colors.(i).(j) <- rgb 0 200 0
|
||||
|
||||
else if (i*gr.width + j) mod 6 = 2 then
|
||||
colors.(i).(j) <- rgb 0 200 200
|
||||
|
||||
else if (i*gr.width + j) mod 6 = 3 then
|
||||
colors.(i).(j) <- rgb 200 0 0
|
||||
|
||||
else if (i*gr.width + j) mod 6 = 4 then
|
||||
colors.(i).(j) <- rgb 200 0 200
|
||||
|
||||
else
|
||||
colors.(i).(j) <- rgb 200 200 0
|
||||
done
|
||||
done;
|
||||
|
||||
let roff = (9*r)/8 in
|
||||
let roff2 = (7*r)/5 in
|
||||
let rsize = (3*r)/4 in
|
||||
let wcolor = rgb 255 255 255 in
|
||||
let bcolor = rgb 150 150 150 in
|
||||
let ncolor = rgb 150 150 150 in
|
||||
|
||||
let xdists = [|-roff ; -roff2; -roff; 0; roff; roff2; roff; 0|] in
|
||||
let ydists = [|-roff; 0; roff ; roff2; roff; 0; -roff ;-roff2|] in
|
||||
|
||||
set_line_width 4;
|
||||
set_color (rgb 122 122 122) ;
|
||||
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 [|(fst node_xy + xdists.(0), snd node_xy + ydists.(0)); (xdists.(4) + r + (2*r + dx)*(i-1)), (ydists.(4) + r + (2*r + dy)*(j-1))|] ;
|
||||
end;
|
||||
|
||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(1), snd node_xy + ydists.(1)); (xdists.(5) + r + (2*r + dx)*(i-1)), (ydists.(5) + 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 [|(fst node_xy + xdists.(2), snd node_xy + ydists.(2)); (xdists.(6) + r + (2*r + dx)*(i-1)), (ydists.(6) + 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 [|(fst node_xy + xdists.(3), snd node_xy + ydists.(3)); (xdists.(7) + r + (2*r + dx)*i), (ydists.(7) + 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 [|(fst node_xy + xdists.(4), snd node_xy + ydists.(4)); (xdists.(0) + r + (2*r + dx)*(i+1)), (ydists.(0) + 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 [|(fst node_xy + xdists.(5), snd node_xy + ydists.(5)); (xdists.(1) + r + (2*r + dx)*(i+1)), (ydists.(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 [|(fst node_xy + xdists.(6), snd node_xy + ydists.(6)); (xdists.(2) + r + (2*r + dx)*(i+1)), (ydists.(2) + r + (2*r + dy)*(j-1))|] ;
|
||||
end;
|
||||
|
||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(7), snd node_xy + ydists.(7)); (xdists.(3) + r + (2*r + dx)*i), (ydists.(3) + r + (2*r + dy)*(j-1))|] ;
|
||||
end;
|
||||
|
||||
done
|
||||
done;
|
||||
|
||||
set_line_width 4;
|
||||
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 *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy - roff) (snd node_xy - roff) (3*rsize/4) ;
|
||||
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
|
||||
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;
|
||||
|
||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy - roff2) (snd node_xy) (3*rsize/4) ;
|
||||
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
|
||||
set_color wcolor;
|
||||
set_line_width 3;
|
||||
draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i).(j).edges.(1) rsize;
|
||||
end;
|
||||
|
||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy - roff) (snd node_xy + roff) (3*rsize/4) ;
|
||||
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
|
||||
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;
|
||||
|
||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy) (snd node_xy + roff2) (3*rsize/4) ;
|
||||
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
|
||||
set_color wcolor;
|
||||
set_line_width 3;
|
||||
draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i).(j).edges.(3) rsize;
|
||||
end;
|
||||
|
||||
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy + roff) (snd node_xy + roff) (3*rsize/4) ;
|
||||
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
|
||||
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;
|
||||
|
||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy + roff2) (snd node_xy) (3*rsize/4) ;
|
||||
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
|
||||
set_color wcolor;
|
||||
set_line_width 3;
|
||||
draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i).(j).edges.(5) rsize;
|
||||
end;
|
||||
|
||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy + roff) (snd node_xy - roff) (3*rsize/4) ;
|
||||
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
|
||||
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;
|
||||
|
||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
|
||||
set_color bcolor;
|
||||
end else begin
|
||||
set_color ncolor ;
|
||||
end;
|
||||
fill_circle (fst node_xy) (snd node_xy - roff2) (3*rsize/4) ;
|
||||
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
|
||||
set_color wcolor;
|
||||
set_line_width 3;
|
||||
draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i).(j).edges.(7) rsize;
|
||||
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 32 32 32) ;
|
||||
fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
||||
set_color (rgb 100 100 100) ;
|
||||
draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
|
||||
done
|
||||
done ;
|
||||
|
||||
let draw_tile i j p =
|
||||
set_line_width 5;
|
||||
set_color colors.(i).(j);
|
||||
draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) p r ;
|
||||
in
|
||||
|
||||
let offx = [|-1; -1; -1; 0; 1; 1; 1; 0|] in
|
||||
let offy = [|-1; 0; 1; 1; 1; 0; -1; -1|] in
|
||||
|
||||
let w = gr.width and h = gr.height in
|
||||
let is_valid i j =
|
||||
(i >= 0) && (j >= 0) && (i < w) && (j < h)
|
||||
in
|
||||
|
||||
let draw_path i j side =
|
||||
let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
|
||||
set_color (rgb 32 220 32);
|
||||
if side = 0 then begin (* SO *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(0), snd node_xy + ydists.(0)); (xdists.(4) + r + (2*r + dx)*(i-1)), (ydists.(4) + r + (2*r + dy)*(j-1))|] ;
|
||||
end;
|
||||
|
||||
if side = 1 then begin (* O *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(1), snd node_xy + ydists.(1)); (xdists.(5) + r + (2*r + dx)*(i-1)), (ydists.(5) + r + (2*r + dy)*j)|] ;
|
||||
end;
|
||||
|
||||
if side = 2 then begin (* NO *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(2), snd node_xy + ydists.(2)); (xdists.(6) + r + (2*r + dx)*(i-1)), (ydists.(6) + r + (2*r + dy)*(j+1))|] ;
|
||||
end;
|
||||
|
||||
if side = 3 then begin (* N *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(3), snd node_xy + ydists.(3)); (xdists.(7) + r + (2*r + dx)*i), (ydists.(7) + r + (2*r + dy)*(j+1))|] ;
|
||||
end;
|
||||
|
||||
if side = 4 then begin (* NE *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(4), snd node_xy + ydists.(4)); (xdists.(0) + r + (2*r + dx)*(i+1)), (ydists.(0) + r + (2*r + dy)*(j+1))|] ;
|
||||
end;
|
||||
|
||||
if side = 5 then begin (* E *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(5), snd node_xy + ydists.(5)); (xdists.(1) + r + (2*r + dx)*(i+1)), (ydists.(1) + r + (2*r + dy)*j)|] ;
|
||||
end;
|
||||
|
||||
if side = 6 then begin (* SE *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(6), snd node_xy + ydists.(6)); (xdists.(2) + r + (2*r + dx)*(i+1)), (ydists.(2) + r + (2*r + dy)*(j-1))|] ;
|
||||
end;
|
||||
|
||||
if side = 7 then begin (* S *)
|
||||
draw_poly_line [|(fst node_xy + xdists.(7), snd node_xy + ydists.(7)); (xdists.(3) + r + (2*r + dx)*i), (ydists.(3) + r + (2*r + dy)*(j-1))|] ;
|
||||
end; if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
|
||||
set_color bcolor;
|
||||
end ;
|
||||
|
||||
if side >= 0 then begin
|
||||
set_color black;
|
||||
fill_circle (fst node_xy + xdists.(side)) (snd node_xy + ydists.(side)) (3*rsize/4) ;
|
||||
set_color (rgb 32 255 32);
|
||||
set_line_width 3;
|
||||
draw_integer (fst node_xy + xdists.(side)) (snd node_xy + ydists.(side)) gr.g.(i).(j).edges.(side) rsize;
|
||||
|
||||
let side2 = (side + 4) mod 8 in
|
||||
let node_xy2 = ((r + (2*r + dx)*(i + offx.(side))), (r + (2*r + dy)*(j + offy.(side)))) in
|
||||
set_color black;
|
||||
fill_circle (fst node_xy2 + xdists.(side2)) (snd node_xy2 + ydists.(side2)) (3*rsize/4) ;
|
||||
set_color (rgb 255 32 32);
|
||||
set_line_width 3;
|
||||
|
||||
if is_valid (i + offx.(side)) (j + offy.(side)) then
|
||||
let reversepond = gr.g.(i + offx.(side)).(j + offy.(side)).edges.(side2) in
|
||||
if reversepond <> -1 then
|
||||
draw_integer (fst node_xy2 + xdists.(side2)) (snd node_xy2 + ydists.(side2)) reversepond rsize
|
||||
end
|
||||
in
|
||||
|
||||
(* Actual algo *)
|
||||
let disttab = Array.make_matrix w h (-1) in
|
||||
|
||||
let pq = create_d (w*h) (0, 0) in
|
||||
|
@ -896,40 +1158,54 @@ let me_out_of_this_thing (gr : type2graph) =
|
|||
done
|
||||
done;
|
||||
|
||||
let is_valid i j =
|
||||
(i >= 0) && (j >= 0) && (i < w) && (j < h)
|
||||
in
|
||||
|
||||
let offx = [|-1; -1; -1; 0; 1; 1; 1; 0|] in
|
||||
let offy = [|-1; 0; 1; 1; 1; 0; -1; -1|] in
|
||||
let dirtab = Array.make_matrix w h (-1) in
|
||||
let origintab = Array.make_matrix w h (0, 0) in
|
||||
|
||||
update_p pq (w/2, h/2) 0;
|
||||
|
||||
while (is_empty_d pq) = false do
|
||||
let out_of_connex = ref false in
|
||||
|
||||
let srci = ref (w/2) and srcj = ref (h/2) in
|
||||
|
||||
while !out_of_connex = false && (is_empty_d pq) = false do
|
||||
let ((i, j), p) = remove_min_d pq in
|
||||
disttab.(i).(j) <- p;
|
||||
draw_path (fst origintab.(i).(j)) (snd origintab.(i).(j)) dirtab.(i).(j);
|
||||
|
||||
if p <> -1 then begin
|
||||
for nb = 0 to 7 do
|
||||
let ni = i + offx.(nb) in
|
||||
let nj = j + offy.(nb) in
|
||||
|
||||
if is_valid ni nj then
|
||||
if disttab.(ni).(nj) = (-1) && gr.g.(ni).(nj).edges.(nb) <> (-1) then begin
|
||||
if disttab.(ni).(nj) = (-1) && gr.g.(i).(j).edges.(nb) > 0 then begin
|
||||
let newdist = p + gr.g.(i).(j).edges.(nb) in
|
||||
let oldp = get_p pq (ni, nj) in
|
||||
if oldp > newdist then
|
||||
update_p pq (ni, nj) newdist
|
||||
if oldp > newdist then begin
|
||||
update_p pq (ni, nj) newdist;
|
||||
dirtab.(ni).(nj) <- nb;
|
||||
origintab.(ni).(nj) <- (i, j)
|
||||
end
|
||||
end
|
||||
done
|
||||
done;
|
||||
|
||||
for j = h-1 downto 0 do
|
||||
draw_tile i j p;
|
||||
srci := i;
|
||||
srcj := j;
|
||||
Unix.sleepf dt ;
|
||||
end
|
||||
else
|
||||
out_of_connex := true;
|
||||
done;
|
||||
|
||||
(*for j = h-1 downto 0 do
|
||||
for i = 0 to w-1 do
|
||||
Printf.printf "{[%d %d] : %d} " i j disttab.(i).(j)
|
||||
done;
|
||||
print_char '\n'
|
||||
done ;
|
||||
Stdlib.print_endline "--" ;;
|
||||
Stdlib.print_endline "--";*)
|
||||
ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;;
|
||||
|
||||
(* ------------------------------------------------------------*)
|
||||
(* ------------------------------------------------------------*)
|
||||
|
@ -974,14 +1250,12 @@ let main r =
|
|||
|
||||
let type2 = generate_type2_graph wd ht !density 1 10 in
|
||||
|
||||
let dt = 0.25 in
|
||||
|
||||
me_out_of_this_thing type2;
|
||||
let dt = 0.3 in
|
||||
|
||||
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 = 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 () end
|
||||
else if choice = 3 then begin me_out_of_this_thing type2 r offset_x offset_y dt ; close_graph () end
|
||||
else failwith "Error : invalid input";
|
||||
|
||||
ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity);;
|
||||
|
|
Loading…
Reference in New Issue