2018-01-12 Algorytmy i struktury danych– W7 1
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Wykład 7
Grafy - wybrane algorytmy
1. Podstawowe pojęcia
2. Reprezentacja grafów w komputerze
3. Podstawowe operacje na grafach
4. Wybrane algorytmy grafowe
4.1. Przechodzenie grafu "w głąb" (DFS – Depth First Search)
4.2. Przechodzenie grafu "wszerz" (BFS – Breadth First Search)
4.3. Badanie spójności grafu
2018-01-12 Algorytmy i struktury danych– W7 2
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
1. Podstawowe pojęcia
Grafem G jest para (V, E)
gdzie V - zbiór wierzchołków (węzłów),
E - zbiór par (x, y) ε V2 krawędzi grafu
Rys. 7.1. Przykładowy graf nieskierowany
V = {A, B, C, D, E} E = {(A, B), (B, C), (B, D), (B, E), (C, D), (C, E)}
Zakładamy, że daną parę wierzchołków łączy co najwyżej jedna krawędź.
2018-01-12 Algorytmy i struktury danych– W7 3
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Jeżeli krawędziom grafu przypisano określony kierunek (początek, koniec), to mamy do
czynienia z grafem skierowanym (zorientowanym, digrafem).
Rys. 7.2. Przykładowy graf skierowany
W niektórych przypadkach wygodnie jest korzystać z grafów, gdzie niektóre wierzchołki
posiadają krawędzie skierowane do siebie. Przykład takiego grafu przedstawia rys.7.3.
2018-01-12 Algorytmy i struktury danych– W7 4
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Rys. 7.3. Przykład grafu skierowanego z pętlami
W niektórych zastosowaniach krawędziom grafu przypisuje się wartości – przeważnie
liczbowe. Mamy wtedy do czynienia z grafem ważonym, a jego formalna definicja zmienia
się do postaci: (V, E, W) gdzie W jest zbiorem wartości przypisanych krawędziom.
Rys. 7.4. Przedstawia przykładowy graf skierowany ważony.
2018-01-12 Algorytmy i struktury danych– W7 5
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Rys. 7.4. Przykładowy graf skierowany z wagami
Graf, który zawiera "zdublowane" krawędzie, tzn. pary wierzchołków połączonych więcej niż jedną krawędzią to multigraf.Graf nie zawierający pętli to graf prosty.Graf prosty o n wierzchołkach posiada co najwyżej |E| = n*(n – 1)/2 krawędzi.
2018-01-12 Algorytmy i struktury danych– W7 6
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Stopień wierzchołka grafu to liczba krawędzi łączących ten wierzchołek z sąsiednimi.
Dla przykładu wierzchołek B grafu z rysunku 7.2 lub 7.4 ma stopień 4, a wierzchołek D
tego samego grafu ma stopień 2.
Podgrafem (grafem częściowym) nazywa się taki podzbiór wierzchołków danego grafu
wraz z krawędziami je łączącymi, który tworzy graf.
Ścieżką (ang. path) w grafie jest ciąg wierzchołków, w którym każdy następny (oprócz
pierwszego) wraz ze swoim poprzednikiem sąsiadują ze sobą w grafie.
Ścieżka prosta to taka ścieżka, w której wszystkie wierzchołki i krawędzie są różne.
Cyklem jest taka ścieżka prosta, w której pierwszy i ostatni wierzchołek są takie same.
W grafie z rys. 7.1 ścieżki proste to przykładowo ścieżki zawierające wierzchołki A, B, D, C
i A, B, C, E.
Cyklem w tym samym grafie są np. ścieżki B, C, D i B, D, C, E, B.
Długością ścieżki jest liczba krawędzi wchodzących w jej skład.
2018-01-12 Algorytmy i struktury danych– W7 7
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Graf jest spójny, jeżeli dla każdej pary wierzchołków istnieje w nim ścieżka, która je łączy.
Graf, który nie posiada tej własności składa się ze spójnych składowych, z których każda jest
maksymalnym podgrafem spójnym.
Maksymalny podgraf spójny oznacza, że nie istnieje ścieżka prowadząca od dowolnego
wierzchołka podgrafu do innego wierzchołka grafu nienależącego do danego podgrafu.
2018-01-12 Algorytmy i struktury danych– W7 8
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
2. Reprezentacja grafów w komputerzeW procedurach komputerowych stosuje się trzy różne sposoby reprezentacji grafów:– macierz sąsiedztwa– lista sąsiedztwa– macierz incydencjiMacierz sąsiedztwa (ang. Adjacency matrix) jest reprezentowana w pamięci komputera jako dwy-wymiarowa nxn tablica, gdzie n – liczba wierzchołków grafu (n = |V|).Kolumny i wiersze macierzy odpowiadają poszczególnym wierzchołkom grafu, a element w wierszu w i kolumnie k odpowiada istnieniu albo nie istnieniu krawędzi (w, k), przy czym wiersz w odpowiada wierzchołkowi początkowemu, a kolumna k – wierzchołkowi końcowemu krawędzi. Wartości elementów macierzy T[w, k] spełniają zależność:
EkwjezeliqEkwjezeli
kwT
),(0),(0
],[
Zależnie od "rodzaju" grafu wartość q jest równa:1 w przypadku grafu niezorientowanego bez wag na krawędziach,1 lub -1 w grafach zorientowanych (1 – krawędź w – k, -1 – krawędź k – w gdzie w < kwartość wagi krawędzi w przypadku grafów ważonych.
W grafach bez pętli wszystkie elementy macierzy sąsiedztwa na przekątnej głównej mają wartość 0.
2018-01-12 Algorytmy i struktury danych– W7 9
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Przykład – graf niezorientowany:0 1 2 3 4
0 0 1 0 1 01 1 0 1 0 12 0 1 0 1 03 1 0 1 0 14 0 1 0 1 0
Przykład – graf zorientowany
Macierz sąsiedztwa jest symetryczna względem przekątnej głównej
0 1 2 3 4
0 0 1 0 0 01 0 0 1 0 02 0 0 0 1 03 1 0 0 0 14 0 1 0 0 0
Macierz sąsiedztwa nie jest symetryczna
2018-01-12 Algorytmy i struktury danych– W7 10
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Lista sąsiedztwa (ang. Adjacency lists)
Jest to tablica n elementowa A, gdzie n jest równe liczbie wierzchołków.
Każdy element tej tablicy jest listą. Lista reprezentuje wierzchołek startowy.
Elementami tej listy są numery wierzchołków końcowych, czyli sąsiadów wierzchołka
startowego, z którymi jest on połączony krawędzią.
Przykład – graf skierowany: Przykład – graf niozorientowany:
0 1
1 2
2 3
3 0 4
4 1
0 1 3
1 0 4 2
2 1 3
3 0 2 4
4 1 3
2018-01-12 Algorytmy i struktury danych– W7 11
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Macierz incydencji (ang. Incidence matrix)
jest macierzą A o wymiarze n x m, gdzie n oznacza liczbę wierzchołków grafu, a m liczbę
jego krawędzi. Każdy wiersz tej macierzy odwzorowuje jeden wierzchołek grafu. Każda
kolumna odwzorowuje jedną krawędź. Zawartość komórki A[i,j] określa powiązanie
(incydencję) wierzchołka vi z krawędzią ej w sposób następujący:
- jeżeli graf jest skierowany
0 1 2 3 4 5
0 1 0 0 -1 0 0
1 -1 1 0 0 -1 0
2 0 -1 1 0 0 0
3 0 0 -1 1 0 1
4 0 0 0 0 1 -1
2018-01-12 Algorytmy i struktury danych– W7 12
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
- jeżeli graf jest nieskierowany
0 1 2 3 4 5
0 1 0 0 1 0 0
1 1 1 0 0 1 0
2 0 1 1 0 0 0
3 0 0 1 1 0 1
4 0 0 0 0 1 1
2018-01-12 Algorytmy i struktury danych– W7 13
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
3. Podstawowe operacje na grafach
Jeżeli mamy dane dwa grafy G1 = (V, E1) oraz G2 = (V, E2) to możemy wykonać na nich
następujące operacje:
- Suma grafów G3 = G1 + G2 = (V, E1, E2) (rys.6.6)
-
Rys. 7.6. Suma grafów
0 1 0 0 0
1 0 1 0 0
G1 = 0 1 0 1 1
0 0 1 0 0
0 0 1 0 0
0 1 0 0 0
1 0 0 1 1
G2 = 0 0 0 0 1
0 1 0 0 0
0 1 1 0 0
0 1 0 0 0
1 0 1 1 1
G3 = 0 1 0 1 1
0 1 1 0 0
0 1 1 0 0
2018-01-12 Algorytmy i struktury danych– W7 14
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
- Transpozycja grafu skierowanego (ang. digraph transposition) polega na takim
przekształceniu grafu skierowanego, że jego krawędzie mają zwrot przeciwny.
Aby transponować graf zadany macierzą sąsiedztwa, wystarczy wykonać transpozycję tej
macierzy.
0 1 2 3 4
0 0 0 0 1 01 1 0 0 0 12 0 1 0 0 03 0 0 1 0 04 0 0 0 1 0
0 1 2 3 4
0 0 1 0 0 01 0 0 1 0 02 0 0 0 1 03 1 0 0 0 14 0 1 0 0 0
2018-01-12 Algorytmy i struktury danych– W7 15
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Operacja transpozycji grafu zadanego listami sąsiedztwa jest bardziej skomplikowana.
Lista kroków algorytmu transpozycji ma w tym przypadku postać:
Wejścien – liczba wierzchołków w grafie,A – n elementowa tablica list sąsiedztwa grafu wyjściowego Wyjście:AT – n elementowa tablica list sąsiedztwa grafu transponowanegoElementy pomocnicze:v – wierzchołek, p, r – wskaźniki elementu listy Lista kroków:
K01: vc ← true ; licznik wierzchołków
K02: Dla i = 0,1,...,m-1 wykonuj K03...K07 ; przeglądamy kolejne kolumny
K03: Dla j = 0,1,...,n-1 wykonuj K04...K07 ; przeglądamy komórki w kolumnie i-tej
K04: Jeśli A[j,i] = 0, to następny obieg pętli K03 ; pomijamy wierzchołki nieincydentne z krawędzią i-tą
K05: A[j,i] ← (-A[j,i]) ; zmieniamy kierunek krawędzi
K06 vc ← ¬ vc ; negujemy vc, co pozwoli wykryć dwa wierzchołki
K07: Jeśli vc = true, to następny obieg pętli K02 ; po dwóch wierzchołkach przechodzimy do następnej kolumny
K08: Zakończ
2018-01-12 Algorytmy i struktury danych– W7 16
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Transpozycja grafu o zadanej macierzy incydencji:w macierzy incydencji zamieniamy wszystkie wartości 1 na -1 i na odwrót. Otrzymamy w ten sposób
graf, w którym krawędzie posiadają odwrotne zwroty. Macierz incydencji możemy przeglądać
kolumnami (kolumna reprezentuje krawędź). W kolumnie szukamy dwóch niezerowych wartości i, gdy je
znajdziemy, zmieniamy ich znaki na przeciwne. Dalsze przeglądanie kolumny można już zaniechać.
Opis algorytmu transponowania grafu zadanego macierzą incydencjiWejścien – liczba wierzchołków w grafie, m – liczba krawędzi w grafie, A – n x m elementowa macierz incydencji grafu wyjściowegoWyjście:A – n x m elementowa macierz incydencji grafu transponowanegoElementy pomocnicze:vc – zmienna logiczna używana do przerywania pętli po dwóch wierzchołkach i,j – indeksy kolumn i wierszy, i,j CLista kroków:K01: vc ← true ; licznik wierzchołkówK02: Dla i = 0,1,...,m-1 wykonuj K03...K07 ; przeglądamy kolejne kolumnyK03: Dla j = 0,1,...,n-1 wykonuj K04...K07 ; przeglądamy komórki w kolumnie i-tejK04: Jeśli A[j,i] = 0, to następny obieg pętli K03 ; pomijamy wierzchołki nieincydentne z krawędzią i-tąK05: A[j,i] ← (-A[j,i]) ; zmieniamy kierunek krawędziK06 vc ← ¬ vc ; negujemy vc, co pozwoli wykryć dwa wierzchołkiK07: Jeśli vc = true, to następny obieg pętli K02 ; po dwóch wierzchołkach przechodzimy do następnej kolumnyK08: Zakończ
2018-01-12 Algorytmy i struktury danych– W7 17
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Kwadrat grafu (ang. square of graph) powstaje z grafu wyjściowego przez dodanie krawędzi pomiędzy
wierzchołkami, które w grafie wyjściowym są połączone ścieżką o długości maksymalnie dwóch
krawędzi. Inaczej, w kwadracie grafu znajduje się krawędź v→u, jeśli w grafie wyjściowym istnieje
krawędź v→u lub w grafie wyjściowym istnieje wierzchołek w oraz krawędzie v→w i w→u.
Graf wyjściowy Kwadrat grafu wyjściowego
Wierzchołek u staje się sąsiadem wierzchołka v w kwadracie grafu, jeśli:
- Wierzchołek u jest sąsiadem v w grafie wyjściowym.
- Wierzchołek u jest sąsiadem wierzchołka w, który z kolei sam jest sąsiadem wierzchołka v.
Wynika z tego, że nowymi sąsiadami wierzchołka v stają się wszyscy sąsiedzi jego sąsiadów.
2018-01-12 Algorytmy i struktury danych– W7 18
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Zasada tworzenia macierzy sąsiedztwa kwadratu grafu jest następująca:
Najpierw tworzymy macierz AK o tym samym stopniu co macierz sąsiedztwa A grafu wyjściowego.
Następnie przechodzimy przez kolejne wierzchołki v grafu. Dla każdego wierzchołka v kopiujemy wiersz
A[v] do wiersza AK[v]. Teraz przeglądamy wiersz A[v] kolumnami u. Jeśli v ≠ u i A[v,u] = 1, to u jest
sąsiadem wierzchołka v i do wiersza AK[v] należy dołączyć wiersz A[u] (czyli sąsiedzi u staną się
sąsiadami v).
Algorytm wyznaczania kwadratu grafu zadanego macierzą sąsiedztwaWejścien – liczba wierzchołków w grafie, A – macierz sąsiedztwa grafu o wymiarach n x n.
Wyjście:AK – macierz sąsiedztwa kwadratu grafu o wymiarach n x n. Elementy pomocnicze:i,j,k – indeksy, i,j,k C
2018-01-12 Algorytmy i struktury danych– W7 19
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
K01: Utwórz macierz AK o wymiarach n x nK02: Dla i = 0,1,...,n-1 wykonuj K03...K08 ; przechodzimy przez kolejne wierszeK03: Dla j = 0,1,...,n-1 wykonuj K04 ; przechodzimy przez kolejne kolumnyK04 AK[i,j] ← A[i,j] ; kopiujemy wiersz wierzchołka bieżącegoK05: Dla j = 0,1,...,n-1 wykonuj K06...K08 ; teraz przeglądamy sąsiadów wierzchołka
bieżącegoK06: Jeśli (i = 1) (A[i,j] = 0), to następny obieg pętli K05 ; pomijamy wierzchołki na przekątnej i takie,
do których nie prowadzi krawędźK07: Dla k = 0,1,...,n-1 wykonuj K08K08: Jeśli A[j,k] = 1, to AK[i,k] ← 1 ; dołączamy wiersz sąsiada do wiersza
bieżącego wierzchołkaK09: Zakończ ; wynik w AK
Lista kroków:
2018-01-12 Algorytmy i struktury danych– W7 20
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
4. Wybrane algorytmy grafowe4. 1. Przechodzenie grafu "w głąb" (DFS – Depth First Search)
Przejście grafu polega na przechodzeniu przez wierzchołki, do których prowadzą ścieżki. Algorytm przejścia daje nam pewność, że żaden taki wierzchołek nie zostanie pominięty. Poważnym problemem jest fakt, że w grafach krawędzie mogą tworzyć cykle lub pętle, czyli prowadzić do tego samego wierzchołka. Rozwiązaniem jest wprowadzenie dla każdego wierzchołka znacznika, który będzie informował algorytm, czy wierzchołek był już odwiedzony. Dzięki temu nie będziemy w kółko krążyć po wierzchołkach tworzących cykl. Znacznik ten nazwiemy visited i będzie on miał wartość logiczną false, gdy wierzchołek nie był odwiedzony, a true, gdy algorytm odwiedził dany wierzchołek. Do przechowywania znaczników visited można wykorzystać osobną tablicę o tylu elementach, ile mamy wierzchołków w grafie. Przed rozpoczęciem przejścia elementy tablicy visited powinny mieć wartość false.
Zasada działania DFS jest następująca:
Zaznaczamy bieżący wierzchołek jako odwiedzony. Przechodzimy do kolejnych sąsiadów wierzchołka bieżącego i wykonujemy dla nich tą samą operację (tzn. zaznaczamy je jako odwiedzone i przechodzimy do ich sąsiadów). Przechodzenie kończymy, gdy zostaną w ten sposób odwiedzone wszystkie dostępne wierzchołki.
2018-01-12 Algorytmy i struktury danych– W7 21
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Przejście rozpoczynamy od wierzchołka v0. Wierzchołek v0 oznaczamy jako odwiedzony (kolor zielony) i przechodzimy do jego sąsiada v1
Wierzchołek v1 oznaczamy jako odwiedzony. Ponieważ nie ma on sąsiadów, to ta gałąź przejścia jest ślepa.
Przechodzimy do kolejnego sąsiada wierzchołka v0, czyli do v5
2018-01-12 Algorytmy i struktury danych– W7 22
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Wierzchołek v5 oznaczamy jako odwiedzony. Wierzchołek ten ma dwóch sąsiadów: v1 i v2. Do v1 nie przechodzimy, ponieważ jest oznaczony jako już odwiedzony.
… I po kolejnych przejściach odwiedziliśmy wszystkie wierzchołki: v0 v1 v5 v2 v3 v4
Algorytm rekurencyjny DFS dla macierzy sąsiedztwa: DFS(v)Wejście: n – liczba wierzchołków,
v – numer wierzchołka startowego,visited – n-elementowa tablica logiczna z informacją o odwiedzonych wierzchołkachA – macierz sąsiedztwa o rozmiarze n x nWyjście:
Lista odwiedzonych wierzchołków grafu.
Elementy pomocnicze:i – indeks
2018-01-12 Algorytmy i struktury danych– W7 23
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
K01: visited[v] ← true ; odwiedź wierzchołekK02: Przetwórz wierzchołek v ; przetwarzanie wstępneK03: Dla i = 0,1,...,n-1:
wykonaj: Jeśli (A[v][i] = 1) (visited[i] = false), to DFS(i); odwiedź algorytmem DFS każdego nieodwiedzonego sąsiada
K04: Przetwórz wierzchołek v ; przetwarzanie końcoweK05: Zakończ
Lista kroków:
2018-01-12 Algorytmy i struktury danych– W7 24
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
4. 2. Przechodzenie grafu "wszerz" (BFS – Breadth First Search)
Algorytm przechodzenia wszerz (ang. breadth-first search, BFS):
Zaczynamy odwiedzanie od wierzchołka startowego. Następnie odwiedzamy wszystkich
jego sąsiadów. Dalej odwiedzamy wszystkich nieodwiedzonych jeszcze sąsiadów sąsiadów.
Itd.
Tutaj również wykorzystujemy dodatkowy parametr - znacznik visited, aby uniknąć
zapętlenia w przypadku napotkania cyklu. Określa on stan odwiedzin wierzchołka. Wartość
false ma wierzchołek jeszcze nie odwiedzony, a wartość true – wierzchołek już odwiedzony.
Znaczniki te znajdują się w tablicy logicznej visited[], która posiada tyle elementów, ile jest
wierzchołków w grafie. Element visited[i] odnosi się do wierzchołka grafu o numerze i.
Działanie tego algorytmu ilustruje procedura przejścia przykładowego grafu.
2018-01-12 Algorytmy i struktury danych– W7 25
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Rozpoczynamy od wierzchołka startowego. Wierzchołek startowy zaznaczamy jako odwiedzony (zielony) i odwiedzamy wszystkich jego sąsiadów pierwszego poziomu.
Sąsiadów pierwszego poziomu oznaczamy jako odwiedzonych i odwiedzamy wszystkich ich sąsiadów, którzy jeszcze nie byli odwiedzeni. . . .
Sąsiada piątego poziomu oznaczamy jako odwiedzonego i odwiedzamy wszystkich jego sąsiadów, którzy jeszcze nie byli odwiedzeni. Do odwiedzenia pozostały dwa ostatnie wierzchołki.
2018-01-12 Algorytmy i struktury danych– W7 26
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Oznaczamy jako odwiedzonych dwóch sąsiadów stopnia 6. W grafie nie ma już nieodwiedzonych wierzchołków. Przejście zostało zakończone.
Taki sposób odwiedzania wierzchołków wymaga użycia kolejki.
Na koniec kolejki wstawiamy wierzchołek startowy. Wewnątrz pętli wierzchołek ten zostanie odczytany z początku
kolejki, po czym algorytm umieści w niej wszystkich nieodwiedzonych sąsiadów.
W kolejnych obiegach pętli sąsiedzi ci (sąsiedzi poziomu 1) zostaną odczytani z początku kolejki, a na jej koniec
zostaną wstawieni sąsiedzi poziomu 2.
Gdy wszyscy sąsiedzi poziomu 1 zostaną przetworzeni, w kolejce pozostaną tylko sąsiedzi poziomu 2.
Teraz oni będą odczytywani z początku kolejki, a na jej koniec trafią sąsiedzi poziomu 3.
Całość będzie się powtarzała w pętli dotąd, aż algorytm przetworzy wszystkie dostępne wierzchołki w grafie.
2018-01-12 Algorytmy i struktury danych– W7 27
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Algorytm BFS dla macierzy sąsiedztwaWejście:n – liczba wierzchołków, v – numer wierzchołka startowego, visited – wyzerowana tablica logiczna n elementowa z informacją o odwiedzonych wierzchołkach A – macierz sąsiedztwa o rozmiarze n x nWyjście:Lista odwiedzonych wierzchołków grafu.Elementy pomocnicze:Q – kolejka i – indeksLista kroków:
K01: Q.push(v) ; w kolejce umieszczamy numer wierzchołka startowego
K02: visited[v] ← trueK03: Dopóki Q.empty() = false, wykonuj K04...K10 ; tutaj jest pętla główna algorytmu BFSK04: v ← Q.front() ; odczytujemy z kolejki numer wierzchołkaK05: Q.pop() ; odczytany numer usuwamy z kolejkiK06: Przetwórz wierzchołek v ; tutaj wykonujemy operacje na wierzchołku vK07: Dla i = 0,1,...,n-1: wykonuj K08...K10 ; przeglądamy wszystkich sąsiadów vK08: Jeśli (A[v][i] = 0) (visited[i] = true), to następny obieg pętli K07 ; szukamy nieodwiedzonego sąsiada
K09: Q.push(i) ; numer sąsiada umieszczamy w kolejceK10: visited[i] ← true ; i oznaczamy go jako odwiedzonegoK11: Zakończ
2018-01-12 Algorytmy i struktury danych– W7 28
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
4.3. Badanie spójności grafuGraf jest spójny (ang. connected graph), jeśli dla każdej pary jego wierzchołków istnieje ścieżka, które je
ze sobą łączy.
W przeciwnym razie graf jest niespójny (ang. disconnected graph).
Spójność grafu (ang. graph connectivity) określa, czy jest on spójny, czy nie.
Algorytm badania spójności grafu nieskierowanegoWejścien – liczba wierzchołków w grafie, graf – zadany w dowolnie wybrany sposób, algorytm tego nie precyzujeWyjście:true – graf jest spójny false – graf nie jest spójny Elementy pomocnicze:visited – n elementowa tablica logiczna odwiedzin wierzchołków vc – licznik odwiedzonych wierzchołków, S – stos wierzchołków v,u – numery wierzchołków w grafie.
2018-01-12 Algorytmy i struktury danych– W7 29
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
K01: Utwórz tablicę visited o n elementachK02: Tablicę visited wypełnij wartościami falseK03: Utwórz pusty stos SK04: vc ← 0 ; inicjujemy licznik odwiedzonych wierzchołkówK05: S.push(0) ; przejście DFS rozpoczniemy od wierzchołka 0K06: visited[0] ← true ; wierzchołek oznaczamy jako odwiedzonyK07: Dopóki S.empty() = false, wykonuj K08...K14 ; przechodzimy przez grafK08: v ← S.top() ; pobieramy wierzchołek ze stosuK09: S.pop() ; pobrany wierzchołek usuwamy ze stosuK10: vc ← vc + 1 ; zwiększamy licznik odwiedzonych wierzchołkówK11: Dla każdego sąsiada u wierzchołka v, wykonuj K12..K14. ; przeglądamy kolejnych sąsiadów
K12: Jeśli visited[u] = true, to następny obieg pętli K11 ; szukamy sąsiadów jeszcze nieodwiedzonychK13: visited[u] ← true ; oznaczamy sąsiada jako odwiedzonegoK14: S.push(u) ; i umieszczamy go na stosieK15: Jeśli vc = n, to zakończ z wynikiem true ; wszystkie wierzchołki odwiedzone, graf jest
spójnyK16: Zakończ z wynikiem false ; graf nie jest spójny
Lista kroków:
2018-01-12 Algorytmy i struktury danych– W7 30
Algorytmy i struktury danych dr inż. Tadeusz Jeleniewski
Graf spójny Graf niespójny
Badanie spójności grafu skierowanego
Graf skierowany jest spójny, jeśli po zastąpieniu wszystkich jego krawędzi skierowanych krawędziami
nieskierowanymi, otrzymamy nieskierowany graf spójny.
Badanie spójności grafu skierowanego sprowadza się do:
-Do przekształcenia grafu skierowanego w graf nieskierowany.
- Badania spójności grafu nieskierowanego zgodnie z opisanym wyżej algorytmem.
Badamy spójność skonstruowanego grafu nieskierowanego za pomocą opisanego wcześniej algorytmu.
Na podstawie: http://eduinf.waw.pl/inf/alg/001_search/0122.php
oraz: Ross K.A. Ross, Ch. R.B. Wright – Matematyka dyskretna. Wyd. PWN, Warszawa, 1999
Top Related