package Ġt sp čĊč Ċ import Ġkotlin . math . sqrt čĊčĊč Ċ /** čĊ Ġ* ĠHandles Ġall Ġdistance Ġcalculations čĊ Ġ*/ č Ċ object ĠDistance Ġ{ čĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠCalculates Ġtotal Ġdistance Ġof Ġjourney čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġtotal ( temp Solution Ar : ĠInt Array ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠDouble Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġtotal Distance Ġ= Ġ 0 . 0 čĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠnumberOf C ities Ġ- Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity 1 Ġ= Ġtemp Solution Ar [ i ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity 2 Ġ= Ġtemp Solution Ar [ i Ġ+ Ġ 1 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Between C ities Ġ= ĠDistance . between C ities ( city 1 , Ġcity 2 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Distance Ġ+= Ġdistance Between C ities čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġtotal Distance čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠCalculates Ġdistance Ġbetween Ġtwo Ġcities , Ġbased Ġon ĠHa vers ine Ġformula čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġbetween C ities ( city 1 : ĠInt , Ġcity 2 : ĠInt ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠDouble Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġearth Radius Ġ= Ġ 6 3 7 1 . 0 čĊĠĠĠĠĠĠĠ Ġval Ġlat 1 Ġ= ĠMath . to Radians ( x Coordinates Ar [ city 1 ]) čĊĠĠĠĠĠĠĠ Ġval Ġlon 1 Ġ= ĠMath . to Radians ( y Coordinates Ar [ city 1 ]) čĊĠĠĠĠĠĠĠ Ġval Ġlat 2 Ġ= ĠMath . to Radians ( x Coordinates Ar [ city 2 ]) čĊĠĠĠĠĠĠĠ Ġval Ġlon 2 Ġ= ĠMath . to Radians ( y Coordinates Ar [ city 2 ]) čĊĠĠĠĠĠĠĠ Ġval Ġlat Distance Ġ= Ġlat 2 Ġ- Ġlat 1 čĊĠĠĠĠĠĠĠ Ġval Ġlon Distance Ġ= Ġlon 2 Ġ- Ġlon 1 čĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Strict Math . pow ( Strict Math . sin ( lat Distance Ġ/ Ġ 2 . 0 ), Ġ 2 . 0 ) Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Strict Math . cos ( lat 1 ) Ġ* čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStrict Math . cos ( lat 2 ) Ġ* čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStrict Math . pow ( Strict Math . sin ( lon Distance Ġ/ Ġ 2 . 0 ), Ġ 2 . 0 ))) čĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= ĠStrict Math . asin ( sqrt ( x )) Ġ* Ġ 2 . 0 čĊĠĠĠĠĠĠĠ Ġreturn Ġy Ġ* Ġearth Radius čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠChecks Ġthat Ġcities Ġand Ġtheir Ġne ighbours ' Ġdistances Ġare Ġover Ġthe Ġminimum Ġdistance čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġcheck Over Min ( temp Ar : ĠInt Array , Ġcity ToCheck : ĠInt ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġ// ĠHandles Ġedge Ġcases Ġof Ġ 0 Ġand Ġ 1 0 0 0 čĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( city ToCheck ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġmin Distance Between C ities Ġ< ĠDistance . between C ities ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ar [ city ToCheck ], čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ar [ city ToCheck Ġ+ Ġ 1 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf C ities - 1 Ġ-> Ġmin Distance Between C ities Ġ< ĠDistance . between C ities ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ar [ city ToCheck ], čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ar [ city ToCheck Ġ- Ġ 1 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( min Distance Between C ities Ġ< ĠDistance . between C ities ( temp Ar [ city ToCheck ], Ġtemp Ar [ city ToCheck Ġ- Ġ 1 ]) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Distance Between C ities Ġ< ĠDistance . between C ities ( temp Ar [ city ToCheck ], Ġtemp Ar [ city ToCheck Ġ+ Ġ 1 ]) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }