Grafem skierowanym D (inaczej digrafem) nazywamy parę(v, A), gdzie V jest skończonym zbiorem wierzchołków, A jest zbiorem par uporządkowanych(u, v) o elementach ze zbioru V. Elementy zbioru A nazywamy łukami digrafu. Typowe zastosowania grafów skierowanych obejmują wiele dziedzin: Obszar Wierzchołek Łuk Internet strona link Telekomunikacja telefon połączenie Łańcuch pokarmowy gatunek zależność drapieżnik-ofiara Finanse papiery wartościowe transakcja Sieć urządzenie połączenie Plan miasta skrzyżowanie ulica jednokierunkowa Projekt zadanie relacja następstwa O łuku(u, v) mówimy, że prowadzi z pierwszego do drugiego wierzchołka w parze, czyli z u do v; wierzchołek u to początek łuku, v jego koniec (kolejność wierzchołków w parze ma znaczenie - określa kierunek danego łuku!). Stopień wejścia wierzchołka w digrafie to liczba łuków wchodzących do wierzchołka, ozn. deg + (v). Stopień wyjścia to liczba łuków wychodzących z niego, ozn. deg (v). W powyższym digrafie mamy deg + ()=, deg ()=, deg + ()=, deg ()=0. Pytanie, jakie często pada przy badaniu własności digrafów: czy jeden wierzchołek jest osiagalny z drugiego? Inaczej - czy z pierwszego wierzchołka można przejść do drugiego zgodnie z kierunkiem łuków? W tym digrafie, z wierzchołka do mamy połączenie (np. ), ale nie istnieje połączenie z do.
Ścieżka w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k. Jeżeli żaden z wierzchołków ścieżki się nie powtarza, to nazywamy ją droga. Dla uproszczenia zapisu, będziemy często podawali ścieżkę (drogę) w postaci ciągu wierzchołków. Ścieżka w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k. Jeżeli żaden z wierzchołków ścieżki się nie powtarza, to nazywamy ją droga. Dla uproszczenia zapisu, będziemy często podawali ścieżkę (drogę) w postaci ciągu wierzchołków. Cyklem w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i różnych łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k, v = v k+, oraz wszystkie pozostałe wierzchołki są różne. Ścieżka w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k. Jeżeli żaden z wierzchołków ścieżki się nie powtarza, to nazywamy ją droga. Dla uproszczenia zapisu, będziemy często podawali ścieżkę (drogę) w postaci ciągu wierzchołków. Cyklem w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i różnych łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k, v = v k+, oraz wszystkie pozostałe wierzchołki są różne. Ścieżka w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k. Jeżeli żaden z wierzchołków ścieżki się nie powtarza, to nazywamy ją droga. Dla uproszczenia zapisu, będziemy często podawali ścieżkę (drogę) w postaci ciągu wierzchołków. Cyklem w digrafie D nazywamy ciąg(v, e, v, e,...,e k, v k+ ) wierzchołków i różnych łuków digrafu D, w którym e i =(v i, v i+ ), dla i=,...,k, v = v k+, oraz wszystkie pozostałe wierzchołki są różne. Droga:(,, ), cykl:(,,, ),(,, ),... ale nie jest drogą ciąg np.(,,, ). Zarówno droga (ścieżka) jak i cykl muszą uwzględniać kierunek łuków (często aby to podkreślić, mówi się, że droga (cykl) jest skierowany).
Problem wyznaczania najkrótszych ścieżek Problem: dana jest sieć połączeń, każde połączenie ma przypisany pewien koszt (np. czas, odległość, itp.). Dla ustalonego elementu sieci, jak wyznaczyć ścieżkę o najmniejszym koszcie do każdego innego elementu w sieci? Problem wyznaczania najkrótszych ścieżek Problem: dana jest sieć połączeń, każde połączenie ma przypisany pewien koszt (np. czas, odległość, itp.). Dla ustalonego elementu sieci, jak wyznaczyć ścieżkę o najmniejszym koszcie do każdego innego elementu w sieci? Model: digraf, w którym wierzchołki reprezentują elementy sieci, łuki połączenia, koszt to waga w przypisana do danego łuku. Dla ustalonego wierzchołka v digrafu chcemy wyznaczyć najkrótszą ścieżkę (czyli ścieżkę o najmniejszej wadze, rozumianej jako suma wag jej łuków) do każdego innego wierzchołka w digrafie. Problem wyznaczania najkrótszych ścieżek Problem: dana jest sieć połączeń, każde połączenie ma przypisany pewien koszt (np. czas, odległość, itp.). Dla ustalonego elementu sieci, jak wyznaczyć ścieżkę o najmniejszym koszcie do każdego innego elementu w sieci? Model: digraf, w którym wierzchołki reprezentują elementy sieci, łuki połączenia, koszt to waga w przypisana do danego łuku. Dla ustalonego wierzchołka v digrafu chcemy wyznaczyć najkrótszą ścieżkę (czyli ścieżkę o najmniejszej wadze, rozumianej jako suma wag jej łuków) do każdego innego wierzchołka w digrafie. Niech D=(V, A, w) będzie digrafem ważonym (w jest funkcją przypisującą wagi łukom digrafu). Najkrótsza ścieżka z u do v w digrafie D nazywamy ścieżkę z u do v o najmniejszej wadze w D (waga ścieżki jest definiowana jako suma wag łuków). Najkrótsza ścieżka z do w tym digrafie to (,,, ) (decyduje waga ścieżki, a nie jej długość). Problem: najkrótsze ścieżki z jednego źródła. Dla digrafu ważonego D i źródłowego wierzchołka s chcemy wskazać najkrótszą ścieżkę (o minimalnej łącznej wadze) z wierzchołka źródłowego do każdego innego, osiągalnego z s, wierzchołka digrafu.
Uwaga. jeżeli dopuszczamy ujemne wagi łuków, to najkrótsze ścieżki mogą nie być dobrze zdefiniowane. Dla przykładu, w tym digrafie mamy cykl c=(,, ), którego waga jest ujemna. Niech p będzie ścieżką z do, zawierającą łuki e, e, e. Waga p wynosi. Czy jest to najkrótsza ścieżka z do? Nie, ponieważ jeżeli przejdziemy po cyklu c, otrzymamy ścieżkę z do o mniejszej wadze, przechodząc po cyklu po raz drugi, dostajemy ścieżkę o mniejszej wadze, niż poprzednio, itd. Zatem w tym digrafie najkrótsza ścieżka z do nie jest dobrze określona. Uwaga. jeżeli dopuszczamy ujemne wagi łuków, to najkrótsze ścieżki mogą nie być dobrze zdefiniowane. Dla przykładu, w tym digrafie mamy cykl c=(,, ), którego waga jest ujemna. Niech p będzie ścieżką z do, zawierającą łuki e, e, e. Waga p wynosi. Czy jest to najkrótsza ścieżka z do? Nie, ponieważ jeżeli przejdziemy po cyklu c, otrzymamy ścieżkę z do o mniejszej wadze, przechodząc po cyklu po raz drugi, dostajemy ścieżkę o mniejszej wadze, niż poprzednio, itd. Zatem w tym digrafie najkrótsza ścieżka z do nie jest dobrze określona. e e - e e - e e e e Problem: najkrótsze ścieżki z jednego źródła. Dla digrafu ważonego D i źródłowego wierzchołka s chcemy wskazać najkrótszą ścieżkę (o minimalnej łącznej wadze) z wierzchołka źródłowego do każdego innego, osiągalnego z s, wierzchołka digrafu. Problem: najkrótsze ścieżki z jednego źródła. Dla digrafu ważonego D i źródłowego wierzchołka s chcemy wskazać najkrótszą ścieżkę (o minimalnej łącznej wadze) z wierzchołka źródłowego do każdego innego, osiągalnego z s, wierzchołka digrafu. Dalej będziemy zakładać, że w digrafie nie ma cykli o ujemnej wadze.
Problem: najkrótsze ścieżki z jednego źródła. Dla digrafu ważonego D i źródłowego wierzchołka s chcemy wskazać najkrótszą ścieżkę (o minimalnej łącznej wadze) z wierzchołka źródłowego do każdego innego, osiągalnego z s, wierzchołka digrafu. Dalej będziemy zakładać, że w digrafie nie ma cykli o ujemnej wadze. Drzewo najkrótszych ścieżek (SPT) o korzeniu w wierzchołku s definiujemy jako poddigraf D =(V, A, w ) digrafu D, gdzie V jest zbiorem wierzchołków osiągalnych z s, D jest drzewem z korzeniem s, oraz dla każdego wierzchołka v V, droga z s do v w D jest najkrótszą drogą z s do v w digrafie D. Innymi słowy, SPT dla wierzchołka s to drzewo z korzeniem w s zawierające najkrótsze ścieżki z s do wszystkich wierzchołków osiągalnych z s w digrafie D. Do rozwiązania problemu kluczowa jest obserwacja, że mając daną najkrótszą ścieżkę, każdy jej fragment też jest najkrótszą ścieżką: Lemat () Niech D=(V, A, w) będzie digrafem ważonym, p=(v,...,v k ) najkrótsza ścieżka z v do v k. Wówczas dla dowolnych i<j k, ścieżka(v i,...,v j ) jest też najkrótsza ścieżka z v i do v j. Dowód. Niech p ab oznacza fragment ścieżki p od wierzchołka v a do v b. Ścieżkę p można zdekomponować na p i, p ij oraz p jk : p v i p ij p jk vi v j v k. Wówczas w(p)=w(p i )+w(p ij )+w(p jk ). Gdyby istniała krótsza ścieżka p i między parą wierzchołków v, v i niż ścieżka p i, to biorąc taką ścieżkę zamiast p i otrzymalibyśmy ścieżkę z v do v k o mniejszej wadze, niż p, a to jest sprzeczne z wyborem p jako najkrótszej ścieżki. W analogiczny sposób dochodzimy do sprzeczności w przypadku, gdy istnieje krótsza ścieżka z v i do v j albo z v j do v k. Technika relaksacji łuku Niech dany będzie digraf D=(V, A, w), bez cykli o ujemnej wadze, wierzchołek źródłowy s. Każdemu wierzchołkowi v digrafu przypiszmy atrybut d[v] - szacunkowa długość najkrótszej drogi z s do v. Wartość d[v] jest ograniczeniem górnym dla długości najkrótszej drogi z s do v. Inicjalizujemy wartości d[v] następująco: d[s]:= 0; dla każdego wierzchołka v V, v s, d[v]:=. Relaksacja łuku(u, v) polega na sprawdzeniu, czy droga do wierzchołka v poprzez u jest krótsza, niż najkrótsza dotychczas znaleziona, i jeżeli tak, to odpowiednim poprawieniu wartości d[v], tzn. jeżeli d[v]>d[u]+w(u, v), to d[v]:= d[u]+w(u, v); w przeciwnym przypadku (gdy d[v] d[u]+w(u, v)) łuk(u, v) nazywamy niewybieralnym. Algorytm Dijkstry Niech D będzie digrafem ważonym, w którym wszystkie wagi są nieujemne. Algorytm Dijkstry wyznaczania drzewa najkrótszych ścieżek (SPT) z wierzchołka źródłowego s. Idea algorytmu: Inicjujemy wartości d[v]: dla wszystkich wierzchołków digrafu podstawiamy, dla wierzchołka źródłowego d[s]:= 0. Wybieramy wierzchołek spoza drzewa znajdujący się najbliżej wierzchołka s (tzn. taki wierzchołek u, dla którego d[u] jest najmniejsza); dodajemy u do drzewa. Dla każdego łuku(u, v) wychodzacego z u wykonujemy relaksację; jeżeli d[v]>d[u]+w(u, v), to d[v]:= d[u]+w(u, v), w przeciwnym przypadku łuk(u, v) jest niewybieralny. powtarzamy krok drugi, aż wszystkie wierzchołki znajdą się w drzewie, albo żaden z wierzchołków spoza drzewa nie będzie miał skończonej wartości d[v].
Input: digraf ważony D, wierzchołek źródłowy s. Output: drzewo najkrótszych ścieżek dla s, reprezentowane za pomocą tablicy poprzednik[]. kolejka Q jest kolejka priorytetowa, zawierajac a wierzchołki uporzadkowane wg wartości d[v] indeksowana wierzchołkami tablica poprzednik[] element poprzednik[u] przechowuje indeks wierzchołka - rodzica wierzchołka u w drzewie SPT. dla każdego wierzchołka v digrafu do d[v]:= ;. d[s]:= 0;. dodaj do kolejki Q wierzchołek s;. while kolejka Q nie jest pusta do. zdejmij pierwszy wierzchołek u z kolejki Q; //zdejmujemy z kolejki wierzchołek u, dla którego d[u] jest najmniejsze. dla każdego łuku (u,v) do 7. if d[v] > d[u] + w(u,v) then //relaksacja łuku (u,v) 8. d[v]:= d[u] + w(u,v); 9. poprzednik[v]:=u; //rodzicem dla v jest u 0. if v nie należy do Q, then dodaj v do Q; 0 0 0
0 0 0 0
0 0 Przepływy w sieciach Twierdzenie Przy wyznaczaniu drzewa SPT o korzeniu w danym wierzchołku digrafu ważonego D, bez wag ujemnych, o m łukach i n wierzchołkach, algorytm Dijkstry działa w czasie proporcjonalnym do m log n (dla najgorszego przypadku). Przykład. Rozważmy sieć kanałów (rurek), którymi płynie ciecz, przy czym przepływ cieczy jest dozwolony tylko w jedną stronę. Każdy kanał (rurka) ma określoną przepustowość (na jednostkę czasu). Model dla sieci tego typu: digraf, którego wierzchołki odpowiadają skrzyżowaniom kanałów (połączeniom rurek), natomiast łuki odpowiadają kanałom, a waga łuku odpowiada przepustowości danego kanału. Zakładamy także, że przepływ nie może się kumulować w punktach połączeń. Mając dane dwa miejsca w sieci, powiedzmy s i t, pytamy o nawiększy przepływ (na jednostkę czasu) z punktu s do t.
Przepływy w sieciach Możliwe zastosowania: badanie natężenia ruchu ulicznego (łuki - ulice, waga łuku to przepustowość danej ulicy, pytamy ile pojazdów może przejechać z punktu A do B w określonym czasie); sieci komputerowe (łuki to łącza o określonej przepustowości); sieci elektryczne (jakie jest maksymalne natężenie prądu w danej sieci, jeżeli znamy maksymalne dopuszczalne natężenia prądu dla poszczególnych przewodów); sieci transportowe (ile towarów można przesłać w danym czasie), itp. Przepływy w sieciach Sieć definiujemy jako digraf D, w którym każdy łuk e ma przypisaną liczbą rzeczywistą nieujemną c(e), nazywaną przepustowościa; mamy dokładnie jedno źródło s (czyli wierzchołek o stopniu wejścia równym 0) oraz dokładnie jedno ujście t (stopień wyjścia równy 0). Przepływ w sieci D jest to funkcja f, która każdemu łukowi e sieci przypisuje liczbę rzeczywistą f(e) (przepływ wzdłuż łuku e). Sumę przepływów wzdłuż łuków wychodzących z wierzchołka u ozn. f (u), a sumę przepływów wzdłuż łuków wchodzących do wierzchołka u ozn. f + (u). Przepływ f jest dopuszczalny, jeżeli spełnia warunki: (i) 0 f(e) c(e) dla każdego łuku e (przepustowość); (ii) f (u)=f + (u) dla każdego wierzchołka u {s, t} (zachowanie przepływu). Maksymalny przepływ w sieci Niech D będzie siecią o źródle s i ujściu t. Wartościa przepływu f, ozn. val(f), nazywamy liczbę f + (t), czyli sumę wartości przepływów wzdłuż łuków wchodzących do ujścia t. Przepływ maksymalny jest to dopuszczalny przepływ o maksymalnej wartości. Zauważmy, że jeśli przepływ f jest dopuszczalny, to f (s)=f + (t). Przepływ zerowy to przepływ o wielkości przepływu równej 0 dla każdego łuku. Łuki dla których f(e)=c(e) nazywamy nasyconymi. Maksymalny przepływ w sieci Niech D będzie siecią o źródle s i ujściu t. Wartościa przepływu f, ozn. val(f), nazywamy liczbę f + (t), czyli sumę wartości przepływów wzdłuż łuków wchodzących do ujścia t. Przepływ maksymalny jest to dopuszczalny przepływ o maksymalnej wartości. Zauważmy, że jeśli przepływ f jest dopuszczalny, to f (s)=f + (t). Przepływ zerowy to przepływ o wielkości przepływu równej 0 dla każdego łuku. Łuki dla których f(e)=c(e) nazywamy nasyconymi. s () (0) u () () () v y (0) () t Przepływ dopuszczalny f : f(s, )=f(v, t)=0, f(e)=dla pozostałych łuków. Wartość przepływu val(f) =. Wielkości przepływów wzdłuż łuków podane są w nawiasach.
Maksymalny przepływ w sieci Niech D będzie siecią o źródle s i ujściu t. Wartościa przepływu f, ozn. val(f), nazywamy liczbę f + (t), czyli sumę wartości przepływów wzdłuż łuków wchodzących do ujścia t. Przepływ maksymalny jest to dopuszczalny przepływ o maksymalnej wartości. Zauważmy, że jeśli przepływ f jest dopuszczalny, to f (s)=f + (t). Przepływ zerowy to przepływ o wielkości przepływu równej 0 dla każdego łuku. Łuki dla których f(e)=c(e) nazywamy nasyconymi. Ścieżki powiększajace Szkielet digrafu D - graf otrzymany z D po usunięciu orientacji łuków (czyli każdy łuk zastępujemy odpowiednią krawędzią). s () () u () (0) v () () t Przepływ dopuszczalny f, wartość tego przepływu val(f )=. Przepływ f jest maksymalny. Łuki nasycone to(u, v),(, y). () y Ścieżki powiększajace Ścieżki powiększajace Niech f będzie dopuszczalnym przepływem w sieci D. Ścieżkę P w grafie G, będącym szkieletem sieci D, od źródła s do ujścia t nazywamy f -powiększajac a, jeżeli dla każdej krawędzi e ścieżki P zachodzi. jeżeli krawędzi ścieżki odpowiada w sieci łuk o kierunku "zgodnym z kierunkiem ścieżki", to f(e)<c(e);. jeżeli krawędzi ścieżki odpowiada w sieci łuk o kierunku "przeciwnym do kierunku ścieżki", to f(e)>0. Niech f będzie dopuszczalnym przepływem w sieci D. Ścieżkę P w grafie G, będącym szkieletem sieci D, od źródła s do ujścia t nazywamy f -powiększajac a, jeżeli dla każdej krawędzi e ścieżki P zachodzi. jeżeli krawędzi ścieżki odpowiada w sieci łuk o kierunku "zgodnym z kierunkiem ścieżki", to f(e)<c(e);. jeżeli krawędzi ścieżki odpowiada w sieci łuk o kierunku "przeciwnym do kierunku ścieżki", to f(e)>0. Niech f (e)=c(e) f(e), jeżeli łuk e ma kierunek zgodny z P, f (e)=f(e), jeżeli łuk e ma kierunek przeciwny do P. Wówczas tolerancję ścieżki P definiujemy jako min e E(P) {f (e)}.
Ścieżki powiększajace Niech f będzie dopuszczalnym przepływem w sieci D. Ścieżkę P w grafie G, będącym szkieletem sieci D, od źródła s do ujścia t nazywamy f -powiększajac a, jeżeli dla każdej krawędzi e ścieżki P zachodzi. jeżeli krawędzi ścieżki odpowiada w sieci łuk o kierunku "zgodnym z kierunkiem ścieżki", to f(e)<c(e);. jeżeli krawędzi ścieżki odpowiada w sieci łuk o kierunku "przeciwnym do kierunku ścieżki", to f(e)>0. Niech f (e)=c(e) f(e), jeżeli łuk e ma kierunek zgodny z P, f (e)=f(e), jeżeli łuk e ma kierunek przeciwny do P. Wówczas tolerancję ścieżki P definiujemy jako min e E(P) {f (e)}. Jeżeli mamy ścieżkę f -powiększającą P, to możemy jej użyć do skonstruowania przepływu o wartości większej od val(f) o wartość równą tolerancji ścieżki P (która jest zawsze liczbą dodatnią). Ścieżki powiększajace s () (0) u () () () v y (0) () Ścieżka f -powiększająca: idziemy z wierzchołka s do, dalej do v i do t. Tolerancja tej ścieżki wynosi. Jeżeli zwiększymy przepływ wzdłuż łuków(s, ) i(v, t) o, a zmniejszymy na łuku(v, ) o, to otrzymamy przepływ f o wartości równej val(f)+=. t Lemat Niech P będzie f -powiększajac a ścieżka o tolerancji z. Wówczas jeżeli zmienimy przepływ f następujaco: na łukach o kierunkach zgodnych z P o wartość+z, na łukach przeciwnych o wartość z, to otrzymamy przepływ dopuszczalny f o wartości val(f )=val(f)+z. Lemat Niech P będzie f -powiększajac a ścieżka o tolerancji z. Wówczas jeżeli zmienimy przepływ f następujaco: na łukach o kierunkach zgodnych z P o wartość+z, na łukach przeciwnych o wartość z, to otrzymamy przepływ dopuszczalny f o wartości val(f )=val(f)+z. Dowód. Pokażemy, że f jest dopuszczalnym przepływem oraz val(f )=val(f)+z. Z definicji tolerancji mamy, że dla każdego łuku e, 0 f (e) c(e), zatem warunek (i) przepustowości jest spełniony. Trzeba pokazać, że zachodzi też warunek (ii) zachowania przepływu. Wystarczy sprawdzić wierzchołki wewnętrzne leżące na ścieżce P (dla pozostałych przepływy się nie zmieniły).
Lemat Niech P będzie f -powiększajac a ścieżka o tolerancji z. Wówczas jeżeli zmienimy przepływ f następujaco: na łukach o kierunkach zgodnych z P o wartość+z, na łukach przeciwnych o wartość z, to otrzymamy przepływ dopuszczalny f o wartości val(f )=val(f)+z. Dowód. Pokażemy, że f jest dopuszczalnym przepływem oraz val(f )=val(f)+z. Z definicji tolerancji mamy, że dla każdego łuku e, 0 f (e) c(e), zatem warunek (i) przepustowości jest spełniony. Trzeba pokazać, że zachodzi też warunek (ii) zachowania przepływu. Wystarczy sprawdzić wierzchołki wewnętrzne leżące na ścieżce P (dla pozostałych przepływy się nie zmieniły). Dla dowolnego wewnętrznego wierzchołka ścieżki P, może zajść jedna z poniższych sytuacji: Lemat Niech P będzie f -powiększajac a ścieżka o tolerancji z. Wówczas jeżeli zmienimy przepływ f następujaco: na łukach o kierunkach zgodnych z P o wartość+z, na łukach przeciwnych o wartość z, to otrzymamy przepływ dopuszczalny f o wartości val(f )=val(f)+z. Dowód. Pokażemy, że f jest dopuszczalnym przepływem oraz val(f )=val(f)+z. Z definicji tolerancji mamy, że dla każdego łuku e, 0 f (e) c(e), zatem warunek (i) przepustowości jest spełniony. Trzeba pokazać, że zachodzi też warunek (ii) zachowania przepływu. Wystarczy sprawdzić wierzchołki wewnętrzne leżące na ścieżce P (dla pozostałych przepływy się nie zmieniły). Dla dowolnego wewnętrznego wierzchołka ścieżki P, może zajść jedna z poniższych sytuacji: + + + - + + + - - + - - - + - - W każdej z nich, zmiana przepływu na łuku wchodzącym do jest taka sama, jak na łuku wychodzącym, zatem f ()=f + (). Z kolei suma przepływów na łukach wchodzących do ujścia zwiększa się o z. Niech dana będzie sieć D, niech s będzie źródłem, t będzie ujściem w D. Przekrojem[S, T] w sieci D nazywamy zbiór zawierający wszystkie łuki ze zbioru S do zbioru T, gdzie S T= V i S T= oraz s S, t T. Przepustowość przekroju[s, T] definiujemy jako sumę przepustowości łuków zawartych w[s, T], ozn. cap(s, T). Uwaga. do przekroju należą tylko te łuki, których koniec leży w zbiorze S, a początek w T, więc łuki z S do T nie mają wpływu na przepustowość tego przekroju. Niech dana będzie sieć D, niech s będzie źródłem, t będzie ujściem w D. Przekrojem[S, T] w sieci D nazywamy zbiór zawierający wszystkie łuki ze zbioru S do zbioru T, gdzie S T= V i S T= oraz s S, t T. Przepustowość przekroju[s, T] definiujemy jako sumę przepustowości łuków zawartych w[s, T], ozn. cap(s, T). Uwaga. do przekroju należą tylko te łuki, których koniec leży w zbiorze S, a początek w T, więc łuki z S do T nie mają wpływu na przepustowość tego przekroju. Twierdzenie Jeżeli f jest dopuszczalnym przepływem, natomiast[s, T] przekrojem, to val(f) cap(s, T).
Niech dana będzie sieć D, niech s będzie źródłem, t będzie ujściem w D. Przekrojem[S, T] w sieci D nazywamy zbiór zawierający wszystkie łuki ze zbioru S do zbioru T, gdzie S T= V i S T= oraz s S, t T. Przepustowość przekroju[s, T] definiujemy jako sumę przepustowości łuków zawartych w[s, T], ozn. cap(s, T). Uwaga. do przekroju należą tylko te łuki, których koniec leży w zbiorze S, a początek w T, więc łuki z S do T nie mają wpływu na przepustowość tego przekroju. Twierdzenie Jeżeli f jest dopuszczalnym przepływem, natomiast[s, T] przekrojem, to val(f) cap(s, T). Wyznaczanie maksymalnego przekroju. Algorytm Forda-Fulkersona Idea algorytmu: () zaczynamy od przepływu zerowego (który jest zawsze dopuszczalny); () mając dany przepływ dopuszczalny, szukamy ścieżki powiększającej; jeżeli taka ścieżka istnieje, to wykorzystujemy ją do skonstruowania przepływu o większej wartości; () jeżeli nie istnieje ścieżka powiększająca, to otrzymaliśmy maksymalny przepływ. Z powyższego twierdzenia wynika, że maksymalny przepływ w sieci nie może przekraczać przepustowości minimalnego przekroju. Algorytm Forda-Fulkersona (algorytm etykietujacy) Input: sieć D oraz dopuszczalny przepływ f. Output: ścieżka f-poszerzająca albo przekrój o przepustowości równej val(f). W trakcie działania algorytmu konstruujemy dwa zbiory: R, wierzchołki odwiedzone i S, wierzchołki przeszukane, S R. () R={s}, S= ; () wybieramy dowolny wierzchołek v R\S; () dla każdego łuku vw wychodzącego z v, jeżeli f(v, w)<c(v, w) i w R, to dodaj w do R; () dla każdego łuku uv wchodzącego do v, jeżeli f(u, v)>0 i u R, to dodaj u do R; każdy wierzchołek dodany do R oznaczamy jako odwiedzony i zapisujemy v jako wierzchołek, z którego dotarliśmy do () jeżeli przeszukano wszystkie łuki dla v, to dodaj v do S; (7) jeżeli ujście t R, to odtwórz ścieżkę P kończącą się w s (to ścieżka f-powiększająca); zwróć P i zakończ; (8) jeżeli R=S, to zwróć przekrój [S, S] i zakończ; (9) w przeciwnym przypadku, wróć do (). Twierdzenie Forda-Fulkersona o minimalnym przekroju i maksymalnym przepływie Twierdzenie (Ford-Fulkerson, 9) W dowolnej sieci, wartość maksymalnego dopuszczalnego przepływu jest równa minimalnej przepustowości przekroju.
Twierdzenie Forda-Fulkersona o minimalnym przekroju i maksymalnym przepływie Twierdzenie (Ford-Fulkerson, 9) W dowolnej sieci, wartość maksymalnego dopuszczalnego przepływu jest równa minimalnej przepustowości przekroju. Podany wcześniej algorytm etykietujący może zapętlić się w przypadku sieci o przepustowościach będących liczbami niewymiernymi. Można wtedy zastosować algorytm, który zaproponowali Edmonds i Karp (w roku 97), będący modyfikacją algorytmu Forda-Fulkersona. Algorytm Forda-Fulkersona w przypadku sieci o przepustowościach będących liczbami całkowitymi działa w czasieo(m val(f )), gdzie f jest maksymalnym przepływem.