Nevezetes algoritmusok Fa megvalstsa Ksztette Vrkonyi Tibor Zoltn
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 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.
- Slides: 9