Algorytmy grafowe Wykład 1 Podstawy teorii grafów Reprezentacje grafów Tomasz Tyksiński CDV
Rozkład materiału 1. Podstawowe pojęcia teorii grafów, reprezentacje komputerowe grafów 2. Przeszukiwanie grafów 3. Spójność grafu, lasy, drzewa, drzewa rozpinające 4. Najkrótsze ścieżki w grafie, algorytm Dijkstry 5. Algorytm Kruskala 6. Cykle Hamiltona w grafach 7. Kolorowanie grafów 8. Skojarzenia w grafach
Literatura Podstawowa T. H. Cormen, C. E. Leiserson, R. L. Rivest, Wprowadzenie do algorytmów M. Karoński, Algorytmy grafowe N. Deo, Teoria grafów i jej zastosowania w technice i informatyce L. Banachowski, K. Diks, W. Rytter, Algorytmy i struktury danych Dodatkowa E. Reingold, J. Nievergelt, N. Deo, Algorytmy kombinatoryczne M. M. Sysło, N. Deo, J. S. Kowalik, Algorytmy optymalizacji dyskretnej
Zaliczenie Kolokwium po ostatnich zajęciach
Rozkład materiału 1. Podstawowe pojęcia teorii grafów, reprezentacje komputerowe grafów 2. Przeszukiwanie grafów 3. Spójność grafu, lasy, drzewa, drzewa rozpinające 4. Najkrótsze ścieżki w grafie, algorytm Dijkstry 5. Algorytm Kruskala 6. Cykle Hamiltona w grafach 7. Kolorowanie grafów 8. Skojarzenia w grafach
Wprowadzenie Celem przedmiotu jest przedstawienie klasy algorytmów operujących na strukturze grafu (sieci). Przedstawione zostaną odpowiednie struktury danych do reprezentacji grafów, a następnie algorytmy grafowe: algorytmy znajdowania najkrótszej ścieżki w grafie, przeglądania grafu, znajdowania drzewa rozpinającego grafu oraz problemy kolorowania i spójności grafów.
Podstawowe pojęcia teorii grafów Graf to jedna z dynamicznych struktur danych, umożliwiająca reprezentację zależności pomiędzy obiektami Inne znane dynamiczne struktury danych to Listy jednokierunkowe Listy dwukierunkowe Listy cykliczne (jedno i dwukierunkowe) Drzewa binarne Drzewa Lasy
Przykłady struktur Lista Lista cykliczna
Przykłady struktur Lista dwukierunkowa Lista dwukierunkowa cykliczna
Przykłady struktur Drzewo binarne
Podstawowe pojęcia teorii grafów Graf jest uogólnieniem wszystkich powyższych struktur dynamicznych Jego budowa przypomina sieć komputerową, gdzie stacje będą wierzchołkami grafu, a bezpośrednie połączenia między nimi będą krawędziami grafu Za pomocą odpowiednio dobranej struktury grafu można rozwiązywać różne problemy, nie tylko związane z sieciami komputerowymi
Zastosowania grafów Zależności grafowe mogą opisywać przykładowo poszukiwanie drogi pomiędzy miastami, połączeń kolejowych, połączeń drogowych między skrzyżowaniami, system pozycjonowania GPS Algorytmy działające na takich grafach mogą wyszukiwać optymalne drogi, najszybsze, najkrótsze
Zastosowania grafów W grach komputerowych przy zastosowaniu sztucznej inteligencji można odnajdywać optymalne drogi poruszania się wirtualnych postaci sterowanych przez komputer Podobne sytuacje spotykamy w robotyce, gdzie urządzenie posiadające wbudowaną mapę musi dotrzeć w najkrótszym czasie do zadanego celu
Zastosowania grafów Strony internetowe mają również strukturę grafu z połączeniami (linkami) do innych stron jako krawędzie łączące kolejne strony, wyszukiwarki internetowe przeglądają sieć w ten sposób, zliczając liczbę krawędzi prowadzących do danej strony budują ranking stron Podobnie w lingwistyce buduje się zależności między słowami w zdaniu (syntaktyka) oraz między ich znaczeniem (semantyka), co dalej ma zastosowanie w rozpoznawaniu mowy, w interakcji między maszyną a człowiekiem
Zastosowania grafów Grafy mają również szerokie zastosowanie w socjologii biologii fizyce chemii energetyce matematyce
Pojęcie grafu Główne rodzaje grafów Grafy proste bez krawędzi wielokrotnych oraz pętli, czyli krawędzi których końcami jest ten sam wierzchołek Multigrafy mogą zawierać krawędzie wielokrotne oraz pętle Graf lub multigraf G składa się zatem z dwóch zbiorów (V, E), gdzie V jest zbiorem wierzchołków ponumerowanych v 1, v 2,, v m E jest zbiorem krawędzi e 1, e 2,, e n łączących dwa wierzchołki Każda krawędź jest zatem parą dwóch wierzchołków e i = { v k, v l }
Przykład grafu Graf nieskierowany prosty Multigraf
Pojęcie grafu Inne rodzaje grafów Grafy skierowane (nazywane również digrafami) to grafy w których krawędzie są uporządkowanymi parami wierzchołków Zatem krawędź e i = ( v k, v l ), jest skierowana od wierzchołka v k do wierzchołka v l (takie krawędzie nazywamy łukami)
Przykład grafu Graf skierowany prosty
Pojęcie grafu Inne rodzaje grafów Grafy ważone to grafy gdzie dodatkowo każdej krawędzi przypisana jest waga (np. koszt przesłania informacji od jednego wierzchołka do drugiego) Hipergrafy to rozszerzenie pojęcia grafu, krawędzie w tym przypadku krawędzie mogą być zbiorami więcej niż dwóch wierzchołków Zbiór krawędzi E jest podzbiorem zbioru wszystkich możliwych niepustych zbiorów o elementach z V
Przykład grafu Graf skierowany ważony prosty
Przykład grafu Hipergraf o czterech krawędziach i sześciu wierzchołkach
Pojęcia opisujące grafy Wprowadzimy teraz kilka podstawowych pojęć opisujących właściwości grafu Przez stopień wierzchołka w grafie nieskierowanym rozumiemy liczbę krawędzi przylegających do danego wierzchołka v, oznaczamy ją deg(v) W grafie skierowanym, możemy mówić o stopniu wyjścia (liczba krawędzi wychodzących) i stopniu wejścia (liczba krawędzi wchodzących), oznaczamy je deg Out (v), deg In (v)
Przykład grafu Graf nieskierowany prosty Wierzchołki mają stopnie deg(v 1 ) = 2 deg(v 2 ) = 5 deg(v 3 ) = 2 deg(v 4 ) = 3 deg(v 5 ) = 3 deg(v 6 ) = 3
Przykład grafu Graf skierowany prosty Wierzchołki mają stopnie deg In (v 1 ) = 1, deg Out (v 1 ) = 1 deg In (v 2 ) = 3, deg Out (v 2 ) = 2 deg In (v 3 ) = 1, deg Out (v 3 ) = 1 deg In (v 4 ) = 1, deg Out (v 4 ) = 2 deg In (v 5 ) = 2, deg Out (v 5 ) = 1 deg In (v 6 ) = 1, deg Out (v 6 ) = 2
Pojęcia opisujące grafy Graf, którego każdy wierzchołek jest połączony bezpośrednio krawędzią z każdym innym wierzchołkiem, nazywamy grafem pełnym Graf pełny na m wierzchołkach oznaczamy K m Graf, którego każdy wierzchołek jest stopnia k nazywamy grafem regularnym stopnia k W trakcie wykładu będą pojawiać się jeszcze inne pojęcia związane z budową grafu
Przykłady grafów pełnych K 1 K 2 K 3 K 4 K 5 K 6
Przykłady grafów regulanych Graf regularny stopnia 5 Graf regularny stopnia 3 Graf regularny stopnia 2
Reprezentacje komputerowe grafów Zajmijmy się teraz możliwościami zapisu grafu w komputerze Rozważmy następujący graf prosty na pięciu wierzchołkach V = {v 1, v 2, v 3, v 4, v 5 } o siedmioelementowym zbiorze krawędzi E = {e 1, e 2, e 3, e 4, e 5, e 6, e 7 }
Przykład grafu Graf nieskierowany prosty na 5 wierzchołkach o 7 krawędziach
Przykład grafu Ten sam graf w wersji planarnej, tzn. narysowany na płaszczyźnie tak, że żadne krawędzie nie przecinają się
Reprezentacje komputerowe grafów Macierz przyległości (sąsiedztwa) Graf G = (V, E), gdzie V = {v 1, v 2,..., v m } jest zbiorem wierzchołków, zapisujemy w postaci macierzy przyległości A(G) o wymiarach m m o elementach (a ij ), gdzie a ij jest liczbą krawędzi łączących wierzchołek v i z v j W przypadku grafu skierowanego a ij jest liczbą łuków z wierzchołka v i do v j
Reprezentacje komputerowe grafów W przykładowym grafie macierz przyległości wygląda następująco v 1 v 2 v 3 v 4 v 5 v 1 0 1 0 1 0 v 2 1 0 1 1 1 A(G) = v 3 0 1 0 1 0 v 4 1 1 1 0 1 v 5 0 1 0 1 0
Reprezentacje komputerowe grafów Własności macierzy przyległości dla grafu prostego macierz przyległości A(G) jest macierzą binarną (złożoną wyłącznie z zer i jedynek) Macierz przyległości wymaga V 2 = m 2 bitów pamięci Jeżeli w jest długością słowa maszynowego, to każdy wiersz macierzy przyległości można zapisać jako ciąg m bitów na [m/w] słowach maszynowych (gdzie [x] oznacza najmniejszą liczbę całkowitą nie mniejszą niż x)
Reprezentacje komputerowe grafów Własności macierzy przyległości (c. d.) W grafie prostym macierz A(G) jest symetryczna Można ją zatem zapisać na mniejszej liczbie bitów, zajmuje ona m(m 1)/2 bitów (nad przekątną) W grafie skierowanym zajmuje m[m/w] (m wierszy) Reprezentacja macierzowa jest korzystniejsza dla grafów gęstych, tzn. mających stosunkowo dużo krawędzi, niewiele mniej niż kwadrat liczby wierzchołków, czyli n m 2
Reprezentacje komputerowe grafów Macierz incydencji Dany jest graf G = (V, E), gdzie V = {v 1, v 2,..., v m } jest zbiorem wierzchołków, E = {e 1, e 2,..., e n } zbiorem krawędzi grafu Macierzą incydencji grafu G jest macierz M(G) = (m ij ), 1 i m, 1 j n, gdzie liczba m ij {0, 1, 2} oznacza ile razy v i oraz e j są incydentne (krawędź przylega do wierzchołka) Wartość 2 występuje w przypadku pętli
Przykład grafu Graf nieskierowany prosty na 5 wierzchołkach o 7 krawędziach
Reprezentacje komputerowe grafów Dla przykładowego grafu macierz incydencji wygląda następująco e 1 e 2 e 3 e 4 e 5 e 6 e 7 v 1 1 0 0 0 0 0 1 v 2 1 1 1 0 1 0 0 M(G) = v 3 0 1 0 1 0 0 0 v 4 0 0 0 1 1 1 1 v 5 0 0 1 0 0 1 0
Reprezentacje komputerowe grafów Właściwości macierzy incydencji Wymaga V. E bitów pamięci (dla grafów prostych), czyli przy naszych oznaczeniach m. n Wartość ta może być większa niż V 2 bitów w macierzy przyległości, ponieważ liczba krawędzi E jest często większa niż liczba wierzchołków V W niektórych jednak przypadkach może być korzystniejsze użycie macierzy incydencji, niż macierzy przyległości pomimo zwiększonej zajętości pamięci Macierze incydencji są szczególnie dogodne przy rozpatrywaniu obwodów elektrycznych i układów przełączających
Reprezentacje komputerowe grafów Kolejnym zapisem grafu jest lista krawędzi Jest to najbardziej naturalny zapis, prosty ale mający również spore zastosowanie w praktyce Dla przykładowego grafu z poprzedniego przykładu otrzymujemy następującą postać listy krawędzi {v 1, v 2 }, {v 1, v 4 }, {v 2, v 3 }, {v 2, v 4 }, {v 2, v 5 }, {v 3, v 4 }, {v 4, v 5 } W przypadku grafów skierowanych, na liście pojawiają się pary uporządkowane wierzchołków zamiast zbiorów
Reprezentacje komputerowe grafów Liczba bitów potrzebna przechowania etykiet (czyli ich numerów) wierzchołków grafu G na m wierzchołkach wynosi b, gdzie 2 b 1 < m 2 b, czyli b = log 2 m + 1 Ilość pamięci do zapisania całego grafu G wynosi zatem 2. b. E bitów Ten sposób reprezentacji jest bardziej ekonomiczny niż macierz przyległości, pod warunkiem, że zachodzi 2 b E < V 2 Reprezentacja taka, jest zatem korzystniejsza dla grafów rzadkich
Reprezentacje komputerowe grafów Podobną reprezentacją do poprzedniej jest lista wierzchołków Przechowujemy graf wykorzystując dwie tablice liniowe F = (f 1, f 2,..., f e ), H = (h 1, h 2,..., h e ) Elementami obu tablic są etykiety wierzchołków Długość tablic e jest równa E W grafie skierowanym, i-ty łuk, e i, prowadzi od wierzchołka f i, do wierzchołka h i W grafie nieskierowanym krawędź e i łączy f i i h i
Przykład grafu W rozpatrywanym grafie Zapis w postaci dwóch list wygląda następująco F = (v 1, v 2, v 2, v 3, v 2, v 4, v 1 ), H = (v 2, v 3, v 5, v 4, v 4, v 5, v 4 )
Reprezentacje komputerowe grafów Kolejną reprezentacją, bardzo często spotykaną w praktyce jest lista wierzchołków sąsiednich (czyli następników) Metoda ta jest efektywna w reprezentacji grafów gdy stosunek E / V nie jest duży Dla każdego wierzchołka v tworzymy listę (lub tablicę), której pierwszym elementem jest v, a pozostałymi elementami są wierzchołki będące sąsiadami wierzchołka v, w przypadku grafów nieskierowanych W przypadku grafów skierowanych zapisujemy do listy bezpośrednich następników wierzchołka v, czyli takie wierzchołki, do których istnieje łuk z wierzchołka v
Przykład grafu W rozpatrywanym grafie Zapis w postaci listy następników wygląda następująco v 1 : v 2, v 4 v 2 : v 1, v 3, v 4, v 5 v 3 : v 2, v 4 v 4 : v 1, v 2, v 3, v 5 v 5 : v 2, v 4
Przykład grafu Dokładniejsza reprezentacja listowa takiego zapisu wygląda następująco Graf nieskierowany 1 2 4 NULL 2 1 4 5 6 NULL 3 5 6 NULL 4 1 2 5 NULL 5 2 3 4 NULL 6 2 3 NULL
Przykład grafu W przypadku grafu skierowanego 1 2 NULL 2 4 6 NULL 3 5 NULL 4 1 5 NULL 5 2 NULL 6 3 6 NULL
Reprezentacje komputerowe grafów Zajętość pamięci jest równa E + V dla grafów skierowanych oraz 2 E + V dla nieskierowanych, ogólnie zatem O( E + V ) Niestety przeglądanie zbioru krawędzi w tej reprezentacji zajmuje rzędowo około E kroków Sprawdzenie, czy krawędź {v i, v j } należy do grafu, wymaga czasu proporcjonalnego do min{ deg(v i ), deg(v j ) } Usunięcie krawędzi {v i, v j } wymaga czasu proporcjonalnego do max{ deg(v i ), deg(v j ) }
Następny wykład Algorytmy przeglądania, przeszukiwania elementów grafu