Gráfok. Programozás II. előadás. Szénási Sándor.

Hasonló dokumentumok
Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Gráfok 1. Tárolási módok, bejárások. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

5/1. tétel: Optimalis feszítőfák, Prim és Kruskal algorithmusa. Legrövidebb utak graphokban, negatív súlyú élek, Dijkstra és Bellman Ford algorithmus.

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

Gráfalgoritmusok ismétlés ősz

Algoritmusok bonyolultsága

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

Adatszerkezetek II. 2. előadás

22. GRÁFOK ÁBRÁZOLÁSA

Gráfok bejárása. Szlávi Péter, Zsakó László: Gráfok II :17

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

A számítástudomány alapjai

Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

Algoritmuselmélet. Mélységi keresés és alkalmazásai. Katona Gyula Y.

Diszkrét matematika 2.C szakirány

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Adatszerkezetek 2. Dr. Iványi Péter

Euler tétel következménye 1:ha G összefüggő síkgráf és legalább 3 pontja van, akkor: e 3

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

Diszkrét matematika 2.C szakirány

III. Gráfok. 1. Irányítatlan gráfok:

Gráf-algoritmusok Legrövidebb utak

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

1: Bevezetés: Internet, rétegmodell Alapok: aszimptótika, gráfok. HálózatokII, 2007

Programozás II. előadás

Adatszerkezetek II. 1. előadás

A gráffogalom fejlődése

Számítógép hálózatok, osztott rendszerek 2009

Algoritmuselmélet 7. előadás

Diszkrét matematika 2. estis képzés

Diszkrét matematika 2. estis képzés

Diszkrét matematika 2.C szakirány

Gráfelméleti feladatok. c f

Diszkrét matematika 2. estis képzés

24. MINIMÁLIS KÖLTSÉGŰ UTAK I.

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

bármely másikra el lehessen jutni. A vállalat tudja, hogy tetszőlegesen adott

Optimalizációs stratégiák 1.

Gráfelméleti alapfogalmak

Gráfelmélet. I. Előadás jegyzet (2010.szeptember 9.) 1.A gráf fogalma

Fák Témakörök. Fa definíciója. Rekurzív típusok, fa adatszerkezet Bináris keresőfa, bejárások Bináris keresőfa, módosítás B-fa

Visszalépéses keresés

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Diszkrét matematika 2.C szakirány

Diszkrét matematika 2. estis képzés

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Diszkrét matematika 1. estis képzés

Adatszerkezetek II. 3. előadás

Struktúra nélküli adatszerkezetek

29. Visszalépéses keresés 1.

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Egyszerű programozási tételek

Haladó rendezések. PPT 2007/2008 tavasz.

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Algoritmuselmélet 11. előadás

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Algoritmusok és adatszerkezetek 2.

Bináris keresőfa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor

2. Visszalépéses keresés

Diszkrét matematika 2.

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Diszkrét matematika 2.C szakirány

EGYSZERŰ, NEM IRÁNYÍTOTT (IRÁNYÍTATLAN) GRÁF

Tuesday, March 6, 12. Hasító táblázatok

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

23. SZÉLESSÉGI BEJÁRÁS

Dijkstra algoritmusa

Gráfalgoritmusok és hatékony adatszerkezetek szemléltetése

Adatszerkezetek 7a. Dr. IványiPéter

Totális Unimodularitás és LP dualitás. Tapolcai János

Diszkrét matematika 2.

Amortizációs költségelemzés

Elemi adatszerkezetek

Web-programozó Web-programozó

Algoritmuselmélet 2. előadás

Algoritmuselmélet. Bonyolultságelmélet. Katona Gyula Y.

Optimalizációs stratégiák 2.

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

ELTE IK Esti képzés tavaszi félév. Tartalom

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

GRÁFELMÉLET. 7. előadás. Javító utak, javító utak keresése, Edmonds-algoritmus

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Láncolt listák Témakörök. Lista alapfogalmak

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda IRT- 4. kurzus. 3. Előadás: A mohó algoritmus

HAMILTON KÖR: minden csúcson PONTOSAN egyszer áthaladó kör. Forrás: (

Egyirányban láncolt lista

Sali Attila Budapest Műszaki és Gazdaságtudományi Egyetem. I. B. 137/b március 16.

38. A gráfalgoritmusok alkalmazása

SzA II. gyakorlat, szeptember 18.

Javító és majdnem javító utak

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Adatszerkezetek 1. Dr. Iványi Péter

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Átírás:

Gráfok előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar

Tárolási módok Szélességi bejárás Mélységi bejárás Legrövidebb utak keresése Minimális feszítőfa keresése Gráfok

3 Alapfogalmak Irányított gráf: csúcsok véges halmaza, illetve egy ezen értelmezett bináris reláció (élek halmaza) Formálisan: G = (V, E) G gráf V csúcsok halmaza, pl. { 1, 2, 3, 4, 5, 6, 7 } E élek halmaza, pl. { (1, 4), (2, 1), (2, 3), } V csúcsok száma E élek száma Súlyozott gráfok esetén az egyes élekhez egy kiegészítő súly értéket is rendelünk 1 5 2 4 7 3 6

4 Alapvető műveletek A gráfok eltárolására számos klasszikus módszer létezik. Az általunk tárgyalt algoritmusok megvalósítása szempontjából a fizikai eltárolási mód nem lényeges, csak annyit várunk el, hogy az alkalmas legyen az alábbi műveletek végrehajtására Gráfokon értelmezhető alapvető műveletek G.Csúcsok visszaadja a gráf csúcsait G.Élek visszaadja a gráf éleit Gráf csúcsain értelmezhető műveletek x.vezetél(y) megadja, hogy vezet-e él a paraméterként átadott y csúcsba? x.szomszédok visszaadja a csúcs szomszédjait (azokat a csúcsokat, amelyekbe vezet él a megadott csúcsból) Súlyozott gráf esetén értelmezhető x.súly(y) súlyozott gráfok esetén visszaadja az x-ből y-ba vezető él súlyát Gráf csúcsok tartalmazhatnak további adatokat is, pl. Tart a csúcshoz kapcsolt tartalom

5 Szomszédsági lista Alapelv: a szomszédsági listás tárolás esetén egy L tömböt használunk, melynek mérete megegyezik a csúcsok számával, az i. eleme egy láncolt lista, amely tárolja az i. csúcs szomszédjait (azokat a csúcsokat, amelyekbe vezet él az i. csúcsból) Műveletek megvalósítása (VezetÉl, stb.) 1 5 1 2 L 4 5 1 3 2 4 7 3 4 6 2 3 5 5 1 5 7 3 6 6 7 4 5 6

6 Szomszédsági lista kiegészítések Amennyiben egy csúcsból nem indulnak ki élek, akkor az üres láncolt listákhoz hasonlóan ez a mező közvetlenül értéket tartalmaz A listában szereplő csúcsok sorrendje tetszőleges, esetenként valamilyen (csúcsazonosító vagy gyakoriság) szerinti rendezést érdemes lehet használni A lista tartalma lehet a csúcs neve/azonosítója, de akár referencia magára a csúcsra Súlyozott gráfok esetében a listát célszerű kiegészíteni egy további mezővel, ami a megadott csúcsból a megadott csúcsba vezető él súlyát tárolja Irányítatlan gráfok esetében az éleket mindkét csúcs listájában szerepeltetni kell (vagy a VanÉl metódust módosítani) Irányított gráfok esetében az adatszerkezet helyfoglalása V *mutató_méret + E *(csúcs_azonosító_méret + mutató_méret)

7 Szomszédsági mátrix/csúcsmátrix Alapelv: a szomszédsági mátrix alapú tárolás esetén egy CS kétdimenziós tömböt használunk, amely sorainak és oszlopainak száma megegyezik a csúcsok számával az i. sor j. oszlopában lévő érték azt mutatja, hogy vezet-e él az i. csúcsból a j. csúcsba (pl. 1 igen, 0 nem) Műveletek megvalósítása (VezetÉl, stb.) CS 1 5 2 4 7 1 2 3 4 1 2 3 4 5 6 7 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 3 6 5 6 1 0 0 0 1 0 1 0 0 0 1 1 0 0 7 0 0 0 0 0 1 0

8 Szomszédsági mátrix kiegészítések Irányítatlan gráfok esetében CS[i,j] értéke minden esetben megegyezik CS[j,i] értékével. Emiatt a mátrix szimmetrikus a főátlójára. Súlyozott mátrixok esetében a módszer kiegészíthető azzal, hogy nem csak 1-et vagy 0-t tárolunk, hanem magát a súly értékét (amennyiben elképzelhetők 0 súlyú élek, akkor módosítanunk kell a nincs él jelzés értékét) Látható, hogy a mátrix mérete csak a csúcsok számától függ, ennek megfelelően a várható helyfoglalás max( V * V ) (irányítatlan gráf esetén elégséges a főátló, illetve az efeletti elemek tárolása, így a tárhely igény is csaknem a felére csökken)

Döntési szempontok Tárhely szempontjából Amennyiben az élek száma a csúcsok számához képest meglehetősen kevés (ritka gráfok) szomszédsági listás tárolás Amennyiben az élek száma a csúcsok számához képest meglehetősen sok (a konkrét érték függ a mutatók méretétől is) csúcsmátrixos tárolás Műveletek szempontjából Gyakran van szükség a Szomszédok műveletre szomszédsági listánál azonnal választ kapunk csúcsmátrixnál V darab lépésre van szükség szomszédsági listás tárolás Gyakran van szükség a VanÉl műveletre szomszédsági listánál egy láncolt lista keresést kell futtatni csúcsmátrixnál azonnali választ kapunk csúcsmátrixos tárolás A megfelelő tárolási mód tehát csak a feladat, illetve a pontos implementáció ismeretében határozható meg (megj.: nagyobb mátrixok esetében a csúcsmátrix a tárhely igénye miatt gyakran nem jelent valós opciót) szenasi.sandor@nik.uni-obuda.hu 9

Tárolási módok Szélességi bejárás Mélységi bejárás Legrövidebb utak keresése Minimális feszítőfa keresése Gráfok

11 Gráf bejárások Gráfok esetében a bejárás hasonlóan értelmezhető mind az eddig megismert adatszerkezetek esetén (a gráf minden csúcsának egyszeri feldolgozása) Az algoritmusok azonban bonyolultabbak az eddig megismerteknél, ugyanis gondolni kell az alábbiakra gráfokban előfordulhatnak körök/ciklusok, és ügyelni kell arra, hogy a bejárásunk ne kerüljön végtelen ciklusba az eddigi adatszerkezeteinkkel ellentétben a gráfok nem feltétlenül összefüggőek, ilyenkor tisztázni kell, hogy mi a pontos cél (egy komponens bejárása, vagy az összes csúcs elérése) Egy irányítatlan gráfot összefüggőnek nevezünk, ha bármely két csúcsa összeköthető úttal Irányított gráfokat akkor nevezzük erősen összefüggőnek, ha tetszőleges két csúcs esetén mindegyik elérhető a másikból A fentieknek megfelelően beszélhetünk összefüggő, illetve erősen összefüggő komponensekről

Szélességi bejárás Szélességi bejárás (szélességi keresés): egy adott kezdőpontból kiindulva feldolgozza a gráf összes innen elérhető csúcsát Minden lépésben a legkorábban eljárás SzélességiBejárás(start) elért, de még teljesen át nem S start F {start} vizsgált csúcs szomszédjai felé ciklus amíg (S ) haladunk tovább k S Használt adatszerkezetek Feldolgoz(k.tart) ciklus x k.szomszédok S egy sor, ami a már elért, ha x F akkor de még a feldolgozásra váró S x csúcsokat tárolja F F {x} F egy halmaz, ami a már elért elágazás vége csúcsokat tárolja Az algoritmus addig fut, amíg eljárás vége elfogynak a feldolgozható csúcsok Fontos kiemelni, hogy ez nem mindig fogja feldolgozni a gráf minden csúcsát szenasi.sandor@nik.uni-obuda.hu 12

13 Csúcsok állapota a bejárás során Már elért, de még fel nem dolgozott csúcsok Azok a csúcsok, amelyeket már elért az algoritmus, de még nem lettek feldolgozva (tehát nem vizsgáltuk meg a belőlök elérhető szomszédokat) Ezek azok a csúcsok, amelyek benne vannak az S sorban Már elért és feldolgozott csúcsok Azok a csúcsok tartoznak ide, amelyeket már elért az algoritmus, és az összes belőlük kivezető él is fel lett már dolgozva (vagy éppen a feldolgozásuk történik) Ezek azok a csúcsok, amelyek már benne vannak az F halmazban, de már nincsenek benne az S-ben Még el nem ért csúcsok Az algoritmus futása során még nem találkoztunk velük Nincsenek benne egyik adatszerkezetben sem

14 Legrövidebb utak hosszát megadó kiegészítés Egy d tömb/hasító táblázat segítségével minden csúcshoz hozzárendelünk egy szám értéket. Ez a kiinduló csúcstól való legrövidebb út hosszát mutatja (ez alatt itt a legkevesebb élből álló utat értjük) A kiinduló pont esetében ez a távolság értelemszerűen 0 Minden további újonnan felfedezett csúcs esetén annak távolsága egyel több, mint annak a csúcsnak a távolsága, ahonnan először értük el A bejárás során el nem ért csúcsok esetén a d nem kap értéket eljárás SzélességiBejárás(start) S start F {start} d[start] 0 ciklus amíg (S ) k S ciklus x k.szomszédok ha x F akkor S x F F {x} d[x] d[k] + 1 elágazás vége eljárás vége

Egy feszítőfát megadó kiegészítés Egy π tömb/hasító táblázat segítségével minden csúcshoz hozzárendelünk egy másik csúcsot (vagy értéket). Ez azt mutatja, hogy adott csúcsot melyik csúcsból értük el A kiinduló pont esetében a π [start] =, hiszen nincs megelőző csúcs Minden további új csúcs esetén annak első elérésekor elhelyezzük a π adott csúcshoz tartozó elemébe azt a csúcsot, ahonnan ide jutottunk A π értékek alapján megadható az adott csúcsokba a start-ból vezető legrövidebb út (ha van) A π értékei alapján felépíthető egy feszítőfa (szélességi fa) szenasi.sandor@nik.uni-obuda.hu eljárás SzélességiBejárás(start) S start F {start} π[start] ciklus amíg (S ) k S ciklus x k.szomszédok ha x F akkor S x F F {x} π[x] k elágazás vége eljárás vége 15

16 Szélességi keresés gyakorlati alkalmazása Komponensek keresése A szélességi keresés lefutása után az F halmaz tartalmazza a kiinduló (start) csúcsból elérhető összes csúcs halmazát Gyenge összefüggőség vizsgálata: az előbb megismert algoritmussal Erős összefüggőség vizsgálata: irányított gráf esetén a fordított gráfon (ennek csúcsai ugyanazok, élei viszont pont ellenkező irányúak) elvégezzük ugyanezt a bejárást, és ha ez is megtalál minden csúcsot, akkor a komponens erősen összefüggő Útkeresés Amennyiben a gráf egyes csúcsai a lehetséges útelágazásokat reprezentálják, az élek pedig az egyes csomópontok között meglévő utakat Akkor a szélességi keresés megadja az összes elérhető csomópontot Egy kiegészítő leállási feltétellel megadható, hogy egy megadott cél csúcs elérése után álljon le a program futása A feltétel lehet valamilyen F feltételnek megfelelő csúcs formájú is A π értékei alapján egyszerűen megadható, hogy a cél csúcsba melyik úton lehet a legrövidebben eljutni

Tárolási módok Szélességi bejárás Mélységi bejárás Legrövidebb utak keresése Minimális feszítőfa keresése Gráfok

18 Mélységi bejárás Mélységi bejárás (mélységi keresés): egy adott kezdőpontból kiindulva feldolgozza a gráf összes innen elérhető csúcsát A szélességi kereséssel ellentétben itt mindig az utoljára elért, új kivezető élekkel rendelkező csúcsokat derítjük fel. Ha nincs ilyen, akkor pedig visszalépünk egy már előzőleg vizsgáltra Használt adatszerkezetek F egy halmaz, ami a már elért csúcsokat tárolja A feldolgozás egy vermen eljárás MélységiBejárásRek(k, címsz. F) F F {k} Feldolgoz(k.tart) ciklus x k.szomszédok ha x F akkor MélységiBejárásRek(x, F) elágazás vége eljárás vége eljárás MélységiBejárás(start) F MélységiBejárásRek(start, F) eljárás vége alapul, ezt a rekurzió miatt közvetve használjuk Fontos kiemelni, hogy ez nem mindig fogja feldolgozni a gráf minden csúcsát

19 Megelőző elemet is tároló változat Gyakran szükség van arra, hogy az egyes csúcsokat melyik másik csúcsból értük el eljárás MélységiBejárásRek(k, címsz. F, címsz. π) Az itt látható kiegészítés ezt F F {k} az adatot gyűjti a π tárolóba Feldolgoz(k.tart) A kiinduló pont esetében a ciklus x k.szomszédok ha x F akkor π [start] =, hiszen nincs π[x] k megelőző csúcs MélységiBejárásRek(x, F) elágazás vége Ez alapján megadható egy út a kiinduló start csúcsból eljárás vége a gráf összes többi csúcsába eljárás MélységiBejárás(start) A szélességi bejáráshoz F hasonlóan a π-ben található π[start] adatok alapján egy MélységiBejárásRek(start, F, π) eljárás vége feszítőfát állíthatunk elő

20 Belépési és elhagyási időt is tároló változat A gyakorlatban hasznos lehet, ha folyamatában vizsgáljuk a mélységi keresés lépéseit. Ehhez célszerű lehet eltárolni az egyes csúcsokba való be- és kilépési időket Ennek megfelelően t idő (lépésszám) be belépési időket tárolja ki kilépési időket tárolja A t változó értéke kezdetben 0, utána pedig az egyes hívások során folyamatosan eljárás MélységiBejárás(start) növekszik F ; MélységiBejárásRek(start,F,0,be,ki) Az eljárás elején és végén eljárás vége látható a be és ki nevű szerkezetek tárolják az egyes csúcsok elérési és elhagyási idejét eljárás MélységiBejárásRek(k, címsz. F, címsz. t, címsz. be, címsz. ki) be[k] t++ F F {k} Feldolgoz(k.tart) ciklus x k.szomszédok ha x F akkor MélységiBejárásRek(x, F) elágazás vége ki[k] t++ eljárás vége

21 Topológiai rendezés Egy irányított gráf topológiai rendezése a csúcsoknak egy olyan sorba rendezése, amelyre igaz, hogy ha létezik (u,v) él a gráfban, akkor u megelőzi a sorban v-t Ha a gráf tartalmaz irányított kört, akkor nincs ilyen sorbarendezés Példa: öltözködéskor melyik ruhadarabot kell felvenni egy másik előtt: alsónadrág nadrág öv ing zokni Néhány lehetséges topológiai rendezés: alsónadrág, nadrág, ing, öv, zokni, cipő, nyakkendő, zakó ing, nyakkendő, zakó, zokni, alsónadrág, nadrág, cipő, öv cipő nyakkendő zakó

22 Topológiai rendezés előállítása Jól tudjuk használni a mélységi keresés azon változatát, amely tárolta az egyes csúcsok elérési és elhagyási idejét Egy topológiai rendezés előállítható úgy, hogy az egyes csúcsokat az elhagyás fordított sorrendjében soroljuk fel Technikailag ez egyszerűbben is megoldható, pl. minden elhagyáskor a csúcsot szúrjuk egy láncolt lista elejére Mivel a gráf nem biztos, hogy erősen összefüggő, így minden csúcsból el kell indítani a rekurzív bejárást eljárás MélységiBejárásRek(k, címsz. F, címsz. fej) F F {k} ciklus x k.szomszédok ha x F akkor MélységiBejárásRek(x, F) elágazás vége ListaElejéreBeszúrás(fej, k) eljárás vége függvény TopológiaiRendezés(G) F ListaInicializálás(fej) ciklus st G.Csúcsok ha st F akkor MélységiBejárásRek(st, F, fej) elágazás vége vissza fej függvény vége

23 Mélységi keresés gyakorlati alkalmazása Visszalépéses keresés A visszalépéses keresés tulajdonképpen a mélységi keresés alapelvét használja működése során A lehetséges megoldások által kifeszített fában lépeget előre amíg tud, amíg vagy talál meg megoldást, vagy ha egy helyen elakad, akkor visszalép és új irányba próbálkozik Fa bejárások A pre-, in-, post-order bejárások tulajdonképpen mind egy-egy mélységi keresést mutatnak be Útkeresések Hasonlóan a szélességi kereséshez, bár nagy/nem korlátos gráfok esetén problémásabb a használata Topológiai rendezés Gyártási folyamat optimalizálása Erősen összefüggő komponensek keresése Gráf bejárása minden pontból kilépési idők megjegyzése Gráf transzponált bejárása (előző kilépési idők szerinti fordított sorrendben)

Tárolási módok Szélességi bejárás Mélységi bejárás Legrövidebb utak keresése Minimális feszítőfa keresése Gráfok

25 Adott csúcsból induló legrövidebb utak A szélességi keresés megadta a súlyozatlan gráfokban a legrövidebb utakat (itt az út hossza alatt az azt alkotó élek számát értettük) Ennek megfelelően a gráf legyen súlyozott A gráf legyen összefüggő Súlyozott gráfok esetében az egyes élekhez súlyokat rendelünk, és azt az utat keressük, ahol az azt alkotó élek súlyainak az összege minimális Megfontolandó Negatív súlyú éleket is tartalmazó gráfok esete Negatív összsúlyú köröket is tartalmazó gráfok esete Gyakorlati alkalmazások 1 1 5 2 4 5 4 3 1 2 2 3 8 4 1 6 1 3 3 7 2

Fokozatos közelítés elve A fokozatos közelítés technikája során Folyamatosan tároljuk az egyes csúcsokhoz a kiindulópontból eddig talált legrövidebb út hosszát (d), ami egy felső becslés a végeredményre Minden csúcsnál eltároljuk azt, hogy ezen az úton melyik csúcsból értük el az adott csúcsot (π) A közelítés elve Kiinduló állapot A kezdőcsúcs esetében d[start] = 1 és π[start] = A többi csúcshoz még nem találtunk utat, ezért ezeknél a távolság értékeket végtelenre állítjuk, a megelőző csúcsokat pedig -ra Közelítés Ha találunk olyan (u, v) élt, amelyre igaz, hogy d[u] + u.súly(v) < d[v] Akkor ez azt jelenti, hogy a v csúcshoz találtunk egy eddig találtnál rövidebb utat, ennek megfelelően módosítjuk a d és π értékeket: d[v] d[u] + u.súly(v) (az új legrövidebbnek gondolt út hossza) π[v] u (ezen az úton a megelőző csúcs) Megfelelő sorrendben hajtva végre a közelítést bizonyítható, hogy meg fogjuk találni a legrövidebb utat minden csúcshoz szenasi.sandor@nik.uni-obuda.hu 26

Dijkstra algoritmusa függvény Dijkstra(G, start) ciklus x G.Csúcsok d[x] ; π[x] S x d[start] 0 ciklus amíg S u S.MinKivesz(d) ciklus x u.szomszédok ha d[u] + u.súly(x) < d[x] akkor d[x] d[u] + u.súly(x) π[x] u elágazás vége vissza (π, d) függvény vége Ahol S egy prioritásos sor. Az S.MinKivesz(d) művelet pedig azt az x S sorbeli elemet adja vissza, ahol a d[x] érték a legkisebb Előfeltétel: a gráf irányított és nem tartalmazhat negatív súlyú éleket! szenasi.sandor@nik.uni-obuda.hu 27

28 Az algoritmus eredménye Az algoritmus eredménye d[x] mutatja minden x csúcs esetén az oda vezető legrövidebb út hosszát (vagy végtelen, ha nincs ilyen) π[x] mutatja a fenti úton a megelőző csúcsot (kivéve a kiinduló és az el nem ért csúcsokat) Tényleges utak előállítása A cél csúcsból elindulva a π-ben található adatok alapján visszafelé lépkedve előállíthatjuk az egyes csúcsokba vezető utakat Addig megyünk, amíg a kezdőcsúcshoz nem érünk (ahol π értéke ) Pl. egy láncolt lista elejébe szúrva a fenti egyszerűen megoldható Legrövidebb utakat tartalmazó fa előállítása Az algoritmus a kezdőcsúcsból minden elérhető csúcsba előállítja a legrövidebb utat A π értékek alapján előállítható egy olyan fa, amely ezeket az utakat tartalmazza Hasonló a szélességi keresésnél is már megismert szélességi fához

További megoldható feladatok Egy csúcsból az összes többi csúcsba vezető legrövidebb utak megkeresése Nincsenek negatív élek: Dijkstra algoritmus Lehetnek negatív élek: Bellman-Ford algoritmus (nem tárgyaljuk) Egy csúcsba vezető legrövidebb utak problémája Az összes csúcsból a cél csúcsba vezető legrövidebb utakat keressük Élek irányításának megfordításával könnyen megoldható Két adott csúcs közötti legrövidebb út problémája A Dijkstra algoritmus a végén erre is választ ad Ennél sokkal jobb megoldásunk nincs Összes csúcspár közötti legrövidebb utak keresése A gráf minden u és v csúcsa között megkeressük a legrövidebb utat Lefuttathatjuk a Dijkstra algoritmust minden csúcsból kiindulva Léteznek erre specializált megoldások (pl. Floyd-Warshall algoritmus) Irányítatlan gráfok esete Ha nincs negatív él, akkor a Dijkstra használható kis módosítással Negatív él egyben negatív kört is jelent szenasi.sandor@nik.uni-obuda.hu 29

Tárolási módok Szélességi bejárás Mélységi bejárás Legrövidebb utak keresése Minimális feszítőfa keresése Gráfok

31 Minimális feszítőfa előállítása Olyan feszítőfát keresünk, ahol az élek összsúlya minimális Ennek megfelelően a gráf legyen súlyozott A gráf legyen irányítatlan Legyen összefüggő Egy gráfnak több minimális feszítőfája is lehet, ezek közül elég az egyiket megtalálnunk Gyakorlati alkalmazások 1 Áramkörök tervezése 3 1 Ellátórendszerek tervezése 1 5 3 2 4 5 4 3 1 2 8 4 1 6 3 7 2

32 Feszítőfa növelésének elve Feszítőfa növelése során Egy alapállapotból kiindulva, egyesével adjuk hozzá az éleket a leendő feszítőfához Tehát az algoritmus minden állapotában a feszítőfa egy részét tartja nyilván (nevezzük ezt A-nak) A feszítőfa lépésenkénti növelésének elve Kiinduló állapot Az A kezdőértéke legyen egy olyan állapot, ami biztosan a leendő feszítőfa része lesz majd (pl. egy darab csúcs, vagy egy jól megválasztott él) Növelés Ezt követően olyan éleket keresünk, amelyeket hozzáadva az eddigi A állapothoz, továbbra is fennáll a fenti állítás (továbbra az A továbbra is a leendő feszítőfa egy része) Ezeket biztonságos éleknek nevezzük Egy ilyen élet hozzáadunk az A-hoz Addig ismételjük, amíg A nem feszítőfa Biztonságos él megállapítása

Biztonságos él keresése Vágásnak nevezzük a gráf csúcsainak a kettéosztását két csoportba pl. ábrán a zöld vonal bal és jobb oldalán lévő elemekre Azt mondjuk, hogy egy él keresztezi a vágást, ha a két végpontja a két különböző csoportba került pl. az ábrán a piros élek Egy él könnyű egy vágásban, ha a vágást keresztező élek közül neki van a legkisebb a súlya pl. az ábrán a vastagabb piros él Egy vágás kikerül egy A halmazt, ha az A egyik éle sem keresztezi a vágást Bizonyítható, hogy ha van egy A halmazunk, amely egy G gráf éleinek részhalmaza, továbbá G egy minimális feszítőfájának is része, akkor az G gráf A-t kikerülő vágásainak könnyű élei biztonságosak szenasi.sandor@nik.uni-obuda.hu 1 1 5 2 4 5 4 3 1 2 3 8 33 4 1 6 3 3 7 2

Prim algoritmusa függvény Prim(G, start) ciklus x G.Csúcsok k[x] ; π[x] S x k[start] 0 ciklus amíg S u S.MinKivesz(k) ciklus x u.szomszédok ha x S u.súly(x) < k[x] akkor k[x] u.súly(x) π[x] u elágazás vége vissza π függvény vége Ahol S egy prioritásos sor. Az S.MinKivesz(k) művelet pedig azt az x S sorbeli elemet adja vissza, ahol a k[x] érték a legkisebb Visszatérési értéke a szülőket tartalmazó adatszerkezet szenasi.sandor@nik.uni-obuda.hu 34

Kruskal algoritmusa függvény Kruskal(G) ciklus x G.Csúcsok Halmaz-létrehozás(x) ciklus (u,v) G.Élek S (u,v) ciklus amíg S (u,v) S.MinKivesz(súly) ha Tartalmazó-halmaz(u) Tartalmazó-halmaz(v) akkor A A {(u,v)} Halmaz-összevonás(Tartalmazó-halmaz(u), Tartalmazó-halmaz(v)) vissza A függvény vége Ahol S egy prioritásos sor, ami most az éleket tartalmazza. Az S.MinKivesz(súly) művelet pedig azt az e S sorbeli elemet adja vissza, ahol az él súlya a legkisebb Az eljárás visszatérési értéke a minimális feszítőfa éleinek halmaza szenasi.sandor@nik.uni-obuda.hu 35

36 Kruskal segédműveletek Halmaz-létrehozás(x) Létrehoz egy új halmazt Ebben elhelyezi az x elemet (ami egy csúcs) Tartalmazó-halmaz(x) Az előzőleg létrehozott halmazok közül megkeresi azt, amelyikben az x szerepel Csak egy ilyen halmaz lehet, a visszatérési értéke ez a halmaz Halmaz-összevonás(A, B) Az előzőleg létrehozott halmazok közül összevon kettőt Tehát pl. az A legyen a két halmaz uniója, a B-t pedig megszünteti Megvalósítás Tényleges halmaz adatszerkezetekkel Objektumorientáltan (halmaz objektumok, illetve halmazok halmazai) A halmazok maximális száma és maximális elemszáma ismert (mind a kettő értéke V ), így tömbök egyszerűen használhatók Láncolt lista az összevonásnál praktikus Másik megoldás, ha halmazok helyett csak a csúcsokhoz rendelünk egy azonosítót, hogy melyik halmazban van (összevonás csak ennek a másolása)

37 Irodalomjegyzék Javasolt/felhasznált irodalom Aho, Hopcroft, Ulmann: Számítógép-algoritmusok tervezése és analízise, Műszaki Könyvkiadó, 1982 Cormen, Leiserson, Rivest: Algoritmusok, Műszaki Könyvkiadó, 1997 Szénási: Algoritmusok, adatszerkezetek II., Óbudai Egyetem, 2014