A Dijkstra algoritmus
Mi az a Dijkstra algoritmus? Egy gráfalgoritmus a „legrövidebb utak egy forrásból” probléma megoldására. Bemenet: egy G = (E,V) élsúlyozott véges gráf, valamint egy s ∈ V csúcs, a forrás. Az élek súlyozása nemnegatív. A gráf lehet irányított vagy irányítatlan. Kimenet: a forrást és az onnan elérhető csúcsokat tartalmazó gráf, ami egyben a forrásból induló legrövidebb utak fája.
Fontos megjegyzés A legrövidebb út alatt most nem a legkevesebb élt tartalmazó utat értjük, hanem azt az, amelyikre az alkotóélek súlyainak összege minimális.
Dijkstra algoritmus röviden 1/2 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. Ehhez tekintsünk egy d[1..n] és egy P[1..n] tömböt (n a csúcsok száma), melyek rendre a távolságokat és a szülő csúcsokat tartalmazzák. Jelölje K azoknak a csúcsoknak a halmazát, amelyekhez már kiszámítottuk az odavezető legrövidebb utat.
Dijkstra algoritmus röviden 2/2 Kezdetben a távolság a kezdőcsúcsra 0, a többire ∞. Minden lépésben a nem kész csúcsok közül tekintsük valamelyik legkisebb távolságú (dmin) csúcsot (v): Vegyük észre, hogy v távolsága a megelőző lépés eredményei és a v-be vezető imént érintett él alapján ismert, ezért v bekerül a K halmazba. Számítsuk ki a v szomszédaira a v-be vezető útnak a v egyes szomszédaiba vezető élekkel kibővített hosszát (kiterjesztés). Amennyiben ez kisebb, mint az illető szomszédba eddig talált legrövidebb út, akkor mostantól ezt tekintjük az ebbe a csúcsba vezető legrövidebb útnak (közelítés).
Dijkstra algoritmus struktogram d[s], P[s] ≔ 0, NIL for all u ∊ V ∖ {s} d[u], P[u] ≔ ∞, NIL Üres(K); Üres(Qmin) Feltölt(Qmin) Qmin ≠ ∅ u ≔ Kivesz(Qmin) K ≔ K ∪ {u} for all v ∊ Szomszédok(u) ∖ K d[v] ≩ d[u] + c(u,v) SKIP d[v] ≔ d[u] + c(u,v) Helyreállít(Qmin) P[v] ≔ u Qmin egy a még feldolgozásra váró csúcsokat tartalmazó minimum választó prioritásos sor. A sor kulcsai a már felfedezett legrövidebb távolságok.
Dijkstra algoritmus példa ∞ ∞ ∞ ∞ ∞ ∞ ∞
Dijkstra algoritmus példa ∞ ∞ ∞ ∞ ∞ ∞
Dijkstra algoritmus példa ∞ ∞ ∞ ∞ ∞ ∞
Dijkstra algoritmus példa 5 ∞ ∞ 3 ∞ 2
Dijkstra algoritmus példa 5 ∞ ∞ 3 ∞ 2
Dijkstra algoritmus példa 5 ∞ ∞ 3 ∞ 2
Dijkstra algoritmus példa 5 5 3 3 3 2
Dijkstra algoritmus példa A két lehetséges minimum távolságú csúcs közül ADS szinten teljesen mindegy, hogy melyik választjuk, de ADT szinten – a minimum kiválasztásos sor miatt – azt fogjuk választani, amelyiket korábban tettük be 5 5 3 3 3 2
Dijkstra algoritmus példa 5 5 3 3 3 2
Dijkstra algoritmus példa Az aktuálisan feldolgozott csúcs egyik szomszédja már kész, a másikhoz pedig már találtunk egy a jelenleginél rövidebb utat, a harmadiknál viszont az eddiginél egy rövidebb utat találtunk! 5 5 3 3 3 2
Dijkstra algoritmus példa A helyzet ugyanaz, mint az előző csúcs esetén. 5 4 3 3 3 2
Dijkstra algoritmus példa 5 4 3 3 3 2
Dijkstra algoritmus példa 5 4 3 3 3 2
Dijkstra algoritmus példa 5 4 3 3 3 2
Dijkstra algoritmus példa Legrövidebb utak feszítőfája 5 4 3 3 3 2
Felhasznált irodalom Fekete István jegyzet: http://people.inf.elte.hu/fekete/docs_2/grafalg/grafalg.htm#dijkstra Thomas, Cormen, Leiserson, Rivest: Új Algoritmusok. Scolar Kiadó, 2003 http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm