Post on 25-Feb-2021
TEORIA GRAFÓW
Podstawowe de�nicje:
• Graf (nieskierowany) G = (V, E) � struktura skªadaj¡ca si¦ ze:
� zbioru wierzchoªków V = {v1, v2, . . . , vn} oraz
� zbioru kraw¦dzi E = {e1, e2, . . . , em}.
Z ka»d¡ kraw¦dzi¡ e skojarzona jest para wierzchoªków incydentnych
(u, v). Analiz¦ algorytmów grafowych mo»emy ograniczy¢ do przypad-
ków, w których para wierzchoªków jednoznacznie identy�kuje kraw¦d¹.
• Graf skierowany � dla ka»dej kraw¦dzi (oznaczanej tutaj jako ªuk) para
wierzchoªków incydentnych jest par¡ uporz¡dkowan¡ {u, v}.Zatem w gra�e skierowanym {u, v} 6= {v, u} ({u, v} i {v, u} oznacza dwa
ró»ne ªuki, podczas gdy w gra�e nieskierowanym (u, v) i (v, u) to ta
sama kraw¦d¹, tzn. (u, v) = (v, u)).
• Ka»dej kraw¦dzi (ªukowi) b¦dziemy przypisywa¢ wag¦ (liczb¦), repre-
zentuj¡c¡ (w zastosowaniach praktycznych) np. dªugo±¢ drogi, koszt
budowy drogi, czas lub koszt przejazdu, niezawodno±¢ poª¡czenia, praw-
dopodobie«stwo przej±cia, przepustowo±¢.
• Rozmiar grafu b¦dziemy identy�kowa¢ przez liczb¦ wierzchoªków n
oraz liczb¦ kraw¦dzi (ªuków) m.
Przykłady grafów o rozmiarze n = 6 i m = 8
graf nieskierowany:
v1
v5
v4
v3
v2
v6
3
8
9
48
45
graf skierowany:
v1
v5
v4
v3
v2
v6
3 9
4 – 8
45
3
3
5
Struktury grafowe
Macierz wag � tablica 2-wymiarowa o rozmiarze n× n, w której warto±¢
na przeci¦ciu i-tego wiersza i j-tej kolumny oznacza wag¦ kraw¦dzi (i, j)
(ªuku {i, j}).
Je±li dany graf nie zawiera kraw¦dzi (i, j) to w odpowiadaj¡cej jej komórce
macierzy wpisujemy warto±¢ ∞. Warto±ci wyró»nione (zera, warto±ci uje-
mne, niesko«czono±ci, znaki nienumeryczne) znajduj¡ si¦ te» na przek¡tnej
macierzy (brak kraw¦dzi typu (i, i)).
Zauwa»my równie», »e macierz dla grafu nieskierowanego jest zawsze syme-
tryczna (w takim wypadku mo»na równie» przechowywa¢ tylko poªow¦ ma-
cierzy).
Zaj¦to±¢ pami¦ci � O(n2).
Lista kraw¦dzi � tablica 2-wymiarowa o rozmiarze m× 3 (lub 3 tablice
liniowe o dªugo±ci m), gdzie pierwsza kolumna (tablica) zawiera wierzchoªki
pocz¡tkowe, druga kolumna (tablica) � wierzchoªki ko«cowe, a trzecia ko-
lumna (tablica) � wagi wszystkich kraw¦dzi grafu. Kraw¦dzie nieistniej¡ce
nie musz¡ by¢ tutaj przechowywane.
Zaj¦to±¢ pami¦ci � O(m).
Przykłady struktur grafowych
3
8
9
48
45
5
[1]
[6]
[5]
[4]
[3]
[2]
[1] [2] [3] [4] [5] [6]
[1] – 5 3 4 8 9
[2] 5 – ∞ 4 ∞ 8
[3] 3 ∞ – ∞ 5 ∞
[4] 4 4 ∞ – ∞ ∞
[5] 8 ∞ 5 ∞ – ∞
[6] 9 8 ∞ ∞ ∞ –
Macierz wagA B W
(1) [1] [2] 5
(2) [1] [3] 3
(3) [1] [4] 4
(4) [1] [5] 8
(5) [1] [6] 9
(6) [2] [4] 4
(7) [2] [6] 8
(8) [3] [5] 5
Lista krawędzi
Poª¡czone listy s¡siadów � struktura skªadaj¡ca si¦ z tablicy n list, gdzie
lista dowi¡zana do komórki i-tej zawiera wszystkie kraw¦dzie incydentne z
wierzchoªkiem i-tym (waga kraw¦dzi i oznaczenie wierzchoªka).
Zauwa»my, »e w przypadku grafu nieskierowanego ka»da kraw¦d¹ (i, j) wy-
st¦puje w tej strukturze 2 razy � w li±cie i-tej oraz j-tej.
Zalet¡ struktury jest to, »e wszystkie kraw¦dzie (ªuki) z danego wierzchoªka
mamy zgrupowane w jednym miejscu (s¡ dost¦pne bez konieczno±ci prze-
szukiwania caªego grafu).
Zaj¦to±¢ pami¦ci � O(n + m).
P¦k wyj±ciowy � odmiana poprzedniej struktury dla sytuacji, gdy nie wy-
konujemy na gra�e operacji dodawania / usuwania kraw¦dzi. Skªada si¦ z
3 tablic � pierwszej o dªugo±ci n oraz dwóch o dªugo±ci m.
Dwie ostatnie tablice zawieraj¡ odpowiednio etykiety wierzchoªków ko«co-
wych i wagi wszystkich kraw¦dzi, pogrupowane w zbiory ze sob¡ incydentne,
a pierwsza tablica (odpowiadaj¡ca wierzchoªkom pocz¡tkowym) zawiera
wska¹niki rozdzielaj¡ce poszczególne grupy (np. je±li wierzchoªek 1 ma
5 kraw¦dzi incydentnych, to komórki [1] i [2] pierwszej tablicy zawieraj¡
odpowiednio wska¹niki na komórki [1] i [6] tablicy drugiej).
Struktura posiada zalet¦ struktury wcze±niejszej � zgrupowanie kraw¦dzi
incydentnych poszczególnych wierzchoªków, przy braku typów wska¹niko-
wych.
Zaj¦to±¢ pami¦ci � O(n + m).
[1]
[5]
[4]
[3]
[2]
[6]
3 9
4– 8
45
3
3
Przykłady struktur grafowych (c.d.)
[1]
[2]
[3]
[4]
[5]
[6]
[2] 5
Połączone listy sąsiadów
[3] 3 [4] 4 [6] 9
[1] 3 [6] -8
[1] 3
[2] 4
[1] 1[2] 5[3] 7[4] 8[5] -1[6] -1
Pęk wyjściowy
B W
[2] 5 (1)
[3] 3 (2)
[4] 4 (3)
[6] 9 (4)
[1] 3 (5)
[6] -8 (6)
[1] 3 (7)
[2] 4 (8)
Dalsze de�nicje
Droga (±cie»ka) z wierzch. v1 do vk w gra�e skierowanym G to ci¡g ªuków{{v1, v2}, {v2, v3}, . . . , {vk−1, vk}}, który mo»emy jednoznacznie okre±li¢ poprostu przez ci¡g (permutacj¦) wierzchoªków, przez które droga ta prze-biega, tj. {v1, v2, . . . , vk−1, vk}.
Wag¡ drogi b¦dziemy okre±la¢ sum¦ wag ªuków j¡ tworz¡cych.
Cykl � droga zamkni¦ta, tzn. taka, »e v1 = vk.
Graf acykliczny � graf nie zawieraj¡cy cykli.
Zauwa»my, »e z wierzchoªka s do t mo»e istnie¢ wiele ró»nych dróg, zatemnajkrótsz¡ drog¡ b¦dzie ta spo±ród dróg, która ma najmniejsz¡ wag¦.
Podgraf G′ = (V ′, E′) grafu G = (V, E) to graf o rozmiarze n′ ≤ n i m′ ≤ m,dla którego V ′ ⊆ V oraz E′ ⊆ E (tzn. wszystkie wierzchoªki i ªuki G′ nale»¡do G).
Graf spójny (nieskierowany) � graf, dla którego istnieje droga mi¦dzy
ka»d¡ par¡ wierzchoªków. Spójny graf skierowany to taki, którego wersja
nieskierowana jest spójna.
Drzewo � spójny, nieskierowany graf acykliczny. W drzewie, jak w ka»dym
gra�e spójnym (nieskierowanym), istnieje droga mi¦dzy ka»d¡ par¡ wierz-
choªków. Zatem doª¡czenie nowej kraw¦dzi spowoduje powstanie cyklu,
a usuni¦cie jakiejkolwiek kraw¦dzi z drzewa spowoduje jego rozspójnienie.
Wreszcie, w drzewie m = n− 1.
Drzewo rozpinaj¡ce (spinaj¡ce) T = (V T , ET ) � podgraf (nieskierowa-
nego, spójnego) grafu G = (V, E), który jest spójny i V T = V . Graf spójny
mo»e zawiera¢ wiele (do nn−2) ró»nych drzew rozpinaj¡cych, z których to
o najmniejszej wadze nazywamy Minimalnym Drzewem Rozpinaj¡cym
(Spinaj¡cym) � MST (ang. Minimum Spanning Tree).
Przykłady dróg z wierzchołka v5 do v
6
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
Przykłady dróg z wierzchołka v5 do v
6
v1
v5
v4
v3
v2
v6
3
8
6
48
45
5
Droga D1 {v5,v
3,v
1,v
2,v
6}
Waga D1: 5+3+5+8 = 21
Przykłady dróg z wierzchołka v5 do v
6
v1
v5
v4
v3
v2
v6
3
8
6
48
45
5
Droga D1 {v5,v
3,v
1,v
2,v
6}
Waga D1: 5+3+5+8 = 21
Droga D2 {v5,v
1,v
4,v
6}
Waga D2: 8+4+6 = 18
Przykłady drzew MST
v1
v5
v4
v3
v2
v6
3
8
6
48
45
5
Drzewo MST1
Waga MST1: 3+8+4+4+6 = 25
Przykłady drzew MST
v1
v5
v4
v3
v2
v6
3
8
6
48
45
5
Drzewo MST1
Waga MST1: 3+8+4+4+6 = 25
Drzewo MST2
Waga MST2: 5+3+5+8+6 = 27
Algorytmy wyznaczania MST
Algorytm KRUSKALA (1956)
polega na doª¡czaniu kolejno kraw¦dzi w porz¡dku ich niemalej¡cych wag,
o ile doª¡czana kraw¦d¹ nie utworzy cyklu z ju» wybranymi kraw¦dziami.
Aby wyznaczy¢ zªo»ono±¢ obliczeniow¡ algorytmu, musimy znale¹¢ efek-
tywn¡ metod¦ sprawdzania, czy doª¡czana kraw¦d¹ utworzy cykl z ju»
doª¡czonymi.
Zauwa»my, »e doª¡czane kraw¦dzie nie musz¡ tworzy¢ spójnego grafu z
ju» doª¡czonymi (spójny graf na pewno otrzymujemy w pierwszym kroku �
gdy mamy doª¡czon¡ tylko 1 kraw¦d¹ � i potem mo»emy otrzyma¢ dopiero
w ostatnim kroku � gdy otrzymujemy peªne drzewo).
Zatem powy»sz¡ procedur¦ mo»emy skonstruowa¢ w ten sposób, »e two-
rzymy tablic¦ C o rozmiarze n i przy jej pomocy kolorujemy wierzchoªki.
Na pocz¡tku ka»dej komórce przypisujemy inn¡ warto±¢ (reprezentuj¡c¡ ko-
lor danego wierzchoªka), np. C[i] = i dla i = 1,2, . . . , n.
W trakcie dziaªania procedury, wierzchoªki nale»¡ce do tego samego pod-
drzewa b¦d¡ posiada¢ ten sam kolor.
Zatem na pocz¡tku ka»dy wierzchoªek nale»y do innego poddrzewa, a na
ko«cu wszystkie wierzchoªki musz¡ nale»e¢ do tego samego poddrzewa.
Gdy chcemy doª¡czy¢ powiedzmy kraw¦d¹ (u, v), to musimy rozpatrzy¢
nast¦puj¡ce przypadki:
1. �aden wierzchoªek (ani u, ani v) jeszcze nie zostaª wybrany (tzn. nie
doª¡czono jeszcze kraw¦dzi, która byªaby incydentna z u lub z v).
Zatem ka»dy z nich ma inny kolor (taki, którego nie posiada »aden inny
wierzchoªek).
Wtedy wierzchoªkowi u nadajemy kolor wierzch. v (C[u] = C[v]) lub
odwrotnie (C[v] = C[u]) � oba wierzchoªki otrzymuj¡ ten sam kolor,
a wi¦c nale»¡ od teraz do tego samego (nowego) poddrzewa. Taka
operacja oczywi±cie nie utworzy cyklu, a wi¦c jest dopuszczalna.
2. Jeden wierzch., np. u, byª ju» wcze±niej wybrany, a drugi, v, jeszcze nie.
Zatem doª¡czenie kraw¦dzi (u, v) nie spowoduje powstania cyklu.
Wtedy wierzchoªek jeszcze nie wybrany musimy doª¡czy¢ do poddrzewa,
do którego nale»y wierzchoªek u (tzn. wierzchoªkowi v przypisujemy ko-
lor wierzchoªka u: C[v] = C[u]).
3. Oba wierzchoªki ju» wcze±niej zostaªy wybrane, z tym »e nale»¡ do ró»-
nych poddrzew (wierzchoªki u i v posiadaj¡ wi¦c ró»ne kolory, podobnie
jak we wcze±niejszych przypadkach).
Zatem doª¡czenie kraw¦dzi spowoduje poª¡czenie dwóch ró»nych pod-
drzew, ale nie spowoduje to powstania cyklu. W tej sytuacji wszyst-
kie wierzchoªki jednego poddrzewa musz¡ przyj¡¢ kolor drugiego, np.
C[i] = C[v] je±li C[i] == C[u].
4. Oba wierzchoªki ju» wcze±niej zostaªy wybrane i nale»¡ do tego samego
poddrzewa (posiadaj¡ ten sam kolor).
Wtedy próbujemy doª¡czy¢ now¡ kraw¦d¹ do istniej¡cego drzewa, co �
jak ju» wiadomo � zawsze spowoduje powstanie cyklu. Zatem taka
operacja jest zabroniona.
Podsumowuj¡c powy»sze, doª¡czenie kraw¦dzi (u, v) jest zabronione
(powstanie cykl) je±li C[u] == C[v] (przypadek 4). W przeciwnym wy-
padku nale»y doª¡czy¢ kraw¦d¹ i wykona¢ operacje na tablicy C opisane
odpowiednio w punktach 1, 2 lub 3.
Oczywi±cie sprawdzenie powy»szego warunku (C[u] == C[v]) zajmie O(1)
czasu, jednak przypadek 3 mo»e w skrajnej sytuacji wymaga¢ przekolo-
rowania n− 2 wierzchoªków (przy wprowadzeniu dodatkowych zmiennych
przechowuj¡cych informacje o rozmiarze poszczególnych poddrzew, opera-
cj¦ t¡ mo»na skróci¢ do bn/2c operacji). Zatem operacja sprawdzenia, czy
doª¡czenie pojedynczej kraw¦dzi do ju» doª¡czonych spowoduje powstanie
cyklu zajmie O(n) czasu.
Teraz mo»emy wróci¢ do wyznaczenia zªo»ono±ci caªego algorytmu Kru-
skala. Zale»y ona od kilku czynników.
Je±li do przechowywania grafu wykorzystamy list¦ kraw¦dzi i przed roz-
pocz¦ciem doª¡czania kraw¦dzi posortujemy t¡ struktur¦ niemalej¡co ze
wzgl¦du na wagi (co zajmie O(m logm) czasu) to b¦dziemy mogli nast¦p-
nie analizowa¢ kraw¦dzie po kolei, za ka»dym razem stosuj¡c procedur¦
sprawdzania cyklu.
Liczba takich iteracji, oznaczmy j¡ przez p, b¦dzie si¦ zawieraªa mi¦dzy n− 1(»adna z analizowanych kraw¦dzi nie tworzyªa cyklu) a m (dopiero ostatniakraw¦d¹ spowodowaªa doª¡czenie wszystkich wierzchoªków i zespójnieniepoddrzew). Zatem zªo»ono±¢ takiej wersji algorytmu Kruskala wyniesieO(m log m + pm).
Zauwa»my jednak, »e w przypadku grafów g¦stych (m >> n) tylko niewielkacz¦±¢ wszystkich kraw¦dzi b¦dzie analizowana. Wtedy sortowanie wszyst-kich b¦dzie niepotrzebne � zbyt rozrzutne.
Lepiej wtedy umie±ci¢ kraw¦dzie w kopcu i pobiera¢ za ka»dym razemnajkrótsz¡ z jeszcze nie doª¡czonych z korzenia.
Wtedy takie pobranie b¦dzie zajmowa¢ O(logm), a takich pobra« b¦dzie p,zatem zªo»ono±¢ caªego algorytmu wyniesie
O(p(log m + m)) = O(pm),
gdzie n ≤ p ≤ m.
Mo»liwe jest te» takie zaimplementowanie algorytmu Kruskala, »e jego zªo-»ono±¢ wyniesie O(m log m).
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
3. (v1,v
4) – 4
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
2) – cykl
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
2) – cykl
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
2) – cykl
5. (v3,v
5) – 5
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
2) – cykl
5. (v3,v
5) – 5
6. (v2,v
6) – 8
Algorytm KRUSKALA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v1,v
3) – 3
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
2) – cykl
5. (v3,v
5) – 5
6. (v2,v
6) – 8
waga MST: 24
Algorytm PRIMA (1957)
rozpoczyna si¦ od wybrania dowolnego wierzchoªka i sukcesywnym doª¡cza-niu najbli»szego s¡siada (tj. wierzchoªka, który jest poª¡czony z którym± zju» doª¡czonych kraw¦dzi¡ o najmniejszej wadze).
Dzi¦ki temu, »e w ka»dym kroku algorytmu doª¡czamy nowy wierzchoªekdo istniej¡cego poddrzewa, nigdy nie spowoduje to powstania cyklu, awszystkich iteracji b¦dzie n− 1.
Intuicyjnie, najkorzystniej jest zastosowa¢ do tego algorytmu struktury po-zwalaj¡ce na efektywne wyszukiwanie wierzchoªków incydentnych w danym,a wi¦c np. poª¡czone listy s¡siadów.
Znalezienie kolejnego wierzchoªka do doª¡czenia b¦dzie w takim wy-padku wymagaªo przejrzenia list struktury odpowiadaj¡cych wierzchoªkomju» doª¡czonym i wybraniu kraw¦dzi o najmniejszej wadze. W najgorszymwypadku b¦dzie wi¦c musieli przejrze¢ wszystkie kraw¦dzie, a wi¦c poje-
dyncza iteracja zajmie O(m) czasu.
Zatem zªo»ono±¢ caªego algorytmu Prima to O(nm).
Algorytm Prima mo»na te» zaimplementowa¢ w taki sposób, »e wierzchoªki
oczekuj¡ce na doª¡czenie umie±cimy w kolejce Q:
pocz¡tkowo zawiera ona wszystkie wierzchoªki, w ka»dej iteracji pobierany
jest dokªadnie jeden, a algorytm ko«czy dziaªanie, gdy stanie si¦ ona pusta.
Kolejk¦ t¡ mo»na zaimplementowa¢ jako kopiec, w którym warto±ci¡ w¦-
zªa jest odªegªo±¢ danego wierzchoªka od najbli»szego wierzchoªka spo±ród
ju» doª¡czonych. Warto±ci te nale»y aktualizowa¢ po ka»dym doª¡czeniu
nowego wierzchoªka, ale za to mamy od razu dost¦pn¡ informacj¦, który
wierzchoªek ma by¢ doª¡czony jako nast¦pny. Takie podej±cie umo»liwia
uzyskanie zªo»ono±ci obliczeniowej algorytmu Prima O(m log n).
Z kolei, je±li zamiast zwykªego kopca, u»yjemy kopca Fibonacciego, uzy-
skamy zªo»ono±¢ O(m + n log n).
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
3. (v1,v
4) – 4
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
3. (v1,v
4) – 4
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
3) – 3
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
3) – 3
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
3) – 3
5. (v3,v
5) – 5
Algorytm PRIMA
v1
v5
v4
v3
v2
v6
3
8
9
48
45
5
1. (v6,v
2) – 8
2. (v2,v
4) – 4
3. (v1,v
4) – 4
4. (v1,v
3) – 3
5. (v3,v
5) – 5
waga MST: 24
Algorytmy wyznaczania najkrótszych dróg
Algorytm DIJKSTRY (1959)
sªu»y do wyznaczania najkrótszych dróg z wyznaczonego w¦zªa (¹ródªa, s)
do wszystkich pozostaªych w¦zªów, w przypadku gdy wagi wszystkich ªu-
ków grafu s¡ nieujemne.
W trakcie dziaªania algorytmu, dla ka»dego w¦zªa, x, pami¦tane jest osza-
cowanie wagi najkrótszej drogi ze ¹ródªa: dsx. Przed rozpocz¦ciem dzia-
ªania algorytmu warto±ci te wynosz¡ ∞ dla wszystkich w¦zªów z wyj¡tkiem
¹ródªa, dla którego dss = 0.
W ka»dym kroku znajdowany jest w¦zeª x∗, dla którego oszacowanie to
jest minimalne i nieustalone i jest ono ustalane (oznacza to, »e dla tego
w¦zªa znale¹li±my ju» drog¦ minimaln¡).
Nast¦pnie dokonuje si¦ relaksacji wszystkich ªuków wychodz¡cych z w¦zªa
x∗, tzn. je±li aktualne oszacowanie, dsy, badanego w¦zªa y, jest wi¦ksze ni»
suma oszacowania dsx∗ oraz wagi, wx∗y, ªuku {x∗, y} to dsy = dsx∗+ wx∗y.
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 ∞ ∞ ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 ∞ ∞ ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 ∞ ∞ ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 ∞ ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 ∞ ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 ∞ ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 ∞ ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 ∞
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 8 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 8 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 8 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 8 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 8 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 12
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 9
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v6}
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v5,v
6}
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v5,v
6}
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v3,v
5,v
6}
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v3,v
5,v
6}
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v1,v
3,v
5,v
6}
Algorytm DIJKSTRY
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2Krok v
1v
2v
3v
4v
5v
6
1 0 5 3 4 8 122 0 5 3 4 7 123 0 5 3 4 7 124 0 5 3 4 7 125 0 5 3 4 7 96 0 5 3 4 7 9
Najkrótsza droga z v1 do v
6:
{ v1,v
3,v
5,v
6}
Zªo»ono±¢ obliczeniowa algorytmu Dijkstry:
Poniewa» w ka»dym kroku algorytmu ustalane jest oszacowanie jednego
w¦zªa, wi¦c wszystkich iteracji jest n.
W ka»dej iteracji nale»y wyznaczy¢ w¦zeª o najmniejszym oszacowaniu �
O(log n), je±li oszacowania w¦zªów nieustalonych b¦dziemy przechowywali
w kopcu.
W tej samej iteracji nale»y jeszcze dokona¢ relaksacji ªuków wychodz¡cych
z ustalonego � O(n).
Zatem caªkowita zªo»ono±¢ algorytmu wynosi O(n2). Mo»liwa jest jednak
taka implementacja algorytmu, aby osi¡gn¡¢ zªo»ono±¢ O(m logn).
Algorytm BELLMANA-FORDA
umo»liwia, w przeciwie«stwie do algorytmu Dijkstry, wyznaczanie najkrót-
szych dróg z wyznaczonego w¦zªa do pozostaªych przy dodatnich i ujem-
nych wagach. Warunkiem jest, aby graf nie zawieraª cykli o ujemnej
wadze, osi¡galnych ze ¹ródªa.
W algorytmie tym równie» wykorzystuje si¦ relaksacj¦ ªuków wychodz¡-
cych. Jednak »eby metod¦ t¡ mo»na byªo z powodzeniem wykorzysta¢ w
grafach z ujemnymi wagami, nale»y w ka»dej z n iteracji dokona¢ relaksacji
dla wszystkich m ªuków.
Prowadzi to do zªo»ono±ci O(nm).
Zauwa»my jednak, »e kolejno±¢ rozpatrywania ªuków do relaksacji mo»e
wpªywa¢ na efektywno±¢ algorytmu.
Np. w pierwszej iteracji zrelaksowanie najpierw ªuków wychodz¡cych ze
¹ródªa sprawi, »e w tej samej iteracji b¦dzie mo»liwe zrelaksowanie równie»
ªuków incydentnych do wcze±niej wspomnianych, a potem incydentnych z
tymi ostatnimi, itd.
Natomiast je±li zaczniemy relaksacj¦ od ªuków najbardziej oddalonych od
¹ródªa, to w pierwszej iteracji b¦dziemy mogli zrelaksowa¢ jedynie ªuki bez-
po±rednio wychodz¡ce ze ¹ródªa (pozostaªe zostan¡ zrelaksowane dopiero
w kolejnych iteracjach).
Oczywi±cie kolejno±¢ analizowania ªuków nie wpªywa na optymalno±¢ al-
gorytmu � ta jest gwarantowana (teoretycznie udowodniona).
W zwi¡zku z powy»szym, ide¦ algorytmu Bellmana-Forda mo»na zastoso-
wa¢ do nast¦puj¡cej implementacji.
• Tworzymy kolejk¦ w¦zªów do rozpatrzenia. Jej funkcja jest taka, »e
najpierw relaksujemy ªuki wychodz¡ce z pierwszego w¦zªa z kolejki, po-
tem z w¦zªa drugiego, itd.
• W ka»dej iteracji do kolejki doª¡czamy w¦zªy incydentne z rozpatrywa-
nym, dla których nast¡piªa poprawa i o ile ju» si¦ tam nie znajduj¡.
• Pocz¡tkowo kolejka zawiera tylko ¹ródªo, a algorytm ko«czy si¦ gdy
w kolejce nie b¦dzie ju» »adnych w¦zªów.
• Dodatkowo, wa»ne jest miejsce umieszczania w¦zªów w kolejce:
� je±li w¦zeª ju» si¦ znajduje w kolejce, to zostaje na tym miejscu;
� je±li byª ju» wcze±niej w kolejce (ale obecnie nie znajduje si¦ w niej),
to jest umieszczany na jej pocz¡tku;
� w przeciwnym wypadku tra�a na koniec.
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v1}
v1
v2
v3
v4
v5
v6
0 ∞ ∞ ∞ ∞ ∞
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = { }
v1
v2
v3
v4
v5
v6
0 ∞ ∞ ∞ ∞ ∞
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v2,v
3,v
4,v
5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 8 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v3,v
4,v
5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 8 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v3,v
4,v
5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 8 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v4,v
5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 8 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v4,v
5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 7 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 7 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v5,v
6}
v1
v2
v3
v4
v5
v6
0 5 3 4 7 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v6}
v1
v2
v3
v4
v5
v6
0 5 3 4 7 12
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = {v6}
v1
v2
v3
v4
v5
v6
0 5 3 4 7 9
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = { }
v1
v2
v3
v4
v5
v6
0 5 3 4 7 9
Algorytm BELLMANA-FORDA
v1
v5
v4
v3
v2
v6
3 12
4 7
45
3
3
8
4 2
Q = { }
v1
v2
v3
v4
v5
v6
0 5 3 4 7 9
Wyznaczenie zªo»ono±ci obliczeniowej powy»szej implementacji jest kªo-
potliwe (w¦zªy mog¡ tra�a¢ wielokrotnie do kolejki) � mo»na wyznaczy¢
nawet takie przypadki, dla których b¦dzie to zªo»ono±¢ wykªadnicza. Jednak
zazwyczaj jest to maªo realne.
Oczywi±cie optymalno±¢ algorytmu jest zachowana.
Rozpatrzmy jeszcze szczególny przypadek zagadnienia:
najkrótsza droga ze ¹ródªa do okre±lonego (pojedynczego) w¦zªa.
W takim wypadku (i przy nieujemnych wagach) przewag¦ ma algorytm
Dijkstry, gdy» mo»emy go zako«czy¢ nie po n iteracjach, ale gdy zostanie
ustalone oszacowanie w¦zªa ko«cowego (przeznaczenia).
W najgorszym wypadku mo»e to by¢ oczywi±cie ostatnia (n-ta) iteracja, ale
cz¦sto b¦dzie to która± z iteracji wcze±niejszych.
Wyznaczanie maksymalnego przepªywu w sieciach
W tym zagadnieniu wagi ªuków nie reprezentuj¡ odlegªo±ci (jak przy najkrót-
szych drogach), tylko maksymalny mo»liwy przepªyw pomi¦dzy w¦zªami (in-
formacji, pªynu, gazu, itp.). Problem polega na wyznaczeniu takich warto±ci
przepªywu pomi¦dzy w¦zªami (nie wi¦kszych ni» maksymalne), aby przepªyw
ze ¹ródªa do okre±lonego w¦zªa ko«cowego byª jak najwi¦kszy.
Algorytm FORDA-FULKERSONA
dotyczy acyklicznych grafów skierowanych. Jest to jedna z podstawowych
idei w tym zakresie.
Najogólniej, polega ona na sukcesywnym wyszukiwaniu (dowolnych)
dróg ze ¹ródªa do uj±cia (w¦zªa ko«cowego).
Mo»na to zrobi¢ w ten sposób, »e b¦d¡c w ¹ródle, wybieramy pierwszy
w¦zeª incydentny (nale»y ustali¢ kolejno±¢ w¦zªów), z niego znowu wybie-
ramy pierwszy incydentny, itd.
W efekcie, albo dotrzemy do uj±cia, albo do innego w¦zªa ko«cowego
(z którego nie ma »adnych ªuków wychodz¡cych):
• Je±li dotarli±my do w¦zªa nie b¦d¡cego uj±ciem, to cofamy si¦ do
w¦zªa poprzedzaj¡cego i wybieramy kolejny w¦zeª incydentny
(je±li trzeba, to cofamy si¦ o wi¦cej ni» 1 w¦zeª).
�uki do w¦zªów, z których si¦ wycofujemy (gdy nie mo»na z nich osi¡-
gn¡¢ uj±cia), usuwamy.
• Je±li ostatni w¦zeª jest uj±ciem, to mamy wyznaczon¡ drog¦.
Ka»dorazowo, po wyznaczeniu jakiej± drogi, znajdowany jest w niej ªuk
o najmniejszym przepªywie i dan¡ drog¡ ustalamy przepªyw o takiej wªa-
±nie warto±ci, tzn. od przepªywu ka»dego ªuku z danej drogi odejmujemy
t¡ najmniejsz¡ warto±¢.
Nast¦pnie ªuki o zerowym przepªywie usuwamy z grafu.
Algorytm ko«czy dziaªanie, gdy usuniemy wszystkie ªuki wychodz¡ce ze
¹ródªa.
Warto±¢ przepªywu maksymalnego uzyskujemy poprzez zsumowanie prze-
pªywów ze wszystkich wyznaczonych dróg.
Wykazano, »e czas dziaªania algorytmu mo»e wzrosn¡¢ do niesko«czono±ci,
je±li wybór kolejnych w¦zªów w drogach b¦dzie dowolny.
Je±li natomiast zawsze b¦dziemy wyszukiwali drogi najkrótsze (o najmniej-
szej liczbie ªuków), to uzyskamy algorytm wielomianowy O(nm2). Tak¡
wersj¦ algorytmu nazywamy algorytmem Edmondsa-Karpa (1969).
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 7
4
5
8
4 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 7
4
5
8
4 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 7
4
5
8
4 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 7
4
5
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 2
4
0
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 2
4
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 2
4
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 2
4
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 2
4
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
3
4 2
4
8
4 2 Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
1
4 2
4
8
2 0 Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
1
4 2
4
8
2Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
1
4 2
4
8
2Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
1
4 2
4
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
4 2
4
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
4 2
4
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
4 2
4
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
2 0
2
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
2
2
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
2
2
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
2
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
v1
v5
v4
v3
v2
v6
8
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
Algorytm FORDA-FULKERSONA
Przepływy:
F(v1,v
2,v
6) = 5
F(v1,v
3,v
5,v
6) = 2
F(v1,v
4,v
2,v
6) = 2
v1
v5
v4
v3
v2
v6
3
4 7
4
5
8
4 2
Maks. przepływ = 9