package Ġorg . ice 1 0 0 0 Ċ Ċ open Ġclass ĠFront Star ( val Ġuser Count : ĠInt ) Ġ{ Ċ ĉ private Ġval Ġname Id Map Ġ= Ġmutable Map Of < UserID , ĠInt >() Ċ ĉ private Ġval Ġid NodeList Ġ= Ġmutable ListOf < Node >() Ċ ĉ private Ġval Ġnext Ġ= Ġmutable ListOf < Int >() Ċ ĉ private Ġval Ġhead Ġ= ĠInt Array ( user Count ) Ġ{ Ġ- 1 Ġ} Ċ ĉ private Ġval Ġtarget Ġ= Ġmutable ListOf < Int >() Ċ ĉ private Ġval Ġdepart Ġ= Ġmutable ListOf < Int >() Ċ ĉ private Ġvar Ġlimit Ġ= Ġ 0 Ċ ĉ val Ġavg Limit : ĠInt Ġget () Ġ= Ġlimit Ġ/ Ġid NodeList . size Ċ ĉ var Ġedge Count Ġ= Ġ 0 Ċĉ ĉ private Ġset Ċ ĉ private Ġval Ġknown User Count : ĠInt Ġget () Ġ= Ġid NodeList . size Ġ+ Ġ 1 ĊĊ ĉ fun Ġadd Node ( userID : ĠUser ID , Ġnode : ĠNode ) Ġ{ Ċĉ ĉ limit Ġ+= Ġnode . weight Ċĉ ĉ // Ġif Ġ( node . weight Ġ> Ġ 1 0 0 ) Ġnode . mark Ġ= Ġtrue Ċĉ ĉ name Id Map [ userID ] Ġ= Ġid NodeList . size Ċĉ ĉ id NodeList Ġ+= Ġnode Ċ ĉ } ĊĊ ĉ fun Ġsolve () Ġ= Ġsolve ( id NodeList . indices . filter Ġ{ Ġid NodeList [ it ]. mark Ġ}) Ċ ĉ infix Ġfun Ġnode Mark ( userID : ĠUser ID ): ĠBoolean Ġ= Ġid NodeList [ name Id Map [ userID ] !! ]. mark Ċ ĉ fun Ġadd Relation ( from : ĠUser ID , Ġto : ĠUser ID ) Ġ= Ġadd Edge ( name Id Map [ from ] !! , Ġname Id Map [ to ] !! ) Ċ ĉ infix Ġfun Ġnode Weight ( userID : ĠUser ID ): ĠInt Ġ= Ġid NodeList [ name Id Map [ userID ] !! ]. weight Ċ ĉ fun Ġadd Node ( userID : ĠUser ID , Ġweight : ĠInt , Ġmark : ĠBoolean ) Ġ= Ġadd Node ( userID , ĠNode ( weight , Ġmark )) Ċ ĉ fun Ġadd Relation ( relation : ĠPair < UserID , ĠUser ID >) Ġ= Ġadd Relation ( relation . first , Ġrelation . second ) ĊĊ ĉ private Ġfun Ġadd Edge ( from : ĠInt , Ġto : ĠInt ) Ġ{ Ċĉ ĉ // Ġtarget [ edge Count ] Ġ= Ġto Ċĉ ĉ // Ġdepart [ edge Count ] Ġ= Ġfrom Ċĉ ĉ // Ġnext [ edge Count ] Ġ= Ġhead [ from ] Ċĉ ĉ target Ġ+= Ġto Ċĉ ĉ depart Ġ+= Ġfrom Ċĉ ĉ next Ġ+= Ġhead [ from ] Ċĉ ĉ head [ from ] Ġ= Ġedge Count ++ Ċ ĉ } ĊĊ ĉ private Ġfun Ġsolve ( marked : ĠList < Int >) Ġ{ Ċĉ ĉ val Ġgenerated List Ġ= Ġmutable ListOf < Int >() Ċĉ ĉ for Ġ( mt f Index Ġin Ġmarked ) Ġ{ Ċĉĉ ĉ var Ġj Ġ= Ġhead [ mt f Index ] Ċĉĉ ĉ while Ġ( j Ġ!= Ġ- 1 ) Ġ{ Ċĉĉĉ ĉ listOf ( id NodeList [ target [ j ]], Ġid NodeList [ depart [ j ]] ). forEach Ġ{ Ċĉĉĉĉ ĉ it . weight Ġ+= Ġavg Limit Ġ/ Ġknown User Count Ċĉĉĉĉ ĉ if Ġ(! it . mark Ġ&& Ġit . weight Ġ> Ġavg Limit ) Ġ{ Ċĉĉĉĉĉ ĉ it . mark Ġ= Ġtrue Ċĉĉĉĉĉ ĉ generated List Ġ+= Ġtarget [ j ] Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ j Ġ= Ġnext [ j ] Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ }