Algorytmy i Struktury Danych. - Grafy. Drzewo rozpinajace

advertisement
Algorytmy i Struktury Danych.
Grafy. Drzewo rozpinajace.
˛
Minimalne drzewo rozpinajace.
˛
Bożena Woźna-Szcześniak
[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 / 42
Plan wykładu
Drzewo rozpinajace
˛
Algorytm Kruskala
Algorytm Prima
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
2 / 42
Drzewo rozpinajace
˛ grafu
Definicja
Drzewem rozpinajacym
˛
grafu G nazywamy spójny i acykliczny
podgraf grafu G zawierajacy
˛ wszystkie jego wierzchołki.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
3 / 42
Drzewo rozpinajace
˛ grafu
Definicja
Drzewem rozpinajacym
˛
grafu G nazywamy spójny i acykliczny
podgraf grafu G zawierajacy
˛ wszystkie jego wierzchołki.
Twierdzenie
Każdy graf spójny zawiera drzewo rozpinajace.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
3 / 42
Drzewo rozpinajace
˛ grafu
Definicja
Drzewem rozpinajacym
˛
grafu G nazywamy spójny i acykliczny
podgraf grafu G zawierajacy
˛ wszystkie jego wierzchołki.
Twierdzenie
Każdy graf spójny zawiera drzewo rozpinajace.
˛
Twierdzenie
W grafie spójnym G = (V , E ) krawedź
˛ e ∈ E jest krawedzi
˛ a˛ ciecia
˛
wtedy i tylko wtedy, gdy e należy do każdego drzewa rozpinajacego
˛
grafu G.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
3 / 42
Drzewo rozpinajace
˛ grafu
Generowanie drzewa rozpinajacego
˛
danego grafu spójnego G
można realizować biorac
˛ kolejno krawedzie
˛
z pewnej listy i
akceptujac
˛ je po sprawdzeniu, czy nie tworza˛ one cyklu z
dotychczas zaakceptowanymi krawedziami.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
4 / 42
Drzewo rozpinajace
˛ grafu
Generowanie drzewa rozpinajacego
˛
danego grafu spójnego G
można realizować biorac
˛ kolejno krawedzie
˛
z pewnej listy i
akceptujac
˛ je po sprawdzeniu, czy nie tworza˛ one cyklu z
dotychczas zaakceptowanymi krawedziami.
˛
Generowanie wszystkich drzew rozpinajacych
˛
danego grafu jest
złożone obliczeniowo, ponieważ drzew rozpinajacych
˛
może być
bardzo dużo.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
4 / 42
Drzewo rozpinajace
˛ grafu - przykład
Pokażemy, że graf ten zawiera 8
różnych drzew rozpinajacych.
˛
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
5 / 42
Drzewo rozpinajace
˛ grafu - przykład
Pokażemy, że graf ten zawiera 8
różnych drzew rozpinajacych.
˛
Łatwo zauważyć, że każde drzewo
rozpinajace
˛ tego grafu ma 3
krawedzie.
˛
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
5 / 42
Drzewo rozpinajace
˛ grafu - przykład
Pokażemy, że graf ten zawiera 8
różnych drzew rozpinajacych.
˛
Łatwo zauważyć, że każde drzewo
rozpinajace
˛ tego grafu ma 3
krawedzie.
˛
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Uporzadkujmy
˛
wszystkie krawedzie
˛
grafu, tworzac
˛ liste˛ krawedzi.
˛
Rozważać bedziemy
˛
nastepuj
˛ ac
˛ a˛
(a, b, c, d, e).
liste˛ krawedzi:
˛
Algorytmy i Struktury Danych.
Wykład 9
5 / 42
Drzewo rozpinajace
˛ grafu - przykład
Pokażemy, że graf ten zawiera 8
różnych drzew rozpinajacych.
˛
Łatwo zauważyć, że każde drzewo
rozpinajace
˛ tego grafu ma 3
krawedzie.
˛
e
v3
v4
b
d
c
a
v1
v2
Uporzadkujmy
˛
wszystkie krawedzie
˛
grafu, tworzac
˛ liste˛ krawedzi.
˛
Rozważać bedziemy
˛
nastepuj
˛ ac
˛ a˛
(a, b, c, d, e).
liste˛ krawedzi:
˛
Każdy podzbiór krawedzi
˛
bedziemy
˛
przedstawiać w postaci listy
uporzadkowanej,
˛
zgodnie z
porzadkiem
˛
w liście krawedzi;
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
5 / 42
Drzewo rozpinajace
˛ grafu - przykład
Do generowania wszystkich drzew
rozpinajacych
˛
zastosujemy algorytm
z nawrotami.
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
6 / 42
Drzewo rozpinajace
˛ grafu - przykład
Do generowania wszystkich drzew
rozpinajacych
˛
zastosujemy algorytm
z nawrotami.
Zgodnie z algorytmem z nawrotami,
bedziemy
˛
tworzyć kolejne listy.
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
6 / 42
Drzewo rozpinajace
˛ grafu - przykład
Do generowania wszystkich drzew
rozpinajacych
˛
zastosujemy algorytm
z nawrotami.
Zgodnie z algorytmem z nawrotami,
bedziemy
˛
tworzyć kolejne listy.
(a, b, c, d, e)
e
v3
v4
b
d
c
lista czerwona oznacza, że
kraw˛edzie te zawieraja˛ cykl i trzeba
sie˛ wycofać.
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
6 / 42
Drzewo rozpinajace
˛ grafu - przykład
Do generowania wszystkich drzew
rozpinajacych
˛
zastosujemy algorytm
z nawrotami.
Zgodnie z algorytmem z nawrotami,
bedziemy
˛
tworzyć kolejne listy.
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
lista czerwona oznacza, że
kraw˛edzie te zawieraja˛ cykl i trzeba
sie˛ wycofać.
lista podkreślona oznaczaja drzewo
rozpinajace.
˛
Algorytmy i Struktury Danych.
Wykład 9
6 / 42
Drzewo rozpinajace
˛ grafu - przykład
Do generowania wszystkich drzew
rozpinajacych
˛
zastosujemy algorytm
z nawrotami.
Zgodnie z algorytmem z nawrotami,
bedziemy
˛
tworzyć kolejne listy.
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
lista czerwona oznacza, że
kraw˛edzie te zawieraja˛ cykl i trzeba
sie˛ wycofać.
lista podkreślona oznaczaja drzewo
rozpinajace.
˛
Listy (drzewa) generowane sa˛ w
porzadku
˛
leksykograficznym
(alfabetycznym).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
6 / 42
Drzewo rozpinajace
˛ grafu - przykład
(), (a), (a, b), (a, b, c) – Mamy
pierwsze drzewo rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
7 / 42
Drzewo rozpinajace
˛ grafu - przykład
(), (a), (a, b), (a, b, c) – Mamy
pierwsze drzewo rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
Usuwamy ostatnia˛ krawedź
˛ z (a, b, c),
dodajemy kolejna˛ krawedź
˛ z listy i
otrzymujemy: (a, b, d ) - zawiera cykl.
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
7 / 42
Drzewo rozpinajace
˛ grafu - przykład
(), (a), (a, b), (a, b, c) – Mamy
pierwsze drzewo rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Usuwamy ostatnia˛ krawedź
˛ z (a, b, c),
dodajemy kolejna˛ krawedź
˛ z listy i
otrzymujemy: (a, b, d ) - zawiera cykl.
Usuwamy zatem d i generujemy
nastepn
˛ a˛ liste:
˛ (a, b, e) –
Otrzymaliśmy drugie drzewo
rozpinajace.
˛
Algorytmy i Struktury Danych.
Wykład 9
7 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ e, nie możemy
jednak kontynuować bo e jest
ostatnia˛ krawedzi
˛ a˛ na liście.
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
8 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ e, nie możemy
jednak kontynuować bo e jest
ostatnia˛ krawedzi
˛ a˛ na liście.
(a, b, c, d, e)
e
v3
v4
b
d
c
Usuwamy kolejna˛ krawedź
˛ -bi
generujemy: (a, c), (a, c, d ). Mamy
kolejne drzewo rozpinajace.
˛
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
8 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ e, nie możemy
jednak kontynuować bo e jest
ostatnia˛ krawedzi
˛ a˛ na liście.
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Usuwamy kolejna˛ krawedź
˛ -bi
generujemy: (a, c), (a, c, d ). Mamy
kolejne drzewo rozpinajace.
˛
Usuwamy ostatnia˛ krawedź
˛ di
kontynuujemy: (a, c, e). Znaleźliśmy
kolejne drzewo rozpinajace.
˛
Algorytmy i Struktury Danych.
Wykład 9
8 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ e, nastepnie
˛
krawedź
˛ c, po czym generujemy
kolejno: (a, d ), (a, d , e). Mamy
kolejne drzewo rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
9 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ e, nastepnie
˛
krawedź
˛ c, po czym generujemy
kolejno: (a, d ), (a, d , e). Mamy
kolejne drzewo rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
Usuwamy krawedź
˛ e, potem d
tworzymy nowa˛ liste:
˛ (a, e). Nie
możemy jednak kontynuować wiec
˛
usuwamy krawedzie
˛
e oraz a.
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
9 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ e, nastepnie
˛
krawedź
˛ c, po czym generujemy
kolejno: (a, d ), (a, d , e). Mamy
kolejne drzewo rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Usuwamy krawedź
˛ e, potem d
tworzymy nowa˛ liste:
˛ (a, e). Nie
możemy jednak kontynuować wiec
˛
usuwamy krawedzie
˛
e oraz a.
Kolejnymi utworzonymi listami sa˛
wiec:
˛ (b), (b, c), (b, c, d ).
Otrzymaliśmy kolejne drzewo
rozpinajace.
˛
Algorytmy i Struktury Danych.
Wykład 9
9 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ d , ale kolejna
lista: (b, c, e) zawiera cykl. Usuwamy
wiec
˛ kolejno krawedź
˛ e, potem c i
generujemy listy (b, d ) i (b, d , e).
Znaleźliśmy kolejne drzewo
rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
10 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ d , ale kolejna
lista: (b, c, e) zawiera cykl. Usuwamy
wiec
˛ kolejno krawedź
˛ e, potem c i
generujemy listy (b, d ) i (b, d , e).
Znaleźliśmy kolejne drzewo
rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Usuwamy kolejno krawedzie
˛
eid a
kolejna˛ lista˛ jest: (b, e). Usuwamy e,
a nastepnie
˛
b i tworzymy listy: (c),
(c, d ), (c, d , e). Mamy kolejne drzewo
rozpinajace.
˛
Algorytmy i Struktury Danych.
Wykład 9
10 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy krawedź
˛ d , ale kolejna
lista: (b, c, e) zawiera cykl. Usuwamy
wiec
˛ kolejno krawedź
˛ e, potem c i
generujemy listy (b, d ) i (b, d , e).
Znaleźliśmy kolejne drzewo
rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Usuwamy kolejno krawedzie
˛
eid a
kolejna˛ lista˛ jest: (b, e). Usuwamy e,
a nastepnie
˛
b i tworzymy listy: (c),
(c, d ), (c, d , e). Mamy kolejne drzewo
rozpinajace.
˛
Usuwamy kolejno e i d , a nastepnie
˛
generujemy las (c, e). Usuwamy e,
nastepnie
˛
c i generujemy kolejne
listy: (d ), (d , e), (e). Nie ma już
jednak wiecej
˛
drzew rozpinajacych.
˛
Algorytmy i Struktury Danych.
Wykład 9
10 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy kolejno krawedzie
˛
e i d, a
kolejna˛ lista˛ jest: (b, e). Usuwamy e,
a nastepnie
˛
b i tworzymy listy: (c),
(c, d ), (c, d , e). Mamy kolejne drzewo
rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
11 / 42
Drzewo rozpinajace
˛ grafu - przykład
Usuwamy kolejno krawedzie
˛
e i d, a
kolejna˛ lista˛ jest: (b, e). Usuwamy e,
a nastepnie
˛
b i tworzymy listy: (c),
(c, d ), (c, d , e). Mamy kolejne drzewo
rozpinajace.
˛
(a, b, c, d, e)
e
v3
v4
b
d
c
a
v1
v2
Bożena Woźna-Szcześniak (AJD)
Usuwamy kolejno e i d , a nastepnie
˛
generujemy las (c, e). Usuwamy e,
nastepnie
˛
c i generujemy kolejne
listy: (d ), (d , e), (e). Nie ma już
jednak wiecej
˛
drzew rozpinajacych.
˛
Algorytmy i Struktury Danych.
Wykład 9
11 / 42
Drzewo rozpinajace
˛ grafu - przykład
e
v3
v4
b
d
c
a
v1
v2
Drzewa rozpinajace
˛
v4
v3
v4
v3
v4
v3
v4
v3
v1
v2
v1
v2
v1
v2
v1
v2
(a,b,c)
(a,b,e)
(a,c,d)
(a,c,e)
v4
v3
v4
v3
v4
v3
v4
v3
v1
v2
v1
v2
v1
v2
v1
v2
(a,d,e)
Bożena Woźna-Szcześniak (AJD)
(b,c,d)
(b,d,e)
Algorytmy i Struktury Danych.
(c,d,e)
Wykład 9
12 / 42
Generowanie drzew rozpinajacych
˛
grafu - założenia
Każdemu wierzchołkowi grafu przyporzadkujemy
˛
dwa atrybuty:
Korzen[r ] - tzw. korzeń drzewa, w którym znajduje sie˛ wierzchołek
r.
Poprzednik [v ] - poprzednik wierzchołka v na jedynej ścieżce
łacz
˛ acej
˛ v z korzeniem.
Poprzednik korzenia jest nieokreślony; w algorytmach zakładamy,
że jest równy 0 lub NIL.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
13 / 42
Założenia - przykład
f
d
i
a
g
b
j
e
h
c
k
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
14 / 42
Założenia - przykład
(g, g)
(g, d )
d
f
i
(g, NIL)
(g, g)
g
a
(g, b)
(g, g)
(g, g)
c
b
(g, b)
(g, g)
j
e
(g, b)
h
(g, e)
k
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
15 / 42
Generowanie drzew rozpinajacych
˛
grafu - idea
Proces generowania wszystkich drzew rozpinajacych
˛
wymaga dwóch
operacji:
Jeżeli kolejna krawedź
˛ z listy nie zamyka cyklu (jest
zaakceptowana), to dodanie jej powoduje połaczenie
˛
dwóch drzew
T 1 i T 2 w jedno nowe drzewo T i w zwiazku
˛
z tym należy dokonać
odpowiedniej zmiany etykiet wierzchołków T (Procedura A i B).
Po otrzymaniu drzewa rozpinajacego
˛
lub wyczerpaniu sie˛ listy
krawedzi
˛
w procesie generowania drzew, wykonujemy krok
“powrotu” polegajacy
˛ na wyrzuceniu ostatnio dodanej krawedzi.
˛
Powoduje to rozbicie pewnego drzewa T na dwa poddrzewa T 1 i
T 2 (Procedura C).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
16 / 42
Procedura A - pseudokod
Zamiana etykiet wierzchołków drzewa T o korzeniu r , po
operacji zamiany r na nowy korzeń v.
Algorytm NowyKorzeń(v):
1: StaryKorzen := Korzen[v]
2: if StaryKorzen = v then
3:
return;
4: end if
5: v1 := 0; v2 := v;
6: repeat
7:
p := v1; v1 := v2; v2 := Poprzednik[v1]; Poprzednik[v1] := p;
8: until v1 = StaryKorzen
9: for each w ∈ V do
10:
if Korzen[w ] = StaryKorzen then
11:
Korzen[w ] = v;
12:
end if
13: end for
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
17 / 42
Procedura A - przykład
operacja zamiany korzenia g na nowy korzeń i.
(g, d)
(g, g)
d
f
a
i
(g, NIL)
(g, g)
g
(g, g) e
j
(g, b)
c
b
(g, g) e
(g, e)
(g, b)
h
(g, e)
k
Bożena Woźna-Szcześniak (AJD)
(g, g)
(g, g)
(g, b)
h
i
g
a
(g, b)
(g, NIL)
(g, g)
(g, b)
c
b
(g, g)
d
f
(g, g)
(g, g)
j
(g, d)
(g, b)
k
Algorytmy i Struktury Danych.
Wykład 9
18 / 42
Procedura A - przykład, cd.
zmieniamy skierowanie krawedzi
˛
na ścieżce z g do i.
zmieniamy drugie etykiety wierzchołków (6=i) tej ścieżki. Etykiety
pozostałych wierzchołków w drzewie T pozostaja˛ bez zmian.
(g, d)
(g, g)
d
f
a
i
(g, NIL)
(g, g)
g
(g, g) e
(g, g)
(g, b)
c
b
(g, g)
d
f
(g, g)
(g, g)
j
(g, d)
(g, b)
(g, b)
j
(g, e)
(g, b)
h
(g, e)
k
Bożena Woźna-Szcześniak (AJD)
c
b
(g, g) e
(g, b)
(g, i)
(g, g)
(g, b)
h
i
g
a
(g, b)
k
Algorytmy i Struktury Danych.
Wykład 9
19 / 42
Procedura A - przykład, cd.
Wszystkie wierzchołki drzewa T otrzymuja˛ pierwsza˛ etykiete˛
(określajac
˛ a˛ korzeń) równa˛ i, a wierzchołek i dostaje druga˛
etykiete˛ postaci (i, NIL).
(g, d)
(g, g)
d
f
g
c
b
(g, g) e
(g, b)
(i, g)
(i, b)
(g, b)
h
j
(i, g)
c
b
e
(i, b)
(i, i)
(i, g)
(g, e)
(i, b)
h
(i, e)
k
Bożena Woźna-Szcześniak (AJD)
i
g
a
(i, NIL)
(i, g)
d
f
(g, g)
(g, g)
j
(i, d)
i
(g, NIL)
(g, g)
a
(g, b)
k
Algorytmy i Struktury Danych.
Wykład 9
20 / 42
Procedura B - pseudokod
Zamienia etykiety wierzchołków dwóch drzew T 1 i T 2, o
korzeniach odpowiednio r 1 i r 2, r 1 < r 2, po operacji ich
połaczenia
˛
przez dodanie krawedzi
˛
e = (u, v), gdzie
u ∈ V (T 1), v ∈ V (T 2).
Algorytm DodajKrawedź
˛ (e = (u, v)):
1: v1 := Korzen[u]; v2 := Korzen[v];
2: if v2 < v1 then
3:
zamien(v1, v2); zamien(u, v);
4: end if
5: NowyKorzen(v);
6: Poprzednik[v] := u;
7: for each w ∈ V do
8:
if Korzen[w ] = v2 then
9:
Korzen[w ] = v1;
10:
end if
11: end for
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
21 / 42
Procedura B - Przykład
Połaczenie
˛
dwóch drzew T 1 i T 2, o korzeniach odpowiednio d i m,
przez dodanie krawedzi
˛
e = (g, b), gdzie g ∈ V (T 1), b ∈ V (T 2).
(d, NIL)
(d, d)
d
f
a
g
e
d
f
a
h
Bożena Woźna-Szcześniak (AJD)
(m, b)
h
(d, e)
(d, g)
k
c
b
e
(m, m)
(m, c)
(d, g)
j
m
i
g
(m, NIL)
(m, b)
(d, d)
(d, g)
(m, b)
(d, e)
(d, g)
c
b
(d, NIL)
(d, d)
(m, m)
(m, c)
(d, g)
j
m
i
(d, d)
(d, g)
(m, NIL)
(m, b)
k
Algorytmy i Struktury Danych.
Wykład 9
22 / 42
Procedura B - Przykład, cd.
wierzchołkom w drzewie T 2 zmieniamy drugie etykiety tak jak
przy zamianie korzenia z m na b (Procedura A); w drzewie T1
drugie etykiety wierzchołków pozostaja˛ bez zmian.
(d, NIL)
(d, d)
d
f
a
g
e
d
a
h
(b, b)
c
b
e
(b, b)
h
(d, e)
(d, g)
k
k
Bożena Woźna-Szcześniak (AJD)
(b, NIL)
(d, g)
j
m
i
g
(b, c)
(b, b)
(d, d)
(d, g)
(m, b)
(d, e)
(d, g)
c
b
(d, g)
j
(m, m)
(m, c)
(d, NIL)
(d, d)
f
m
i
(d, d)
(d, g)
(m, NIL)
(m, b)
Algorytmy i Struktury Danych.
Wykład 9
23 / 42
Procedura B - Przykład, cd.
wierzchołkowi b jako druga˛ etykiete˛ przypisujemy g.
wszystkie wierzchołki drzewa T 2 otrzymuja˛ pierwsza˛ etykiete˛
równa˛ d ; w drzewie T1 pierwsze etykiety wierzchołków pozostaja˛
bez zmian.
(d, NIL)
(d, d)
d
f
a
(b, NIL)
g
e
d
f
a
h
(d, b)
c
b
e
(d, b)
h
(d, e)
(d, g)
k
Bożena Woźna-Szcześniak (AJD)
(d, g)
(d, g)
j
m
i
g
(d, c)
(d, b)
(d, d)
(d, g)
(b, b)
(d, e)
(d, g)
(d, NIL)
(d, d)
(b, b)
c
b
(d, g)
j
m
i
(d, d)
(d, g)
(b, c)
(b, b)
k
Algorytmy i Struktury Danych.
Wykład 9
24 / 42
Procedura C - pseudokod
Zamiania etykiet wierzchołków drzewa T o korzeniu r po
usunieciu
˛
z niego krawedzi
˛
e = (u, v), czyli rozbiciu T na dwa
drzewa T 1 i T 2, gdzie u ∈ V (T 1), v ∈ V (T 2) i r ∈ V (T 1).
UWAGA! W naszym przypadku zawsze usuwamy ostatnio dodana˛
krawedź,
˛
wiec
˛ wierzchołek u jest wierzchołkiem wiszacym
˛
i po
usunieciu
˛
krawedzi
˛
stanie sie˛ drzewem trywialnym
(jednowierzchołkowym). Zatem proces usuniecia
˛
krawedzi
˛
polega
jedynie na zmianie atrybutów wierzchołka u. Realizuje to algorytm
UsuńKrawedź.
˛
Algorytm UsuńKrawedź(e=(u,v)):
˛
1: if Poprzednik[u] = v then
2:
zamien(u, v)
3: end if
4: Poprzednik[v] := 0;
5: Korzen[v] = v;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
25 / 42
Procedura C - Przykład
W drzewie T 1 obie etykiety wierzchołków pozostaja˛ bez zmian.
Wierzchołkowi b przypisujemy etykiete˛ (b, 0) (staje sie˛ korzeniem
drzewa T 2). Drugie etykiety pozostałych wierzchołków w drzewie T 2
pozostaja˛ bez zmian, ale otrzymuja˛ pierwsza˛ etykiete˛ równa˛ b.
(d, NIL)
(d, d)
d
f
(d, d)
(d, g)
a
g
(d, g)
e
a
h
(b, b)
c
b
e
(b, b)
h
(d, e)
(d, g)
k
k
Bożena Woźna-Szcześniak (AJD)
(b, NIL)
(d, g)
j
m
i
g
(b, c)
(b, b)
(d, d)
(d, g)
(d, b)
(d, e)
(d, g)
d
f
(d, b)
c
b
(d, g)
j
m
i
(d, NIL)
(d, d)
(d, c)
(d, b)
Algorytmy i Struktury Danych.
Wykład 9
26 / 42
Procedura C - Przykład, cd.
Usuniecie
˛
kraw˛edzi (g, b).
(d, NIL)
(d, d)
d
f
a
(b, NIL)
(d, d)
(d, g)
g
e
a
h
(b, b)
c
b
e
(b, b)
h
(d, e)
(d, g)
k
Bożena Woźna-Szcześniak (AJD)
(b, NIL)
(d, g)
j
m
i
g
(b, c)
(b, b)
(d, d)
(d, g)
(b, b)
(d, e)
(d, g)
d
f
(b, b)
c
b
(d, g)
j
m
i
(d, NIL)
(d, d)
(b, c)
(b, b)
k
Algorytmy i Struktury Danych.
Wykład 9
27 / 42
Algorytm generowania wszystkich drzew
rozpinajacych
˛
grafu
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
28 / 42
Znaleźć wszystkie drzewa rozpiete
˛ grafu
b
g
f
v3
e
d
c
v1
v5
v4
a
v2
Bożena Woźna-Szcześniak (AJD)
a, ab, abc, abd, abde, abdf,
abdg, abef, abeg, abfg, abg,
ac, acd, acde, acdf, acdg, ace,
acef, aceg, acf, acfg, acg, ad,
ade, adef, adeg, adf, adfg,
adg, aef, aefg, aeg, af, afg, ag,
b, bc, bcd, bcde, bcdf, bcdg,
bce, bcef, bceg, bcf, bcfg, bcg,
bd, bde, bdef, bdeg, bdf, bdfg,
bdg, be, bef, befg, beg, bf, bfg,
bg, c.
Algorytmy i Struktury Danych.
Wykład 9
29 / 42
Drzewa rozpinajace
˛ o minimalnej wadze
Jeżeli mamy do czynienia z grafem z wagami, to najcz˛eściej
interesuje nas znalezienie drzewa rozpinajacego
˛
o minimalnej
wadze, tzn., drzewa z najmniejsza˛ suma˛ wag jego krawedzi.
˛
Aby znaleźć drzewo o żadanych
˛
własnościach można zastosować
dwa algorytmy:
Kruskala (algorytm zachłanny)
Prima (algorytm najbliższego sasiada).
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
30 / 42
Algorytmy Kruskala
Algorytm jest oparty o metode˛ zachłanna˛ i polega na
łaczeniu
˛
wielu poddrzew w jedno za pomoca˛ krawedzi
˛
o
najmniejszej wadze.
Wybierz krawedź
˛ (która nie jest petl
˛ a)
˛ e1 tak, by waga tej krawedzi
˛
była najmniejsza.
Jeżeli krawedzie
˛
e1 , e2 , . . ., ek zostały już wybrane, to z
pozostałych E \ {e1 , e2 , . . . , ek } wybierz krawedź
˛ ek +1 w taki
sposób aby:
graf, który składa sie˛ tylko z kraw˛edzi e1 , e2 , . . ., ek , ek +1 był
acykliczny, oraz
waga kraw˛edzi ek +1 była najmniejsza.
Jeśli nie można wykonać kroku 2, to STOP.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
31 / 42
Algorytm Kruskala - Złożoność obliczeniowa
Algorytm można podzielić na dwa etapy:
w pierwszym etapie sortujemy kraw˛edzie według wag w czasie
O(m · log(m)).
w drugim etapie budujemy rozpiete
˛ drzewo poprzez wybór
najkrótszych kraw˛edzi ze zbioru kraw˛edzi E(G); ten etap można
wykonać w czasie O(m · log(n)).
Sumaryczny czas pracy algorytmu Kruskala wynosi: O(m · log(n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
32 / 42
Algorytm Kruskala - Przykład
4
a
2
b
c
1
2
8
2
7
f
e
3
d
Po posortowaniu krawedzi
˛
wg.
wag otrzymujemy:
ae=1 , af=2 , bc=2 , be=2 ,
de=3 , ab=4 , fd=6 , ef=7 ,
cd=8
6
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
33 / 42
Algorytm Kruskala - Przykład
Krok 1.
Krok 2.
4
a
2
b
c
4
a
1
8
2
f
c
1
2
7
2
b
e
2
7
d
f
6
Bożena Woźna-Szcześniak (AJD)
8
2
3
e
3
d
6
Algorytmy i Struktury Danych.
Wykład 9
34 / 42
Algorytm Kruskala - Przykład
Krok 3.
4
a
2
b
Krok 4 - scalenie.
4
a
b
c
8
2
f
c
1
1
2
7
2
e
2
7
d
f
e
3
d
6
6
Bożena Woźna-Szcześniak (AJD)
8
2
3
Algorytmy i Struktury Danych.
Wykład 9
35 / 42
Algorytm Kruskala - Przykład
Krok 5.
4
a
2
b
Minimalne drzewo.
c
1
2
8
2
7
f
2
a
e
3
d
b
c
1
2
2
f
e
3
d
6
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
36 / 42
Algorytm Prima
Algorytm ten jest, podobnie jak algorytm Kruskala oparty o
metode˛ zachłanna.
˛
Budowe˛ minimalnego drzewa rozpinajacego
˛
zaczynamy od
dowolnego wierzchołka, np. od pierwszego. Dodajemy
wierzchołek do drzewa, a wszystkie krawedzie
˛
incydentne
umieszczamy na posortowanej wg. wag liście.
Nastepnie
˛
zdejmujemy z listy pierwszy element (o najmniejszej
wadze) i jeżeli wierzchołek, który łaczy
˛
nie należy do drzewa,
dodajemy go do drzewa a na liście znów umieszczamy wszystkie
krawedzie
˛
incydentne z wierzchołkiem, który dodaliśmy.
Jednym zdaniem: zawsze dodajemy do drzewa krawedź
˛ o
najmniejszej wadze, osiagaln
˛
a˛ (w przeciwieństwie do Kruskala) z
jakiegoś wierzchołka tego drzewa.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
37 / 42
Algorytm Prima - Przykład
4
a
2
b
c
1
2
8
2
7
f
e
3
d
6
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
38 / 42
Algorytm Prima - Przykład
Krok 1.
Krok 2.
4
a
2
b
c
4
a
1
8
2
f
c
1
2
7
2
b
e
2
7
d
f
6
Bożena Woźna-Szcześniak (AJD)
8
2
3
e
3
d
6
Algorytmy i Struktury Danych.
Wykład 9
39 / 42
Algorytm Prima - Przykład
Krok 3.
Krok 4
4
a
2
b
4
a
c
8
2
f
c
1
1
2
7
2
b
e
2
7
d
f
e
3
d
6
6
Bożena Woźna-Szcześniak (AJD)
8
2
3
Algorytmy i Struktury Danych.
Wykład 9
40 / 42
Algorytm Prima - Przykład
Krok 5.
4
a
2
b
Minimalne Drzewo
c
1
2
8
2
7
f
2
a
e
3
d
b
c
1
2
2
f
e
3
d
6
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
41 / 42
Algorytm Prima a Algorytm Kruskala - Przykład
Minimalne Drzewo wg. Algorytmu
Kruskala.
2
a
c
b
Minimalne Drzewo wg. Algorytmu
Prima
2
a
c
b
1
1
2
2
2
f
e
2
3
Bożena Woźna-Szcześniak (AJD)
d
f
Algorytmy i Struktury Danych.
e
3
d
Wykład 9
42 / 42
Download