ASD 11 - Strona główna AGH

Transkrypt

ASD 11 - Strona główna AGH
Algorytmy i Struktury Danych
Wykład XI
Grafy – cd.
1
Co dziś?
Algorytmy grafowe
# silne składowe spójne
# sortowanie topologiczne
# graf eulerowski
Minimalne drzewa rozpinające
# algorytm Kruskala
# algorytm Prima
Najkrótsze ścieżki z jednym źródłem
# relaksacja
# algorytm Dijkstry
# algorytm Bellmana-Forda
ASD 11
2
Silnie spójne składowe
Taki zbiór U ⊆ V wierzchołków, że dla każdej
pary (u,v) z U istnieją ścieżki
u v oraz v u
Algorytm
1. przeszukiwanie w głąb grafu G
2. utworzenie GT
3. przeszukiwanie w głąb grafu GT w kolejności
malejących wartości „znacznika końca” grafu G
4. oznaczenie (wypisanie) wierzchołków każdego
drzewa z lasu przeszukiwania
ASD 11
3
1
Transpozycja grafu - GT
ASD 10
4
Transpozycja grafu - GT
ASD 11
5
Silnie spójne składowe
ASD 11
6
2
Silnie spójne składowe
ASD 11
7
Silnie spójne składowe
ASD 11
8
Silnie spójne składowe
ASD 11
9
3
Sortowanie topologiczne
Dotyczy dagów (dag – directed acyclic graph)
Uporządkowanie wierzchołków grafu G w taki
sposób, że jeśli istnieje krawędź (u,v) to
wierzchołek u występuje przed v
Algorytm
1. przeszukiwanie w głąb grafu G
2. kiedy zakończymy „przetwarzanie” v wstawiamy
go do listy (stos)
3. wypisanie wierzchołków z listy
ASD 11
10
Sortowanie topoplogiczne
ASD 11
11
Cykl Eulera
Cykl Eulera – cykl który zawiera wszystkie krawędzie
grafu i każdą tylko raz
Graf nazywamy eulerowskim jeśli posiada cykl eulera
Graf nieskierowany – wszystkie wierzchołki maja
parzysty stopień
Graf skierowany – wszystkie wierzchołki mają równą
ilość krawędzi wchodzących i wychodzących
Ścieżka eulera
ASD 11
12
4
ASD 11
13
Cykl Eulera
Mamy graf eulerowski
1. Wyznaczamy cykl z dowolnego wierzchołka
2. Przechodzimy wyznaczony cykl aż do wierzchołka
który ma jeszcze nieodwiedzone krawędzie i
wypisujemy odwiedzone krawędzie (odkładamy do
kolejki)
3. Od tego wierzchołka rekurencyjnie wywołujemy
algorytm
4. Kończymy przeglądanie cyklu czyli wracamy do 2
ASD 11
14
Drzewa rozpinające
Pojęcie drzewa rozpinającego
Drzewo rozpinające ma V-1 krawędzi
Problem minimalnego drzewa rozpinającego
ASD 11
15
5
Drzewa rozpinające
Graf spójny, bez wag:
# przeszukiwanie w głąb
# przeszukiwanie w szerz
ASD 11
16
Schemat algorytmu – graf ważony
1. Dopóki zbiór krawędzi nie tworzy drzewa
rozpinającego:
znajdź krawędź bezpieczną i dołącz ją do zbioru
tworzącego drzewo
ASD 11
17
Algorytm Kruskala
1. Tworzymy zbiór dla każdego wierzchołka
2. Sortujemy krawędzie niemalejąco
3. Dla każdej krawędzi (u,v) :
jeśli u należy do innego zbioru niż v to łączymy zbiory
i (u,v) dokładamy do drzewa
ASD 11
18
6
Algorytm Kruskala
Złożoność
# tworzenie zbiorów
# sortowanie
# dla każdej krawędzi
O( V )
O( E lg(E) )
O( E )
# O( E lg(E) )
ASD 11
19
Algorytm Prima
1. Ustalamy korzeń minimalnego drzewa
2. Do drzewa minimalnego dokładamy krawędź
lekką
3. Krok drugi wykonujemy dla wszystkich
wierzchołków
ASD 11
20
Algorytm Prima
Implementacja
# kolejka priorytetowa dla wierzchołków
# klucze dla wierzchołków
na początek ∞
potem równe wadze krawędzi
# wskazanie na ojca
Struktura dla grafu
ASD 11
21
7
Algorytm Prima
Złożoność
# budowanie kopca O(V)
# pętla główna
dokładanie wierzchołka z kolejki O(V lg(V) )
modyfikacja kluczy wierzchołków O(E lg(V) )
# O( E lg(V) )
# Kopiec Fibonacciego
ASD 11
22
Najkrótsze ścieżki z jednym źródłem
Mamy dany ważony graf skierowany oraz
wyróżniony wierzchołek s, poszukujemy
najkrótszych ścieżek z wierzchołka s do
wszystkich wierzchołków
# najkrótsze ścieżki z jednym wierzchołkiem
docelowym
# najkrótsza ścieżka między parą wierzchołków
# najkrótsze ścieżki między wszystkimi parami
wierzchołków
ASD 11
23
Relaksacja
Inaczej – osłabianie ograniczeń
Górne oszacowanie na długość ścieżki
Implementacja
# wartość długości pamiętamy w wierzchołku
# na początku ∞
# pamiętamy wskazanie na ojca
ASD 11
24
8
Algorytm Dijkstry
1. Mamy zbiór S w którym są wierzchołki dla
których najkrótsze ścieżki są już znalezione
2. Dokładamy do S wierzchołek o najmniejszej
odległości od s
3. Wykonujemy relaksację krawędzi
wychodzących z dokładanego wierzchołka
4. Jeśli są jeszcze wierzchołki to idź do 2
ASD 11
25
Algorytm Dijkstry
Wierzchołki pamiętamy w kolejce priorytetowej
(kopce)
Tylko grafy o dodatnich wagach (ujemne cykle)
ASD 11
26
Algorytm Dijkstry
Złożoność
# budowa kopca O(V)
# pobieranie wierzchołków O(V lg(V))
# relaksacja O(E lg(V))
# O((V+E)lg(V)) = O(E lg(V))
ASD 11
27
9
Algorytm Bellmana-Forda
1. Ustawiamy dla wierzchołków ∞
2. Pętla o |V| - 1 przebiegach:
dla każdej krawędzi zrób relaksację
3. Dla każdej krawędzi sprawdź czy nie ma ujemnego
cyklu
ASD 11
28
Algorytm Bellmana-Forda
Grafy o ujemnych wagach
Sprawdza czy nie ma ujemnych pętli
Złożoność
# O(V*E)
ASD 11
29
DAG – najkrótsze ścieżki
1. Posortuj graf topologicznie
2. Dla każdego wierzchołka w porządku
topologicznym:
dla każdego wierzchołka sąsiedniego:
zrób relaksacje
ASD 11
30
10
DAG – najkrótsze ścieżki
Złożoność
# O( V+E )
Ścieżka krytyczna (PERT)
ASD 11
31
ASD 11
32
Pytania?
KONIEC!
11

Podobne dokumenty