From 80dd15b8b0743147f99d7d1f5450cb6747fc1bfa Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sun, 2 Jun 2024 15:21:12 +0200 Subject: [PATCH] BFS implemented --- a.out | Bin 301706 -> 317685 bytes graphs.cmi | Bin 3287 -> 3510 bytes graphs.cmo | Bin 32425 -> 48380 bytes graphs.ml | 252 +++++++++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 237 insertions(+), 15 deletions(-) diff --git a/a.out b/a.out index 99d1635cf4df1328df530c96dcd7d8e7f4f90a8f..6f84fb81b05527e2426e7019ebbd86ceb4e0ff29 100755 GIT binary patch delta 14183 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 delta 9217 zcmcIp3tZJj_UFvZ)q54zdjq`?AY2}bf{Lpx`VSL)Y#5lh_(0PDL4y*7q{P$(719zD zyx7r1b+Nvw8TDao+KXaK&TISaOvwuF0GvD(&Gjm>Z z=KOy5YPIL{yY4C62~BZw>PWZ(@Ghn$!BVJ^jY$x1fLeQPU4Wc04r1ECd)PPythh4; zD&Tz_nF`-yMGAP!)HK-4FfkRpFfaqwVq6;d$x|6%X0TsPiN}2zkcpLDT*Xfj<qYq-+sF0xYu$>An)myTKLdcn>^{a20LmA;6%v`c8iF2_WFk zPiRhH9T&3X05r9MCg)Oc4IM`y9R4K_9)Tn)T$eO4ML;voy9DuYLms>Yhk^86-3TMF z@DjMwc;porhzDB6tJT=Mfh@ee4L9Sde6nH9KVbr~`Co>?)TLbpd&>fkxaRizr*j>e zn?$6>D;af~fYxfh3Uh$rtnXk0aB2G<3Iu8FxDL|+4AOD~wgI%k+JBRPZDrX_ zILm2o>U&`+XMVWXn;Y=}XYOE*o#Kv~4D>k1eQ8%|^eJx&^PiVf5k{Al^fle~lpQRh~Gmg23@4> zJ{BbmUFo?mHg@4wd+A?|a!!A?mqVEBKY;dyZkY7|djh(nC7uOf%@GjxoD6}@53n;3 zE>90+3&9XU3v|HxLCh+PVo5pZArB5>-vjhiv%+P=5Vl>AFCD{3g-G;yh^1rYFcyN9 z4-xlo6+PIXEZax%r$b-)R6KhZ&>YX`SPy5J@H^Z!oJG;mvpvi_UwoJaLO(UMLVp}d z6njp80so_hz2JU1?_m~h=oqcEqBXlvb9rt6)+RAucmN#{;3*rDSP@XjmyKqgCUw4) z2r&x!V%})xg*BtezNKn(f<`dd$!WjP*@z#Frhqb!VT&l(SB_zQ;4^t}3=0P~6zmWG zu@jn;nXvp`OYkTy`wwbk@Zwlzbt)PsW0RG2hsoS=Y=i+G!rDjKWuJJOp(2esr!WaF zj9XIJ4y;IHiI|Z}2jV~~+ui~T(+HkRbHR#91Vy@n-MLYoNN0;WKmiV)Nv9xkE;HIo z&biCd87z}Sp`zZ8b;YD)^i0wxV+NVqJd=gUMKjrMfcY|Z7JHe&0z5sN#rqVwgwetk zyD)~%VM!RhmDZ`8!-kj^(}RA*)Duq|xK)a|ESf`!j4fpEc7P=kO4;Q$@B-f0P4VK6 ztU|z2+_;K46U=;aZv_(_m(m*TXpJCh>QAlr8TwSPcvvbYS5QRKr25t5%%ym7HD!XO zIA9I)HK=(;Y+UW++qi}e1SrLCUuGMi49hCXQOodyN)~0aYZ*(aSJBaxnt@s;YHF`C z^mmXy%j7TzMWU(P#g3L&Ss&B#Ryh1sHXB~VkEt`Eizp9+nEx7c_oyJ;-t`R2 zUSqv1tBG`L#H_*k*VH+Ejl!T|1~=Lh6OHJ%iDg(E#5sy4yUxNZShk5pnO-HbQn(cB zH?a{OYh93fjFA?R5`NLE1I7RhE>fAF$0- zg3bMqPRl;EP?UZ9QGs(lWTTdu1xD;=W>tF8V@%%9GO*!87J&@~OvnrS*$FVbOY1Rv z?Gh`_38j1Z!pE!zK9*ZPVV5|3B3B<`(;0j!J?hy)1JvM>>!i%5Sbd#@Kkz3OZKNWN z*0y5cNwyab$}dl{bRRe*W3RDzb{l^ZO*1sJ9dH=;G?OLj@LDq^{d(E^1`D7_X-_H7QF3tS;eyJ!GBfW=9&I{pItO(*w7#2j2s)G4mETR#Za7i%t z#qtndVme7%s)#;?bn$rF6Z;$CbW3E`Dc`1s@<{j!%R@TFin=OWAOo_w*%^ldAKe%u#4{_eumb9-%`r;P5;^V`FD+%<%M4Hx9fq1-Cq zqO2aq3rz42?43mYCD$yuCyA#6MkbLs5unSPAMWabt_@`3cidV*PKe(*M zeelE>?u`@1az8YW<=(P%EME)oU5nil#_=#JYwUmSd@t49l-#3C*KS?5p!dIAkosG% z6_u&36HOH)q10U2i)!=n+-kbvnud8t=W?O2y;0xjTdmL#lOtpRD&Djk}2Gm8QKt^2i9j& z#;VEW?$8zwW>SP3Wn(5^!0s{8V|5YPsHtdb$8hVXROePa!7~K3N66tv=+)`-9R5Cd z$d$Q#p$Gg%+6s69KnHXb@>O8Q0rU8Iu&55PWPzB`EWJZg##4b;Mysbo4r57Ihd`#NF*iFL$gg;==G58O&s_eZh(~Mcm5? z4QP9X66l2@9!RyfM=@VawfD+m-Usf*gT=fT72Y?B`6GCsn7hl2XZd!(W*Xx0VjhCY z&(e7^Kg;{tQ-#3NMZ6ik7LlxlAJLK7{v6*6finAfI{IY&m5ceSRE`fQ;eP>m6MbHw zErM|P3;YP~JIc*6aw(4kO9*Ln>t!4&pDX2uflBgm%lLx~x}u|;kAN_2ET_ZJ4Lz2V z^}A#5<>cXT9J-wLioo3Ed?56|>gBwvp(icqXLlshg|VC`s$x6#C5}{VQ|D{)+8lP}ts(BJL;kafPuJKWgAJ(`|;}IGk&^S@!k2D^s@ji|J zpmB}HNgD4}Sk+vkG-0=97_IS6jmK!bUE{GDZ`L?j<0_5EX}nhB@fufZ{D{UCgbS2U zCTPM6%`j2pa*ZF=xK!g5jY~96)p(J{X&M)4JW1n1jng%rqx`P~$k2p*%`jQxJdLMl zoTKq$8c)?YQ{zmHvoy}o_;HO>HGV?l399B*0!-C}WX+JR@hFX_X`HC>bd3`<&e1qd z<6Mo0X#AwcF&fX%I9mB%36Q4={WN|`)-HJ+=nm&Sk8*sO5@&RfrYO@%~OGMD1I^}Ls9UMu`^Js;R}K0)P^iPTgu zsM}}((PF4?(zuAQq8Brq_9WdHsT;U3JxfHjtUG3JpnF8(k`4TQ%R-{6r5Y%gs40su zt%?%xb2zt(KL*dMZmf*n$Rp_Xm06qkU)uXDrYVmRt9m(8Q^!+N_FgO}N}ghd5`23< zUC&G8$d7n{fEO_LfGQbf*#Rnp=rzc8h+rAU9-<7t3?~!9m_t;xlpmtJT#ic)^O>+5 zFCL*ft8X0-#FE2w^W@a=oha(KpNy&J^f`4D4b>MxFX?xbA7?#Ql29=ugv$gk5mpzr zqNzWn+bW{9Sip9SE|LmNJ4ULmRvo=*98=ZcF-qr~X#_9hu48-~t7P~ zx=JrZfw5y7njJ(<8SPaq(_%c`QFs~zk^C_BEAH7*MbR{BN{i0aes~0aSbvUIOztEi z=^8KVBI0qyLVE8}yV_ef(ozmqq9E|PvCe%GHmFEeR^ARfk{Ti67;sUn}y@rl|iQIAtiSiS9JFmMmrIMmf)!r3PYtH=$k$ou?y@ zIPRLFew<(bZ^z?jwV;E3_mkobCuaA5+Gi*^;g=5?| z^l`z-+Erb8^yAt$Jdp_W8<*aiK5d-kJAr78=hRLzEm3q(Fn6T5OkLXdoTh%qr((_p zUeZFCfjJj>5sk~5_(DZ@NAqY=s0gFQdFtRgkHUxswUwOP!0E>rhqR3o0jiH3FCNtE zPsfH-x^gC5<(pd;?kZ^~`el`*_?}*isiz&{6*n#XnBv~svid^mXyIPC`?^yfvLSse zXy%zjFK%wtO_Stv4~m5_P8E|XrqrE3?efi=ld11OZ3wkoYL8P>_1|EPRSH$Ni&dN++o(-br$fo8pCb z9yvAPhw-@t5!k}-^je-XI&QBUERPFM8FQ9C6%gb9kLR2QmVL*H3(67yRrf{VnKYr| z(CNdBNzQSr5ASdoV$+oc<(_o98GY8>%@0)EO%|i52rQng;%q%0oI-Kuz>8DF4(c3_ ziEZ?2!N^Qng*KsomeZLdvxw-x=d#4iJKJ9c`i;j$0m(J@ z2{8j;Gd4~Y>97SyXNv{&@QZA*?G95{P7{Oa>6g=JHwSu57wEI~ZW;w(j`|#aYPyI9 z*oL*aq7NqKid5&)ohSxX-ca@HcJ*x4Psr6RQ!1al!<5(2GD9r>$&?)}Q%=ngsU%`` zE)`Pcc_Nv{7xRRqZrxJ?yL?KANgV~({<{d62)oW14c*+&;-sg=E8Skdc=M(@LvLtJ zRlZYa(KT1P=s0vH*}Wakohf>aQC#$|m20<)i~3t<@41DpzI>`x!>OsigtIqqDydv} z|2LB5i}~QMj(Q+9Rh*|&a~0^$4KcPi%(lUOnwsRhsn8zMK}83xj}XBV*OzeYE=vLa&g9`&B)A~L_gVlh8}goj*dFf zv6H0jTh~f_GHY7i6!k)Qs!n)y{FG+*aLrCiPn$LcSbH?pi!nVG)1&UAr)A|Qq)nPU zl|(Hep#~5A{ewlz*T3WD)|QM4WHCWT<%48Ny?7NMM#dfyYlQh+)wRgv;Mk>qzS2Bt z)Y0z+UOFcBvFN_I>o`@q1Cz!LA4Ic`4gSO6Bw8ti%-42sTK3f5{rmS%j_ecpzh#mu AG5`Po diff --git a/graphs.cmi b/graphs.cmi index d1c3772848357e0165f9b6ec21447fb881c19624..441676d08d455fd69082fabc05f4b61dcb4b6e4a 100644 GIT binary patch literal 3510 zcmZu!3v?9K8NUDI?gDBFDg~^q70JdB5}BA-6VlQRaH7dMXeEF^i0i;kHrs4wlik^1 zDDo&Eq=F9g;47e$A}^&7QG_Uk35_TZA&3Z83?a4R6Huhkw4(RknVUNe>^U?0{rB`Wl53usdQVKLu85mW=55tskY=}8 zuNtd;<&mhOkMSFR$#dZp@}sByP1ev58+k`nqy*4mKu0Ys+31+x--xgG`w2-(M9Y#v zn$u>r_$kwnu%;IXo@YoK_6qx1?%+A%01ub|=vzQt79MD$%ak~^fD-$HYD8B+n#-8G zg*6aA7+=NHO3u8BgXgJ>VN(F+11z#|hK-g`7x{(MMMf~D%m@&{YDkTNG|!0vrwhF= zTsK<1Hum#|C3zyhvH`P6@ zi0V!Y2USfE>vbUgk!i-ic9v~D2F|j9vOM%Ccy9vlFDx9ek&m)y<0(sOye6Tngn&vB%zskE`<6tY5yb=|Fw-~(lS$LHLCsNTHCsEP4 z;i~Fbv{nrUs$;6I*O5OGL0Aicw6HrzN-U<--AmPYX#_nB{&gX7n}FNxGQyigQ?p$# zuD$Vw-O?<^yh$DOETJ7dqQ7yllY?CxSTxv!XbgA{fVa)UhaC7B4Ys}1Z?>2zS~N%& z|FPZ(_&u5=4ua^QH{MaK22CXb00 zGhMH%R_|m_Dv%brg7M7=2lWbocUd?c!uvZ-mIwNv+0b_~^ow7vT?wIe=a32&T2YEpr;-HO#!yLTF!4b0J9w0A*g^=7I zk_QoEA~!Nv3e*{Nn~qeps9vGQSXhB*xgD5mv)0=Y;$$J@eHM)eTu+pvPSYeY>I1T? z*9h|%S9Y9(4>|Y;(^?JaDd@KV`Yk3}Yq+tNX`PG4P_fxP#RkjcApOZv=z7z9#N-$r z(1m~#jzm|}$3&uQE46b$CpqZg;1rX%1mH&S6@hOok+_r_4>O4?QOQ*$PNNbZcO<%A zUY$%1{<#qNPe-7uZayI;-~m@s|HTD;%E4(4K4TKsgVZ0!4u!FqMB)Z+*t>i?s-zNq ztb##WLQX6AVd4LCM(`R)olw&SHJ1s&R>z1Xu^3wcEn-1-Z-(+jB*OQ?Qoa}J1?Lwm zfScK#ZKrn+{7m$IDWL1A@HLO<3=`A_(piXSL;P+c=rA{mnV=3pi>aWyx&_4)Ef}rh zlAhp_T!nbnPJDy#eU9W|FcF7urMF*-j&B6~R>1RI-*+5bU_#G;^aJQqL7zs1p5?|2 zCiF6(C#cZdLgZ}pBu#u4^_4?z9yl(z|1ID}0WVR0NrI$)kT?N}4q_y6qm%MWHvn2e z`BTV(kT}1>IT!#**F)_iP&}AIT!)tob0zx+0r0{(C-j}O!EJY z$&cBF+#e^xk>>uL89PSqTew?(%QRCaXyHc;xoA)8^2Yl1FTO6lI5YI;(_N-HtV9n+ z!qWnQ61B#Vi-Wl^_x(WC!s|MVU+Gmj$TTy%`=={fxgmQFED3#IoU*3j;*D#YA3bx# zH1FUe#<7|*z*dXfjQij~NvXv9pIEdncWJxz~1i`u&53JeZkr zP;t2`pyxM3o^;EEFB^+DZacE!C+qv{*_BIH%%(Bq%-*TxJLl|vW0@Aq&eNBjG|e>j z%@m#FjPcD)qHKr+%LUQa?^ifKj4Q|~!f8Fh0 drCr$3u=@8Wf`{IAY6W3ZBNDkh^fC><|3@3&5h4Hp literal 3287 zcmZu!3se+U7@mK+gO5V$bh6huma!lz<{;DoEgO7bkP3+?NwjBlhh=qlcG(>;>|q^x zdD7!#$J0ZrF;b~a$TG7`7bDAeiItWjP)0r~%Lhi5-Fs&)cO&yMR-+dhz|Br&szij@w4?P635RDDas0Tm7?ImF29~8gE-;KXrn?H z5`DUn&Bwon+fW?0Ek?Wo6QlkUgnNX-D7u#XPA8l}Tkhm7ZxWHNO5JDV@W!{8xVITt!@xTXtR=dq(}sDx;eAH_0ZAqC zNB8mG4~bpM?G4O(BT4iBlz+s!KW1PPk-R(tQY}cUqv#bI)f35UiizY*Umz3?R%sr0 zD6APqHU7c+eYzLKN!=Mz!(p}hZlWcQ=oQ>dudewsV#* zINXj2PdhBjqUekR*I+^kE(&~N(p;a%C~{Dy&V892beK?c6VD=tBiFcX(;WOHO@KC+ zY|+uG9yH3eFb&EbEVILk*{Jv0!Jq^#<9iy51TpWDLrzmM_d1Ms^h$2FFkMF&Xl0;{ zDh+|~3?v+egf=X-f*BX7*2jc#L~MFbv7WLBh*KPeF=tFWm19a^Z~;F!5@VWv#1b31 z$5AHeCk8qg_?b#v2q1y$b#Sf15*IOJBbB&ZC?pb-XmNm8h!1`gbK)PP1TTUp!Ne4p zn2HHrVn!Mzs1s(>7`w}?tkUmiRW_AXS%AwuPO9S~-3(jl^B>-Kg2R~I_6rN=SE}ZH z5U+wsBVp2LtY$qk?xkv)ggHdbZQW|Zs_qE}n4Ti0X91t+H=1BHpSPUCIT(ngp_|F$ zCf@NohktN*n#nuEz*(wuABY2C@+_F_!#bOpLC#$X+Jy?D^A<0@ZA>FMPa{)h;D-d8 zIQ2OWJ2^a0>3;%o1myn!`5lK7c-tF{9<3Bn)2i9V*X;nUrPAzCyx@&bb-UaIsAw4i~T^%fPy!m zpbi@e%%HD-aey#SQS6HE86qk?KS5* z%No|*KTFliOj+8s(EE3uYvr=et5 z)^Mg}Y%mb=Yd9%~N;1CM)iR@WR9r&YsVyTLEK6oSV|-qESetTO@o#VU`cR&ge_i7A zVX1r6n5nYKb;p#82Na!Hk+)_;^PBN?eYS1M#OqwJ)E9pJa@#h zQs|!w->ir!pDNwFy6VrtcSO|~qeiH6)B2j# fgHEQL-L$NB_94&S&z(vT5Uv0bedqSFO@kTdIC7t+rJ!x3#yuO3R(UxifKlnvipn5MYe% zF{W$owdR`7|5|(PeLyA`FRdItcI?;-^G4>Sr9C)%ZdzK}%mMlzy*?c@X_?xNZshYD zThaD(rS!&oWVZeqpRHfu{gOwkm#GG+T$X~6*Rj!n! zbhFZay}C5s->B^+N+&AKSHc$K-L-XD*TH=Hip`*FEjJK4d7ZP%m%$#o}%uzFjgHGC}TKir)r>UHK9*8g1y1$d) zUrTi_XvT-cx`S_gB}YeUJzq_TJ(+qwn=nVivwE^-1}pixW_?DL9P53Q@25n+Za%ga z!mZ0OCr9ZjC9d8|)b%ta#%NhLiN?gY)A-_YZ zxj4|%-2Tem{28TWZBlz|mMB#!xn0kV=dLB2tdnGIl5d`W9%ozZ&P>5>CzbVB$*tQ> zHP*9Iun9)Pv9`r7*a_FEHU3lYmY%b*y3KUSuuF1iTvX1*q)e9zQ6Zd-Z%|6d_6&dp8ZKAB}Kt86##XRcmXDspo z_QQQ%Q}#gi1lK=BdEZmLEe!RMKlUfim7Ki>D52YP%<)1r^v6@yCpo}gYTI~0wz44 z>;WB-ACI5?zpe2*F3_3kTIlGwBkE(~Gr@BKp4ys=0gd{74?0qE(p=1}leWg}^>1y= z{;sbjk3OG zuu1M{6Zg`i=`6*!G=DyYF_a7@z;0ne{G2_OD=kstj2G6)*@>LdCg#j>$T^bdN_gCL z#3--{_5o?lM9SLW}j=-Sf`f%r!+VX5{k2B^7)#G?}+0wy99aRTMDuII|f*tqU7I3z2%we=L^ms%%N>6KjfYKAmh2` ztj#@bQ*+S89Q@2yVvkG)m)GguR-&@tpM4^kImHQcbej2vZxBA5p+vp5{%!yMa&5ha z=sih1#<2h|6Wkv&S=4dG5i$d5x{_UFdQwc#DtMDe;~B3{{G6Q`{AvxE7l=+PPFH`S$96xlx}R0W8(2W zy6xHcS=jE))qbBi@q(IQ2IO$YDmpp zCwg2bYo2-Zp~G|7Q~5;wCp7lC{_uKC{BuR%8@trjee;$v-cPF{8QkAO4gmVGDBoQfpABgEbi*cbzfq z=fdY0j9#tr8-0oMlJSjsF(oeY8-vjc-^pb-e~I^98|A$9anb$>O3m$~V5nTlG1XW3 zQl+-y2mirOs<^>6zK3z+wevPyJFo4LgctYI+vfZ|R5-z|*Pk`bz2m}LA5Rq@%!8;a zYtu0aUK~U0L1jv9#Sk`p55mt>u|(eSHH;p>;eVcd%!c6IC47My{OyQ+%6&T0a28%q$@rEk-opA174EXNhF}UTv=vjnSAngt?=4}eslCeg zCU4uaM}>V!rcSNdtK3g-oAWpPj7tUAEnx?{tjBPyhYB<7Kj5WY$@eecn|M!eD~`f@ zlkbz^xLU#!xo>K3@@IZ~zQ?6f!`9%6xKr`_P~j`=M||eQm{%??vu6 zxo3^Egq^1LBG=(-+uP>Wcz3l^s1zQjF5&YxIu6xdl&ZgunPh!JKBmM)K4UO?G2gM_ znB|`S*6u~TBeUPoc2c4~mnePbgWwzT70M4%0yF+yOfd#!{fSCvGoV*kj`Nt` zrz@YMRHB4VeCOJrG+1ef5;ClLzOkOBgp7Yn^0r+2-1gTMpgV^uMpp}rzl;m#N};a zh$p|`IQ)GPy}rJvr}M-|UR{s3_~2Mrt33M~{&}tr_FX+}3;oIFCDE^B=f%_p7x|3A z=;eO;H+OtOKmPEn_c*1WO%(IgCT$Xvhw`MC}rbHjq8jSKh_PvcYkcf?zu)0>~q>5Ev zlgZZjXu)i%aZ$6Q5xX8I{yQ!m!w17F_4a2@Yw^mwM7*N6C7j-*G987}RB#z5SF2r##Qvg46Kc%J%_3zk1GE!fR{yR%|6( z=c5I;)HId2j#m77oK4}FJui$?-%mL!v<0Wk^>ZsZ2B+YsC4AzmpFtA8-!%0NF>E7M ze5N8FQ@^-6>Y3l(xJ)+Ij@VDbc;p#BPzk*8ot=GbkP_dr{JS@OV1j2~A|~k1Q>sj8 zU5+_?@A7Yhy_I(?Ci^T+Ro-p0=VQAm+;*fNr!@LO9>FhIIM{oY`$pW&ePiJrgEgKk zu6QP-Dv#f}N<2^T*YUubFHvIOf;`_|Yho-^!hihqapqAE=J=Rnk>5G!yHSbXcz&of zUkN*`3G_85`?!uF3l{McJ^XoAZ1cMYzcmnljnY~ruH%)E-=Wl89O&VBkFKkgxQc?t z{(Sytluy+W=(sXZLvEu1-qS8)?+2NZa39f&q~22 z7!AkT7Q56tT&LFfPrbo3n1$!h9Z(N=ep3SD|N8$+1#6Rhvp!kp;D)?;8~)9QbxePz z67n%6F6L2hKkI`9avkpTnz9G7C%FD8%KO^(mc7P#YR_4~e+L|(_vrS$$n|)8Fn`%g z!t=W7J@aUrnnxbOaUSgKL(GZsmTF&H7mR=OR+C(hu9qhzLz-$yln{!$boTho03lj>%`2n-Rn($z1}V1 z0UvlCMwE^OOgNT0DnA}S=Z&_;@3=r`s%xR6d3RyD7EL$r!a<+!35YX zR0=;!I4dnzTB5`mFRYWZ6L_Ny&+#)QHi@0*N_gCL#h?OjCE_fVXU~zCN1j(;-|>x)e*Ph6j+M5&=Y%om`)GS&4_zIxCdt*2a8~RH3_7k4 zcV4M2XYBSkV}^0qp7;x6`f%s#P@hc`vB&p}qdAv{@=P1XoA0mfnJaX41m03P3;*l? zFBN=e^Ru9ziTSROZ0$KG`uFXA%I7Gt2bL=F4Kduh9Qz}3{@WPOsw^dJrt&`B8Xr$l z8`$ovG(?G*vFR~$?^vCpynhe%mS?J;FF1c7OB+5rdp?PY{DkA;tj#@bQ*+S89Q@2y zVvpqc*3x@jNB#e$@UKt_|H*~dl)Z_(c2y#7kJIxRZi#KE5^-@Be(O)c-)kZt{Iwa9N6}8kCAyk=6faeq0fKE z`Ja;YGyj|xeYm))Ya4e%`B+2#8-E&Z8F?Bndojv@NHDtX(~JoGUyro_ebDF&mLW7q$# zB6w!+@b4lS%5%OdRC1dgpH0QgI%#Xn zUVqmb_y8Bnm3W^7XW_MdIP%ld^PK#($N4T1XTFY();#h|qqbf@ zYVBtva^_fR%b7TgIp1sB6MN|D2+WbIBjG&R5g2q_AMU(TTh8I_aSjdRus!h?#`NLN z7tf96&T`=QXn4+cB=(xiRePL!!+7)kwLNi%u8zQ4D(B?|3IFa4wQT8(JuP95uXq2Z zBlLJeo#-&^_&O%ox)qsPhTAyqQtue`8nEuQ@mCW{$MYaZ|p@0b6WFT9eX+R zz$LkKOi+XVO00eAa+(sd%ap)QOo?ld60+dCRLSQf3$B=pjx|b`D$&oyJoZKA@y_G- zgY}-eBFFd{O6Y%EWvKHwCDw)GfoBa=pu|A~u~O2<7`-#fsh=aiVdA3e?^<27*E=2|f0^L&o)+uolz*ZW(NcRBJ5 z7W_UuFWjGuou=enuh%nEZF#-=DBn*Byii-W;d78hCqxc?9y!cW;sT#B7`@0j`C*>d zp0x!2lfl6H1Pri;;G5fZf17%qwS<@Hst3FvhtFW$<7HifO*L6Ip37rLAGJy*kGm4`n9Q7SC(I%DO<|>_JU^=Q zJYQhO^W&IGHUFOp=}RU5)jF?}QaHzx^`6=~PFdgXpSR%}AdepRJ+VfGI!27x02izi z*W<0P2ft@dSf}?lx7URCE|>Mz_xXKze+ch0#N{$R$6Jq${oDJ9AyMA% ziGv)+l(@(zISA)EruSTl*iL1yxFG?r$zc47ggGVZ1Nm)k?N8M)u*_P(fA_bK@~p+C z_91EkInKg4bF6qDwQ`;4%TXc@hC1vvA51~Jh^|`)#RW1BIkpYGL!}@4N<}-7r0ugMD7yT3D2B#0%RYjTqE=)6>k znD7H47LNK_YI#$WoFLsf|HgV&7ST?5jTyC$I^3-fJoqDC}2m9X@U}KgX>VP`L_7oReke#dFR9bRNk$>@sHr$dXUaTm+#H&*-&^d zXHQF4Dpf)rzC_9QBJRU`5&OwdCG>E8^|k%`&j{GGxAggjJ@!KSn0tfz!W@@bk#Jw3 z_sn4&oip^F`Q4RRPt=exo&g_z_;FoN>pgPd$n8Dye(>*nkw5R-^6viq$b|Lb+ws5L zzu%t&9xpzG*)6cnq{hNGMD1jmJMoXP&@flmkC}k^g{-FQ-#x_UWEG2x0FHv$k ziTU>ami!`Cu02|haK4N59^3SlE5($!=;JIwi+@X$3Y56$!*^P06I0^i-eY7g`oeRF zd!iE8VkPpEDC0KK6I0^Cc2lz0#wNbIZS*FtVeB%FZuGcM*mi$>oHj9D^kpe=F%DL! zalgj<5sfW=P_zC@@L+*?i+8bh=!4iNXgNF3_HJxXZfrRh(SKTFo88zF3-L3?#XbW+mK(j+-u>`18tHu+@t^ec zqoJJqkoq<#ZNSu;;$`J4W~Zm6Js4|fh{vB8TToM$eO>j+>=i4ODZZw9Wo>qCd2wy_ z#4XzfFEZ(2ODiuG=^>K0Es`E^(_^vu4Gnc02F$4~t*p4Fw4tGXSV{5H%A%#kOUjB? zm6g;=T3kCL5lP#n?MNFeuBj=$u4qMBZBcP)X^o`qLB+5@MN!ek#Z{%%OGVZs$S-nv z*^b6;B0Fg_Bt4Dx6Ox`ud#a?br_Gjh8}B3OySeWroi@_;mrk2#`$(skXa`BBSFu0H zQc_W}LL%jQABjo?&xf1Gi)zf>lIqIp8i_P8o+Z&N+G8c!2R&USI*9udBx-iXN%Tqj z&z0y_+FlYhzb8xdP43T==-bE-l+J6k-EgMIUqE)GvpQK9IZHAM5uPg<3uqTehB=on z8BcM4m1L0CNQGqVM!rBY^SECqnKNl?By%qPGbD2}_tlcQjrIn~+(G{w>C%V$)zT%O zcCB=Y(LZ0hlyZNobh(B0bJArU{bkZMjka964x+zAy4t+B95bH#dO61Yy+@9jjoh_z z%wGC8N!C!>FG$uX+Am6$+4+=YY4YnMk4iV||C)3&Jztk@)0lskbbFieC#Ac^^)2ac z_MVpRYNsypfOOZm>m%FbSe37j{6LOXyY-RhZloUk2<-$}2H)^UvV+G|XA z>Gd~bj*}B3i2O-T+-)5vO7C1_PL|%JH7ch{Z_P_x5 zGg-0+ndWlI4t!oB+2uO)(Q3J9W!cIy>9EDx%W2Aq~=C6_dK{{@h z{%cHRf%MmyRklR>Z#S8%rTvdvekqlIT zsMc3yVBqF2WniG@bs4zMhW@_{RPR(~j|^1r>LS<4;Ca^Z2O0d7G4IOYZN}`C!8?ul zvkXzcb<+RHkRD9BL(T}a?31Cv$bK2BBlXerbQ#*mn5Yb$ZA_*NRSR{I2j$FntfRXO zvqGmIC&S9Er>6`vhtp4#VOy-{WErO3)I}bbyi)7Pmb@p8$&oy>ojySFc396~$=hel zP#GR!(z7z+KI<4EBZ869GEzs>y?hxN_<4?uoM}B1WaL~Xy&|L2tfNpyTeZ`t%IIm< zGebtJh|ZoRqt_WTTSmv3^jjH|OZ&Er(U9T~#Tp(e)N;lS&_gpD;&n5)jcMl-Ij5I) z-Lfs3{y9nixhyM^Wnb2tJN@Qs1+kcnxkVLzg#9@s#Z?PsjG6`eV}iJDmNBoIAD@&l zZyIx(-mA4JI#9DmUGLE`Jn`G*E>$z2?7TT<9WNN7~ zWiqwah8D%-CnlW;s7d-H&9Z`lBK5l$kS)c~NH0Gv;NPx!#zc%FK;6>)&POlg4~oW^T8k zCuQbK*7H4?HP?Ff$gEmp-jZ2sjM*l$)|$-oGAq#Yf?S{`)SsWo1?q+}yX1nsCj6pY zm}Wh{kP9n~`ITH4=y_ExTxUJMkqh5PIFc!|dm3|$%p4zl$BgMIv!~gt zzsT&}#=Ic2_Zjn{T(sF_vgM*}#tfB<%pZNPxVX3V43>*W88ccg9?vX&LAW?>JtO4e z$BdaE7e8r3y<|?rdd`tK*~UzjIfHDdugqCvJ%uvoK4WIfoCX^jBy+Y~&n%hqrZJbx zoVRUgxXfK(%qW?=&W6sCxxw`La>*v^DUwTqD6Wx9wwUl_xpcM-mCL18!N?N1bffiD z$)$nO3+1wW>#3E?f}v~WvOwYWa@nJ%=SrD3&17zoc|pjZl6iskPs=Rpw_>y3MA4C}mm3 z{6orm!bC;NvQ6gKQf5&^Gi0Ip6YVMs&7WvDSs3{9o-8tdqMwjOYixQiS!9kyPm)D( z)ANCp2hjSvl$-Tvnp6ZHekc{Ik%@Meiao}3k;UduG$M=pSkJMtc%5k;C5z4H=oneN z!!*AqOWsW3U=m#}>D^^!KbbjeTQpkZH*+|cRBB-QxY{F?=4<*}Qn}2`Pn62d#`KoT z?Z!-zrIqH;Vp$q^wn~;-sL=~#sXC-dTp>&M8FRB#MQqk(QWfNGja1dz&^oEolxgq_ zq-v-2+$L3T8&fA$du^yfstc{>PN`PMRP+5(U2a1)QoYrB?v?6Sjro#Pt94a)gDlIm zo(5T#Ys_P^Y^V*bm1Uca`HU=k(uO`M%eEQwxGdjp%oDOa@aLPdTs5o0d!%Ny4Sh#y zf?3Z#s?z z8dY0Q%gRz4dP7#~EEWE>tPBGDt*qQ*GSA7XwKnueSry2Ao#S#5eccb3(rr*jus9q9RkT&H@}v3KSAhzTDr z*RM9_1iAheQ}~`-zs`D2ksC%CbDG>R-k5%J!!)LMPM0;=)-zDn%r|C;tSL3-Oj)zc zWV*|ZG3yyAH*PZKY`Jl>F=OS%Ehcla+!WZFC^rQ@Pm-GgpQp%8=5yx(ar}K<0gALNP z0CuMJE`fc@ti@q>8Cwsl*0j`>u$m@iKd?wiuxdbael2XFvCqS>E8?5)gVM$EzL2zMZb#ZM`^}?cxs#+bnBU?v; zFQ26qtBP!t?xETp$%M;?I|fc&*O&VKBZhG^`@p=VD=R;mHxKCu0t?_ygwrq@P3TwC zk3^Rp=q{;V@lp30vywAn7!bXK97Tr0ZG<}mZWG*TaGRA2!qR96>VW@`g?$B0k%>&$ z4hNp^Ad!(Ca3Cefz>12hk2LK0m>*;~axvoj;8;oPBXEUqS#Sg36jcXuv|h_zA1S4K zC>)Dt{V2H6aO0^|#@VnWGn#QFEXj&yjDpn!sQ`YjUuV5bVKo@-oucgLtkxORV0)Or zWLT_5GnT z%EdLW^^qUJWy0-*>!DmU;|17UI)4Y32gh2D+ba1M9FavHft&d;{qeaB{EY#^jJyR` z3HJxMTIHe{EbRC?SYZ*xH!}WvxJ__Bh1+bBrf7$igdHTV8P`JXR<=&(EBglQeI`p# zbv7+C19mIDnO$LDGTA@El9*^FOQP<5n}*%GeJ1d}vKz8Y;3U}b#`b~Lu#)~nlsPAD zwRC$~y8UBYG;?micaId<*116))Tixp=+xpWO9eKVuQCr-UD3R-O6s$XWk;;124`8J zS1hloJy7R*DiReIYW?iM#b6)hQ`Quv^OUA4O;ehVrj31c#!%B#ea+&c(v>Wsjk&mz znG36xRThmKw}drLQVo-pn%25awc6gW(W;d>o%wrA6|3>?`C(NBs>apf=*Jwq+t6}8 zlN2rLN)>F}*awuoC(TubRk&9N;=HE^9!`zNpNosAk+(7p3)E}*^F;_L!w?|sL5-&FQK z^R-JiSWrF0YF4&8)TVV}Q$sLgHsHIj*o zCH+lVzFU^Rr#DOd=KWxz`k^k3U}B-MY&iF8;{M70b&~#$)O;u_GE~j=e$yjRv(@Gn zFn4>R{o5q{U0HF0tQe>hKkYYX1`~JL#92(-ZR~7iH|gfEVMDab=aqku&yn_xKAt!I zx$PSsy8ZP(ynE$euU}OE)&~s@XZSCCbIO*-^JbLh%PqT#mfn{2>ly!+u|zR+;1@vq zt{cyb?p(jv7@$k2AeD9TphJ@cp<9W9}{-Xh}S4PfR8Ci41guypl6;fh9 zjKuSne4*d)`P+WkwcoeCy5!|=UwKnQ!*F-wg5uhWRb~3fkLP8_tDl{8>^Hk?Xc%Y z*RQzhoX*EC-21(8TN)bjTxL?mBKzeyp4WNae|;_Esl1X4d*@ts=Fk_4L#FK4(|F#z z(=PerLo*)x)+=A>_Gp*qzL($7(D)N|JnziR0SlkG`TI}TRn?3fTU+-=LqoL7?s#6$ z$jXY!Z}-74GsB|^=EF) zU0F?4apif{HA{^DQ(QIo6`K%v$}5FV_MG%$&%W8?*}Ht^(370 zp8LG__qq3dznS@%`OJ9s3xutAKirX)o144Enqf5_q{`ZU*?!m``6u@AL1)@ zDL1qWVIc_9`nw~w$-*FF@nPZiSq6IN$?Lvt=S}u+)%l7Ts>^+OxIQiaSi^{(`6Kx)&yXVSTzJ9J>p31%4;(fpFJ$o`ye~RCiyc)_PwV+~Uc4pRMv&^hq zJ6deI|J+o$eOlVaka=fxe}12o-0#*LD2}{)dSM!~xw?Tl@a@Um_zkz`8+gpWLHFTs zcRq9H#%K7|`K%{4r_1KwqIu8HH?X+(8M+S>d4|G$@7C9rSH#OC)@p|<{AW+2=icY{ zTi%&_pXB@AnR$1b?=jDYXR?x(N-KmGUaD5&qqM1qinEe=ON&3KI{)|1omP^8w2Eo% zrS%}KAX@8Z_na=~rG}1>6r=w&ZQse~jTdifsn70!pZ3(V-N6;t?%eSumn2&J_r`Bu z3V!Z!_;QM9T8dV5GF%%T=(QKpZV@g1V@`~7c|(7FPrvYUgCXoDeX<@g7|hSnN;4S@ z35Jy$_qn^;y0>EY3GIBHkl&GIN@Rt*L75>-R;qT#pi{%*nXITCd0<0`w zM}Up}A45Pb%RU6OvEG9KD%7uh7XcFg4i?gcHRTEx2C;ks3nSS63>GGk^e88>kQi&q zRRl`mYY6P+{S5^6vAl`EF_yOwIKhEGMj$2brw#(AS$`Hm3h##zBu8@xRA*3AVMNdw zcK8{BUSx+c1W}@X>R{19aaf2&(;h*K5Nr@&MzFtta0J^0EJ1K7N4?V5X>kZpSPK@C8CmqA($p2c%*13ToKhn2q&hb=|nhnPhqPN-XtIy;ay^iM>tU?Q#!)+M1O&ZATb?6 zgg$``M9>7trw|cV0Y!+oDxesPO9gDiVovB$u?~xg8hLNRV!hR^Sj?@eD8~}LR|l5p zBRh>H$Hg>+B?AI#ute|vZ?R-dH0QBoLK3zi(na7{%J!a?j`p36jYa$Rxep-npjf+L zi5v8Anb%;kOXM4{=;5j>Wr9ittTb(0idZRcT#i_(N{OZrJ1Rc$h@&W~nus{!K_CTj`QmdOaZ{qn zzzW?b8!N=eW6Z@0-RU+~To$LbSV{Aw_;pxGCITf`S;~ow2CTd;nsUVJi8do%FII_o z$z$|KJmn$hKqR=t*@;zc0vfQYOF$D=9TXo=BoeDcwF`+y1+*jagn$kt4vAAdl6pk5 z4@r{(_9N+vfL-PtbS6!Nvu9DU;wKJ#is^Vy^rT%)d~F#tU94HugME)y}=k{iI=PqPZBm7OBO+08G zFC)hy88;&*Uo@l0p%yjO%Lg`tfDqV-2RZ*UY_*~Zf=!Oh%VUAI!Fa7eAq|$M*M+rK0o_=umwyCnsVWsq z!`dk^9fX~t$k_wC-s0o1yTqpe_8Bo9Mv?CG1d4Q@@1aQdDMOKmCQR|iv93zMUtt~D zNb@Y#wMn9CtT%~f5bO0se~tBeq8G4UPvpjW%0tXrP<&9Fe~RK;0xqI>T0kpG3<5?_ za!$Z&C>fS7c(0$MWK7}@V8aQqjbp=Q0dHW#lz?Ai!*%ib4mOU6W)h`l0dJ$!BH&jj zO%R`cl)}zm2WQQtT~k%@@;eu=R|9DQwlp@M~-x7tKegv`Xp}R8|PEqLMPx zY5q4VscEW}jmjql4M=7VxL9q>tm|2cW!fuKLfTM$^r0$lMIj8G)mCbv)btTomEvaMEQ`1q+ z-73j&__Iuc!_0Ci92S!Lt4n)lPvf3lvl$(6cWF8JFzIc`kY-1z1p9C14q9sTE52E^2!O{1<9(izxwhnGBTwL>&)ERZ~$% zw}gHLscERA4oQ`Xy5jw6A zly3{1Tub>SoE0Rka>v{~?#}etV{lgShlKJ|IGbd|acQYJS#Y*-(7SNbcr@i-;5@|g z5}b!gs_H{<4zS|4aGqiLuW-sGeFaV?t^5ei@vmmP#L8(nnZI%k&Z{hM!1*yrRrMS} zy&Mb_)cdpPcc?eBdL;_ffj>4H zs1kihTtx%To4_?RNJ-S9f%4KX_Ifm&5J1j6qt!C`?!EhZW(VKE6H`%%h6(M5uf!x^ z$8l05i`$-^4>q>!@4}7&&Q7n>J7}!b>jWATv`=1H8HGk0In#sDC}W}b-bR;r+(hGL zEq{bPWXR=cq#;v|AvBp7cn71YSNqG6m?$(I<{S^B>8Ny3U2C7 zQ=W!9Sv>v#x6ISq1@{Q?uy{)8sVuX@J;8pjz&*)+^u)NOsQ07T*&>=S?9_Ajp_vaU zQQB-VNbXvOA+H12~ zUmR1t|LB3yi1J$~pP}8%?50Ac18V7$q^HpGqy*0XLx`e$d_Zp|6@I9&(8e^kiQym_ zxA$4J3`z7kwEEv$)+Y?ch1g`oriC8L5I(mHrwpys9Q87S*0`^ijRCz9Y_eceDh0*P zZ8AA1Q-a3PnlIoD?3x}NJa$a=$;R&Ebinezr=!-g*T;{YKJwm;oAsam*>3IH=QPLn zUTuA;^|cU~eR_^sub=tMS{qyR{daHA?5w){siHkOx@nnD*r4juGpMTP2ahR 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *) @@ -418,7 +437,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore (i-1) j ; + explore (i-1) j (depth+1); end; if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *) @@ -431,7 +450,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore (i-1) (j+1) ; + explore (i-1) (j+1) (depth+1); end; if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *) @@ -444,7 +463,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore i (j+1) ; + explore i (j+1) (depth+1); end; if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *) @@ -457,7 +476,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore (i+1) (j+1) ; + explore (i+1) (j+1) (depth+1); end; if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *) @@ -470,7 +489,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore (i+1) j ; + explore (i+1) j (depth+1); end; if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *) @@ -483,7 +502,7 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore (i+1) (j-1) ; + explore (i+1) (j-1) (depth+1); end; if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *) @@ -496,19 +515,221 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; - explore i (j-1) ; + explore i (j-1) (depth+1); end; end in - explore (gr.width/2) (gr.height/2); - -(* ------------------------------------------------------------*) -(* ------------------------------------------------------------*) -(* ------------------------------------------------------------*) + explore (gr.width/2) (gr.height/2) 0; ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; + +(* ------------------------------------------------------------*) +(* ------------------------------------------------------------*) +(* ------------------------------------------------------------*) + +let another_type_of_bfs (gr : type2graph) r d = + 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; + + set_line_width 4; + set_color (rgb 192 192 192) ; + for i = 0 to gr.width -1 do + for j = 0 to gr.height -1 do + let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*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 + d)*(i-1)), (r + (2*r + d)*(j-1))|] ; + end; + + if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) + draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*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 + d)*(i-1)), (r + (2*r + d)*(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 + d)*i), (r + (2*r + d)*(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 + d)*(i+1)), (r + (2*r + d)*(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 + d)*(i+1)), (r + (2*r + d)*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 + d)*(i+1)), (r + (2*r + d)*(j-1))|] ; + end; + + if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) + draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ; + end; + + done + done; + + 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 + d)*i), (r + (2*r + d)*j)) in + if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; + end; + + if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; + end; + + if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; + end; + + if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; + 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; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; + end; + + if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; + end; + + if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; + end; + + if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) + draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; + 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 192 192 192) ; + fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; + set_color (rgb 100 100 100) ; + draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; + draw_integer (r + (2*r + d)*i) (r + (2*r + d)*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 + d)*i) (r + (2*r + d)*j) r ; + set_color black; + draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; + set_color colors.(i).(j); + draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r ; + in + + (* Actual BFS *) + + let pq = Queue.create () in + + Queue.add (0, gr.width/2, gr.height/2, gr.width/2, gr.height/2, [||], [||]) pq ; + + let visited = Array.make_matrix gr.width gr.height false in + + try + while true do + let (depth, i0, j0, i, j, path_arr, bigpath_arr) = Queue.take pq in + + if visited.(i).(j) = false then begin + set_line_width 4; + set_color black; + draw_poly_line path_arr ; + set_color colors.(i).(j); + set_line_width 8; + draw_poly_line bigpath_arr ; + + draw_tile i j; + + set_color colors.(i0).(j0) ; + draw_tile i0 j0; + + visited.(i).(j) <- true; + + set_color white; + fill_circle (1200-r) (800-r) r; + set_color black; + draw_integer (1200-r) (800-r) depth r; + + Unix.sleepf 0.5; + + let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in + + if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && (visited.(i-1).(j-1) = false) then begin (* SO *) + Queue.add (depth+1, i, j, i-1, j-1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq; + end; + + if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *) + Queue.add (depth+1, i, j, i-1, j, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq; + end; + + if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *) + Queue.add (depth+1, i, j, i-1, j+1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq; + end; + + if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *) + Queue.add (depth+1, i, j, i, j+1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq; + end; + + if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *) + Queue.add (depth+1, i, j, i+1, j+1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq; + end; + + if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *) + Queue.add (depth+1, i, j, i+1, j, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq; + end; + + if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *) + Queue.add (depth+1, i, j, i+1, j-1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq; + end; + + if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *) + Queue.add (depth+1, i, j, i, j-1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq; + end + end; + done; + () + with + | Stdlib.Queue.Empty -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; + +(* ------------------------------------------------------------*) +(* ------------------------------------------------------------*) +(* ------------------------------------------------------------*) + (* ----------------------- Tests --------------------------- *) open_graph " 1200x800" ;; @@ -517,7 +738,8 @@ set_window_title "Graphs" ;; let type2 = generate_type2_graph 8 6 40 1 1 ;; (*another_type_of_graph_printing type2 35 75 ;;*) -another_type_of_dfs type2 35 75 ;; +(*another_type_of_dfs type2 35 75 ;;*) +another_type_of_bfs type2 35 75 ;; close_graph () ;;