Wykład 7. Algorytmy grafowe

Podobne dokumenty
Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

Ogólne wiadomości o grafach

MATEMATYKA DYSKRETNA - MATERIAŁY DO WYKŁADU GRAFY

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Algorytmiczna teoria grafów

Algorytmy grafowe. Wykład 1 Podstawy teorii grafów Reprezentacje grafów. Tomasz Tyksiński CDV

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Sortowanie topologiczne skierowanych grafów acyklicznych

a) 7 b) 19 c) 21 d) 34

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

Algorytm Dijkstry znajdowania najkrótszej ścieżki w grafie

Matematyka dyskretna

Matematyczne Podstawy Informatyki

Digraf o V wierzchołkach posiada V 2 krawędzi, zatem liczba różnych digrafów o V wierzchołkach wynosi 2 VxV

Drzewa. Jeżeli graf G jest lasem, który ma n wierzchołków i k składowych, to G ma n k krawędzi. Własności drzew

Graf. Definicja marca / 1

Złożoność obliczeniowa klasycznych problemów grafowych

Podstawowe pojęcia dotyczące drzew Podstawowe pojęcia dotyczące grafów Przykłady drzew i grafów

Algorytmy grafowe. Wykład 2 Przeszukiwanie grafów. Tomasz Tyksiński CDV

Matematyczne Podstawy Informatyki

Digraf. 13 maja 2017

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

Matematyka dyskretna. Andrzej Łachwa, UJ, B/14

Matematyczne Podstawy Informatyki

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

. Podstawy Programowania 2. Grafy i ich reprezentacje. Arkadiusz Chrobot. 9 czerwca 2016

Wykład 10 Grafy, algorytmy grafowe

TEORIA GRAFÓW I SIECI

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

Podstawy Programowania 2 Grafy i ich reprezentacje. Plan. Wstęp. Teoria grafów Graf skierowany. Notatki. Notatki. Notatki. Notatki.

Matematyka dyskretna - 7.Drzewa

E: Rekonstrukcja ewolucji. Algorytmy filogenetyczne

TEORETYCZNE PODSTAWY INFORMATYKI

G. Wybrane elementy teorii grafów

Teoria grafów podstawy. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Programowanie obiektowe

SPÓJNOŚĆ. ,...v k. }, E={v 1. v k. i v k. ,...,v k-1. }. Wierzchołki v 1. v 2. to końce ścieżki.

Kolorowanie wierzchołków Kolorowanie krawędzi Kolorowanie regionów i map. Wykład 8. Kolorowanie

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Wstęp do Programowania potok funkcyjny

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

. Podstawy Programowania 2. Algorytmy dfs i bfs. Arkadiusz Chrobot. 2 czerwca 2019

Programowanie dynamiczne i algorytmy zachłanne

Grafy i Zastosowania. 9: Digrafy (grafy skierowane) c Marcin Sydow

Algorytm DFS Wprowadzenie teoretyczne. Algorytm DFS Wprowadzenie teoretyczne. Algorytm DFS Animacja. Algorytm DFS Animacja. Notatki. Notatki.

Algorytmy z powracaniem

Czy istnieje zamknięta droga spaceru przechodząca przez wszystkie mosty w Królewcu dokładnie jeden raz?

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Algorytmy wyznaczania centralności w sieci Szymon Szylko

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Wstęp do sieci neuronowych, wykład 12 Łańcuchy Markowa

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Wstęp do sieci neuronowych, wykład 11 Łańcuchy Markova

Podstawowe własności grafów. Wykład 3. Własności grafów

Algebrą nazywamy strukturę A = (A, {F i : i I }), gdzie A jest zbiorem zwanym uniwersum algebry, zaś F i : A F i

Ilustracja S1 S2. S3 ściana zewnętrzna

Lista 0. Kamil Matuszewski 1 marca 2016

Działanie algorytmu oparte jest na minimalizacji funkcji celu jako suma funkcji kosztu ( ) oraz funkcji heurystycznej ( ).

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA

(4) x (y z) = (x y) (x z), x (y z) = (x y) (x z), (3) x (x y) = x, x (x y) = x, (2) x 0 = x, x 1 = x

Marek Miszczyński KBO UŁ. Wybrane elementy teorii grafów 1

Algorytmy i Struktury Danych.

WSTĘP DO INFORMATYKI. Grafy i struktury grafowe

Teoria grafów dla małolatów. Andrzej Przemysław Urbański Instytut Informatyki Politechnika Poznańska

Programowanie obiektowe

Wykłady z Matematyki Dyskretnej

Temat: Struktury danych do reprezentacji grafów. Wybrane algorytmy grafowe.

7. Teoria drzew - spinanie i przeszukiwanie

Algorytmiczna teoria grafów

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Wstęp do Programowania potok funkcyjny

AiSD zadanie trzecie

Lista 4. Kamil Matuszewski 22 marca 2016

Grafy dla każdego. dr Krzysztof Bryś. Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska.

6. Wstępne pojęcia teorii grafów

TEORIA GRAFÓW I SIECI

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Suma dwóch grafów. Zespolenie dwóch grafów

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Egzamin, AISDI, I termin, 18 czerwca 2015 r.

TEORIA GRAFÓW I SIECI

TEORETYCZNE PODSTAWY INFORMATYKI

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

DWA ZDANIA O TEORII GRAFÓW. przepływ informacji tylko w kierunku

Sieć (graf skierowany)

Drzewa poszukiwań binarnych

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Minimalne drzewa rozpinające

Wstęp do programowania

E ' E G nazywamy krawędziowym zbiorem

Transkrypt:

Wykład Algorytmy grafowe

Algorytmy grafowe i podstawowe algorytmy przeszukiwania Problem Definicje i własności Reprezentacja Przeszukiwanie wszerz (Breadthirst Search) Przeszukiwanie w głąb (Depthirst Search) Sortowanie topologiczne Literatura Cormen, Leiserson, Rivest, Wprowadzenie do algorytmów, rozdział

Problem Wiele zjawisk może być opisanych poprzez binarne relacje pomiędzy obiektami: Wszelkiego typu mapy drogowe i plany Odsyłacze w stronach WWW Graf jest abstrakcyjną strukturą opisującą takie binarne relacje pomiędzy elementami. Bardzo dużo problemów można sprowadzić do rozwiązywania zadań grafowych: najkrótszej ścieżki, połączenia pomiędzy węzłami, minimalnego drzewa rozpinającego, etc.

Przykład zastosowania Siatka połączeń lotniczych każdy wierzchołek reprezentuje miasto. każda krawędź reprezentuje bezpośrednie połączenie lotnicze pomiędzy miastami. pytanie o bezpośrednie połączenie = pytanie czy istnieje krawędź. pytanie o połączenie = czy istnieje droga z A do B. z połączeniami możemy powiązać koszty (grafy ważone), wtedy sensowne staje się pytanie o najtańsze połączenie z A do B.

Przykład: odnajdowanie właściwego połączenia w metrze Stacje są wierzchołkami Połączenia pomiędzy stacjami są krawędziami Najkrótsza droga= najmniejsza odległość, najmniejszy czas. Stacje, do których można dojechać (osiągalne).

Graf: definicja Grafem nazywamy parę G = (V,E), gdzie V = {v,.. v n } jest zbiorem wierzchołków, E = {e,.. e m } jest zbiorem krawędzi. Krawędź e k = (v i,v j ) łączy dwa wierzchołki v i i v j ze zbioru V. Krawędzie mogą być skierowane lub nie (uporządkowane lub nieuporządkowane): e ij : v i v j lub e ij : v i > v j Graf G nazywamy skończonym jeśli V i E są skończone. Przez rozmiar grafu G rozumiemy G = V + E.

Przykłady Niech V = {,,,,,} Graf skierowany Graf nieskierowany

Grafy z wagami (ważone) Grafem ważonym nazywamy graf dla którego każda krawędź ma przypisaną wagę (koszt) c(v i, v j ) >. Każdy graf można uważać za graf ważony (dla każdej krawędzi przypisujemy wagę ). Jeśli dwa wierzchołki nie są połączone to można je traktować jako połączone z wagą. Koszt ścieżki: suma kosztów poszczególnych krawędzi c k ( p) = c( v, ) i v i i=

Grafy skierowane W grafie skierowanym krawędzie są skierowane tj. e = (u,v) zaczyna się w u i kończy w v (v jest połączone z u). Dopuszczalne jest połączenie wierzchołka z samym sobą e = (u,u) Stopień wchodzący (indegree) d in (v) dla wierzchołka v jest ilością krawędzi wchodzących do v. Odpowiednio stopień wychodzący (outdegree) d out (v) dla wierzchołka v jest ilością krawędzi wychodzących z v. Σd in (v i ) = Σd out (v i ) Ścieżka z u do v w grafie G = (V,E) o długości k jest sekwencją wierzchołków <u = v,v,, v k = v> takąże dla i =,,k para (v i,v i ) należy do E.

Grafy nieskierowane W grafie nieskierowanym krawędź e = (u,v) łączy wierzchołki u i v. Grafy nieskierowane nie mogą mieć połączeń wierzchołka z samym sobą Połączenie jest relacją symetryczną: jeśli e = (u,v) to u jest sąsiadem v oraz v jest sąsiadem u. Stopień wierzchołka d(v) jest ilością jego sąsiadów Σd(v i ) = E. Określenie ścieżki w grafie tak samo jak dla grafu skierowanego.

erminologia Cyklem nazywamy ścieżkę, która rozpoczyna się i kończy w tym samym wierzchołku. Grafem spójnym nazywamy nieskierowany graf dla którego istnieje ścieżka pomiędzy dwoma dowolnymi wierzchołkami (każdy wierzchołek jest osiągalny, z każdego innego wierzchołka). Grafem silnie spójnym nazywamy graf skierowany, dla którego dla każdych dwóch wierzchołków u i v istnieje droga z u do v oraz z v do u. Graf G = (V,E ) jest podgrafem G = (V,E), jeśli G G jeśli V V oraz E E.

Rozmiar grafu Istnieje co najwyżej E = O( V ) krawędzi w grafie. Dowód: każdy węzeł może występować w co najwyżej V krawędziach. Graf dla którego E = V nazywamy kliką (każde dwa wierzchołki są połączone krawędzią). W każdym spójnym grafie jest co najmniej E V krawędzi. Dowód: przez indukcje dla V. Graf planarny (graf płaski) graf, który da się narysować na płaszczyźnie tak, by łuki obrazujące krawędzie grafu nie przecinały się. Dla grafu planarnego mamy E = O( V ). Dwa minimalne grafy, które nie są planarne, to K i K,. wierdzenie Kuratowskiego () mówi, że graf skończony jest planarny wtedy i tylko wtedy, gdy nie zawiera podgrafu homeomorficznego z grafem K ani z grafem K,.

ypy ścieżek Ścieżkę nazywamy prostą jeżeli żaden wierzchołek nie występuje w niej więcej niż raz Składa się z różnych wierzchołków Ścieżkę nazywamy cyklem wtedy i tylko wtedy jeśli v = v k. Rozpoczyna się i kończy w tym samym wierzchołku! W ścieżkach zawierających cykl jako podścieżkę wierzchołki mogą pojawiać się kilkakrotnie.

ypy ścieżek przykłady. {a,c,f,e} ścieżka prosta, L =. {a,b,d,c,f,e} ścieżka prosta, L =. {a,c,d,b,d,c,f,e} ścieżka zawiera cykl {d,b,d}. {a,c,d,b,a} cykl, L =. {a,c,f,e,b,d,c,a} cykl, L =

Grafy a drzewa Drzewo jest to spójny graf, który nie zawiera cykli. Drzewo ma E = V krawędzi. Następujące własności są równoważne:. G jest drzewem.. G nie ma cykli; dodanie nowej krawędzi buduje cykl.. G jest spójny; po usunięciu dowolnego węzła przestaje taki być. Podobnie można podąć definicje drzewa skierowanego.

Reprezentacja grafu Mamy dwie standardowe reprezentacje grafów:. Lista sąsiedztwa: dla każdego węzła v tworzymy listę liniową L v jego sąsiadów w grafie. Rozmiar takiej reprezentacji to: Θ( V + E ).. Macierz sąsiedztwa: macierz V V, w której krawędź e = (u,v) jest reprezentowana przez niezerowe wejście (u,v). Rozmiar takiej reprezentacji to : Θ( V ). Lista sąsiedztwa jest wygodniejsza dla dla rzadkich grafów. Macierz sąsiedztwa jest wygodniejsza dla dla gęstych grafów.

Przykład: reprezentacja listą sąsiedztwa V = {,,,,,} E = {(,),(,),(,),(,)} V L i nul l

Przykład: reprezentacja macierzą sąsiedztwa V = {,,,,,} E = {(,),(,),(,),(,)} A Dla grafów nieskierowanych, A = A

Porównanie reprezentacji lista sąsiedztwa bardziej zwarta niż macierz sąsiedztwa (dobra dla rzadkich grafów) stwierdzenie czy istnieje krawędź zajmuje więcej czasu macierz sąsiedztwa zawsze wymaga Θ(n ) pamięci często marnujemy dużo pamięci szybko możemy odnaleźć informację o krawędzi

Porównanie reprezentacji macierz sąsiedztwa Lista sąsiedztwa

Porównanie reprezentacji Macierz sąsiedztwa Lista sąsiedztwa Lista krawędzi pamięć Θ(V ) Θ(V + E) Θ(E) Sprawdzenie istnienia połączenia (u, v) Θ() Ο(outdegree[u]) Ο(E) Odnajdowanie krawędzi rozpoczynających się w u Θ(V) Ο(outdegree[u]) Θ(E) Odnajdowanie krawędzi kończących się w v Θ(V) Θ(E) Θ(E) Odnalezienie wszystkich krawędzi Θ(V ) Θ(E) Θ(E)

rawersowanie grafu Odnajdowanie połączeń Mając dany graf i wierzchołek s w tym grafie. Odszukać drogi do wszystkich pozostałych wierzchołków tj. czy istnieje połączenie pomiędzy s i v Najbardziej popularne są dwa algorytmy: Breadthirst Search (BS) przeszukiwanie wszerz Odnajduje drogi (najkrótsze drogi) w grafach nieskierowanych. Odnajduje połączone wierzchołki. Depthirst Search (DS) przeszukiwanie w głąb Odnajduje drogi w grafach nieskierowanych.. Odnajduje połączone wierzchołki. Przeprowadza topologiczne sortowanie w grafach skierowanych (liniowe uporządkowanie wierzchołków, w którym jeśli istnieje krawędź skierowana prowadząca od wierzchołka x do y, to x znajdzie się przed wierzchołkiem y. Innymi słowy, każdy wierzchołek poprzedza wszystkie te wierzchołki, do których prowadzą wychodzące od niego krawędzie).

BS i problem najkrótszej ścieżki Mając dany dowolny wierzchołek s, BS odwiedza wierzchołki w porządku rosnącym (względem odległości od s). W każdym kroku, BS odwiedza wszystkie osiągalne wierzchołki o stałej odległości. W taki sposób, BS odkrywa wszystkie drogi od s do innych wierzchołków. Co oznacza termin odległość? Ilość krawędzi w ścieżce od s. Przykład s= s Wierzchołki odległe o?,,, Wierzchołki odległe o?,,, Wierzchołki odległe o?

Algorytm BS // flag[ ]: visited table

BS przykład Lista sąsiedztwa Visited able (/) source Inicjalizacja tablicy (wszystko false) Q = { } Inicjalizacja kolejki Q (pusta)

Lista sąsiedztwa Visited able (/) source Oznaczamy jako odwiedzone Q = { }

Visited able (/) Neighbors source Oznacz sąsiadów,, jako odwiedzonych Q = {} Q = {,, } Dequeue. Umieść wszystkich nieodwiedzonych sąsiadów w kolejce

Visited able (/) source Neighbors Q = {,, } Q = {,,, } Oznacz nowoodwiedzonych, Dequeue. umieść wszystkich nieodwiedzonych sąsiadów w kolejce nie umieszczana w kolejce (już odwiedzona)

Visited able (/) Neighbors source Oznacz nowoodwiedzonych, Q = {,,, } Q = {,,,, } Dequeue. dodaj do kolejki nieodwiedzonych sąsiadów. tylko i nie były jeszcze odwiedzone

source Visited able (/) Q = {,,,, } Q = {,,, } Dequeue. nie posiada nieodwiedzonych sąsiadów! Neighbors

source Visited able (/) Q = {,,, } Q = {,, } Dequeue. nie ma nieodwiedzonych sąsiadów! Neighbors

source Visited able (/) Q = {,, } Q = {, } Dequeue. nie ma nieodwiedzonych sąsiadów! Neighbors

Visited able (/) Neighbors source Oznaczamy Q = {, } Q = {, } Dequeue. dodajemy do kolejki.

Visited able (/) source Neighbors Oznaczamy Q = {, } Q = {, } Dequeue. dodajemy do kolejki

Visited able (/) source Neighbors Q = {, } Q = { } Dequeue. nie ma nieodwiedzonych sąsiadów

source Visited able (/) Q = { } Q = { } Dequeue. brak nieodwiedzonych sąsiadów Neighbors

Visited able (/) source Co osiągnęliśmy? Q = { } SOP!!! Q jest pusta!!! Wszystkie wierzchołki zostały odwiedzone. Istnieje droga od wierzchołka Do wszystkich pozostałych w grafie

Złożoność czasowa BS (z wykorzystaniem list sąsiedztwa) Przyjmijmy n = ilość wierzchołków, m = ilość krawędzi. O(n + m) Każdy wierzchołek trafia do Q (enqueued i dequeued) co najwyżej raz. Każda iteracja zajmuje czas proporcjonalny do deg(v) + ( + ze względu na dequeue).

Czas wykonania W grafie o m krawędziach suma stopni wierzchołków wynosi? Σ vertex v deg(v) = m Stąd całkowity czas działania (pętla while): O( Σ vertex v (deg(v) + ) ) = O(m+n) = O(n+m) Suma wszystkich iteracji w pętli while!

Złożoność czasowa BS (z wykorzystaniem macierzy sąsiedztwa) Przyjmijmy n = ilość wierzchołków, m = ilość krawędzi. O(n ) Odnalezienie sąsiadów v wymaga przejrzenia wszystkich elementów w wierszu. Zajmuje to czas O(n). Sumując to dla wszystkich iteracji dostajemy O(n ). Dostajemy stąd, że, BS w tej wersji ma złożoność O(n ) niezależnie od ilości krawędzi m. Dla listy sąsiedztwa mieliśmy O(n+m); Jeśli m=o(n ), (graf gęsty) to dostajemy O(n+m)=O(n ).

Odnajdowanie najlepszych dróg BS pokazuje jedynie czy istnieje połączenie ze źródła s do pozostałych wierzchołków v. Nie odnajduje ścieżki! Potrzebujemy modyfikacji algorytmu odnajdującej ścieżki Jak to zrobić? Nie wiemy które wierzchołki leżą na ścieżce dopóki nie dojdziemy do v! Ale, dla pary {w,v}, wiemy czy w był odwiedzony z v. Efektywne rozwiązanie: Wykorzystać dodatkową tablicę pred[..n] do zapamiętywania poprzedników dla każdego wierzchołka. Pred[w] = v oznacza, że w został odwiedzony z v.

BS + wyznaczanie ścieżek inicjujemy pred[v] Oznaczamy skąd przyszliśmy.

Przykład source Visited able (/) Q = { } Pred

source Visited able (/) Q = { } Pred

source Visited able (/) Q = {} Q = {,, } Oznaczamy że przyszliśmy z. Neighbors Pred Dequeue

source Visited able (/) Q = {,, } Q = {,,, } Oznaczamy, że przyszliśmy z. Dequeue. Neighbors Pred

source Visited able (/) Q = {,,, } Q = {,,,, } Przyszliśmy z Dequeue. Neighbors Pred

source Visited able (/) Q = {,,,, } Q = {,,, } Dequeue. nie ma nieodwiedzonych sąsiadów! Neighbors Pred

source Visited able (/) Q = {,,, } Q = {,, } Dequeue. nie ma nieodwiedzonych sąsiadów! Neighbors Pred

source Visited able (/) Q = {,, } Q = {, } Dequeue. nie ma nieodwiedzonych sąsiadów! Neighbors Pred

source Visited able (/) Q = {, } Q = {, } Dequeue. Neighbors Pred

source Visited able (/) Q = {, } Q = {, } Dequeue. Neighbors Pred

source Visited able (/) Q = {, } Q = { } Dequeue. Neighbors Pred

source Visited able (/) Q = { } Q = { } Dequeue. Neighbors Pred

source Visited able (/) Q = { } SOP!!! Q jest pusta!!! ablicę Pred można teraz wykorzystać do pokazania ścieżek! Pred

Odnajdowanie ścieżek nodes visited from Algorytm rekursywny Np: Path(),, Path(),,, Path(),

BS ree Ścieżki odnalezione przez BS można przedstawić w postaci drzewa z korzeniem (nazywa się je BS tree), gdzie początkowy wierzchołek jest korzeniem. BS tree dla wierzchołka s=.

Przeszukiwanie w głąb Depthirst Search (DS) DS jest drugim popularnym algorytmem trawersowania grafów. Idea jest podobna do przechodzenia preorder (najpierw rodzic potem rekursywnie dzieci). DS może pokazać informacje o grafie które trudno uzyskać przy BS. Np. czy w grafie istnieją cykle?

Algorytm DS Algorytm DS odwiedza sąsiadów korzystając z rekurencji. Kiedykolwiek odwiedzamy v z u, rekursywnie odwiedzamy wszystkich nieodwiedzonych do tej pory sąsiadów v. Potem powracamy do u... Zauważmy: możliwe jest, że w nie był odwiedzony kiedy rekursywnie odwiedzaliśmy w, ale zostanie odwiedzony w czasie kiedy powrócimy z wywołania rekursywnego. u w v w w

Algorytm DS oznaczamy wszystkie nieodwiedzone wierzchołki Można podobnie jak poprzednio oznaczać Ścieżki przy pomocy pred[ ]. Oznaczamy węzeł jako odwiedzony. Dla wszystkich nieodwiedzonych sąsiadów wywołaj rekursywnie RDS(w)

Przykład Visited able (/) source Pred

source Visited able (/) Oznaczamy Jako odwiedzone Pred RDS( ) teraz wywołujemy RDS()

Visited able (/) source RDS( ) RDS() już odwiedzone, wywołujemy RDS() Rekursywne wywołanie odwiedzone Pred Pred[] oznaczone

Visited able (/) source Pred Oznaczamy jako odwiedzone i Pred[] RDS( ) RDS() Rekursywne RDS() > brak nieodwiedzonych sąsiadów, powrót do RDS() wywołanie

source Visited able (/) Pred RDS( ) RDS() teraz odwiedzamy > RDS() powrót do Rekursywne wywołanie

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() > odwiedzamy, RDS() Ozn. i Pred[] Pred

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() odwiedzamy RDS() Pred Oznaczamy i Pred[]

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() odwiedzamy RDS() Pred Oznaczamy i Pred[]

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() Pred Oznaczamy i Pred[] RDS() RDS() RDS() SOP wszyscy sąsiedzi są już odwiedzeni wracamy do RDS()

Visited able (/) source Powrót do Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() odwiedzamy > RDS() Pred

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() RDS() już odwiedzone, wracamy do > RDS() Pred Oznaczamy i Pred[]

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() RDS() RDS() odwiedzamy > RDS() Pred Oznaczamy i Pred[]

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() RDS() RDS() Pred Oznaczamy i Pred[] RDS() > Stop brak nieodwiedzonych sąsiadów

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() RDS() RDS() > Stop Pred

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() RDS() > Stop Pred

Visited able (/) source Rekursywne wywołanie RDS( ) RDS() RDS() RDS() RDS() > Stop Pred

Visited able (/) Pred RDS( ) RDS() RDS() RDS() > Stop source Rekursywne wywołanie

Visited able (/) Pred RDS( ) RDS() RDS() > Stop source Rekursywne wywołanie

Visited able (/) Pred RDS( ) RDS() > Stop source Rekursywne wywołanie

Visited able (/) Pred RDS( ) > Stop Rekurencyjne wywołania zakończone source

Odnajdowanie ścieżek przy pomocy DS Visited able (/) Pred Np. Path() > Path() > Path() > source

Drzewo DS Otrzymujemy w taki sposób drzewo ścieżek (DStree). Warto zauważyć, że jest ono znacznie głębsze niż dla BS. Odzwierciedla on strukturę wywołań rekurencyjnych. kiedy odwiedzamy sąsiada w wierzchołka v, dodajemy w jako dziecko v. kiedy DS powraca z wierzchołka v, powracamy do rodzica v.

Złożoność czasowa DS (z zastosowaniem list sąsiedztwa) Nigdy nie odwiedzamy wierzchołka więcej niż raz. Musimy zatem sprawdzić wszystkie wierzchołki grafu. Wiemy, że Σ vertex v degree(v) = m, gdzie m jest ilością krawędzi. Dla każdego z wierzchołków zabiera to czas proporcjonalny do deg(v) +. Stąd czas wykonania DS jest proporcjonalny do sumy ilości wierzchołków i krawędzi (tak jak dla BS). O(n + m) gdzie n ilość wierzchołków, m ilość krawędzi. Inny zapis: O( v + e ) v = ilość wierzchołków (n) e = ilość krawędzi (m)

Zastosowania grafów: połączenia G = L N P O Q R M A D C E s Jak stwierdzić czy dwa wierzchołki są połączone? G B K Czy A jest połączone z? Czy A jest połączone z L? H

Problem połączeń Graf nazywamy spójnym jeśli dla każdej pary wierzchołków istnieje droga łącząca je. niespójny spójny Jak można stwierdzić czy graf jest spójny? Wykorzystać BS lub DS (wybierając dowolnie jakiś wierzchołek jako początek). Jeśli odwiedziliśmy wszystkie wierzchołki to graf jest spójny. Czas takiej procedury? O(n + m)

Spójne składowe

Spójne składowe Spójną składową grafu jest maksymalny spójny podgraf tego grafu. Zbiór spójnych składowych jest jednoznaczny dla każdego grafu. Przykład: poniższy graf można jednoznacznie przedstawić w postaci sumy spójnych podgrafów: C, C i C.

Odnajdowanie spójnych składowych Odnajdujemy wszystkie wierzchołki połączone z v => tworzą jedną spójną składową Zwykły DS

Złożoność czasowa dla każdego z podgrafów (i=,, ): O ( n + m i i ) Stąd dla całego grafu: O( n + = + i mi ) O( ni mi ) = O( n + i i i m)

Grafy skierowane W grafie skierowanym krawędzie są skierowane tj. e = (u,v) zaczyna się w u i kończy w v (v jest połączone z u). Dopuszczalne jest połączenie wierzchołka z samym sobą e = (u,u) Stopień wchodzący (indegree) d in (v) dla wierzchołka v jest ilością krawędzi wchodzących do v. Odpowiednio stopień wychodzący (outdegree) d out (v) dla wierzchołka v jest ilością krawędzi wychodzących z v. Σd in (v i ) = Σd out (v i ) Ścieżka z u do v w grafie G = (V,E) o długości k jest sekwencją wierzchołków <u = v,v,, v k = v> takąże dla i =,,k para (v i,v i ) należy do E.

Reprezentacja grafów skierowanych Można korzystać zarówno z macierzy sąsiedztwa, jak i z list sąsiedztwa. do z

Skierowane grafy acykliczne Skierowana ścieżka jest sekwencją wierzchołków (v, v,..., v k ). Cykl skierowany jest skierowanąścieżką o tożsamym początku i końcu. Graf skierowany jest acykliczny jeśli nie zawiera cykli skierowanych.

Indegree i Outdegree W wypadku grafów skierowanych nie można po prostu mówić o stopniu wierzchołka deg(v) Zamiast tego będziemy mówić o ilości krawędzi wchodzących Indegree(v) oraz wychodzących z wierzchołka Outdegree(v) Każdej krawędź arc(u,v) będzie liczona razy: jako outdegree dla u oraz indegree dla v. vertex v indegree( v) = outdegree( v) = m vertex v

Obliczanie Indegree i Outdegree Outdegree łatwo obliczyć Przeglądamy listę adj[v] i liczymy sąsiadów. Obliczanie Indegree Rozpoczynamy od indegree[v]= dla każdego wierzchołka v. Przeglądamy listy adj[v] dla każdego v. Dla każdego odnalezionego wierzchołka: indegree[w]++; Czas wykonania: O(n+m).

Przykład Indeg()? Indeg()? Outdeg()? Ilość krawędzi? m = outdegree? indegree?

Zastosowanie grafów skierowanych Grafy skierowane często wykorzystuje się do reprezentacji zadań wzajemnie zależnych. j. takich że każde następne może rozpocząć się dopiero po zakończeniu innego. Zależności takie mogą być modelowane poprzez krawędzie skierowane (arc). arc (i,j) oznacza, że zadanie j nie może rozpocząć się przed zakończeniem zadania i. i j Oczywiście, żeby praca się zakończyła taki graf nie może być cykliczny.

Sortowanie topologiczne liniowe uporządkowanie wierzchołków, w którym jeśli istnieje krawędź skierowana prowadząca od wierzchołka x do y, to x znajdzie się przed wierzchołkiem y. Innymi słowy, każdy wierzchołek poprzedza wszystkie te wierzchołki, do których prowadzą wychodzące od niego krawędzie. Wierzchołki w każdym grafie acyklicznym skierowanym można posortować topologicznie na jeden lub więcej sposobów. np.

Algorytm sortowania topologicznego Zauważmy: Punkt startowy musi posiadać indegree równe. Jeśli takiego wierzchołka nie ma gram nie jest acykliczny Algorytm:. Jeśli indegree dla wierzchołka wynosi zero można od niego zacząć (wypisujemy).. Jeśli wierzchołek i został wypisany to krawędzie wychodzące z niego nie są już potrzebne możemy usunąć wszystkie krawędzie wychodzące z i oraz samo i.. Po usunięciu z grafu wierzchołka i pozostaje on acykliczny i można rozumowanie powtórzyć.

opological Sort Znajdujemy punkt startowy redukujemy indegree(w) Wkładamy nowy start do kolejki Q

Przykład Indegree start Q = { } OUPU:

Indegree Dequeue Q = { } > usuwamy krawędzie z uaktualniamy indegree sąsiadów (,, ) OUPU:

Indegree Q = {,, } Wkładamy do kolejki wszystkie nowe punkty startowe OUPU:

Indegree Dequeue Q = {, } usuwamy krawędzie.. uaktualniamy indegree sąsiadów (, ) OUPU:

Indegree Q = {,, } Enqueue OUPU:

Indegree Dequeue Q = {, } OUPU:

Indegree Dequeue Q = {,, } Enqueue OUPU:

Indegree Dequeue Q = {, } OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = {, } Enqueue, OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = {, } OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = { } OUPU:

Indegree Dequeue Q = { } Enqueue. OUPU:

Indegree Dequeue Q = { } SOP brak sąsiadów OUPU:

OUPU:

Złożoność dla sortowania topologicznego Nigdy nie odwiedzamy wierzchołka więcej niż raz. Dla każdego wierzchołka, Sprawdzamy wszystkie wychodzące krawędzie, Co zabiera czas proporcjonalny do outdegree(v) +. Jeśli zsumujemy to dla wszystkich wierzchołków to dostaniemy czas O(n + m).