package Ġad . k ata . a oc 2 0 2 1 . day 1 2 Ċ Ċ import Ġad . k ata . a oc 2 0 2 1 . extensions . toMap Mer ging Ċ Ċ data Ġclass ĠGraph < T >( private Ġval Ġedges : ĠMap < T , ĠSet < T >>) Ġ{ ĊĊĠĠĠ Ġfun Ġdistinct Paths ( from : ĠT , Ġto : ĠT , Ġcan Re visit : Ġ( T , ĠPath < T >) Ġ-> ĠBoolean Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġfalse Ġ}) Ġ= ĊĠĠĠĠĠĠĠ Ġfind Paths ( from , Ġto , Ġcan Re visit Ġ= Ġ{ Ġn , Ġp Ġ-> Ġcan Re visit ( n , Ġp ) Ġ&& Ġn Ġ!= Ġfrom Ġ}) ĊĊĠĠĠ Ġprivate Ġfun Ġfind Paths ( ĊĠĠĠĠĠĠĠ Ġfrom : ĠT , ĊĠĠĠĠĠĠĠ Ġto : ĠT , ĊĠĠĠĠĠĠĠ Ġpath : ĠPath < T > Ġ= ĠlistOf ( from ), ĊĠĠĠĠĠĠĠ Ġcan Re visit : Ġ( T , ĠPath < T >) Ġ-> ĠBoolean ĊĠĠĠ Ġ): ĠPaths < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( from Ġ== Ġto ) Ġreturn Ġset Of ( path ) ĊĊĠĠĠĠĠĠĠ Ġval Ġneighbors Ġ= Ġadjacent Nodes Of ( from ) Ġ- Ġpath . filter Not Ġ{ Ġcan Re visit ( it , Ġpath ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġreturn Ġneighbors . flatMap Ġ{ Ġn Ġ-> Ġfind Paths ( n , Ġto , Ġpath Ġ+ Ġn , Ġcan Re visit ) Ġ}. to HashSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjacent Nodes Of ( node : ĠT ) Ġ= Ġedges [ node ] Ġ?: Ġempty Set () Ċ } Ċ Ċ type alias ĠEdge < T > Ġ= ĠPair < T , ĠT > Ċ type alias ĠPath < T > Ġ= ĠList < T > Ċ type alias ĠPaths < T > Ġ= ĠSet < Path < T >> Ċ Ċ fun Ġ< T > Ġun id irectional Graph Of ( edges : ĠList < Edge < T >>) Ġ= ĊĠĠĠ ĠGraph (( edges Ġ+ Ġedges . reversed Edges ()). toMap Mer ging Ġ{ Ġit . to HashSet () Ġ}) Ċ Ċ private Ġfun Ġ< T > ĠList < Edge < T >> . reversed Edges () Ġ= Ġmap Ġ{ Ġ( a , Ġb ) Ġ-> Ġb Ġto Ġa Ġ} Ċ Ċ inline Ġfun Ġ< T > Ġun id irectional Graph Of ( ĊĠĠĠ Ġedges : ĠList < String >, ĊĠĠĠ Ġdelimiter : ĠChar Ġ= Ġ'-', ĊĠĠĠ Ġtransform : Ġ( String ) Ġ-> ĠT Ċ ) Ġ= ĊĠĠĠ Ġun id irectional Graph Of ( ĊĠĠĠĠĠĠĠ Ġedges . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . split ( delimiter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( transform ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. window ed ( 2 ) Ġ{ Ġ( a , Ġb ) Ġ-> Ġa Ġto Ġb Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ