Upload
others
View
22
Download
2
Embed Size (px)
Citation preview
Algorytmy i Struktury Danych.Grafy
dr hab. Bożena Woźna-Szcześ[email protected]
Jan Długosz University, Poland
Wykład 9
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 1 / 20
Plan wykładu
Wyszukiwanie spójnych składowych grafu (ang. Connectedcomponents)Sortowanie topologiczne (ang. Topological sort)
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 2 / 20
Spójne składowe
DefinicjaKażda spójna składowa grafu G = (V ,E) jest maksymalnympodzbiorem wierzchołków U zbioru V takim, że dla dowolnychdwóch wierzchołków z U istnieje łącząca je ścieżka w G.Jeżeli graf składa się z jednej spójnej składowej to mówimy, żejest spójny (ang. connected).Każdy graf nieskierowany można podzielić na jedna lub większąliczbę spójnych składowych (ang. connected components).
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 3 / 20
Spójne składowe
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 4 / 20
Spójne podgrafy
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 5 / 20
Spójne składowe - algorytm
Wejście: G = (V ,E)Wyjście: Spójne składowe grafu G
Algorytmy DFS oraz BFS wyznaczają spójne składowe grafu G 1.Złożoność: O((m + n).
1J. Hopcroft, R. Tarjan. “Efficient algorithms for graph manipulation”. 1973 .Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 20
Spójne składowe - algorytm
Wejście: G = (V ,E)Wyjście: Spójne składowe grafu GAlgorytmy DFS oraz BFS wyznaczają spójne składowe grafu G 1.
Złożoność: O((m + n).
1J. Hopcroft, R. Tarjan. “Efficient algorithms for graph manipulation”. 1973 .Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 20
Spójne składowe - algorytm
Wejście: G = (V ,E)Wyjście: Spójne składowe grafu GAlgorytmy DFS oraz BFS wyznaczają spójne składowe grafu G 1.Złożoność: O((m + n).
1J. Hopcroft, R. Tarjan. “Efficient algorithms for graph manipulation”. 1973 .Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 20
Spójne składowe - algorytm DFS
Require: Graf (V ,E), tablicavisited o rozmiarze |V | = n
Algorytm DFS:1: for all i := 1 to n do2: visited [i] := 0;3: end for4: for all i := 1 to n do5: if visited [i] = 0 then6: visit(i , visited);7: end if8: end for
Require: Graf (V ,E), tablicavisited o rozmiarze |V | = n
Algorytm visit(i,visited):1: print(i);2: visited [i] := 1;3: for each neighbor j of i do4: if visited [j] = 0 then5: visit(j);6: end if7: end for
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 7 / 20
Implementacja
void Graph::dfs_rek(int a) {bool* visited = new (nothrow) bool[this->n];for (int k = 0; k < this->n; ++k)
visited[k] = false;for (int k = a; k < this->n; ++k){if (visited[k] == false) this->visit(k,visited);
}delete[] visited;
}
void Graph::visit(int a, bool* visited) {displayVertex(a);visited[a] = true;int c = this->getUnVisitedVertex(a, visited);while (c != -1){
if (visited [c] == false) visit(c,visited);c = this->getUnVisitedVertex(a, visited);
}}
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 8 / 20
Wykonanie
Krawedzie grafu:A-B A-C B-A B-D C-A C-D D-B D-CDFS - odwiedzone wierzcholki: ABDCDFS rekurencyjny - odwiedzone wierzcholki: ABDCBFS - odwiedzone wierzcholki: ABCD
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 9 / 20
Spójne składowe
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 10 / 20
Sortowanie Topologiczne - sformułowanie problemu
Wejście: Acykliczny graf skierowany G = (V ,E).Wyjście: Liniowy porządek wierzchołków z V taki, że jeśli graf Gzawiera krawędź (u, v), to w tym porządku wierzchołek uwystępuje przed wierzchołkiem v .
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 11 / 20
Sortowanie topologicznie - przykład
Wierzchołki w każdym grafieacyklicznym skierowanymmożna posortowaćtopologicznie na jeden lubwięcej sposobów
7,5,3,11,8,2,9,107,5,11,2,3,10,8,93,7,8,5,11,10,9,25,7,11,2,3,8,9,10
7 5 3
11 8
2 9 10
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 12 / 20
Sortowanie Topologiczne - algorytm bazujący na DFS
Wykonaj TopologicalDFS na wejściowym acyklicznym grafieskierowanym G = (V ,E).Wypisz wierzchołki w porządku malejącym ze względu na ich“czas końcowy” - umieszczony w tablicy final .Złożoność: O(|V |+ |E |)Wejście: Graf G, tablice visited oraz final o rozmiarze |V | = n
Algorytm TopologicalDFS:1: t := 02: for all i := 1 to n do3: visited [i] := 0; final[i] := 04: end for5: for all i := 1 to n do6: if visited [i] = 0 then7: visit(i , t , visited , final);8: end if9: end for
Algorytm visit(i,t,visited,final):1: visited [i] := 1;2: for each outgoing edge j of i do3: if visited [j] = 0 then4: visit(j , t , visited , final);5: end if6: end for7: t = t + 1;8: final[i] = t ;
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 13 / 20
Sortowanie Topologiczne - przykład
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 14 / 20
Implementacja
Aby na postawie implementacji z poprzedniego wykładu wykonaćimplementację grafu skierowanego, wystarczy zmienić metodęaddEdge na następującą
void Graph::addEdge(int a, int b){if (a >= 0 && a < this->n && b >= 0 && b < this->n) {this->adj[a][b] = true;
} else {cout
Implementacja
void Graph::topological_visit(int a, int & t,bool* visited, int* fin)
{visited[a] = true;int c = this->getUnVisitedVertex(a, visited);while (c != -1){
if (visited [c] == false)topological_visit(c,t,visited,fin);
c = this->getUnVisitedVertex(a, visited);}t++;fin[a] = t;
}
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 16 / 20
Implementacja
void Graph::topological_dfs() {bool* visited = new (nothrow) bool[this->n];int* fin = new (nothrow) int[this->n];int t = 0;for (int k = 0; k < this->n; ++k) {visited[k] = false; fin[k] = 0;
}for (int k = 0; k < this->n; ++k) {if (visited[k] == false)
this->topological_visit(k,t,visited,fin);}delete[] visited;for (int k = 0; k < this->n; ++k){
int idx = max(fin,this->n);displayVertex(idx);fin[idx] = -1;
}delete[] fin;
}Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 17 / 20
Sortowanie topologiczne - Algorytm 2
Metoda usuwania wierzchołków o stopniu wejściowym równymzero
Wykorzystywana własność: jeśli graf jest acyklicznym grafemskierowanym, to posiada przynajmniej jeden wierzchołek ostopniu wejściowym równym zero.Idea: Dopóki graf posiada wierzchołki o stopniu wejściowym zero,znajdujemy taki wierzchołek, usuwamy go z grafu wraz zewszystkimi wychodzącymi z niego krawędziami i umieszczamy gona liście wierzchołków posortowanych topologicznie.Jeśli w grafie pozostaną jakieś wierzchołki, to graf posiada cykle isortowania topologicznego nie można wykonać.Złożoność: O(|V |+ |E |)
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 18 / 20
Sortowanie topologiczne - Algorytm 2
Algorytm: G = (V ,E)1: Q - Zbiór wszystkich wierzchoków bez krawędzi wchodzacych;2: while Q! = ∅ do3: Usuń wierzchołek n z Q.4: Wypisz n.5: for all m ∈ V takiego, że (n,m) ∈ E do6: E = E \ (n,m)7: if m nie ma już więcej krawędzi wchodzących then8: Wstaw m do Q.9: end if
10: end for11: end while12: if E! = ∅ then13: Graf G ma cykl.14: end if
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 19 / 20
Sortowanie topologiczne - Algorytm 2, przykład
5
4
3
2
1
Usuwamy 1−−−−−−→ 5
4
3
2 Usuwamy 2−−−−−−→ 5
4
3
Usuwamy 3−−−−−−→ 5
4
Usuwamy 4−−−−−−→ 5 Usuwamy 5−−−−−−→
Sortowanie topologiczne: 1, 2, 3, 4, 5
Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 20 / 20