@ file : Suppress (" Member Visibility Can Be Private ", Ġ" Un necessary Variable ", Ġ" Replace Java Static Method With Kotlin Analog ", ĊĠĠĠ Ġ" unused ", Ġ" UNUSED _ VARIABLE ", Ġ" Replace Manual Range With Indices Calls " Ċ ) Ċ Ċ package Ġalgorithms Ċ Ċ import Ġorg . jetbrains . kotlin x . mult ik . api . d 2 array Ċ import Ġorg . jetbrains . kotlin x . mult ik . api . mk Ċ import Ġorg . jetbrains . kotlin x . mult ik . ndarray . data . D 2 Array Ċ import Ġorg . jetbrains . kotlin x . mult ik . ndarray . data . set ĊĊ Ċ /** Ċ Ġ* Ċ Ċ Dist ances ĠBet ween ĠLe aves ĠProblem : ĠCompute Ġthe Ġdistances Ġbetween Ġleaves Ġin Ġa Ġweighted Ġtree . Ċ Ċ Input : Ġ ĠAn Ġinteger Ġn Ġfollowed Ġby Ġthe Ġad jacency Ġlist Ġof Ġa Ġweighted Ġtree Ġwith Ġn Ġleaves . Ċ Ċ Output : ĠAn Ġn Ġx Ġn Ġmatrix Ġ( di , j ), Ġwhere Ġdi , j Ġis Ġthe Ġlength Ġof Ġthe Ġpath Ġbetween Ġleaves Ġi Ġand Ġj . ĊĊ Ġ* ĠSee Ġalso : Ċ Ġ* Ġstep ik : Ġhttps :// step ik . org / lesson / 2 4 0 3 3 5 / step / 1 2 ? unit = 2 1 2 6 8 1 Ċ Ġ* Ġro sal ind : Ġhttp :// ros al ind . info / problems / ba 7 a / Ċ Ġ*/ Ċ Ċ /** Ċ Ċ Code ĠChallenge : ĠSolve Ġthe ĠDist ances ĠBet ween ĠLe aves ĠProblem . Ċ The Ġtree Ġis Ġgiven Ġas Ġan Ġad jacency Ġlist Ġof Ġa Ġgraph Ġwhose Ġleaves Ċ are Ġintegers Ġbetween Ġ 0 Ġand Ġn Ġ- Ġ 1 ; Ġthe Ġnotation Ġa -> b : c Ċ means Ġthat Ġnode Ġa Ġis Ġconnected Ġto Ġnode Ġb Ġby Ġan Ġedge Ġof Ġweight Ġc . Ċ The Ġmatrix Ġyou Ġreturn Ġshould Ġbe Ġspace - separated . ĊĊ Ġ*/ Ċ Ċ class ĠDist ances Between Le aves Ġ{ ĊĊĠĠĠ Ġvar Ġtra versed : ĠMutable List < Int > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġmatrix Size Ġ- Ġthe Ġrow / column Ġsize Ġof Ġthe Ġdistance Ġmatrix ĊĠĠĠĠ Ġ* Ġ@ param Ġg Ġ- Ġthe Ġmapping Ġof Ġnodes Ġto Ġa Ġlist Ġof Ġconnected Ġnodes Ġwith Ġconnected Ġweights ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOT ES : Ġthe Ġleaf Count Ġcan Ġbe Ġless Ġthan Ġthe Ġnode Ġnumbers Ġ- Ġbut Ġthe Ġtraversal Ġis Ġlimited Ġto ĊĠĠĠĠ Ġ* Ġthe Ġ 0 .. ( leaf Count - 1 ) Ġnode Ġnumbers . Ġ ĠHence Ġthe Ġreturned Ġ 2 D Ġmatrix Ġhas Ġonly ĊĠĠĠĠ Ġ* Ġrepresent atives Ġfrom Ġnodes Ġ{ Ġ 0 .. ( leaf Count - 1 ) Ġ} ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdistances Between Le aves ( matrix Size : ĠInt , Ġg : ĠMap < Int , ĠMap < Int , ĠInt >> ): ĠD 2 Array < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthe Matrix Ġ= Ġmk . d 2 array ( matrix Size , Ġmatrix Size ) Ġ{ 0 } ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmatrix Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġmatrix Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra versed Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġrecursive Traversal ( matrix Size , Ġj , Ġi , Ġi , Ġ Ġg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Matrix [ i , Ġj ] Ġ= Ġweight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthe Matrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġrecursively Ġdesc end Ġinto Ġthe Ġ[ g ] Ġmatrix Ġsearching Ġfor Ġthe Ġ[ target Node ] ĊĠĠĠĠ Ġ* ĠĠ Ġaccum ulate Ġthe Ġtotal Ġdistance Ġacross Ġthe Ġrecursion s Ġuntil Ġthe Ġ[ target Node ] ĊĠĠĠĠ Ġ* ĠĠ Ġis Ġfound Ġin Ġthe Ġtrue . ĊĠĠĠĠ Ġ* ĠĠ Ġ@ return Ġ Ġthe Ġaccumulated Ġdistance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrecursive Traversal ( ĊĠĠĠĠĠĠĠ Ġmatrix Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġtarget Node : ĠInt , ĊĠĠĠĠĠĠĠ Ġfrom Node : ĠInt , ĊĠĠĠĠĠĠĠ ĠcurrentNode : ĠInt , ĊĠĠĠĠĠĠĠ Ġg : ĠMap < Int , ĠMap < Int , ĠInt >> ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Of Connections And Dist ances Ġ= Ġg [ currentNode ] ĊĠĠĠĠĠĠĠ Ġif Ġ( map Of Connections And Dist ances Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" recursive ĠTr avel Ġ- Ġthis Ġshouldn 't Ġhappen Ġ- Ġnull Ġon Ġa Ġkey ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġdistance Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġtra versed . add ( currentNode ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( p Ġin Ġmap Of Connections And Dist ances ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . key Ġ== Ġtarget Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ+= Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . key Ġ< Ġmatrix Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tra versed . contains ( p . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Weight Ġ= Ġrecursive Traversal ( matrix Size , Ġtarget Node , Ġfrom Node , Ġp . key , Ġg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Weight Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp . value Ġ+ Ġdistance Ġ+ Ġfound Weight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdistance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġmatrix Size Ġ- Ġthe Ġrow / column Ġsize Ġof Ġthe Ġdistance Ġmatrix ĊĠĠĠĠ Ġ* Ġ@ param Ġg Ġ- Ġthe Ġmapping Ġof Ġnodes Ġto Ġa Ġlist Ġof Ġconnected Ġnodes Ġwith Ġconnected Ġweights ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOT ES : Ġthe Ġleaf Count Ġcan Ġbe Ġless Ġthan Ġthe Ġnode Ġnumbers Ġ- Ġbut Ġthe Ġtraversal Ġis Ġlimited Ġto ĊĠĠĠĠ Ġ* Ġthe Ġ 0 .. ( leaf Count - 1 ) Ġnode Ġnumbers . Ġ ĠHence Ġthe Ġreturned Ġ 2 D Ġmatrix Ġhas Ġonly ĊĠĠĠĠ Ġ* Ġrepresent atives Ġfrom Ġnodes Ġ{ Ġ 0 .. ( leaf Count - 1 ) Ġ} ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdistances Between Le aves Float ( matrix Size : ĠInt , Ġg : ĠMap < Int , ĠMap < Int , ĠFloat >> ): ĠD 2 Array < Float > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthe Matrix Ġ= Ġmk . d 2 array ( matrix Size , Ġmatrix Size ) Ġ{ 0 f } ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmatrix Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġmatrix Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra versed Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġrecursive Traversal Float ( matrix Size , Ġj , Ġi , Ġi , Ġ Ġg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Matrix [ i , Ġj ] Ġ= Ġweight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthe Matrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġrecursively Ġdesc end Ġinto Ġthe Ġ[ g ] Ġmatrix Ġsearching Ġfor Ġthe Ġ[ target Node ] ĊĠĠĠĠ Ġ* ĠĠ Ġaccum ulate Ġthe Ġtotal Ġdistance Ġacross Ġthe Ġrecursion s Ġuntil Ġthe Ġ[ target Node ] ĊĠĠĠĠ Ġ* ĠĠ Ġis Ġfound Ġin Ġthe Ġtrue . ĊĠĠĠĠ Ġ* ĠĠ Ġ@ return Ġ Ġthe Ġaccumulated Ġdistance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrecursive Traversal Float ( ĊĠĠĠĠĠĠĠ Ġmatrix Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġtarget Node : ĠInt , ĊĠĠĠĠĠĠĠ Ġfrom Node : ĠInt , ĊĠĠĠĠĠĠĠ ĠcurrentNode : ĠInt , ĊĠĠĠĠĠĠĠ Ġg : ĠMap < Int , ĠMap < Int , ĠFloat >> ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Of Connections And Dist ances Ġ= Ġg [ currentNode ] ĊĠĠĠĠĠĠĠ Ġif Ġ( map Of Connections And Dist ances Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" recursive ĠTr avel Ġ- Ġthis Ġshouldn 't Ġhappen Ġ- Ġnull Ġon Ġa Ġkey ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġdistance Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġtra versed . add ( currentNode ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( p Ġin Ġmap Of Connections And Dist ances ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . key Ġ== Ġtarget Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ+= Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . key Ġ< Ġmatrix Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tra versed . contains ( p . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Weight Ġ= Ġrecursive Traversal Float ( matrix Size , Ġtarget Node , Ġfrom Node , Ġp . key , Ġg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Weight Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp . value Ġ+ Ġdistance Ġ+ Ġfound Weight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdistance ĊĠĠĠ Ġ} Ċ } Ċ