Grafy (4): grafy z wagą
Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków
UTP Bydgoszcz
14
Graf z wagą
Definicja. Grafem ważonym krawędziowo nazywamy graf G (VG, EG) wraz z funkcją δ : EG → R przypisującą każdej krawędzi e jej wagę W (e) (my będziemy na ogół przyjmować, że waga jest liczbą nieujemną).
Przykład.
Graf z wagami (krawędzi).
54 35
67 76 58
43 64 45
Definicja. Graf ważony wierzchołkowo to graf G (VG, EG) wraz z funkcją ω : VG → R przypisującą każdemu wierzchołkowi v jego wagę ω(v) (najczęściej waga wierzchołka to liczba naturalna).
Waga podgrafu
Definicja.
Waga W (H) podgrafu H grafu G to suma wag krawędzi grafu H.
Definicja.
Minimalne drzewo spinające to drzewo spinające, którego waga nie jest większa od wag innych drzew spinających.
Uwaga.
Minimalnych drzew spinających może być wiele.
Na przykład, gdy każdej krawędzi grafu G przypiszemy wagę 1, to wszystkie drzewa spinające są minimalne (mają wagę kVGk − 1).
Problem. Znaleźć minimalne drzewo spinające.
Algorytm Kruskala
Najpierw sortujemy (nazywamy) krawędzie tak, by W (e1) ¬ W (e2) ¬ · · · ¬ W (em).
Na wejściu: skończony graf spójny G z wagami i m krawędziami uporządkowanymi według wzrastających wag.
Na wyjściu: zbiór krawędzi E minimalnego drzewa spinającego.
Niech E := ∅.
Dla j = 1 do m
jeśli graf E ∪ {ej} jest acykliczny, to dołącz ej do E . Uwaga.
W kolejnych krokach mogą się pojawić grafy niespójne.
Twierdzenie.
Algorytm Kruskala tworzy minimalne drzewo spinające.
Algorytm Kruskala, przykład
3 5
4 2 4
1 4
5
6
5 7
8 3
8
e3
e8
e5 e2 e6 e1
e7 e9
e11 e10
e12
e13
e4
e14
Numerujemy krawędzie według wag w porządku niemalejącym.
Algorytm Kruskala, przykład
e3
e8
e5 e2 e6 e1 e7
e9
e11
e10
e12 e13
e4
e14
e3
e8
e5 e2 e6 e1 e7
e9
e11
e10
e12 e13
e4
e14
Niech E := ∅.
Dla j = 1 graf o krawędzi e1 jest acykliczny. E = {e1}.Dla j = 2 graf o krawędziach e1, e2 jest acykliczny. E = {e1, e2}.
Podobnie dla j = 3, 4, 5, 6. E = {e1, e2, e3, e4, e5, e6}. Dla j = 7 dodanie e7 spowodowałoby, że e3e5e7 jest cyklem. Krawędź e7 odrzucamy. Podobnie odrzucamy e8, e9, e10, e11, e12. Dodajemy e13 i odrzucamy e14.
E = {e1, e2, e3, e4, e5, e6, e13}
Algorytm Kruskala, przykład
e3
e8
e5 e6
e2 e1
e7
e9
e11
e10
e12
e13
e4
e14
e3
e8
e5 e6
e2 e1
e7
e9
e11
e10
e12
e13
e4
e14
Niech E := ∅.
Dla j = 1 graf o krawędzi e1 jest acykliczny. E = {e1}.
Dla j = 2 graf o krawędziach e1, e2 jest acykliczny. E = {e1, e2}.
Ten graf nie jest spójny (nie jest drzewem), ale to nie szkodzi.
Dla j = 7 dodanie e7 spowodowałoby, że e3e5e7 jest cyklem. Krawędź e7
odrzucamy. Podobnie z e8, e9, e10, e11, e12. Dodajemy e13 i odrzucamy e14.
Algorytm Kruskala, przykład
e3
e8
e5 e2 e6 e1 e7
e9
e11
e10
e12 e13
e4
e14
e3
e8
e5 e2 e6 e1 e7
e9
e11
e10
e12 e13
e4
e14
Niech E := ∅.
Dla j = 1 graf o krawędzi e1 jest acykliczny. E = {e1}.
Dla j = 2 graf o krawędziach e1, e2 jest acykliczny. E = {e1, e2}.
Podobnie dla j = 3, 4, 5, 6. E = {e1, e2, e3, e4, e5, e6}.
Dla j = 7 dodanie e7 spowodowałoby, że e3e5e7 jest cyklem. Krawędź e7 odrzucamy. Podobnie odrzucamy e8, e9, e10, e11, e12. Dodajemy e13 i odrzucamy e14. E = {e1, e2, e3, e4, e5, e6, e13}
Algorytm Kruskala, przykład
e3
e8
e5 e2 e6 e1 e7
e9
e11
e10
e12 e13
e4
e14
e3
e8
e5 e2 e6 e1 e7
e9
e11
e10
e12 e13
e4
e14
Niech E := ∅.
Dla j = 1 graf o krawędzi e1 jest acykliczny. E = {e1}.
Dla j = 2 graf o krawędziach e1, e2 jest acykliczny. E = {e1, e2}.
Podobnie dla j = 3, 4, 5, 6. E = {e1, e2, e3, e4, e5, e6}.
Dla j = 7 dodanie e7 spowodowałoby, że e3e5e7 jest cyklem. Krawędź e7 odrzucamy. Podobnie odrzucamy e8, e9, e10, e11, e12. Dodajemy e13 i odrzucamy e14.E = {e1, e2, e3, e4, e5, e6, e13}.
Algorytm Kruskala, przykład
3 5
4 2 4
1 4
5
6
5 7
8 3
8
e3
e5 e2 e6 e1 e13
e4
Drzewo spinające
E = {e1, e2, e3, e4, e5, e6, e9, e11, e13} ma wagę
1 + 2 + 3 + 3 + 4 + 4 + 8 = 25.
Algorytm Prima
Nie wymaga, by krawędzie były posortowane. Buduje drzewo (na każdym etapie otrzymujemy graf spójny) wybierając krawędź o najmniejszej wadze, łączącą jakiś wierzchołek drzewa z innym wierzchołkiem spoza drzewa.
Na wejściu: skończony graf spójny G (VG, EG) z wagami.
Na wyjściu: zbiór krawędzi E minimalnego drzewa spinającego.
Niech E := ∅.
Wybierz dowolne v ∈ VG i niech V := {v }.
Dopóki V 6= VG wykonuj:
wybierz w EG krawędź {u, w } o najmniejszej wadze taką, że u ∈ V oraz w ∈ VG \ V
dołącz {u, w } do E i dołącz w do V .
Twierdzenie. Algorytm Prima tworzy minimalne drzewo spinające.
Złożoność czasowa to O(n2).
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
Wybieramy dowolny wierzchołek, na przykład u. E := ∅, V := {u}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z u ma {u, s}.
E = {{u, s}}, V = {u, s}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {s, v }.
E = {{u, s}, {s, v }}, V = {u, s, v }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {v , t}.
E = {{u, s}, {s, v }, {v , t}}, V = {u, s, v , t}.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
Wybieramy dowolny wierzchołek, na przykład u. E := ∅, V := {u}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z u ma {u, s}.
E = {{u, s}}, V = {u, s}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {s, v } (mogliśmy, to obojętne, wybrać {u, v }). E = {{u, s}, {s, v }}, V = {u, s, v }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {v , t}.
E = {{u, s}, {s, v }, {v , t}}, V = {u, s, v , t}.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
Wybieramy dowolny wierzchołek, na przykład u. E := ∅, V := {u}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z u ma {u, s}.
E = {{u, s}}, V = {u, s}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {s, v }.
E = {{u, s}, {s, v }}, V = {u, s, v }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {v , t}.
E = {{u, s}, {s, v }, {v , t}}, V = {u, s, v , t}.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
E = {{u, s}, {s, v }, {v , t}}, V = {u, s, v , t}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {t, w }.
E = {{u, s}, {s, v }, {v , t}, {t, w }}, V = {u, s, v , t, w }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {w , y }.
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }}, V = {u, s, v , t, w , y }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {y , x }.
E = {{u, s}, {s, v }, {v , t}, {w , y }, {y , x }}, V = {u, s, v , t, w , y , x }.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
E = {{u, s}, {s, v }, {v , t}}, V = {u, s, v , t}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {t, w }.
E = {{u, s}, {s, v }, {v , t}, {t, w }}, V = {u, s, v , t, w }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {w , y }.
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }}, V = {u, s, v , t, w , y }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {y , x }.
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }, {y , x }}, V = {u, s, v , t, w , y , x }.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
E = {{u, s}, {s, v }, {v , t}}, V = {u, s, v , t}.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {t, w }.
E = {{u, s}, {s, v }, {v , t}, {t, w }}, V = {u, s, v , t, w }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {w , y }.
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }}, V = {u, s, v , t, w , y }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {y , x }.
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }, {y , x }}, V = {u, s, v , t, w , y , x }.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }, {y , x }}, V = {u, s, v , t, w , y , x }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {y , z}
(albo, to obojętne, {w , z}).
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }, {y , x }, {y , z}}, V = {u, s, v , t, w , y , x , z}.
Algorytm Prima, przykład
s t
u v w
x y z
3 5
4 2 4
1 4
5
6
5 7
8 3
8
s t
u v w
x y z
3 4 2 4
1 8 3
E = {{u, s}, {s, v }, {v , t}, {w , y }, {y , x }}, V = {u, s, v , t, w , y , x }.
Najmniejszą możliwą wagę spośród krawędzi wychodzących z V ma {y , z}
Minimalne drzewo spinające:
E = {{u, s}, {s, v }, {v , t}, {t, w }, {w , y }, {y , x }, {y , z}}, V = {u, s, v , t, w , y , x , z}.
Problem komiwojażera (TSP, travelling salesman problem)
Mamy daną listę miast i znamy odległości między nimi. Znaleźć najkrótszą drogę taką, by każde miasto odwiedzić dokładnie raz i wrócić do miasta, z którego wyjechaliśmy.
Bardziej formalnie:
Problem komiwojażera polega na znalezieniu minimalnego cyklu Hamiltona (cyklu, w którym przez każdy wierzchołek przechodzimy dokładnie raz) w grafie ważonym (najczęściej rozważa się grafy pełne).
W asymetrycznym problemie komiwojażera waga krawędzi zależy od kierunku poruszania się po niej, ponadto krawędź może być
„ jednokierunkowa”.
Uwaga.
Jeżeli w grafie wszystkie krawędzie mają wagę 1, to problem redukuje się do znalezienia „zwykłego” cyklu Hamiltona.
Problem komiwojażera
Uwaga. Problem komiwojażera jest NP-zupełny.
Uwaga. Niech C = e1e2. . . en−1en będzie cyklem Hamiltona o
najmniejszej wadze (oznaczanej W (C )) w grafie G (czyli rozwiązaniem problemu komiwojażera). Oczywiście droga e1e2. . . en−1 jest drzewem spinającym grafu G . Oznaczmy przez m wagę minimalnego drzewa spinającego grafu G (potrafimy ją obliczyć stosując poznane przed chwilą algorytmy).
Wtedy m ¬ W (e1) + · · · + W (en−1) = W (C ) − W (en), czyli W (C ) m + µ,
gdzie µ jest najmniejszą z wag krawędzi grafu G .
Jeśli umiemy znaleźć jakikolwiek cykl Hamiltona o wadze bliskiej m + µ, to zazwyczaj nie warto szukać dalej.
Algorytm Forda-Bellmana
Wyszukuje minimalne drogi w grafie ważonym;
także z wagami ujemnymi, ale bez cykli o ujemnej wadze.
Złożoność czasowa to O(n3).
Na wejściu:
graf skierowany G = (VG, EG), VG = {v1, v2, . . . vn}, wagę krawędzi (vk, vj) oznaczamy przez W (k, j ).
Na wyjściu:
wagi minimalnych dróg od v1 do pozostałych wierzchołków.
Zmienna pomocnicza:
funkcja D.
Algorytm Forda-Bellmana
D(1) := 0.
Dla każdego j od 2 do n oblicz D(j ) := W (1, j ).
Dla każdego k od 1 do n − 2 zrób:
dla każdego j od 2 do n zrób:
dla każdego i od 1 do n zrób:
D(j ) := min(D(j ), D(i ) + W (i , j )).
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 dla k = 2 dla k = 3 dla k = 4
Dla j = 2: D(1)+W(1,2)=0+2=2, D(2) + W (2, 2) = 2 + 0 = 2, D(3) + W (3, 2) = 2 + ∞, D(4) + W (4, 2) = 1 + (−2) = −1, D(5) + W (5, 2) = ∞ + ∞ = ∞, D(6) + W (6, 2) = ∞ + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1
dla k = 2 dla k = 3 dla k = 4
Dla j = 2: D(1)+W(1,2)=0+2=2, D(2) + W (2, 2) = 2 + 0 = 2, D(3) + W (3, 2) = 2 + ∞, D(4) + W (4, 2) = 1 + (−2) = −1, D(5) + W (5, 2) = ∞ + ∞ = ∞, D(6) + W (6, 2) = ∞ + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0
dla k = 2 dla k = 3 dla k = 4
Dla j = 3: D(1) + W (1, 3) = 0 + 2 = 2, D(2) + W (2, 3) = −1 + 1 = 0, D(3) + W (3, 3) = 0 + 0 = 0, D(4) + W (4, 3) = 1 + ∞ = ∞,
D(5) + W (5, 3) = ∞ + ∞ = ∞, D(6) + W (6, 3) = ∞ + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1
dla k = 2 dla k = 3 dla k = 4
Dla j = 4: D(1) + W (1, 4) = 0 + 1 = 1, D(2) + W (2, 4) = −1 + ∞ = ∞, D(3) + W (3, 4) = 0 + 8 = 8, D(4) + W (4, 4) = 1 + 0 = 1,
D(5) + W (5, 4) = ∞ + 2 = ∞, D(6) + W (6, 4) = ∞ + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1
dla k = 2 dla k = 3 dla k = 4
Dla j = 5: D(1) + W (1, 5) = 0 + ∞ = ∞, D(2) + W (2, 5) = −1 + 8 = 7, D(3) + W (3, 5) = 0 + 1 = 1, D(4) + W (4, 5) = 1 + ∞ = ∞,
D(5) + W (5, 5) = ∞ + 0 = ∞, D(6) + W (6, 5) = ∞ + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 dla k = 3 dla k = 4
Dla j = 6: D(1) + W (1, 6) = ∞, D(2) + W (2, 6) = −1 + ∞ = ∞, D(3) + W (3, 6) = 0 + ∞ = ∞, D(4) + W (4, 6) = 1 + 4 = 5,
D(5) + W (5, 6) = 1 + 1 = 2, D(6) + W (6, 6) = ∞ + 0 = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 0 -1
dla k = 3 dla k = 4
Dla j = 2: D(1)+W(1,2)=0+2=2, D(2) + W (2, 2) = −1 + 0 = −1, D(3) + W (3, 2) = 0 + ∞, D(4) + W (4, 2) = 1 + (−2) = −1, D(5) + W (5, 2) = 1 + ∞ = ∞, D(6) + W (6, 2) = 2 + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 0 -1 0
dla k = 3 dla k = 4
Dla j = 3: D(1) + W (1, 3) = 0 + 2 = 2, D(2) + W (2, 3) = −1 + 1 = 0, D(3) + W (3, 3) = 0 + 0 = 0, D(4) + W (4, 3) = 1 + ∞ = ∞,
D(5) + W (5, 3) = 1 + ∞ = ∞, D(6) + W (6, 3) = 2 + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 0 -1 0 1
dla k = 3 dla k = 4
Dla j = 4: D(1) + W (1, 4) = 0 + 1 = 1, D(2) + W (2, 4) = −1 + ∞ = ∞, D(3) + W (3, 4) = 0 + 8 = 8, D(4) + W (4, 4) = 1 + 0 = 1,
D(5) + W (5, 4) = 1 + 2 = 3, D(6) + W (6, 4) = 2 + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 0 -1 0 1 1
dla k = 3 dla k = 4
Dla j = 5: D(1) + W (1, 5) = 0 + ∞ = ∞, D(2) + W (2, 5) = −1 + 8 = 6, D(3) + W (3, 5) = 0 + 1 = 1, D(4) + W (4, 5) = 1 + ∞ = ∞,
D(5) + W (5, 5) = 1 + 0 = 1, D(6) + W (6, 5) = 2 + ∞ = ∞
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 0 -1 0 1 1 2
dla k = 3 dla k = 4
Dla j = 6: D(1) + W (1, 6) = ∞, D(2) + W (2, 6) = −1 + ∞ = ∞, D(3) + W (3, 6) = 0 + ∞ = ∞, D(4) + W (4, 6) = 1 + 4 = 5,
D(5) + W (5, 6) = 1 + 1 = 2, D(6) + W (6, 6) = 2 + 0 = 2
Algorytm Forda-Bellmana,
przykład, D(j ) := min(D(j ), D(i ) + W (i , j ))v1
v2
v3
v4
v5
v6
2
2 1 1
−2
8
1 8
4
1 2
D(1) D(2) D(3) D(4) D(5) D(6)
D(j)=W(1,j) 0 2 2 1 ∞ ∞
dla k = 1 0 -1 0 1 1 2
dla k = 2 0 -1 0 1 1 2
dla k = 3 0 -1 0 1 1 2
dla k = 4 0 -1 0 1 1 2
Zarówno dla k = 3 jak i k = 4 nic się już nie zmieni.
Algorytm Dijkstry, wagi nieujemne
Algorytm ten znajduje drogę W∗(1, j ) o najmniejszej wadze (najmniejszym koszcie, najkrótszym czasie, najkrótszą drogę) od v1 do innych wierzchołków.
Na wejściu: graf skierowany bez pętli G (VG, EG), VG = {v1, v2, . . . , vn} o nieujemnej wadze krawędzi; waga krawędzi (vk, vj) to W (k, j ).
Na wyjściu: wagi minimalne W∗(1, j ) dla j = 2, . . . , n od wierzchołka v1 do wierzchołka vj.
Zmienne pomocnicze: zbiory V , L, funkcja D.
Złożoność czasowa to O(n2).
Algorytm Dijkstry, wagi nieujemne
Na początku L := ∅ oraz V := {2, 3, . . . , n}
Dla i ∈ V wykonaj D(i ) := W (1, i )
Dopóki V \ L 6= ∅ wykonaj
wybierz k ∈ V \ L o najmniejszej wartości D(k) dołącz k do L
dla każdego j ∈ V \ L wykonaj jeśli D(j ) > D(k) + W (k, j ), to
zastąp D(j ) sumą D(k) + W (k, j ).
Dla j ∈ V wykonaj W∗(1, j ) := D(j ).
W następnym przykładzie W∗(1, j ) są oznaczone czerwonym kolorem w tabeli jako D(j ).
Ponadto, liczba w nawiasie oznacza numer wierzchołka, przez który prowadzi droga.
Algorytm Dijkstry, przykład z zaznaczeniem drogi
v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞ 2
Algorytm Dijkstry, minimalna droga do v
2to v
1v
2v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞ 2
Algorytm Dijkstry, minimalna droga do v
4to v
1v
2v
4v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4
Algorytm Dijkstry, minimalna droga do v
7to v
1v
2v
4v
7v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 9 (2) − ∞ 7 (4) 6 (4) ∞ ∞
7
Algorytm Dijkstry, minimalna droga do v
6to v
1v
2v
4v
6v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 9 (2) − ∞ 7 (4) 6 (4) ∞ ∞
7 − 9 (2) − ∞ 7 (4) − 8 (7) 14 (7)
6
Algorytm Dijkstry, minimalna droga do v
8to v
1v
2v
4v
7v
8v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 9 (2) − ∞ 7 (4) 6 (4) ∞ ∞
7 − 9 (2) − ∞ 7 (4) − 8 (7) 14 (7)
6 − 9 (2) − ∞ − − 8 (7) 14 (7)
8
Algorytm Dijkstry, minimalna droga do v
3to v
1v
2v
3v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 9 (2) − ∞ 7 (4) 6 (4) ∞ ∞
7 − 9 (2) − ∞ 7 (4) − 8 (7) 14 (7)
6 − 9 (2) − ∞ − − 8 (7) 14 (7)
8 − 9 (2) − ∞ − − − 13 (8)
3
Algorytm Dijkstry, minimalna droga do v
9to v
1v
2v
3v
9v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 9 (2) − ∞ 7 (4) 6 (4) ∞ ∞
7 − 9 (2) − ∞ 7 (4) − 8 (7) 14 (7)
6 − 9 (2) − ∞ − − 8 (7) 14 (7)
8 − 9 (2) − ∞ − − − 13 (8)
3 − − − ∞ − − − 11 (3)
9
Algorytm Dijkstry, z v
1do v
5nie ma drogi
v1
v2 v3
v4 v5
v6 v7
v8 v9
2 3 10
7
3 2 3
7 6
1
2 1
2 8
5 2
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 9 (2) − ∞ 7 (4) 6 (4) ∞ ∞
7 − 9 (2) − ∞ 7 (4) − 8 (7) 14 (7)
6 − 9 (2) − ∞ − − 8 (7) 14 (7)
8 − 9 (2) − ∞ − − − 13 (8)
3 − − − ∞ − − − 11 (3)
9 − − − ∞ − − − −
Algorytm Dijkstry, grafy nieskierowane
Uwaga.
Problem znalezienia najkrótszej drogi w grafie prostym nieskierowanym (jeśli krawędzie mają nieujemne wagi) można sprowadzić do problemu znalezienia najkrótszej drogi w grafie skierowanym:
każdą krawędź {u, v } zastępujemy krawędziami (u, v ) oraz (v , u).
Algorytm Dijkstry, graf nieskierowany, przykład
v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
Algorytm Dijkstry, graf nieskierowany, przykład
v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞ 2
Algorytm Dijkstry, minimalna droga do v
2to v
1v
2v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞ 2
Algorytm Dijkstry, minimalna droga do v
4to v
1v
2v
4v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4
Algorytm Dijkstry, minimalna droga do v
7to v
1v
2v
4v
7v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 7 (4) − 12 (4) 7 (4) 6 (4) ∞ ∞
7
Algorytm Dijkstry, minimalna droga do v
3to v
1v
2v
4v
3v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 7 (4) − 12 (4) 7 (4) 6 (4) ∞ ∞
7 − 7 (4) − 12 (4) 7 (4) − 8 (7) 14 (7) 3
Algorytm Dijkstry, minimalna droga do v
6to v
1v
2v
4v
6v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 7 (4) − 12 (4) 7 (4) 6 (4) ∞ ∞
7 − 7 (4) − 12 (4) 7 (4) − 8 (7) 14 (7)
3 − − − 10 (3) 7 (4) − 8 (7) 14 (7)
6
Algorytm Dijkstry, minimalna droga do v
8to v
1v
2v
4v
7v
8v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 7 (4) − 12 (4) 7 (4) 6 (4) ∞ ∞
7 − 7 (4) − 12 (4) 7 (4) − 8 (7) 14 (7)
3 − − − 10 (3) 7 (4) − 8 (7) 14 (7)
6 − − − 10 (3) − − 8 (7) 14 (7)
8
Algorytm Dijkstry, minimalna droga do v
9to v
1v
2v
4v
7v
8v
9v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 7 (4) − 12 (4) 7 (4) 6 (4) ∞ ∞
7 − 7 (4) − 12 (4) 7 (4) − 8 (7) 14 (7)
3 − − − 10 (3) 7 (4) − 8 (7) 14 (7)
6 − − − 10 (3) − − 8 (7) 14 (7)
8 − − − 10 (3) − − − 8(8)
9
Algorytm Dijkstry, minimalna droga do v
5to v
1v
2v
4v
3v
5v1
v2 v3
v4 v5
v6 v7
v8
v9
2 10 10
7
3 2 3
7 6
1
2 1
2 8
0
dodaj do L D(2) D(3) D(4) D(5) D(6) D(7) D(8) D(9)
∅ 2 (1) 10 (1) ∞ ∞ ∞ ∞ ∞ ∞
2 − 9 (2) 5 (2) ∞ ∞ ∞ ∞ ∞
4 − 7 (4) − 12 (4) 7 (4) 6 (4) ∞ ∞
7 − 7 (4) − 12 (4) 7 (4) − 8 (7) 14 (7)
3 − − − 10 (3) 7 (4) − 8 (7) 14 (7)
6 − − − 10 (3) − − 8 (7) 14 (7)
8 − − − 10 (3) − − − 8(8)
9 − − − 10 (3) − − − −
5