From 9e68e9bbd776ef4a197a612de1369c1128550965 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sat, 8 Jun 2024 19:50:27 +0200 Subject: [PATCH] Finally fixed Dijkstra --- a.out | Bin 325467 -> 339081 bytes graphs.cmi | Bin 5562 -> 5618 bytes graphs.cmo | Bin 59131 -> 75719 bytes graphs.ml | 326 ++++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 300 insertions(+), 26 deletions(-) diff --git a/a.out b/a.out index c2a813ef932a24f7183992fd5d21c5ded10e989e..eef794449cbace92b88ca3bf51c63201292e84d1 100755 GIT binary patch delta 6910 zcmbtZYiv}<8RhQGVlUoZ_Off%?qYnG#Sk75wjd!igsi~`gNjs3K&lE51S)JGPC%59 zLIMs{4H9YP8vHelB8B{@+N!OZs*=;EibUF`?T=dRpQ@yV6oLt9MJSK*5ZiO^?yRrb z-Rt6B`DpIUd^2;t$9yw){nvlRkNzcb=!kVB@MERl4}Rs-h_74%;c`uB(*& zC3KN=v6NG-x-saIkaKvo7pZaM)@e5@L6r_fB}vDuc6-8y4+OV96AQWo2K z%87?`*0ROE4g0rA$4%Ix+1AtRxg5>OQB-0hK!)9tZqrHG1exVt85*M~LpdM|@S%oO z-1O5xZ2)CDrFBRpt!2{tRXtOj)p~k?O>ilC12W6jb6he(R7WFYWcAmOT(;|p;79@VNRxhG)@ddKTg4NoKCju6~ob0 z+=#V|2tQJ$e>75zK0i|9y`=i@sfP@irJk(75GWyoHcvRMG%}+RV#xUss`3(&H&^Mo z!4K}{a$EZBf6NQKcUS(lLC=sw6SVf`!6b54nLK#!f60U4`d2`SPYMVCrk<2@ojRU3 zNT%s9dUANEfSVprZUE+D$QqPPn^p2emrhzW($S595jnXJMO0qw(v5OHu45;%+88)A z3-X*NB&~aOCNi~9<&Nl-lS{3*RV(MZ^vqgXiw6;N=d%DkF-dxM>XgJXmJSWmZCO1= zx`R7(3UrG+rFpeZK=Hw)dZD|O3nXbFawf?xL$YJ1o(I_?p@<>mP&%JPk*va2Qmk8Q z?DnkXs@_9{hA0?UPu6w$wCG9KekR^-*q4}?$CKB@wkP3IhfmZPjqJumSU!19&$Nck z!W`~r<{e(5xKn+3m(EBGq)etw-)H4Iv5`*49JLj!oZgF@2VL)*-$S!W2FS;Y-B_s7 zbNRGfDX@pF{=^;z_OOB$6uLV`g$i-)A@4Z@LNiB@4NWm*<(a+M4z*GU?E4AX6!hka zIvH%ou6M6f|5u*y@bsJu_Zc-*G^$uHxI9ZjcsNUtdt@Y6``#FhS%}}J{kXCHxq3K} zjWnZc9g`#I^Q!v-_!s*Tz-`|R%nj;dUcY=tqU-c*Z%TgwLrYV7!=^&>Hk1y)6^f%Xb$rhIZqPp*fqHEIP&eqIws9e>E_BJ*Iv?zzUtQ<>n&;dyPDs16bYY~ z>o`C&J^~Ejg^7OwuGf#Ee8*E~;^3#rGJx+UUGY@p`y7DteC$w7PfXtaP%R7csLx2c!CENI7u5nedtK=e z7oag>?g9}m@KY?n$&s?Js-%0<;1RP6*bb0(NZz=plA#b@Gr$(mkJ|8N8?#%9$Y*mIE7f7>A%Wgh88L(baP0I|1E4q!RgB_Kwo-%`YOSaEjH^ zSTq_}W;SE#$mZK%z*uK$sFBU%adF*xTP2#DLR%IkAKK9=lxIxc4Fy}FN}Dm5)&a}i zOHGKTbQg0MX>d^GB(yS{>wt{_z0fT!vvoYeW;1GK*kd)Qh7y637C4$bnPv zE7i!*?QH<%On<$npR4D;kD90kZ=psF8VpW!r!=h6BXu#~L=UEm8Re%7iTLSa`pfI$ zx`bh7bXo3x5ma)C`FMITHOweKHB6{ia*65pQG-`rqsFpwYCPgVf-%B7V@YJ8jlO3b z_=J}k>Zc2d__@UNm)E71;bkJ(=u_4$iyTOrSRLUKv>ROx;vJc>j80NFH4xt5r-)(U zr;Jyoyh5{#LJVi4P~|=2YGtDK!L{mQA~3^8Q_gI#N>NAUj7)juir!+78|BL8HCHba z#$(jW3?EG|v*Y~qGBTs+#eg?@Ei0F=TO3H3kglXx>5g*!WQL8VkJ)v8`WTt=`dHS9 z7CkS-EKV+I_qVng^lddj+UDbt(aKGA0N^1NwB!d-Jz3hjbhwpYTqMn#08i*B;I}(? zu(Q8NN_eT{tw-Aq+8JQELg~1Nq1Orgx5t1aA4>@u2oT~KaV z#y$9gJO{gF@Gh<#??iPtZ#^>fS}%+`mn>Qb?`$*Yu<;hHp4Y6@dJg(rD;BMn5ND#+ z2RZR%GY};epdvAVecn(teQZwvWKZ8O2ADj}7_ahd<9u|@{Ys#3!mvRZYxqbU3TRny zTgBE=9p0pF0FfXvWXXC5;hlPmUKLW`Y^!z z=X+8=gkPl(p}HQRIA@5<$|02safCZ@pLHSGzz$;!w(>Dvvt{!oxcADCiq+B>T!SUS zaqb?=q&xAtAD}(6K&co%nB>SMH6_iVQvqtpWors}5hceva_W*wr8zsrLO=%KHfF4t z7@Z_7*HpZo8G-i80(^=h()w?e47xVr?^xE$GI$-DIO}vGLUV9gu8|V^pl(dlS7gK` zIiFFGOS=YgL%u$ZsyDz)cYa4$)5Myg<9)wM>Vph1reChbcaw&=z+=Fxf&AT{Gp+&X z!L0ygsT7%W48+|3+@Np?vW;`F*_glAf;TNc#tY@W8Rl>d?0W z&%Qel{kneI>VGYu>zNv;80F^xRQ~1P%ZMM=MVjtpI&kOV_ADcpAP)~nxt;(M(cC(_)YEn E7mH`lA^-pY delta 951 zcmYk4T}TvB6oBW>J)^ts&N}O~X}G%M&tm18KJ+7*IQBy*5e5>3Ygj9x5z+QgluC+H z_7GA79*BY-q!)Xr2&O-%2P*`j)p`k&5c_|qmLPg4wsT?y4}5da-#vHkIrrk5RrBA> z!4WZ{-jlGPZK+Wd#W{4!bi)fWo*VR$SxV#*Wke31c`p-U7cTG;!{!h2bSS_9VuX+c z5D5%@lpQ$QA`JZ)*%=Zprla^I&9cp;x~ii1Y31!Fh+?9g=ph0)78Z4`>al^?9Ix!O^}z(pMjqc*85eCYDU zDoAf9t`TuU#pF3@VmJUX>cdN=P#nr9b!B5rvQ;Oz zRJ-m1jgXtb9)1thWF<`SyBH=|x+n)6F&6PQlEuwT;Ovq#otdi!8ZLOe5%LufIoNy$ zB5U~fxi>tvhg7ki)+;ndfnqz<;;2hA?)oZ0&!YebHxO%`^m7vj!=gw$!$lvM!AIGx z9OWk*b!MAQH)TQpP4&r~yY~eg7J4-W`1ZG7XEJ%tzNV@`h^%FA&nr}?p|xOfE|c+Q z{j@0YIrrc+B-iUl=wxgz+(QbA|y9ccDni{vk(&~N2rm^$AZ7)ZLwnZm) ap3JMei^J90lsZ0vEio-3&SGy&v;F}KYQM|? diff --git a/graphs.cmi b/graphs.cmi index 9fb1c3199278dfc00dce87dd17a53fed00695fda..a445c850036869e13032a083cd27eb37a70789d9 100644 GIT binary patch literal 5618 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 LV&H!#?(zHzGa}Z5 literal 5562 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 Ak^lez diff --git a/graphs.cmo b/graphs.cmo index 2db9ee44f36fa11ae81bcbbb86b419ac59987746..07cb7ebb1460ab4aa0772b9aeec7be020e819259 100644 GIT binary patch literal 75719 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 ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; -type 'a dyna = {mutable memlen : int ; mutable len : int ; a : ('a * int) array};; +(* --------------------------------------------------------------- *) +(* ---AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--- *) +(* --------------------------------------------------------------- *) + +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 ;; @@ -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); - for nb = 0 to 7 do - let ni = i + offx.(nb) in - let nj = j + offy.(nb) in + 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 - 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 + if is_valid ni nj then + 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 begin + update_p pq (ni, nj) newdist; + dirtab.(ni).(nj) <- nb; + origintab.(ni).(nj) <- (i, j) + end + end + done; + + 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 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);;