Temat: Struktury danych do reprezentacji grafów. Wybrane algorytmy grafowe. Oznaczenia G = V, E - graf bez wag, gdzie V - zbiór wierzchołków, E- zbiór krawdzi V = n - liczba wierzchołków grafu G E = m - liczba krawdzi grafu G i, - krawd (para uporzdkowana) z wierzchołka i do wierzchołka j w grafie skierowanym i, j - krawd (podzbiór) łczca wierzchołki i oraz j w grafie nieskierowanym G = V, E, f - graf z wagami, gdzie V - zbiór wierzchołków, E- zbiór krawdzi, f: V R ( j) Załoenia Graf skierowany nie ma ptli, czyli dla kadej krawdzi ( j) i j, zachodzi Wierzchołki grafu s reprezentowane numerami:,,..., n i, grafu. Struktury danych do reprezentacji grafu bez wag a) macierz ssiedztwa Definiujemy tablic dwuwymiarow G o rozmiarach n n. Jeeli graf jest nieskierowany to: [, j] G i 0 = dla dla i, j i, j E E
G: 0 0 0 0 0 0 0 0 0 Złoono pamiciowa: n Macierz ssiedztwa jest symetryczna wzgldem głównej przektnej dla grafu nieskierowanego. Jeeli graf jest skierowany to: [, j] G i 0 = dla dla ( i, j) ( i,j) E E G: 0 0 0 0 0 0 0 0 0 0 0 0 Złoono pamiciowa: n
Wady: dua złoono pamiciowa dla grafów rzadkich (tj. takich dla których m<<n ), nieefektywna realizacja algorytmów grafowych wymagajcych dotarcia do wszystkich wzłów incydentnych z danym wzłem. Zalety: efektywna realizacja (stały koszt) dodawania i usuwania krawdzi grafu, efektywna realizacja (stały koszt) sprawdzenia, czy w grafie jest dana krawd b) Listy incydencji Struktur danych jest w tym przypadku jednowymiarowa tablica wskaników na listy wierzchołków incydentnych. W indeksie i takiej tablicy znajduje si adres pierwszego elementu listy zawierajcej numery tych wierzchołków grafu, które incyduj z wierzchołkiem numer i. Rozmiar tablicy jest równy n. dla grafu nieskierowanego, T tablica incydencji T[]:,, T[]:,, T[]:,, T[]:,, T[]:, grafu skierowanego T[]:,, T[]:, T[]: T[]: T[]: Złoono pamiciowa: n+m
Wady: nieefektywna realizacja dodawania (usuwania) krawdzi grafu (Trzeba sprawdzi cał list incydencji, aby ustali, czy krawdzi wstawianej (usuwanej) nie ma ju (jest) w grafie. nieefektywna realizacja sprawdzenia, czy w grafie jest dana krawd (Trzeba przejrze cał list incydencji). struktura trudniejsza w realizacji Zalety: efektywna złoono pamiciowa dla skierowanych grafów rzadkich, efektywna realizacja algorytmów grafowych wymagajcych dotarcia do wszystkich wzłów incydentnych z danym wzłem.. Struktury danych do reprezentacji grafu z wagami a) macierz ssiedztwa Definiujemy tablic dwuwymiarow G o rozmiarach n n. Jeeli graf jest skierowanego to: [, j] G i = f dla ( i, j) (( i, j) ) dla ( i, j) E E Warto ustalana jest indywidualnie dla konkretnego grafu i konkretnego algorytmu grafowego. Na przykład dla problemu najkrótszych cieek n f max, gdzie f max to maksimum funkcji wag. G: * -6 8. 0 6. 8 Złoono pamiciowa: n
Analogicznie definiujemy macierz ssiedztwa dla nieskierowanego grafu z wagami. c) Listy incydencji Struktur danych jest w tym przypadku jednowymiarowa tablica wskaników na listy wierzchołków incydentnych. W indeksie i takiej tablicy znajduje si adres pierwszego elementu listy zawierajcej numery tych wierzchołków grafu, które incyduj z wierzchołkiem numer i oraz wagi tych krawdzi. Rozmiar tablicy jest równy n.. Algorytmy bazowe dla grafów bez wag i ich przykładowe zastosowanie a) Przegldania grafu metod wszerz (breadth-first search (BFS)) WP: G graf bez wag, s- wierzchołek startowy WK: Odwiedzenie kadego wierzchołka grafu G, do którego istnieje co najmniej jedna cieka z s. Struktura do reprezentacji grafu G - tablica struktur z polami: link - wskanik na list incydencji, color typ z trzema wartociami: biały, szary, czarny, Wskanik listy incydencji zawiera pola: nr numer wierzchołka next adres kolejnego elementu listy Struktura pomocnicza kolejka z operacjami: in, out, first, empty. (in(e,q)- wstawia do kolejki Q element e, out(q) usuwa element e z kolejki Q, first(q) zwraca dane z pierwszego elementu niepustej kolejki Q, empty(q) sprawdza, czy kolejka Q jest niepusta)
Algorytm I Krok: Inicjalizacja tablicy grafu G: nr wierzchołka color biały biały biały biały biały link,,, II Krok: Przegldanie grafu z wierzchołka s BFS(G, s) G[s].color = szary; Q= ; in(s,q); while (!empty(q)) u= first(q); temp = G[u].link; while (temp!=null) v = temp->nr; if (G[v].color == biały) 6
// odwiedzenie wierzchołka v G[v].color = szary; in(v,q); temp = temp->next; out(q); G[u].color = czarny; G: nr wierzchołka color czarny czarny czarny czarny czarny Link,,, b) Zastosowanie przegldania grafu metod wszerz (breadth-first search (BFS)) do ustalania najkrótszych cieek w grafie bez wag WP: G graf bez wag, s- wierzchołek startowy WK: najkrótsze cieki z wierzchołka s do pozostałych wierzchołków grafu Struktura do reprezentacji grafu G - tablica struktur z polami: link - wskanik na list incydencji, color typ z trzema wartociami: biały, szary, czarny, d odległo od wierzchołka startowego, 7
pi poprzednik na ciece Wskanik listy incydencji zawiera pola: nr numer wierzchołka next adres kolejnego elementu listy Struktura pomocnicza kolejka z operacjami: in, out, first, empty. (in(e,q)- wstawia do kolejki Q element e, out(q) usuwa element e z kolejki Q, first(q) zwraca dane z pierwszego elementu niepustej kolejki Q, empty(q) sprawdza, czy kolejka Q jest niepusta) Algorytm I Krok: Inicjalizacja tablicy grafu G: nr wierzchołka color biały biały biały biały biały D pi - - - - - link,,, II Krok: Przegldanie grafu z wierzchołka s z jednoczesnym ustawianiem etykiet d i pi 8
BFS(G, s) G[s].color = szary; G[s].d = 0; Q= ; in(s,q); while (!empty(q)) u= first(q); temp = G[u].link; while (temp!=null) v = temp->nr; if (G[v].color == biały) G[v].color = szary; G[v].d = G[u].d + ; G[v].pi = u; in(v,q); temp = temp->next; out(q); G[u].color = czarny; G: nr wierzchołka color czarny czarny czarny czarny czarny d 0 pi - link,,, 9
Złoono czasowa BFS Jako operacj elementarn przyjmujemy wykonanie operacji in lub out na kolejce Q oraz operacj przegldania list incydencji grafu. Kady wierzchołek jest wstawiany co najwyej raz i co najwyej raz jest z niej usuwany. Std łczny czas wykonania operacji na kolejce wynosi O(n). Poniewa lista incydencji kadego wierzchołka jest przegldana tylko wtedy, gdy wierzchołek zostanie usunity z kolejki, lista incydencji kadego wierzchołka jest przegldana co najwyej raz. Suma długoci wszystkich list wynosi Θ(m). Łczny czas przegldania list wynosi zatem O(m). Inicjowanie grafu zabiera czas O(n). Reasumujc: koszt BFS wynosi O(m+n). c)przegldania grafu metod w głb (depth-first search (DFS)) WP: G graf bez wag, s- wierzchołek startowy WK: Odwiedzenie kadego wierzchołka grafu G, dla którego istnieje co najmniej jedna cieka z s Struktura do reprezentacji grafu G - tablica struktur z polami: link - wskanik na list incydencji, color typ z trzema wartociami: biały, szary, czarny, Wskanik listy incydencji zawiera pola: nr numer wierzchołka next adres kolejnego elementu listy Struktura pomocnicza stos z operacjami: push, pop, top, empty. (push(e,s)- wstawia do stosu S element e, pop(s) usuwa element e ze stosu S, top(s) zwraca dane z wierzchołka niepustego stosu S, empty(s) sprawdza, czy stos S jest niepusty) 0
Algorytm I Krok: Inicjalizacja tablicy grafu G: nr wierzchołka color biały biały biały biały biały link,,, II Krok: Przegldanie grafu z wierzchołka s DFS_VISIT(u) (funkcja rekurencyjna) G[u].color = szary; temp=g[u].link; while (temp!=null) v=temp->nr; if (G[v].color ==biały ) // odwiedzenie wierzchołka v DFS_VISIT(v); temp = temp->link; G[u].color = czarny;
DFS (G, s): DFS_VISIT(s); G: nr wierzchołka color czarny czarny czarny czarny czarny link,,, d) Zastosowanie przegldania grafu metod w głb (depth-first search (DFS)) do sortowania topologicznego grafu WP: G graf bez wag, skierowany i acykliczny (bez cykli) WK: Nowa numeracja wierzchołków taka, e jeeli graf G zawiera krawd (u, v), to w tym porzdku wierzchołek u wystpuje przed wierzchołkiem v (wierzchołek u ma mniejszy numer ni wierzchołek v). Numery wierzchołków w nowej numeracji zapamitane s w stosie wynikowym W. Jeeli graf nie jest acykliczny to takie uporzdkowanie nie jest moliwe. Struktura do reprezentacji grafu G - tablica struktur z polami: link - wskanik na list incydencji, color typ z trzema wartociami: biały, szary, czarny, Wskanik listy incydencji zawiera pola:
nr numer wierzchołka next adres kolejnego elementu listy Struktura pomocnicza stos z operacjami: push, pop, top, empty. (push(e,s)- wstawia do stosu S element e, pop(s) usuwa element e ze stosu S, top(s) zwraca dane z wierzchołka niepustego stosu S, empty(s) sprawdza, czy stos S jest niepusty) Algorytm I Krok: Inicjalizacja tablicy grafu Graf G: Krawd (u, v) oznacza, e cz garderoby u powinna by załoona przed czci garderoby v. slipki spodnie skarpetki buty zegarek pasek koszula krawat marynarka nr 6 7 8 9 wierzchołka dane wierchołka skarpetki slipki spodnie Buty zegarek koszula pasek krawat marynarka color biały biały biały biały biały biały biały biały biały link,, 7 - - 7, 8 9 9 -
II Krok: Przegldanie grafu metod w głb z wierzchołka startowego s. Wierzchołki, które staj si czarne s wstawiane do stosu wynikowego W. Kolejno wierzchołków w stosie W okrela nowa numeracj wierzchołków grafu po sortowaniu topologicznym. DFS_VISIT(u) (funkcja rekurencyjna) W= ; G[u].color = szary; temp=g[u].link; while (temp!=null) v=temp->nr; if (G[v].color ==biały ) DFS_VISIT(v); temp = temp->link; G[u].color = czarny; push(u,w); DFS(G, s); W= ; DFS_VISIT(s); for (i=;i<=n;i++) if (G[i].color==biały) DFS_VISIT(i); nr 6 7 8 9 wierzchołka dane wierchołka skarpetki slipki spodnie buty zegarek koszula pasek krawat marynarka color czarny czarny czarny czarny czarny czarny czarny czarny czarny link,, 7 - - 7, 8 9 9 - nowa numeracja 6 7 8 9
Złoono czasowa DFS Jako operacj elementarn przyjmujemy liczb wywoła rekurencyjnych procedury DFS_VISIT (operacje stosowe realizowane w stosie wywoła) oraz operacj przegldania list incydencji grafu. Koszt procedury DFS wynosi O(m+n) - uzasadnienie analogiczne jak dla BFS.