Készítette: Lakos PéterDijkstra algoritmus
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úcs Kulcs
A (s)
B
C
D
E
F
G
H
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10Legyen A a kezdőcsúcs
(s:=A)
A (s) B C D E F G H
d:
P:
A (s) B C D E F G H
d: 0
P: NIL
A (s) B C D E F G H
d: 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞
P: NIL NIL NIL NIL NIL NIL NIL NIL
minQ
Csúcs Kulcs
A (s) 0B ∞
C ∞
D ∞
E ∞
F ∞
G ∞
H ∞
A (s) B C D E F G H
d: 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞
P: NIL NIL NIL NIL NIL NIL NIL NIL
minQ
Csúcs Kulcs
A (s) 0B ∞
C ∞
D ∞
E ∞
F ∞
G ∞
H ∞
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
u
minQ
Csúcs Kulcs
B ∞
C ∞
D ∞
E ∞
F ∞
G ∞
H ∞
A
v
A (s) B C D E F G H
d: 0 20 ∞ ∞ ∞ ∞ ∞ ∞
P: NIL NIL NIL NIL NIL NIL NIL NIL
minQ
Csúcs Kulcs
B 20
C ∞
D ∞
E ∞
F ∞
G ∞
H ∞
A (s) B C D E F G H
d: 0 20 ∞ ∞ ∞ ∞ ∞ ∞
P: NIL A NIL NIL NIL NIL NIL NIL
v
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ ∞ ∞ ∞
P: NIL A NIL NIL NIL NIL NIL NIL
minQ
Csúcs Kulcs
B 20
C ∞
D 80E ∞
F ∞
G ∞
H ∞
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ ∞ ∞ ∞
P: NIL A NIL A NIL NIL NIL NIL
v
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ ∞ 90 ∞
P: NIL A NIL A NIL NIL NIL NIL
minQ
Csúcs Kulcs
B 20
C ∞
D 80E ∞
F ∞
G 90H ∞
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ ∞ 90 ∞
P: NIL A NIL A NIL NIL A NIL
Nincs több ilyen csúcs,kilépünk a belső ciklusból.
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ ∞ 90 ∞
P: NIL A NIL A NIL NIL A NIL
minQ
Csúcs Kulcs
B 20
C ∞
D 80E ∞
F ∞
G 90H ∞
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
Az előző lépés mintájárafolytatjuk az algoritmust,amíg ki nem ürül a minQ.
minQ
Csúcs Kulcs
C ∞
D 80E ∞
F ∞
G 90H ∞
u
B
v
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ 30 90 ∞
P: NIL A NIL A NIL B A NIL
minQ
Csúcs Kulcs
C ∞
D 80E ∞
F 30
G 90H ∞
A (s) B C D E F G H
d: 0 20 ∞ 80 ∞ 30 90 ∞
P: NIL A NIL A NIL B A NIL
minQ
Csúcs Kulcs
C ∞
D 80E ∞
F 30
G 90H ∞
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
u
B
v
minQ
Csúcs Kulcs
C ∞
D 80E ∞
G 90H ∞
FA (s) B C D E F G H
d: 0 20 40 80 ∞ 30 90 ∞
P: NIL A F A NIL B A NIL
minQ
Csúcs Kulcs
C 40
D 80E ∞
G 90H ∞
v
A (s) B C D E F G H
d: 0 20 40 70 ∞ 30 90 ∞
P: NIL A F F NIL B A NIL
minQ
Csúcs Kulcs
C 40
D 70E ∞
G 90H ∞
A (s) B C D E F G H
d: 0 20 40 70 ∞ 30 90 ∞
P: NIL A F F NIL B A NIL
minQ
Csúcs Kulcs
C 40
D 70E ∞
G 90H ∞
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
u
Bv
F
v
minQ
Csúcs Kulcs
D 70E ∞
G 90H ∞
CA (s) B C D E F G H
d: 0 20 40 50 ∞ 30 90 ∞
P: NIL A F C NIL B A NIL
minQ
Csúcs Kulcs
D 50E ∞
G 90H ∞
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 90 60
P: NIL A F C NIL B A C
minQ
Csúcs Kulcs
D 50E ∞
G 90H 60
C-nek F is szomszédja, de azmár benne van a KÉSZ halmazban.
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 90 60P: NIL A F C NIL B A C
minQ
Csúcs Kulcs
D 50E ∞
G 90H 60
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
u
B
F
v
C
minQ
Csúcs Kulcs
E ∞
G 90H 60
D
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60
P: NIL A F C NIL B D C
minQ
Csúcs Kulcs
E ∞
G 70H 60
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C
minQ
Csúcs Kulcs
E ∞
G 70H 60
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
uB
F
C
D
minQ
Csúcs Kulcs
E ∞
G 70
H
A H csúcsnak nincs egy szomszédja sem,így be sem lépünk a belső ciklusba.
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C
minQ
Csúcs Kulcs
E ∞
G 70
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
u
B
F
C
D
H
minQ
Csúcs Kulcs
E ∞
G
minQ
Csúcs Kulcs
E ∞
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C
Az algoritmus működése:
KÉSZ:H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
A
u
B
F
C
D
H
G
minQ
Csúcs Kulcs
E
A (s) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C
Az eredmény:
H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
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) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C
Az eredmény:
H
C
F
D
A
B
G
E
10
50
30 20
2090
20
80
40 1050
20
10
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) B C D E F G H
d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C
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
10
50
30 20
2090
20
80
40 1050
20
10
H
C
F
D
A
B
G
10
20
20
10
20
10
Megjegyzés:
További információk, példa: http://people.inf.elte.hu/fekete/docs_2/grafalg/grafalg.pdf25 - 30. oldal