From b6953af967958ca476eff539c3f1bc9a99aa4cea Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sat, 8 Jun 2024 17:57:22 +0200 Subject: [PATCH] Finally, it works --- a.out | Bin 347712 -> 325467 bytes graphs.cmi | Bin 7975 -> 5562 bytes graphs.cmo | Bin 85776 -> 59131 bytes graphs.ml | 650 ++++++++--------------------------------------------- 4 files changed, 89 insertions(+), 561 deletions(-) diff --git a/a.out b/a.out index fd7bfd40d4001e9542b99a2cbe5e83c8c9831e5b..c2a813ef932a24f7183992fd5d21c5ded10e989e 100755 GIT binary patch delta 2350 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 Ak^lez literal 7975 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 diff --git a/graphs.cmo b/graphs.cmo index 706731595391854ec5b89c2f87a2d4e22175f9c1..2db9ee44f36fa11ae81bcbbb86b419ac59987746 100644 GIT binary patch delta 12092 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 V>jzls>)D*_e}8kbq%O_#{{Y3J5w!pS diff --git a/graphs.ml b/graphs.ml index 290f40e..5bd3df9 100644 --- a/graphs.ml +++ b/graphs.ml @@ -824,588 +824,112 @@ 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) ;; +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 create () = - { arr = [||] ; len = 0 } ;; - -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 +let add_elt_d da elt p = + if da.len = da.memlen then + failwith "Not yet" 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 pq = pq_create () in - Array.iter (fun x -> pq_add x pq default_priority) a ; - pq ;; +let get_min_d da = + let cmin = ref (snd da.a.(0)) in + let idmin = ref 0 in + 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 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 7 = 0 then - colors.(i).(j) <- rgb 0 0 200 +let get_p da elt = + let cp = ref (-1) in + let break = ref false in + for i = 0 to da.len -1 do + if !break = false && fst da.a.(i) = elt then begin + cp := snd da.a.(i); + break := true + end + done; + !cp ;; - else if (i*gr.width + j) mod 7 = 1 then - colors.(i).(j) <- rgb 0 200 0 +let update_p da elt newp = + 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 - colors.(i).(j) <- rgb 0 200 200 +let me_out_of_this_thing (gr : type2graph) = + 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 - colors.(i).(j) <- rgb 200 0 0 + let pq = create_d (w*h) (0, 0) in - else if (i*gr.width + j) mod 7 = 4 then - colors.(i).(j) <- rgb 200 0 200 - - 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 + for i = 0 to w-1 do + for j = 0 to h-1 do + add_elt_d pq (i, j) 999999 done done; - set_line_width 4; - set_color black ; - 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; + let is_valid i j = + (i >= 0) && (j >= 0) && (i < w) && (j < h) 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 - for i = 0 to gr.width-1 do - for j = 0 to gr.height-1 do - loops.(i).(j) <- Array.make 8 false; + if is_valid ni nj then + if disttab.(ni).(nj) = (-1) && gr.g.(ni).(nj).edges.(nb) <> (-1) 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 + end done done; - let dcolor = rgb 0 255 0 in - - let done_smth = ref true in - - 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; + 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; - () - with - | BreakOfLoop -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; + print_char '\n' + done ; + Stdlib.print_endline "--" ;; (* ------------------------------------------------------------*) (* ------------------------------------------------------------*) @@ -1437,7 +961,7 @@ let main r = 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 open_graph " 1500x1000" ; @@ -1448,15 +972,19 @@ let main r = let offset_x = (gwd - r)/(wd-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 + 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 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 another_type_of_dijkstra type2 r offset_x offset_y dt gwd ght ; close_graph () end - else failwith "Error : invalid input";; + else if choice = 3 then begin () end + else failwith "Error : invalid input"; + + ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity);; main 35;;