Algorytmy Grafowe. dr hab. Bożena Woźna-Szcześniak, prof. UJD. Wykład 1,2,3. Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie

Podobne dokumenty
Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

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

MATEMATYKA DYSKRETNA - MATERIAŁY DO WYKŁADU GRAFY

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

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

Algorytmy i Struktury Danych.

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

Matematyczne Podstawy Informatyki

Ogólne wiadomości o grafach

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

Algorytmiczna teoria grafów

Algorytmy Grafowe. dr hab. Bożena Woźna-Szcześniak, prof. UJD. Wykład 5 i 6. Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie

Digraf. 13 maja 2017

G. Wybrane elementy teorii grafów

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

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

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

Algorytmy i Struktury Danych.

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

Wstęp do Programowania potok funkcyjny

Algorytmy z powracaniem

Matematyka dyskretna

Grafy i sieci w informatyce - opis przedmiotu

Algorytmy i Struktury Danych.

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

Sortowanie topologiczne skierowanych grafów acyklicznych

Wykład 7. Algorytmy grafowe

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

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

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

Matematyczne Podstawy Informatyki

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

Sprawozdanie do zadania numer 2

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

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

Literatura. 1) Pojęcia: złożoność czasowa, rząd funkcji. Aby wyznaczyć pesymistyczną złożoność czasową algorytmu należy:

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

Wstęp do Programowania potok funkcyjny

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

Algorytmy Grafowe. dr hab. Bożena Woźna-Szcześniak, prof. UJD. Wykład 7,8,9. Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie

Algorytmy i Struktury Danych.

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

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

Elementy teorii grafów Elementy teorii grafów

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

TEORIA GRAFÓW I SIECI

Algorytmy i Struktury Danych.

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

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

Wykład 10 Grafy, algorytmy grafowe

Graf. Definicja marca / 1

Algorytmy i Struktury Danych.

Matematyczne Podstawy Informatyki

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

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

E S - uniwersum struktury stosu

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

Spis treści. Przykład. Przykład 1 Przykład 2. Twórcy Informacje wstępne Pseudokod Przykład. 1 Grafy skierowane z wagami - przypomnienie

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

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

TEORIA GRAFÓW I SIECI

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

KARTA KURSU. Algorytmy, struktury danych i techniki programowania. Algorithms, Data Structures and Programming Techniques

Programowanie obiektowe

WSTĘP DO INFORMATYKI. Grafy i struktury grafowe

TEORIA GRAFÓW I SIECI

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych

Lista 0. Kamil Matuszewski 1 marca 2016

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

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

Drzewa poszukiwań binarnych

Programowanie obiektowe

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

Algorytmy i Struktury Danych

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

Siedem cudów informatyki czyli o algorytmach zdumiewajacych

Algorytmy wyznaczania centralności w sieci Szymon Szylko

Sieć (graf skierowany)

Grafy co o ich rysowaniu wiedzą przedszkolaki i co z tego wynika dla matematyków

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

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

Wykład 4. Droga i cykl Eulera i Hamiltona

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA Pod auspicjami Polskiej Akademii Nauk Warszawa, ul. Newelska 6, tel.

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Algorytmiczna teoria grafów

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

Ścieżki w grafach. Grafy acykliczne i spójne

Graf to nie tylko tytuł szlachecki

Droga i cykl Eulera Przykłady zastosowania drogi i cyku Eulera Droga i cykl Hamiltona. Wykład 4. Droga i cykl Eulera i Hamiltona

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

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

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

Znajdowanie wyjścia z labiryntu

Listy, kolejki, stosy

Podstawowe algorytmy i ich implementacje w C. Wykład 9

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

Teoria obliczeń i złożoność obliczeniowa

Wstęp do programowania. Zastosowania stosów i kolejek. Piotr Chrząstowski-Wachtel

Transkrypt:

Algorytmy Grafowe dr hab. Bożena Woźna-Szcześniak, prof. UJD Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie b.wozna@ujd.edu.pl Wykład 1,2,3 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 1 / 68

Cel przedmiotu Celem wykładów jest zapoznanie studentów z podstawowymi algorytmami grafowymi. Przedstawiona zostanie również ich poprawność i złożoność. Celem laboratorium jest implementacja algorytmów wprowadzonych na wykładzie. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 2 / 68

Program przedmiotu Reprezentacje grafu. Wyszukiwanie wszerz i wyszukiwanie w głab. (Silnie) spójne komponenty. Sortowanie topologiczne. Minimalne drzewo rozpinajace - Algorytmy Kruskala i Prima. Znajdowanie cyklu lub ścieżki Eulera. Algorytm Fleury ego. Znajdowanie cyklu lub ścieżki Hamiltona Problem najkrótszej ścieżki: Algorytm Floyda-Warshalla Problem najkrótszej ścieżki: Algorytm Dijkstry Problem najkrótszej ściezki: Algorytm Bellmana-Forda Test końcowy. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 3 / 68

Literatura I Cormen T.H., Leiserson Ch.E., Rivest R.L. Wprowadzenie do algorytmów. WNT, 1997 i późniejsze. Łukasz Malinowski. Implementacja wybranych algorytmów dla grafów bez wag w języku Python. http://users.uj.edu.pl/ ~ufkapano/download/lukasz_malinowski_2014.pdf Undirected Graphs: https://algs4.cs.princeton.edu/41graph/ Directed Graphs: https://algs4.cs.princeton.edu/42digraph/ B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 4 / 68

Wprowadzenie Grafy - Obszary Zastosowania Informatyka Technika 1 Fizyka Nauki społeczne Biologia Kartografia Lingwistyka i wiele innych... 1 Deo N. Teoria grafów i jej zastosowania w technice i informatyce, PWN, Warszawa 1980. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 5 / 68

Wprowadzenie Grafy - Zastosowania w Informatyce: Reprezentacja struktury programów Modelowanie systemów komputerowych Automatyczna weryfikacja systemów współbieżnych i rozproszonych Kryptografia - Szyfr Cezara, Problem Dalekopisu, Kod Graya, Kody Huffmana, kryptografia wizualna, itd. Sieci komputerowe - znajdowanie najkrótszych ścieżek i wiele innych... B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 6 / 68

Wprowadzenie Leonhard Euler Za pierwszego teoretyka i badacza grafów uważa się Leonharda Eulera 2, który rozstrzygnał tzw. zagadnienie mostów królewieckich. 2 Leonhard Euler (ur. 15 kwietnia 1707 r. w Bazylei - Szwajcaria, zm. 18 września 1783 r. w Petersburgu - Rosja) - szwajcarski matematyk, fizyk i astronom, jeden z twórców nowoczesnej matematyki. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 7 / 68

Wprowadzenie Mosty królewieckie Przez Królewiec przepływała rzeka Pregole, w której rozwidleniach znajdowały się dwie wyspy. Ponad rzeka przerzucono siedem mostów, z których jeden łaczył obie wyspy, a pozostałe mosty łaczyły wyspy z brzegami rzeki. Plan mostów pokazuje rysunek: B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 8 / 68

Wprowadzenie Mosty królewieckie Zwykłe spacerowanie szybko się znudziło mieszkańcom Królewca i zaczęli zastanawiać się, czy istnieje taka trasa spacerowa, która przechodzi przez każdy most dokładnie raz, żadnego nie omija, i pozwala wrócić do punktu wyjścia. Mieszkańcy nie potrafili rozwiazać postawionego problemu samodzielnie, więc postanowili napisać do matematyka Leonharda Eulera. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 9 / 68

Wprowadzenie Mosty królewieckie Euler wykazał, że rozwiazanie problemu mieszkańców nie jest możliwe, a decyduje o tym nieparzysta liczba wylotów mostów zarówno na każda z wysp, jak i na oba brzegi rzeki. (Jeśli wejdzie się po raz trzeci na wyspę, nie ma jak z niej wyjść). Sytuację tę można przedstawić za pomoca następujacego grafu: B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 10 / 68

Wprowadzenie Rodzaje grafów Rodzaje grafów rozważane na wykładach grafy nieskierowane (niezorientowane) grafy skierowane (zorientowane) grafy z wagami B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 11 / 68

Wprowadzenie Rodzaje grafów Rodzaje grafów rozważane na wykładach grafy nieskierowane (niezorientowane) grafy skierowane (zorientowane) grafy z wagami Inne rodzaje grafów multigrafy hipergrafy B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 11 / 68

Wprowadzenie Graf skierowany Definicja Grafem skierowanym (lub digrafem) nazywamy parę G = (V, E): V to skończony zbiór, którego elementy nazywamy wierzchołkami, E {(u, v) : u, v V } to zbiór uporzadkowanych par wierzchołków ze zbioru V, zwanych krawędziami. Możliwe jest istnienie pętli od danego wierzchołka do niego samego. Na wykładzie przyjmujemy następujace oznaczenia: n oznacza liczbę wierzchołków (rozmiar zbioru V ) m oznacza liczbę krawędzi (rozmiar zbioru E) B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 12 / 68

Wprowadzenie Graf skierowny G = (V, E) - przykład V = {A, B, C, D} E = {(A, B), (B, B), (B, C), (B, D), (C, A), (C, D), (D, C)} n = 4, m = 7 A C B D B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 13 / 68

Wprowadzenie Graf nieskierowany Definicja Grafem nieskierowanym (grafem) nazywamy parę V to zbiór wierzchołków. G = (V, E): E {{u, v} : u, v V, u v} to zbiór nieuporzadkowanych par wierzchołków, zwanych krawędziami. W grafie nieskierowanym nie moga występować pętle. Na wykładzie przyjmujemy następujace oznaczenia: n oznacza liczbę wierzchołków (rozmiar zbioru V ) m oznacza liczbę krawędzi (rozmiar zbioru E) B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 14 / 68

Wprowadzenie Graf nieskierowny G = (V, E) - przykład V = {A, B, C, D, E, F} E = {{A, B}, {A, C}, {B, C}, {B, D}, {C, D}, {E, F}} n = 6, m = 6 A C E B D F B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 15 / 68

Podstawowe pojęcia Wprowadzenie Jeśli (u, v) jest krawędzia grafu skierowanego G = (V, E), to mówimy, że krawędź (u, v) jest wychodzaca z wierzchołka u i wchodzaca do wierzchołka v. Jeśli (u, v) jest krawędzia grafu nieskierowanego G = (V, E), to mówimy, że krawędź (u, v) jest incydentna z wierzchołkami u i v. Stopień wierzchołka: W grafie skierowanym to suma stopni wejściowego (ilość krawędzi wchodzacych) i wyjściowego (ilość wychodzacych krawędzi). W grafie nieskierowanym to liczba incydentnych z nim krawędzi. Wierzchołki nazywamy sasiednimi, jeśli istnieje krawędź (skierowana lub nieskierowana) pomiędzy nimi. Wierzchołek nazywamy izolowanym, jeśli nie jest połaczony żadna krawędzia z innym wierzchołkiem. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 16 / 68

Podstawowe Pojęcia Wprowadzenie Ścieżka(Droga) o długości k z wierzchołka u do wierzchołka u w grafie G = (V, E) jest ciagiem wierzchołków (v 0, v 1, v 2,..., v k ) takich, że u = v 0, u = v k i (v i 1, v i ) E dla i = 1, 2,..., k Długość ścieżki jest liczba krawędzi ścieżki, tj. długość ścieżki (v 0, v 1,..., v k ) wynosi k 1. Ścieżka jest nazywana ścieżka prosta, jeżeli wszystkie jej wierzchołki sa różne. W grafie skierowanym ścieżka (v 0, v 1,..., v k ) tworzy cykl jeśli v 0 = v k oraz zawiera co najmniej jedna krawędź. Cykl jest prosty, jeżeli żaden wierzchołek (oprócz pierwszego) nie pojawia się w nim więcej niż raz. Pętla jest cyklem o długości 1. Graf nie zawierajacy cykli nazywamy acyklicznym. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 17 / 68

Podstawowe Pojęcia Wprowadzenie Każda spójna składowa grafu G = (V, E) jest maksymalnym podzbiorem wierzchołków U zbioru V takim, że dla dowolnych dwóch wierzchołków z U istnieje łacz aca je ścieżka w G. Jeżeli graf składa się z jednej spójnej składowej to mówimy, że jest spójny (ang. connected). Każdy graf nieskierowany można podzielić na jedna lub większa liczbę spójnych składowych (ang. connected components). Graf skierowany jest silnie spójny, jeśli każde dwa wierzchołki sa osiagalne jeden z drugiego. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 18 / 68

Wprowadzenie Spójne składowe B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 19 / 68

Wprowadzenie Spójne podgrafy B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 20 / 68

Wprowadzenie Specjalne rodzaje grafów I Graf pełny - graf nieskierowany, w którym każda para wierzchołków jest połaczona krawędzia. Graf pełny o n wierzchołkach oznacza się przez K n (poniżej K 5 ) E A D B C Graf pełny o n wierzchołkach posiada n (n 1) 2 krawędzi przykładowo graf K 5 posiada 10 krawędzi. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 21 / 68

Wprowadzenie Specjalne rodzaje grafów II Graf regularny to graf, w którym każdy wierzchołek ma taki sam stopień. Graf pełny stopnia n jest grafem regularnym stopnia n 1. f -graf to graf z ograniczonym stopniem wierzchołka, tzn. jego stopień nie może być większy niż f. Graf planarny - graf nieskierowany, który można narysować na płaszczyźnie tak, by krawędzie grafu nie przecinały się ze soba. Planarność ma duże zastosowanie w informatyce, m.in., w graficznej reprezentacji różnego rodzaju układów (np. scalonych, bramek, etc.). B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 22 / 68

Wprowadzenie Specjalne rodzaje grafów III v 1 v 4 v 1 v 4 v 2 v 3 v 2 v 3 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 23 / 68

Reprezentacje grafów Reprezentacja grafów w komputerze Macierz sasiedztwa Listy sasiedztwa Lista krawędzi B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 24 / 68

Macierz sasiedztwa Reprezentacje grafów Definicja Dany jest graf G = (V, E), gdzie V = {v 1,..., v n } (tj. zakłada się, że wierzchołki sa ponumerowane w pewien dowolny sposób) oraz V = n. Macierz sasiedztwa grafu G to macierz M(G) = (a ij ) o wymiarze n n taka, że { 1 jeśli (v i, v j ) E a ij = 0 w przeciwnym razie B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 25 / 68

Reprezentacje grafów Macierz sasiedztwa - przykład V = {A, B, C, D, E, F} E = {{A, B}, {A, C}, {B, C}, {B, D}, {C, D}, {E, F}} M(G) = A B C D E F A 0 1 1 0 0 0 B 1 0 1 1 0 0 C 1 1 0 1 0 0 D 0 1 1 0 0 0 E 0 0 0 0 0 1 F 0 0 0 0 1 0 A C E B D F B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 26 / 68

Reprezentacje grafów Graf skierowny G = (V, E) - przykład V = {A, B, C, D} E = {(A, B), (B, B), (B, C), (B, D), (C, A), (C, D), (D, C)} M(G) = A B C D A 0 1 0 0 B 0 1 1 1 C 1 0 0 1 D 0 0 1 0 A C B D B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 27 / 68

Reprezentacje grafów Macierz sasiedztwa - własności Macierz sasiedztwa dla grafów bez wag jest macierza binarna. Macierz sasiedztwa wymaga Θ( V 2 ) pamięci, niezależnie od liczby krawędzi w tym grafie. W przypadku grafów prostych do pamiętania jednego elementu macierzy można użyć tylko jednego bitu zamiast jednego słowa maszynowego. Dla grafów nieskierowanych macierz sasiedztwa jest symetryczna, dlatego w pewnych zastosowaniach opłaca się pamiętać tylko elementy na i powyżej głównej przekatnej macierzy sasiedztwa. M(G) = A B C D E F A 0 1 1 0 0 0 B 1 0 1 1 0 0 C 1 1 0 1 0 0 D 0 1 1 0 0 0 E 0 0 0 0 0 1 F 0 0 0 0 1 0 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 28 / 68

Reprezentacje grafów Listy sasiedztwa Definicja W reprezentacji grafu G = (V, E) za pomoca list sasiedztwa dana jest tablica A zawierajaca V list, po jednej dla każdego wierzchołka z V. Dla każdego u V elementami listy sasiedztwa A[u] sa wszystkie wierzchołki v takie, że krawędź (u, v) E, tzn. w A[u] przechowujemy zbiór wierzchołków połaczonych krawędzia z u. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 29 / 68

Reprezentacje grafów Listy sasiedztwa - przykład 1 2 5 / 1 2 2 1 5 3 4 / 5 4 3 3 4 5 2 4 / 2 5 3 / 4 1 2 / B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 30 / 68

Reprezentacje grafów Listy sasiedztwa - przykład 1 2 / 1 2 2 3 5 / 5 4 3 3 4 5 4 / 2 / 1 4 / B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 31 / 68

Reprezentacje grafów Listy sasiedztwa Jeżeli G jest grafem skierowanym, to suma długości wszystkich list sasiedztwa wynosi E, ponieważ krawędź postaci (u, v) jest reprezentowana przez wystapienie v na liście A[u]. Jeżeli G jest grafem nieskierowanym, to suma długości wszystkich list sasiedztwa wynosi 2 E, ponieważ dla nieskierowanej krawędzi {u, v} wierzchołek u występuje na liście sasiedztwa v i odwrotnie, v występuje na liście u. Niezależnie od tego, czy graf jest skierowany czy nie, rozmiar wymaganej pamięci przez reprezentację listowa jest Θ( V + E ) Reprezentacja listowa jest preferowana dla grafów rzadkich tj. takich, dla których E jest dużo mniejsze niż V 2. Reprezentacja macierzy sasiedztwa jest preferowana dla grafów gęstych tj. takich, dla których E jest bliskie V 2 lub gdy potrzebne jest szybkie stwierdzenie, czy istnieje dana krawędź. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 32 / 68

Reprezentacje grafów Lista Krawędzi Dany jest graf G = (V, E), V = n, E = m Lista krawędzi to lista, na której przechowujemy wszystkie krawędzie występujace w grafie. Dla grafu skierowanego, może to być lista (tablica) zawierajaca uporzadkowane pary wierzchołków. Dla grafu nieskierowanego, może to być lista (tablica) zawierajaca nieuporzadkowane pary wierzchołków. Ponieważ każda krawędź zawiera tylko dwie liczby (tj. zakładamy, że wierzchołki sa ponumerowane), całkowita zajętość pamięci dla listy krawędzi jest rzędu Θ( E ). B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 33 / 68

Reprezentacje grafów Lista krawędzi - graf skierowany 1 2 3 L = [(1, 2), (2, 3), (3, 4), (4, 2), (2, 5), (5, 4), (5, 1)]. 5 4 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 34 / 68

Reprezentacje grafów Lista krawędzi - graf nieskierowany 1 2 3 L = [(1, 2), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (4, 5)]. 5 4 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 35 / 68

Przeszukiwanie grafów Przeszukiwania grafu w głab Algorytm przeszukiwania grafu w głab (ang. Depth-first search, DFS) to podstawowa metoda badania grafów. Algorytm DFS wykorzystuje się do badania spójności grafu - jeśli procedura wywołana dla pierwszego wierzchołka dotrze do wszystkich wierzchołków grafu to graf jest spójny. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 36 / 68

Przeszukiwanie grafów Przeszukiwania grafu w głab - idea Dane wejściowe: Dowolny graf G = (V, E), opcjonalnie wierzchołek poczatkowy v V. Idea algorytmu DFS(v): 1 Zaznacz wszystkie wierzchołki grafu jako nieodwiedzone. 2 Przejdź do poczatkowego wierzchołka, np. wskazanego v, zaznacz v jako odwiedzony. i sprawdź, czy posiada nieodwiedzonych sasiadów. 3 Jeżeli v posiada nieodwiedzonych sasiadów, to przechodzimy to pierwszego nieodwiedzonego i powtarzamy cała procedurę. 4 Jeżeli wszyscy sasiedzi pewnego wierzchołka u sa zaznaczeni jako odwiedzeni, lub nie ma on sasiadów, to algorytm wraca do wierzchołka, z którego u został osiagnięty. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 37 / 68

Przeszukiwanie grafów Przeszukiwania grafu w głab - idea 1 2 DFS (1): 1,2,3,4,5 DFS (2): 2,3,4,5,1 3 DFS (3): 3,4,2,5,1 5 4 DFS (4): 4,2,5,1,3 DFS (5): 5,1,2,3,4 Jeżeli podano wierzchołek poczatkowy, to algorytm zbada spójna składowa zawierajac a ten wierzchołek (przypadek powyżej). W przeciwnym razie algorytm przeszukuje kolejne spójne składowe, wybierajac losowy wierzchołek z nowej spójnej składowej. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 38 / 68

Przeszukiwanie grafów Algorytm DFS - graf G=(V,E) reprezentowany przez listy sasiedztwa DFS(G): 1: for each vertex u V do 2: color[u] = WHITE 3: pre[u] = NIL 4: end for 5: time = 0 6: for each vertex u V do 7: if color[u] == WHITE then 8: VISIT (G, u) 9: end if 10: end for VISIT (G, u) 1: time = time + 1 2: d[u] = time 3: color[u] = GRAY 4: for each v Adj[u] do 5: if color[v] == WHITE then 6: pre[v] = u 7: VISIT (G, v) 8: end if 9: end for 10: color[u] = RED 11: time = time + 1 12: f [u] = time B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 39 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład DFS: 1,2,5,4,3,6 1 2 3 Krok: 1 1/ 4 5 6 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 40 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 2 1/ 2/ Krok: 3 1/ 2/ 3/ B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 41 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 4 1/ 2/ Krok: 5 1/ 2/ 4/ 3/ 4/ 3/ B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 42 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 6 1/ 2/ Krok: 7 1/ 2/ 4/5 3/ 4/5 3/6 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 43 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 8 Krok: 9 1/ 2/7 1/ 2/7 4/5 3/6 4/5 3/6 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 44 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 10 Krok: 11 1/8 2/7 1/8 2/7 9/ 4/5 3/6 4/5 3/6 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 45 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 12 Krok: 13 1/8 2/7 9/ 1/8 2/7 9/ 4/5 3/6 4/5 3/6 10/ B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 46 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 14 Krok: 15 1/8 2/7 9/ 1/8 2/7 9/ 4/5 3/6 10/ 4/5 3/6 10/11 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 47 / 68

Przeszukiwanie grafów Działanie algorytmu - Przykład Krok: 16 1/8 2/7 9/12 KONIEC 4/5 3/6 10/11 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 48 / 68

Przeszukiwanie grafów Algorytm DFS -przykład 1 2 3 4 5 6 7 8 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 49 / 68

Przeszukiwanie grafów Algorytm DFS -przykład 1 2 3 4 5 6 7 8 DFS(1): 1, 4, 6, 7, 8, 5, 2, 3 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 49 / 68

Stos Przeszukiwanie grafów Stos Stos jest struktura liniowo uporzadkowanych danych, z których jedynie ostatni element, zwany wierzchołkiem, jest w danym momencie dostępny. W wierzchołku odbywa się dołaczanie nowych elementów, również jedynie wierzchołek można usunać. Cecha charakterystyczna stosu jest to, że dane sa zapisywane i pobierane metoda Last-In-First-Out (LIFO) (pierwszy wchodzi, ostatni wychodzi). Działanie stosu jest często porównywane do stosu talerzy: nie można usunać talerza znajdujacego się na dnie stosu nie usuwajac wcześniej wszystkich innych. nie można także dodać nowego talerza gdzieś indziej, niż na sama górę. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 50 / 68

Stos - operacje Przeszukiwanie grafów Stos Niech S = (d 1, d 2,..., d n ) oznacza stos, wtedy: Odkładanie elementu na stos: push(s, d) = (d, d 1, d 2,..., d n ) Pobieranie elementu ze stosu: pop(s) = (d 2,..., d n ), o ile n > 1 Pobieranie elementu ze szczytu stosu bez jego usuwania: top(s) = d 1 Sprawdzanie niepustości stosu: empty(s) wtw., gdy n = 0 Pop i Push d 1 Szczyt stosu d 2 d 3 d 4 d 5 NULL B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 51 / 68

Przeszukiwanie grafów DFS - reprezentacja macierzowa grafu Stos Badanie nieodwiedzonego wierzchołka // zwraca nieodwiedzony wierzchołek przyległy do a // zwraca -1, jeżeli takiego wierzchołka nie ma int getunvisitedvertex(vertex a, BoolVector visited) { for (b = 0; b < n; b=b+1) { if (edge[a][b] == true // jest krawędź and visited[b]==false // b nie były odwiedzony ) then return b; } return -1; } B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 52 / 68

Przeszukiwanie grafów DFS - reprezentacja macierzowa grafu Stos DFS(Graph G,vertex a) { //G jest macierzą sąsiedztwa bool visited [n]; for (k = 0; k < n; k=k+1) visited[k] = false; STACK s; // stos do przechowywania wierzchołków visited[a] = true; // rozpocznij od wierzchołka a displayvertex(a); // wyswietl wierzchołek s.push(a); // zapisz na stos while (not s.empty()) { // pobierz nieodwiedzony wierzchołek, // przyległy do szczytowego elementu stosu b = getunvisitedvertex(s.top(), visited); if (b == -1) { // jezeli nie ma takiego wierzcholka, s.pop(); } else { visited[b] = true; // oznacz wierzcholek jako odwiedzony displayvertex(b); // wyswietl wierzcholek } } } s.push(b); // zapisz na stos B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 53 / 68

Przeszukiwanie grafów Przeszukiwania grafu w głab - złożoność Stos Złożoność czasowa algorytmu DFS: graf reprezentowany jako listy sasiedztwa: Θ( V + E ), na co składa się poczatkowa inicjalizacja (zabiera Θ( V )) i przechodzenie po wszystkich sasiadach każdego wierzchołka (zabiera Θ( E ) ponieważ suma długości wszystkich list sasiedztwa wynosi 0( E )). graf reprezentowany jako macierz sasiedztwa: Θ( V 2 ). B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 54 / 68

Przeszukiwanie grafów Stos Zastosowania DFS Podstawowe zastosowania: Sprawdzanie spójności grafu. Wyznaczanie spójnych składowych grafu. Wyznaczanie silnie spójnych składowych (w wersji dla grafu skierowanego). Znajdowanie drogi w labiryncie. Zauważmy, że w procedurze DFS wywołujemy procedurę Visit dokładnie tyle razy, ile jest spójnych składowych w grafie W szczególności, gdy graf jest spójny, Visit zostanie wywołana dokładnie raz przez procedurę DFS. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 55 / 68

Spójne składowe Przeszukiwanie grafów Stos B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 56 / 68

Kolejka Przeszukiwanie grafów Kolejka Kolejka FIFO (First In First Out) jest struktura liniowo uporzadkowanych danych, w której dołaczać nowe dane można jedynie na koniec, a usuwać z poczatku. Procedura usunięcia danych z końca kolejki jest taka sama, jak w przypadku stosu, z ta różnica, że usuwamy dane od poczatku a nie od końca. Działanie na kolejce jest intuicyjnie jasne, gdy skojarzymy ja z kolejka ludzi np. w sklepie. Każdy nowy klient staje na jej końcu, obsługa odbywa się jedynie na poczatku. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 57 / 68

Przeszukiwanie grafów Kolejka Kolejka - operacje Niech K = (d 1, d 2,..., d n ) oznacza kolejkę, wtedy: Wstawianie elementu do kolejki: enqueuq(k, d) = (d 1, d 2,..., d n, d) Pobieranie elementu z kolejki: dequeuq(k ) = (d 2,..., d n ), o ile n > 1 Obsługiwanie pierwszego elementu z kolejki bez jego usuwania : first(k ) = d 1 Sprawdzanie niepustości kolejki: empty(k ) wtw., gdy n = 0 Poczatek kolejki d 1 d 2 d 3 d 4 d 5 Koniec kolejki B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 58 / 68

Przeszukiwanie grafów Przeszukiwanie grafu wszerz Kolejka Z ustalonego wierzchołka źródłowego s przegladamy kolejne wierzchołki z niego osiagalne. Wierzchołki w odległości k od źródłowego s odwiedzane sa przed wierzchoakami w odległości k + 1. Jeżeli po powyższym procesie pozostanie jakikolwiek nieodwiedzony wierzchołek u, kontynuujemy przeszukiwanie traktujac go jako nowy wierzchołek źródłowy. Cały proces powtarzamy, aż wszystkie wierzchołki w grafie zostana odwiedzone. Odwiedzane wierzchołki przechowywane sa w kolejce FIFO. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 59 / 68

Przeszukiwanie grafów Kolejka Algorytm BFS - graf G=(V,E) reprezentowany przez listy sasiedztwa BFS(G, s): 1: for each vertex u V {s} do 2: color[u] = WHITE 3: d[u] = 4: pre[u] = NIL 5: end for 6: color[s] = GRAY 7: d[s] = 0 8: pre[s] = NIL 9: EnQueue(Q, s) 1: while Q do 2: u = DeQueue(Q) 3: for each v Adj[u] do 4: if color[v] == WHITE then 5: color[v] = GRAY 6: d[v] = d[u] + 1 7: pre[v] = u 8: EnQueue(Q, v) 9: end if 10: end for 11: DeQueue(Q) 12: color[u] = BLACK 13: end while B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 60 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka Rysunek: Źródło:Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms. The MIT Press, 2009. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 61 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka Rysunek: Źródło:Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms. The MIT Press, 2009. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 62 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka Rysunek: Źródło:Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms. The MIT Press, 2009. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 63 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka Rysunek: Źródło:Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms. The MIT Press, 2009. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 64 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka Rysunek: Źródło:Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms. The MIT Press, 2009. B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 65 / 68

Przeszukiwanie grafów Kolejka BFS - reprezentacja macierzowa grafu BFS(Graph G,vertex a) { //G jest macierzą sąsiedztwa bool visited [n]; for (k = 0; k < n; ++k) visited[k] = false; Queue q; // kolejka do przechowywania wierzchołków visited[a] = true; // rozpocznij od wierzcholka a displayvertex(a); // wyswietl wierzcholek q.enqueue(a); // wstaw na koncu while (not q.empty()) { // do opróżnienia kolejki, b = q.front(); // pobierz piewszy wierzcholek q.dequeue(); // usun go z kolejki // dopóki ma nie odwiedzonych sasiadów c = getunvisitedvertex(b, visited); // pobierz sasiada while (c!= -1) { visited[c] = true; // oznacz displayvertex(c); // wyswietl q.enqueue(c); // wstaw do kolejki c = getunvisitedvertex(b, visited); // pobierz sasiada } // while } // while(kolejka nie jest pusta) } B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 66 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka 1 2 3 4 5 6 7 8 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 67 / 68

Przeszukiwanie grafów Algorytm BFS -przykład Kolejka 1 2 3 4 5 6 7 8 BFS(1): 1, 4, 5, 6, 7, 8 BFS(2): 2, 4, 6, 7, 8 BFS(3): 3, 5, 8, 7 BFS: 1, 4, 5, 6, 7, 8, 2, 3 B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 67 / 68

Przeszukiwanie grafów Kolejka Przeszukiwania grafu wszerz - złożoność Złożoność czasowa algorytmu BFS: graf reprezentowany jako listy sasiedztwa: Θ( V + E ), na co składa się poczatkowa inicjalizacja (zabiera Θ( V )) i przechodzenie po wszystkich sasiadach każdego wierzchołka (zabiera Θ( E ) ponieważ suma długości wszystkich list sasiedztwa wynosi 0( E )). graf reprezentowany jako macierz sasiedztwa: Θ( V 2 ). B. Woźna-Szcześniak (UJD) Algorytmy Grafowe 68 / 68