Nevezetes algoritmusok: Fa megvalósítása Készítette: Várkonyi Tibor Zoltán
Feladat specifikációja A jól ismert adatstruktúra, amely lehet üres vagy halmaza egy vagy több pontnak, amelyek élekkel kapcsolódnak egymáshoz, kielégítve az alábbi feltételeket. Pontosan egy - gyökérnek nevezett - pont van, amelybe nem érkezik él. A gyökeret kivéve, minden csúcsba pontosan egy él mutat. A gyökérből minden csúcsba pontosan egy irányított élsorozaton át lehet eljutni.
Elképzelés Inputfile: kettesével tárol pontokat A csúcsok nem feltétlenül 1-es indexnél kezdődnek, és maradhatnak ki csúcs indexek. Megvalósítás: Asszociatív tároló
Az asszociatív tároló Ha nem találkoztunk még a megadott indexszel, akkor hozzávesszük (kiél és beélnél is) a tárolóhoz Ha már szerepelt a csúcs él végpontjában, akkor már nem lehet fa A tárolóban feljegyezzük az éllistát a későbbi bejáráshoz
Az asszociatív tároló (folyt.) Számoljuk meg, hogy hány csúcsba nem vezet él. Ha a gráf beolvasásának végén nem nem egyetlen ilyen gyökér van, akkor nem fa. Közben számoljuk az éleket is. Egy N pontú fának pontosan N-1 éle kell legyen. Ha ez nem teljesül, akkor nem fa. A körmentességet még be kell látnunk (mélységi bejárással például)
Megvalósítás Szükségünk lesz egy mapra, amely kulcsként használja a csúcs indexét Kell még egy osztály, amiben tároljuk a csúcsokra vonatkozó információkat (a map értéke) Globális változók a megfelelő csúcsok (gyökér) és élek számozására
Megvalósítás (folyt.) Még lehet kör a gráfban, így alkalmazzunk egy mélységi bejárást! Az színezzük azokat a csúcsokat, amelyeken már jártunk. Ha már színezet csúcshoz értünk, akkor volt benne irányított kör. Ha nem jutottunk el minden csúcsba, akkor nem összefüggő. A maradék esetekben fát kapunk.
Osztály Csúcs Befok Éllista (ki-élek)
Megjegyzések C++ implementáció esetén érdemes az STL map sablon típusát használni.