Upload
trinhthu
View
231
Download
3
Embed Size (px)
Citation preview
Algorytmy i Struktury Danych.Grafy
Bozena [email protected]
Jan Długosz University, Poland
Wykład 7
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 1 / 43
Grafy - Obszary Zastosowania
Informatyka
Technika 1
Fizyka
Nauki społeczne
Biologia
Kartografia
Lingwistyka
i wiele innych . . .
1Deo N. Teoria grafów i jej zastosowania w technice i informatyce, PWN,Warszawa 1980.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 2 / 43
Grafy - Zastosowania w Informatyce:
Reprezentacja struktury programów
Modelowanie systemów komputerowych
Automatyczna weryfikacja systemów współbieznych irozproszonych
Kryptografia - Szyfr Cezara, Problem Dalekopisu, Kod Graya,Kody Huffmana, kryptografia wizualna, itd.
Sieci komputerowe - znajdowanie najkrótszych sciezek
i wiele innych . . .
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 3 / 43
Graf - idea
Graf to - intuicyjnie - zbiór wierzchołków , które moga bycpołaczone krawedziami , w taki sposób, ze kazda krawedzkonczy sie i zaczyna w pewnym wierzchołku.
Wierzchołki grafu zazwyczaj sa etykietowane (numerowane) ireprezentuja pewne obiekty (np. miasta).
Krawedzie obrazuja relacje pomiedzy obiektami (np. połaczeniakolejowe).
Krawedzie moga miec wyznaczony kierunek, a graf zawierajacytakie krawedzie nazywany jest grafem skierowanym .
Krawedz moze posiadac wage, tzn. przypisana wartosc liczbowa,która okresla na przykład odległosc w kilometrach pomiedzywierzchołkami (jesli graf jest reprezentacja połaczen miedzymiastami).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 4 / 43
Graf - Leonharda Eulera
Za pierwszego teoretyka i badacza grafów uwaza sie LeonhardaEulera2, który rozstrzygnał tzw. zagadnienie mostówkrólewieckich .
2Leonhard Euler (ur. 15 kwietnia 1707 r. w Bazylei - Szwajcaria, zm. 18 wrzesnia1783 r. w Petersburgu - Rosja) - szwajcarski matematyk, fizyk i astronom, jeden ztwórców nowoczesnej matematyki.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 5 / 43
Mosty królewieckie
Przez Królewiec przepływała rzeka Pregole, w której rozwidleniachznajdowały sie dwie wyspy. Ponad rzeka przerzucono siedem mostów,z których jeden łaczył obie wyspy, a pozostałe mosty łaczyły wyspy zbrzegami rzeki. Plan mostów pokazuje rysunek:
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 6 / 43
Mosty królewieckie
Zwykłe spacerowanie szybko sie znudziło mieszkancom Królewcai zaczeli zastanawiac sie, czy istnieje taka trasa spacerowa, któraprzechodzi przez kazdy most dokładnie raz, zadnego nie omija, ipozwala wrócic do punktu wyjscia.
Mieszkancy nie potrafili rozwiazac postawionego problemusamodzielnie, wiec postanowili napisac do matematykaLeonharda Eulera.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 7 / 43
Mosty królewieckie
Euler wykazał, ze rozwiazanie problemu mieszkanców nie jestmozliwe, a decyduje o tym nieparzysta liczba wylotów mostówzarówno na kazda z wysp, jak i na oba brzegi rzeki. (Jesli wejdziesie po raz trzeci na wyspe, nie ma jak z niej wyjsc).
Sytuacje te mozna przedstawic za pomoca nastepujacego grafu:
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 8 / 43
Mosty królewieckie
Problem mostów królewieckich, to inaczej problem znalezienia wdanym grafie tzw. cyklu Eulera , czyli cyklu przechodzacego przezwszystkie wierzchołki i wszystkie krawedzie danego grafu, aleprzez kazda krawedz tylko raz.
W roku 1736 roku Euler udowdnił twierdzenie, które obecniemozna sformułowac w sposób nastepujacy:
W grafie mozna znalezc cykl Eulera wtedy i tylko wtedy,gdy graf jest spójny i kazdy jego wierzchołek ma parzystystopien.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 9 / 43
Graf skierowany
DefinicjaGrafem skierowanym (digrafem) nazywamy strukture
G = (V ,E)
gdzie
V to zbiór wierzchołków,
E ⊆ {(u, v) : u, v ∈ V} to zbiór uporzadkowanych parwierzchołków ze zbioru V , zwanych krawedziami.
Przez n oznaczamy ilosc wierzchołków (rozmiar zbioru V )Przez m oznaczamy ilosc krawedzi (rozmiar zbioru E )
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 10 / 43
Graf skierowny G = (V ,E) - przykład
V = {1,2,3,4,5,6}E = {(1,2), (1,3), (2,4), (2,5), (3,4), (3,6), (4,6)}n = 6, m = 7
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 11 / 43
Podstawowe Pojecia
Droga ( sciezka) w grafie skierowanym to lista wierzchołków(n1,n2, . . . ,nk ) taka, ze wystepuje krawedz łaczaca kazdywierzchołek z nastepnym, to znaczy (ni ,ni+1) ∈ E dlai = 1,2, . . . , k .
Droga prosta , to droga w której zadna krawedz sie nie powtarza.
Długo sc drogi wynosi k − 1, co stanowi liczbe krawedzinalezacych do tej samej drogi.
Cykl w grafie skierowanym jest droga o długosci co najmniej 1,która zaczyna sie i konczy w tym samym wierzchołku. Długosccyklu jest długoscia drogi.
Cykl jest prosty , jezeli zaden wierzchołek (oprócz pierwszego)nie pojawia sie w nim wiecej niz raz.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 12 / 43
Podstawowe Pojecia
Jezeli graf posiada jeden lub wiecej cykli to mówimy, ze jestgrafem cyklicznym .
Jezeli graf nie posiada cykli to, mówimy, ze jest grafemacyklicznym .
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 13 / 43
Podstawowe Pojecia
Jezeli graf posiada jeden lub wiecej cykli to mówimy, ze jestgrafem cyklicznym .
Jezeli graf nie posiada cykli to, mówimy, ze jest grafemacyklicznym .
Przykład:
Cykle proste: (0,0), (0,2,0), (1,3,2,1), (1,3,2,4,1)Cykl nieprosty: (0,2,1,3,2,0)
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 13 / 43
Graf nieskierowany
DefinicjaGrafem nieskierowanym (grafem) nazywamy strukture
G = (V ,E)
gdzie
V to zbiór wierzchołków,
E ⊆ {{u, v} : u, v ∈ V} to zbiór dwuelementowychpodzbiorów/multizbiorów zbioru V , zwanych krawedziami.
Przez n oznaczamy ilosc wierzchołków (rozmiar zbioru V )Przez m oznaczamy ilosc krawedzi (rozmiar zbioru E )
Droga w grafie nieskierowanym, to lista wierzchołków.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 14 / 43
Graf nieskierowny - przykład
V = {1,2,3,4,5,6}
E = {(1,2), (1,3), (2,4), (2,5), (3,4), (3,6), (4,6)}
n = 6, m = 7
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 15 / 43
Podstawowe pojecia
Graf posiadajacy krawedzie pomiedzy kazda para róznychwierzchołków nosi nazwe grafu pełnego .
O grafie nieskierowanym mówi sie ze jest planarny , jesli istniejemozliwosc rozmieszczenia jego wierzchołków na płaszczyznie, anastepnie narysowania jego krawedzi jako lini ciagłych które sienie przecinaja.
Grafy nieplanarne to takie, które nie posiadaja reprezentacjipłaskiej.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 16 / 43
Podstawowe pojecia
Graf posiadajacy krawedzie pomiedzy kazda para róznychwierzchołków nosi nazwe grafu pełnego .
O grafie nieskierowanym mówi sie ze jest planarny , jesli istniejemozliwosc rozmieszczenia jego wierzchołków na płaszczyznie, anastepnie narysowania jego krawedzi jako lini ciagłych które sienie przecinaja.
Grafy nieplanarne to takie, które nie posiadaja reprezentacjipłaskiej.
Planarnosc ma duze zastosowanie w informatyce, m.in., wgraficznej reprezentacji róznego rodzaju układów (np. scalonych,bramek, etc.).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 16 / 43
Podstawowe pojecia
Stopie n wierzchołka :W grafie nieskierowanym to liczba incydentnych z nim krawedzi.W grafie skierowanym to suma stopni wejsciowego (ilosckonczacych sie krawedzi) i wyjsciowego (ilosc wychodzacychkrawedzi).
Graf regularny to graf, w którym kazdy wierzchołek ma taki samstopien.
f -graf to graf z ograniczonym stopniem wierzchołka, tzn. jegostopien nie moze byc wiekszy niz f .
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 17 / 43
Przykład
Stopien wierzchołka 1 jesy równy 2, a wierzchołka 2 jest równy 3.
Graf jest planarny.
3-graf.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 18 / 43
Reprezentacja grafów w komputerze
Macierz sasiedztwa
Lista incydencji (sasiedztwa)
Lista krawedzi
Macierz incydencji
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 19 / 43
Macierz sasiedztwa
Dany jest graf G = (V ,E), |V | = n, |E | = m
Budujemy tablice (macierz) M o rozmiarach n · n.Wypełniamy tablice M w sposób nastepujacy:
Zerem - jesli dwa wierzchołki nie sa połaczone krawedzia.Jedynka - jesli dwa wierzchołki sa połaczone.
Uwagi: Dla grafów nieskierowanych macierz sasiedztwa jestsymetryczna, zatem implementujac ja za pomoca tablic dynamicznychmozna ja zmniejszyc do połowy - zapisujemy tylko macierzdolno-(górno)-trójkatna.
Złozonosc pamieciowa: O(n2)
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 20 / 43
Macierz sasiedztwa - graf nieskierowany
1 2 3 4 5 61 1 12 1 1 13 1 1 14 1 1 15 16 1 1
Czas wstawienia: O(1)
Czas usuniecia: O(1)
Czas zapytania: O(1)
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 21 / 43
Macierz sasiedztwa - graf skierowany
0 1 2 3 40 1 1 11 12 1 1 13 1 14 1
Czas wstawienia: O(1)
Czas usuniecia: O(1)
Czas zapytania: O(1)
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 22 / 43
Lista incydencji
Dany jest graf G = (V ,E), |V | = n, |E | = m
Budujemy liste dla kazdego wierzchołka v ∈ V , w którejprzechowujemy zbiór wierzchołków połaczonych krawedzia z v .
Złozonosc pamieciowa: O(n + m).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 23 / 43
Lista incydencji - graf nieskierowany
1: 2 32: 1 4 53: 1 4 64: 2 3 65: 26: 3 4
Czas wstawienia: O(1)
Czas usuniecia: czaswyszukiwania na liscieuporzadkowanej
Czas zapytania: czaswyszukiwania na liscieuporzadkowanej
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 24 / 43
Lista incydencji - graf skierowany
0: 0 1 21: 32: 0 1 43: 2 44: 1
Czas wstawienia: O(1)
Czas usuniecia: czaswyszukiwania na liscieuporzadkowanej.
Czas zapytania: czaswyszukiwania na liscieuporzadkowanej.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 25 / 43
Lista Krawedzi
Dany jest graf G = (V ,E), |V | = n, |E | = m
Lista krawedzi to lista, na której przechowujemy wszystkiekrawedzie wystepujace w grafie.
Zapisujac przy pomocy tej reprezentacji graf, w którym wystepujakrawedzie skierowane i nieskierowane nalezy w przypadkukrawedzi nieskierowanej z u do v zapisac krawedz dwukrotnie:u − v oraz v − u.
Złozonosc pamieciowa: O(m).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 26 / 43
Lista krawedzi - graf nieskierowany
1 - 21 - 32 - 12 - 42 - 53 - 13 - 43 - 64 - 24 - 34 - 65 - 26 - 36 - 4
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 27 / 43
Lista krawedzi - graf skierowany
0 - 00 - 10 - 21 - 32 - 02 - 12 - 43 - 23 - 44 - 1
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 28 / 43
Macierz incydencji
Dany jest graf G = (V ,E), |V | = n, |E | = mMacierz incydencji to tablica o rozmiarach n · m.Składa sie ona z m kolumn i n wierszy:
jesli krawedz wychodzi z danego wierzchołka, to piszemy wodpowiedniej kolumnie (-1),jesli krawedz wchodzi do danego wierzchołka, to piszemy (+1),jesli wierzchołek nie nalezy do krawedzi, to piszemy 0,jesli jest petla własna, to piszemy 2.
Złozonosc pamieciowa O(n · m).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 29 / 43
Macierz incydencji - graf skierowany
0 1 2 3 40 - 0 20 - 1 -1 10 - 2 -1 11 - 3 -1 12 - 0 1 -12 - 1 1 -12 - 4 -1 13 - 2 1 -13 - 4 -1 14 - 1 1 -1
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 30 / 43
Macierz sasiedztwa a lista sasiedztwa
Macierze sasiedztwa sa preferowanym sposobem reprezentacjigrafów wówczas, gdy grafy sa geste, tzn. kiedy liczba krawedzijest bliska maksymalnej mozliwej ich liczby.
Dla grafu skierowanego o n wierzchołkach maksymalna liczbakrawedzi wynosi n2.
Jesli graf jest rzadki, to reprezentacja oparta na listach sasiedztwamoze pozwolic zaoszczedzic pamiec.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 31 / 43
Algorytm przeszukiwania grafu w głab - DFS
Algorytm DFS to podstawowa metoda badania grafówskierowanych.Algorytm DFS wykorzystuje sie do badania spójnosci grafu - jesliprocedura wywołana dla pierwszego wierzchołka “dotrze” dowszystkich wierzchołków grafu to graf jest spójny.Algorytm:
Wybrany wierzchołek umiesc na stosie, zaznacz jako odwiedzony iprzejdz do jego nastepnika. Nastepnik równiez umiesc na stosie,zaznacz jako odwiedzony i przejdz do jego nastepnika.Jesli napotkany wierzchołek nie ma krawedzi incydentych znieodwiedzonymi wierzchołkami, usun go ze stosu i pobierz zestosu kolejny wierzchołek do przeszukania.
W praktyce stosuje sie zasade, ze jesli przeszukiwanywierzchołek jest połaczony krawedziami z wieloma wierzchołkami,wybiera sie do przeszukania wierzchołek o najmniejszej liczbieporzadkowej. Dlatego szukajac kolejny nieodwiedzony nastepniknalezy rozpoczynac od konca macierzy.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 32 / 43
DFS - przykład
Jedno z mo zliwych drzewprzeszukiwania:
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 33 / 43
Przeszukiwanie grafu wszerz (BFS)
Aby przeszukac graf wszerz (BFS) nalezy zamiast stosu wykorzystackolejke do przechowywania wierzchołków, a kolejnychnieodwiedzonych nastepników szukac od poczatku macierzy.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 34 / 43
BFS i DFS- przykład
W wyniku wywołaniaprocedury DFS dla grafu obokotrzymamy wierzchołki wnastepujacej kolejnosci:1,2,4,5,3,6.
W wyniku wywołaniaprocedury BFS dla grafu obokotrzymamy wierzchołki wkolejnosci: 1,2,3,4,5,6.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 35 / 43
Graf - pewna implementacja
Definicja grafutypedef struct {
int n; // liczba wierzchołków grafubool ** adj; // macierz s ˛asiedztwa
} Graph;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 36 / 43
Graf - pewna implementacja
Deklaracja interfejsu// inicjalizacja struktury Graphvoid init(Graph * , int);// dodanie krawedzivoid addEdge(Graph * , int, int);void display(Graph const * ); // wy swietlenie grafuvoid dfs(Graph * , int); // wyszukiwanie "wgł ˛ab"void bfs(Graph * , int); // wyszukiwanie "wszerz"int getUnVisitedVertex(Graph * ,int, bool const visited []);void displayVertex(int);
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 37 / 43
Graf - pewna implementacja
Inicjalizacja struktury Graphvoid init(Graph * g, int n) {
g->n = n;g->adj = calloc(n, sizeof(bool * ));for (int k = 0; k < n; ++k) {
g->adj[k] = calloc(n, sizeof(bool));}for(int b = 0; b < n; ++b) {
for(int a = 0; a < n; ++a) {g->adj[a][b] = false;
}}// zerowanie macierzy
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 38 / 43
Graf - pewna implementacja
Dodanie krawedzivoid addEdge(Graph * g, int a, int b){
if (a >= 0 && a < g->n && b >= 0 && b < g->n) {g->adj[a][b] = true;g->adj[b][a] = true;
} else {printf("Niepoprawne dane\n\n");exit(EXIT_FAILURE);
}}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 39 / 43
Graf - pewna implementacja
Wyswietlenie grafuvoid displayVertex(int a) {
printf("%c ", ’A’ + a);}void display(Graph const * g) {
printf("\nKrawedzie grafu:\n");for (int row = 0; row < g->n; ++row)
for (int col = 0; col < g->n; ++col)if (g->adj[row][col]) {
printf("%c%c", (char)(’A’ + row), ’-’);printf("%c%s", (char)(’A’ + col), " ");
}printf("\n");
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 40 / 43
Graf - pewna implementacja
nie odwiedzony wierzchołek// zwraca nie odwiedzony wierzchołek przyległy do a// zwraca -1, je zeli takiego wierzchołka nie maint getUnVisitedVertex(Graph * g, int a, bool const visited []){
for (int b = 0; b < g->n; ++b) {if (g->adj[a][b] && !visited[b]) {
return b;}
}return -1;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 41 / 43
Graf - pewna implementacja
Wyszukiwanie "wgłab"void dfs(Graph * g, int a) {
bool * visited = calloc(g->n, sizeof(bool));for (unsigned int k = 0; k < g->n; ++k)
visited[k] = false;Stack s; initStack(&s);visited[a] = true; // rozpocznij od wierzchołka adisplayVertex(a); // wy swietl wierzchołekpush(&s, a); // zapisz na stoswhile (!stackEmpty(&s)) {
// pobierz nie odwiedzony wierzchołek,// przyległy do szczytowego elementu stosuint b = getUnVisitedVertex(g, top(&s), visited);if (b == -1){ // je zeli nie ma takiego wierzchołka,
pop(&s);} else {
visited[b] = true;displayVertex(b);push(&s, b);
}} // whilefree(visited);
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 42 / 43
Graf - pewna implementacja
wyszukiwanie wszerzvoid bfs(Graph * g, int a) {
bool * visited = calloc(g->n, sizeof(bool));for (unsigned k = 0; k < g->n; ++k)
visited[k] = false;Queue q; initQueue(&q);visited[a] = true;displayVertex(a);inject(&q, a); // wstaw na ko ncuwhile (!queueEmpty(q)) {
int b = front(&q); // pobierz piewszy wierzchołekeject(&q); // usu n go z kolejkiint c; // dopóki ma nie odwiedzonych s ˛asiadówwhile ((c = getUnVisitedVertex(g, b, visited)) != -1){
visited[c] = true;displayVertex(c);inject(&q, c);
}} // while(kolejka nie jest pusta)free(visited);
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 7 43 / 43