• Nie Znaleziono Wyników

Grafy (4): grafy z wagą

N/A
N/A
Protected

Academic year: 2021

Share "Grafy (4): grafy z wagą"

Copied!
92
0
0

Pełen tekst

(1)

Grafy (4): grafy z wagą

Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków

UTP Bydgoszcz

14

(2)

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).

(3)

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.

(4)

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.

(5)

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.

(6)

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}

(7)

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.

(8)

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}

(9)

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}.

(10)

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.

(11)

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).

(12)

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}.

(13)

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}.

(14)

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}.

(15)

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 }.

(16)

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 }.

(17)

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 }.

(18)

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}.

(19)

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}.

(20)

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.

(21)

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.

(22)

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.

(23)

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 )).

(24)

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) = ∞ + ∞ = ∞

(25)

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) = ∞ + ∞ = ∞

(26)

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) = ∞ + ∞ = ∞

(27)

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) = ∞ + ∞ = ∞

(28)

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) = ∞ + ∞ = ∞

(29)

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 = ∞

(30)

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 + ∞ = ∞

(31)

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 + ∞ = ∞

(32)

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 + ∞ = ∞

(33)

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 + ∞ = ∞

(34)

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

(35)

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.

(36)

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).

(37)

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.

(38)

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

(39)

Algorytm Dijkstry, minimalna droga do v

2

to v

1

v

2

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

(40)

Algorytm Dijkstry, minimalna droga do v

4

to v

1

v

2

v

4

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

(41)

Algorytm Dijkstry, minimalna droga do v

7

to v

1

v

2

v

4

v

7

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

(42)

Algorytm Dijkstry, minimalna droga do v

6

to v

1

v

2

v

4

v

6

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

(43)

Algorytm Dijkstry, minimalna droga do v

8

to v

1

v

2

v

4

v

7

v

8

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

(44)

Algorytm Dijkstry, minimalna droga do v

3

to v

1

v

2

v

3

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

(45)

Algorytm Dijkstry, minimalna droga do v

9

to v

1

v

2

v

3

v

9

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

(46)

Algorytm Dijkstry, z v

1

do v

5

nie 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

(47)

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).

(48)

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)

(49)

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

(50)

Algorytm Dijkstry, minimalna droga do v

2

to v

1

v

2

v1

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

(51)

Algorytm Dijkstry, minimalna droga do v

4

to v

1

v

2

v

4

v1

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

(52)

Algorytm Dijkstry, minimalna droga do v

7

to v

1

v

2

v

4

v

7

v1

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

(53)

Algorytm Dijkstry, minimalna droga do v

3

to v

1

v

2

v

4

v

3

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 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

(54)

Algorytm Dijkstry, minimalna droga do v

6

to v

1

v

2

v

4

v

6

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 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

(55)

Algorytm Dijkstry, minimalna droga do v

8

to v

1

v

2

v

4

v

7

v

8

v1

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

(56)

Algorytm Dijkstry, minimalna droga do v

9

to v

1

v

2

v

4

v

7

v

8

v

9

v1

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

(57)

Algorytm Dijkstry, minimalna droga do v

5

to v

1

v

2

v

4

v

3

v

5

v1

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

Cytaty

Powiązane dokumenty

Jeśli szczęśliwie jako rozwiązanie optymalne naszego programu liniowego dostaniemy same zera i jedynki, to będą one definiowały pewną trasę, która musi być optymalna,

Łącząc środki sąsiednich kwadratów siatki, otrzymujemy 11 grafów w jednym kawałku i bez pętelek (czyli spójnych i bez cykli ) – takie grafy nazywamy drzewami.. Które

Ponieważ brakowało funduszy, aby utrzymać silną armię na całym terytorium imperium, Konstantyn wprowadził zasadę, aby każde ważne strategicznie miejsce, w którym nie

Je´sli d jest cyklem Hamiltona w gra…e G, to cykl ten ÷¾ aczy wszystkie wierzcho÷ ki grafu, czyli graf jest spójny.. Ponadto dowolny wierzcho÷ ek nale· zy do tego cyklu, czyli

Graf prosty G nazywamy grafem Hamiltonowskim, jeżeli istnieje cykl przechodzący przez każdy wierzchołek dokładnie raz. Przykład: Cykl Hamiltona w grafie dwuna- stościanu -

[r]

W grafie podanym na rysunku zaznaczono jego

(i) dowolne dwie maksymalne ścieżki w grafie spójnym G mają niepuste przecięcie, (ii) przecięcie wszystkich maksymalnych ścieżek w drzewie T jest niepuste.. Zadanie