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:
1) Kezdetben a távolság legyen a kezdőcsúcsra 0, a többi csúcsra ∞ 2) Minden lépésben a nem KÉSZ csúcsok közül tekintsük az egyik legkisebb távolságú csúcsot a) Azt mondhatjuk, hogy ez a v csúcs már KÉSZ, azaz ismert a hozzá vezető legrövidebb út. b) 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. c) 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 elve:
Az algoritmus: 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. inicializálás
Az algoritmus: A KÉSZ halmazba rakjuk azokat a csúcsokat, amelyekhez már ismerjük az egyik legrövidebb utat. inicializálás
Az algoritmus: Ezen kívül használunk egy minimum választó prioritásos sort (minQ) inicializálás 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: minQ CsúcsKulcs A (s) B C D E F G H KÉSZ: H C F D A B G E Legyen A a kezdőcsúcs (s:=A) A (s)BCDEFGH d: P: A (s)BCDEFGH d:0 P:NIL A (s)BCDEFGH d:0 ∞∞∞∞∞∞∞ P:NIL minQ CsúcsKulcs A (s) 0 B ∞ C ∞ D ∞ E ∞ F ∞ G ∞ H ∞
BCDEFGH d:0 ∞∞∞∞∞∞∞ P:NIL minQ CsúcsKulcs A (s) 0 B ∞ C ∞ D ∞ E ∞ F ∞ G ∞ H ∞ Az algoritmus működése: KÉSZ: H C F D A B G E u minQ CsúcsKulcs B ∞ C ∞ D ∞ E ∞ F ∞ G ∞ H ∞ A v A (s)BCDEFGH d:0 20∞∞∞∞∞∞ P:NIL minQ CsúcsKulcs B 20 C ∞ D ∞ E ∞ F ∞ G ∞ H ∞ A (s)BCDEFGH d:0 20∞∞∞∞∞∞ P:NILA v A (s)BCDEFGH d:0 20∞ 80 ∞∞∞∞ P:NILA minQ CsúcsKulcs B 20 C ∞ D 80 E ∞ F ∞ G ∞ H ∞ A (s)BCDEFGH d:0 20∞ 80 ∞∞∞∞ P:NILA A v A (s)BCDEFGH d:0 20∞ 80 ∞∞ 90 ∞ P:NILA A minQ CsúcsKulcs B 20 C ∞ D 80 E ∞ F ∞ G 90 H ∞ A (s)BCDEFGH d:0 20∞ 80 ∞∞ 90 ∞ P:NILA A A Nincs több ilyen csúcs, kilépünk a belső ciklusból.
A (s)BCDEFGH d:0 20∞ 80 ∞∞ 90 ∞ P:NILA A A minQ CsúcsKulcs B 20 C ∞ D 80 E ∞ F ∞ G 90 H ∞ Az algoritmus működése: KÉSZ: H C F D A B G E A Az előző lépés mintájára folytatjuk az algoritmust, amíg ki nem ürül a minQ. minQ CsúcsKulcs C ∞ D 80 E ∞ F ∞ G 90 H ∞ u B v A (s)BCDEFGH d:0 20∞ 80 ∞30 90 ∞ P:NILA A BA minQ CsúcsKulcs C ∞ D 80 E ∞ F 30 G 90 H ∞
A (s)BCDEFGH d:0 20∞ 80 ∞30 90 ∞ P:NILA A BA minQ CsúcsKulcs C ∞ D 80 E ∞ F 30 G 90 H ∞ Az algoritmus működése: KÉSZ: H C F D A B G E A u B v minQ CsúcsKulcs C ∞ D 80 E ∞ G 90 H ∞ F A (s)BCDEFGH d: ∞30 90 ∞ P:NILAFA BA minQ CsúcsKulcs C 40 D 80 E ∞ G 90 H ∞ v A (s)BCDEFGH d: ∞30 90 ∞ P:NILAFF BA minQ CsúcsKulcs C 40 D 70 E ∞ G 90 H ∞
A (s)BCDEFGH d: ∞30 90 ∞ P:NILAFF BA minQ CsúcsKulcs C 40 D 70 E ∞ G 90 H ∞ Az algoritmus működése: KÉSZ: H C F D A B G E A u B v F v minQ CsúcsKulcs D 70 E ∞ G 90 H ∞ C A (s)BCDEFGH d: ∞30 90 ∞ P:NILAFC BA minQ CsúcsKulcs D 50 E ∞ G 90 H ∞ A (s)BCDEFGH d: ∞ P:NILAFC BAC minQ CsúcsKulcs D 50 E ∞ G 90 H 60 C-nek F is szomszédja, de az már benne van a KÉSZ halmazban.
A (s)BCDEFGH d: ∞ P:NILAFC BAC minQ CsúcsKulcs D 50 E ∞ G 90 H 60 Az algoritmus működése: KÉSZ: H C F D A B G E A u B F v C minQ CsúcsKulcs E ∞ G 90 H 60 D A (s)BCDEFGH d: ∞ P:NILAFC BDC minQ CsúcsKulcs E ∞ G 70 H 60
A (s)BCDEFGH d: ∞ P:NILAFC BDC minQ CsúcsKulcs E ∞ G 70 H 60 Az algoritmus működése: KÉSZ: H C F D A B G E A u B F C D minQ CsúcsKulcs E ∞ G 70 H A H csúcsnak nincs egy szomszédja sem, így be sem lépünk a belső ciklusba.
A (s)BCDEFGH d: ∞ P:NILAFC BDC minQ CsúcsKulcs E ∞ G 70 Az algoritmus működése: KÉSZ: H C F D A B G E A u B F C D H minQ CsúcsKulcs E ∞ G
minQ CsúcsKulcs E ∞ A (s)BCDEFGH d: ∞ P:NILAFC BDC Az algoritmus működése: KÉSZ: H C F D A B G E A u B F C D H G minQ CsúcsKulcs E
A (s)BCDEFGH d: ∞ P:NILAFC BDC Az eredmény: H C F D A B G E 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
A (s)BCDEFGH d: ∞ P:NILAFC BDC Az eredmény: H C F D A B G E Ha berajzoljuk a kezdőcsúcsból az összes többi csúcsba vezető legjobb utat, megkapjuk a legrövidebb utak fáját.
A (s)BCDEFGH d: ∞ P:NILAFC BDC 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. H C F D A B G E H C F D A B G
Megjegyzés: További információk, példa: oldal