Download - A Dijkstra algoritmus
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 struktogramd[s], P[s] 0, NIL≔
for all u V {s}∊ ∖d[u], P[u] ∞, NIL≔
Üres(K); Üres(Qmin
)Feltölt(Q
min)
Qmin ≠ ∅u Kivesz(Q≔
min)
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(Q
min)
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
∞
∞
∞
0 ∞
∞
∞
Dijkstra algoritmus példa
∞
∞
∞
0 ∞
∞
∞
Dijkstra algoritmus példa
3
5
∞
0 ∞
2
∞
Dijkstra algoritmus példa
3
5
∞
0 ∞
2
∞
Dijkstra algoritmus példa
3
5
∞
0 ∞
2
∞
Dijkstra algoritmus példa
3
5
3
0 5
2
3
Dijkstra algoritmus példa
3
5
3
0 5
2
3
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
Dijkstra algoritmus példa
3
5
3
0 5
2
3
Dijkstra algoritmus példa
3
5
3
0 5
2
3
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!
Dijkstra algoritmus példa
3
5
3
0 4
2
3
A helyzet ugyanaz, mint az előző csúcs esetén.
Dijkstra algoritmus példa
3
5
3
0 4
2
3
Dijkstra algoritmus példa
3
5
3
0 4
2
3
Dijkstra algoritmus példa
3
5
3
0 4
2
3
Dijkstra algoritmus példa
3
5
3
0 4
2
3
Legrövidebb utak feszítőfája
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