Finally fixed Dijkstra

This commit is contained in:
Alexandre 2024-06-08 19:50:27 +02:00
parent b6953af967
commit 9e68e9bbd7
4 changed files with 300 additions and 26 deletions

BIN
a.out

Binary file not shown.

Binary file not shown.

Binary file not shown.

310
graphs.ml
View File

@ -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);;