package Ġcom . r 3 . demos . ub in 2 a . plan . graph Ċ Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠSimple Cycle Detection Tests Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġcycles Ġin Ġcomponent Ġwith Ġtwo Ġnodes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcycles Ġ= Ġdetect Simple Cycles ( strong ly Connected Component Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcycles . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġcycles Ġin Ġcomponent Ġwith Ġthree Ġnodes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcycles Ġ= Ġdetect Simple Cycles ( strong ly Connected Component Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 3 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcycles . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġcycles Ġin Ġcomponent Ġwith Ġfive Ġnodes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcycles Ġ= Ġdetect Simple Cycles ( strong ly Connected Component Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 1 , Ġ 2 ), ĠEdge ( 1 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 2 , Ġ 3 ), ĠEdge ( 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 3 , Ġ 4 ), ĠEdge ( 3 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 4 , Ġ 5 ), ĠEdge ( 4 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 5 , Ġ 1 ), ĠEdge ( 5 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 5 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 3 , Ġ 5 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 3 , Ġ 4 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 2 , Ġ 3 , Ġ 5 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 , Ġcycles . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġcycles Ġin Ġcomponent Ġwith Ġsix Ġnodes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcycles Ġ= Ġdetect Simple Cycles ( strong ly Connected Component Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 1 , Ġ 2 ), ĠEdge ( 1 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 3 , Ġ 1 ), ĠEdge ( 3 , Ġ 2 ), ĠEdge ( 3 , Ġ 4 ), ĠEdge ( 3 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 4 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 5 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( 6 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 1 , Ġ 5 , Ġ 2 , Ġ 3 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 2 , Ġ 3 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġassert Has Simple Cycle ( cycles , Ġ 2 , Ġ 3 , Ġ 6 , Ġ 4 , Ġ 5 , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġcycles . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstrongly Connected Component Of ( var arg Ġedges : ĠEdge < Int >): ĠStr ong ly Connected Component < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdetect Strong ly Connected Components ( Direct ed Graph ( edges . asList ())). single () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Has Simple Cycle ( cycles : ĠSet < Cycle < Int >>, Ġvar arg Ġnodes : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cycles . count Ġ{ Ġare Ident ical Cycles ( it , Ġnodes . asList ()) Ġ} Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Cycle Ġ= Ġnodes . join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Simple Ġcycle Ġ{$ expected Cycle } Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġare Ident ical Cycles ( a : ĠCycle < T >, Ġb : ĠCycle < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( a . size Ġ!= Ġb . size Ġ|| Ġa . toSet () Ġ!= Ġb . toSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġa . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġb . indexOf ( a . first ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Ġ= Ġ( i Ġ+ Ġdelta ) Ġ% Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a [ i ] Ġ!= Ġb [ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ