/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 4 ĠThe ĠGu ava ĠAuthors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . common . graph Ċ Ċ import Ġcom . google . common . annotations . Beta Ċ Ċ /** Ċ Ġ* ĠA Ġfunctional Ġinterface Ġfor Ġ[ graph ]( https :// en . wikipedia . org / wiki / Graph _( discrete _ mat hematic s )) - structured Ġdata . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġinterface Ġis Ġmeant Ġto Ġbe Ġused Ġas Ġthe Ġtype Ġof Ġa Ġparameter Ġto Ġgraph Ġalgorithms Ġ( such Ġas Ċ Ġ* Ġtopo logical Ġsort ) Ġthat Ġonly Ġneed Ġa Ġway Ġof Ġaccessing Ġthe Ġpre decess ors Ġof Ġa Ġnode Ġin Ġa Ġgraph . Ċ Ġ* Ċ Ġ* Ġ< h 3 > Usage </ h 3 > Ċ Ġ* Ċ Ġ* ĠGiven Ġan Ġalgorithm , Ġfor Ġexample : Ċ Ġ* Ċ Ġ* Ġ< pre >` public Ġ< N > Ġsome Graph Algorithm ( N Ġstart Node , ĠPre decess ors Function < N > Ġpre decess ors Function ); Ċ ` </ pre > Ġ* Ċ Ġ* Ċ Ġ* Ġyou Ġwill Ġinvoke Ġit Ġdepending Ġon Ġthe Ġgraph Ġrepresentation Ġyou 're Ġusing . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġhave Ġan Ġinstance Ġof Ġone Ġof Ġthe Ġprimary Ġ` common . graph ` Ġtypes Ġ([ Graph ], Ċ Ġ* Ġ[ Value Graph ], Ġand Ġ[ Network ]): Ċ Ġ* Ċ Ġ* Ġ< pre >` some Graph Algorithm ( start Node , Ġgraph ); Ċ ` </ pre > Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġworks Ġbecause Ġthose Ġtypes Ġeach Ġimplement Ġ` Pre decess ors Function `. ĠIt Ġwill Ġalso Ġwork Ċ Ġ* Ġwith Ġany Ġother Ġimplementation Ġof Ġthis Ġinterface . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġhave Ġyour Ġown Ġgraph Ġimplementation Ġbased Ġaround Ġa Ġcustom Ġnode Ġtype Ġ` My Node `, Ċ Ġ* Ġwhich Ġhas Ġa Ġmethod Ġ` getParent s ()` Ġthat Ġretrieves Ġits Ġpre decess ors Ġin Ġa Ġgraph : Ċ Ġ* Ċ Ġ* Ġ< pre >` some Graph Algorithm ( start Node , ĠMy Node :: getParent s ); Ċ ` </ pre > Ġ* Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġhave Ġsome Ġother Ġmechanism Ġfor Ġreturning Ġthe Ġpre decess ors Ġof Ġa Ġnode , Ġor Ġone Ġthat Ġdoesn 't Ċ Ġ* Ġreturn Ġa Ġ` Iterable <? Ġextends ĠN >`, Ġthen Ġyou Ġcan Ġuse Ġa Ġlambda Ġto Ġperform Ġa Ġmore Ġgeneral Ċ Ġ* Ġtransformation : Ċ Ġ* Ċ Ġ* Ġ< pre >` some Graph Algorithm ( start Node , Ġnode Ġ-> ĠImmutableList . of ( node . mother (), Ġnode . father ())); Ċ ` </ pre > Ġ* Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠGraph Ġalgorithms Ġthat Ġneed Ġadditional Ġcapabilities Ġ( accessing Ġboth Ġpre decess ors Ġand Ċ Ġ* Ġsuccess ors , Ġiter ating Ġover Ġthe Ġedges , Ġetc .) Ġshould Ġdeclare Ġtheir Ġinput Ġto Ġbe Ġof Ġa Ġtype Ġthat Ċ Ġ* Ġprovides Ġthose Ġcapabilities , Ġsuch Ġas Ġ[ Graph ], Ġ[ Value Graph ], Ġor Ġ[ Network ]. Ċ Ġ* Ċ Ġ* Ġ< h 3 > Additional Ġdocumentation </ h 3 > Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠSee Ġthe ĠGu ava ĠUser ĠGuide Ġfor Ġthe Ġ` common . graph ` Ġpackage Ġ( [" Graphs ĠEx plain ed "]( https :// github . com / google / gu ava / wiki / Graphs Explain ed )) Ġfor Ċ Ġ* Ġadditional Ġdocumentation , Ġincluding Ġ[ notes Ġfor Ċ Ġ* Ġimplement ors ]( https :// github . com / google / gu ava / wiki / Graphs Explain ed # notes - for - implement ors ) Ċ Ġ* Ċ Ġ* Ġ@ author ĠJ osh ua ĠO ' Mad ad h ain Ċ Ġ* Ġ@ author ĠJ ens ĠN y man Ċ Ġ* Ġ@ param Ġ< N > ĠNode Ġparameter Ġtype Ċ Ġ* Ġ@ since Ġ 2 3 . 0 Ċ </ N > Ġ*/ Ċ @ Beta Ċ interface ĠPre decess ors Function < N > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġnodes Ġin Ġthis Ġgraph Ġadjacent Ġto Ġ` node ` Ġwhich Ġcan Ġbe Ġreached Ġby Ġtra ver sing ĊĠĠĠĠ Ġ* Ġ` node `' s Ġincoming Ġedges Ġ* again st * Ġthe Ġdirection Ġ( if Ġany ) Ġof Ġthe Ġedge . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSome Ġalgorithms Ġthat Ġoperate Ġon Ġa Ġ` Pre decess ors Function ` Ġmay Ġproduce Ġun desired Ġresults ĊĠĠĠĠ Ġ* Ġif Ġthe Ġreturned Ġ[ Iterable ] Ġcontains Ġduplicate Ġelements . ĠImplement ations Ġof Ġsuch ĊĠĠĠĠ Ġ* Ġalgorithms Ġshould Ġdocument Ġtheir Ġbehavior Ġin Ġthe Ġpresence Ġof Ġduplicates . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġelements Ġof Ġthe Ġreturned Ġ` Iterable ` Ġmust Ġeach Ġbe : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* ĠNon - null ĊĠĠĠĠ Ġ* Ġ Ġ* ĠUs able Ġas Ġ` Map ` Ġkeys Ġ( see Ġthe ĠGu ava ĠUser ĠGuide 's Ġsection Ġon Ġ[ Ċ Ġ* Ġgraph Ġelements ]( https :// github . com / google / gu ava / wiki / Graphs Explain ed # graph - elements - nodes - and - edges ) Ġfor Ġdetails ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` node ` Ġis Ġnot Ġan Ġelement Ġof Ġthis Ġgraph ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpre decess ors ( node : ĠN ): ĠIterable < N > Ċ } Ċ