200 likes | 326 Views
Dijkstra algoritmus. Készítette: Lakos Péter. Adott egy élsúlyozott , véges gráf Negatív élsúlyokat nem tartalmaz Lehet irányított vagy irányítatlan Továbbá adott egy s kezdőcsúcs Határozzuk meg minden csúcsra az s-ből odavezető legrövidebb utat és annak hosszát!. Feladat:.
E N D
Dijkstra algoritmus Készítette: Lakos Péter
Adott egy élsúlyozott, véges gráf • Negatív élsúlyokat nem tartalmaz • Lehet irányított vagy irányítatlan • Továbbá adott egy s kezdőcsúcs • Határozzuk meg minden csúcsra az s-ből odavezető legrövidebb utat és annak hosszát! Feladat:
Minden lépésben tartsuk nyilván az összes csúcsra a forrástól az illető csúcsba vezető, eddig talált legrövidebb utat • a d[1..n] tömbben a távolságot • a P[1..n] tömbben a megelőző csúcsot Az algoritmus elve:
Az algoritmus elve: • Kezdetben a távolság legyen a kezdőcsúcsra 0, a többi csúcsra ∞ • Minden lépésben a nem KÉSZ csúcsok közül tekintsük az egyik legkisebb távolságú csúcsot • Azt mondhatjuk, hogy ez a v csúcs már KÉSZ, azaz ismert a hozzá vezető legrövidebb út. • A v-t terjesszük ki, azaz a v csúcs szomszédaira számítsuk ki a (már ismert) v-be vezető, és onnan egy kimenő éllel meghosszabbított út hosszát. • Amennyiben ez jobb (kisebb), mint az illető szomszédba eddig talált legrövidebb út, akkor innentől kezdve ezt az utat tekintsük az adott szomszédba vezető, eddig talált legrövidebb útnak.
Az algoritmus: inicializálás A d[1..n] és P[1..n] tömböket a távolság és a megelőző csúcs nyilvántartására használjuk.
Az algoritmus: inicializálás A KÉSZ halmazba rakjuk azokat a csúcsokat, amelyekhez már ismerjük az egyik legrövidebb utat.
Az algoritmus: inicializálás Ezen kívül használunk egy minimum választó prioritásos sort (minQ) Ebben a csúcsokat tároljuk a már felfedezett, legrövidebb d (s -> u) távolsággal, mint kulcs értékkel.
Az algoritmus működése: 10 B F 20 50 40 10 50 A C 80 10 Legyen A a kezdőcsúcs (s:=A) 90 E 20 D 20 30 20 G KÉSZ: H
Az algoritmus működése: v 10 B F 20 50 40 10 u 50 A C 80 10 90 E Nincs több ilyen csúcs, kilépünk a belső ciklusból. 20 D 20 v 30 20 G KÉSZ: H v A
Az algoritmus működése: u 10 v B F 20 50 40 10 50 A C 80 10 90 Az előző lépés mintájára folytatjuk az algoritmust, amíg ki nem ürül a minQ. E 20 D 20 30 20 G KÉSZ: H B A
Az algoritmus működése: u 10 B F 20 50 40 10 50 A v C 80 10 90 E 20 D 20 v 30 20 G KÉSZ: H B F A
Az algoritmus működése: 10 B F 20 50 40 10 50 A u C 80 10 90 C-nek F is szomszédja, de az már benne van a KÉSZ halmazban. E 20 D 20 v 30 20 G KÉSZ: H v B C F A
Az algoritmus működése: 10 B F 20 50 40 10 50 A C 80 10 90 E 20 D 20 u 30 20 G KÉSZ: H v B C F A D
Az algoritmus működése: 10 B F 20 50 40 10 50 A C 80 10 90 A H csúcsnak nincs egy szomszédja sem, így be sem lépünk a belső ciklusba. E 20 D 20 30 20 G KÉSZ: H u H B C F A D
Az algoritmus működése: 10 B F 20 50 40 10 50 A C 80 10 90 E 20 D 20 30 20 G KÉSZ: H u H B C G F A D
Az algoritmus működése: 10 B F 20 50 40 10 50 A C 80 10 90 u E 20 D 20 30 20 G KÉSZ: H H B C G E F A D
Az eredmény: • Az elkészült d és P tömbök segítségével minden csúcsról leolvasható az s-ből odavezető legrövidebb út és annak hossza • Pl.: a D csúcsba vezető leghatékonyabb út 50 költségű • D-be C-n keresztül jutottunk • C-be F-ből jöttünk • F-be B-ből • B-be pedig A-ból (kezdőcsúcs) • Vegyük észre, hogy az E-be vezető út költsége végtelen, vagyis ebbe a csúcsba nem lehet eljutni 10 B F 20 50 40 10 50 A C 80 10 90 E 20 D 20 30 20 G H
Az eredmény: • Ha berajzoljuk a kezdőcsúcsból az összes többi csúcsba vezető legjobb utat, megkapjuk a legrövidebb utak fáját. 10 B F 20 50 40 10 50 A C 80 10 90 E 20 D 20 30 20 G H
Az eredmény: • Ha berajzoljuk a kezdőcsúcsból az összes többi csúcsba vezető legjobb utat, megkapjuk a legrövidebb utak fáját. 10 B F 20 50 40 10 10 B 50 F A C 20 80 10 10 90 A E 20 C D 20 10 30 20 G H D 20 20 G H
Megjegyzés: • További információk, példa:http://people.inf.elte.hu/fekete/docs_2/grafalg/grafalg.pdf25- 30. oldal