Algorytmy i Struktury Danych, 11. ¢wiczenia
2009-01-05
1 Plan zaj¦¢
• skojarzenia w drzewach
• skojarzenia w dwudzielnych grafach regularnych
• grafy dwudzielne: najliczniejsze skojarzenia a minimalne pokrycie wierz- choªkowe
• algorytm Prima na MST
• zadanie 21.3-4. (ci¡g operacji makeset, nd-set i union w którym wszyst- kie operacje union poprzedzaj¡ pierwsz¡ operacj¦ ndset, czas O(m) przy kompresji ±cie»ek i ª¡czeniem wedªug rangi)
• problem 21-1 z Cormena
2 Algorytmy na drzewach
Naliczniejsze skojarzenie
Mo»emy obliczy¢ nast¦puj¡ce tablice:
• OP T [v] najlepsze rozwi¡zanie dla poddrzewa o korzeniu w v,
• OP T1[v] najlepsze rozwi¡zanie dla poddrzewa o korzeniu w v, ale zakªa- damy, »e v i pewien z jego synów jest poª¡czony kraw¦dzi¡ ze skojarzenia,
• OP T2[v] najlepsze rozwi¡zanie dla podrzewa o korzeniu w v, ale zakªa- damy, »e v i »aden z jego synów nie jest poª¡czony kraw¦dzi¡ ze skojarze- nia.
Algorytm 1: MaxMatching(v)
for x ∈ child(v) do MaxMatching(x) ;
1
sumOpt = 0;
2
for x ∈ child(v) do sumOpt = sumOpt + OP T [x];
Naliczniejszy zbiór niezale»ny
Mo»emy obliczy¢ nast¦puj¡ce tablice:
• OP T [v] najlepsze rozwi¡zanie dla poddrzewa o korzeniu w v,
• OP T1[v] najlepsze rozwi¡zanie dla poddrzewa o korzeniu w v, ale zakªa- damy, »e v nale»y do zbioru niezale»nego,
• OP T2[v] najlepsze rozwi¡zanie dla podrzewa o korzeniu w v, ale zakªa- damy, »e v nie nale»y do zbioru niezale»nego.
Algorytm 2: MaxIndependentSet(v)
for x ∈ child(v) do MaxIndependentSet(x) ;
1
OP T1[v] = 1; OP T2[v] = 0 ;
2
for x ∈ child(v) do
3
OP T1[v] = OP T1[v] + OP T2[x];
4
OP T2[v] = OP T2[v] + OP T [x];
5
OP T [v] = max(OP T1[v], OP T2[v]);
6
3 Skojarzenia w grafach dwudzielnych (regular- nych)
Znajdowanie skojarzenie w czasie O(E4)
Ka»dej kraw¦dzi przyznajemy wag¦ w(e), pocz¡tkowo wszystkie wagi s¡
równe 1. W kolejnych krokach prawdziwe b¦d¡ nast¦puj¡ce niezmienniki:
• dla ka»dej kraw¦dzi e, 0 ≤ w(e) ≤ 4
• dla ka»dego wierzchoªka v, Pu∈adj(v)w((v, u)) = 4.
Algorytm ko«czy dziaªanie, gdy dla ka»dej kraw¦dzi w(e) ∈ {0, 4}.
Do analizy zªo»ono±ci potrzebna jest funkcja potencjaªu:
Φ =X
e∈E
w(e)2
Dodatkowo wiemy, »e Φ0= n4/2, a Φkoniec = n42/2 = m4. Po znalezieniu cyklu C = S ∪ T , potencjaª zmienia si¦ o:
X
e∈S
((w(e)+1)2−w(e)2)+X
e∈T
((w(e)−1)2−w(e)2) = |S|+|T |+2(w(S)−w(T )) ≥ |C|
Algorytm 3: Matching(G) P ← ∅;
1
M ← ∅;
2
(C, P ) ←DFS-Cycle(G, P ) ;
3
while C 6= ∅ do
4
(S, T ) ←Euler-Split(C) ;
5 if w(E[S]) ≥ w(E[T ]) then
6
(N, H) ←Redistribute-Weights(S, T, 1)
7 else
8
(N, H) ←Redistribute-Weights(T, S, 1)
9
M ← M ∪ N ;
10
G ← G − (H ∪ N );
11
(C, P ) ←DFS-Cycle(G, P ) ;
12
return M
13
Algorytm Noga Alon'a
Lemat 1 Niech H 2rregularny graf dwudzielny. Graf H mo»na podzieli¢ na dwa grafy dwudzielne H1, H2, które s¡ rregularne. Mo»na to zrobi¢ w czasie O(|E|).
Wystarczy dla ka»dej kraw¦dzi e ∈ E z m(e) ≥ 2, przenie±¢ po bm(e)/2c kopii kraw¦dzi do H1 i H2. To co zostanie w H tworzy spójne skªadowe w których mo»na obliczy¢ cykle Eulera, z ka»dego cyklu poªow¦ kraw¦dzi przeno- simy do H1, poªow¦ do H2. Zªo»ono±¢ algorytmu jest liniowa wzgl¦dem liczby rozró»nialnych kraw¦dzi.
Lemat 2 W dwudzielnym grae regularnym G, doskonaªe skojarzenie mo»na obliczy¢ w czasie O(m log m).
Niech 2tb¦dzie najmniejsz¡ pot¦g¡ 2 speªniaj¡c¡ 2t≥ m(m = kn/2). Niech α = b2t/kc, β = 2t− kα(czyli α = 2t div k, β = 2t mod k). Niech M b¦dzie dowolnym doskonaªym skojarzeniem w G (M nie musi zawiera¢ kraw¦dzi z G).
Niech H b¦dzie grafem otrzymanym z G przez zamienienie ka»dej kraw¦dzi z G przez α kopii, i dodanie β kopii kraw¦dzi z M. Tak skonstruowany graf H jest 2tregularny. Niech H1, H2 rozbicie H na grafy 2t−1regularne. Jeden z tych grafów zawiera mniej zªych kraw¦dzi (takich które powstaªy z M), dokªadniej zawiera co najwy»ej nβ/4 < nk/4 zªych kraw¦dzi. Po t krokach znajdziemy skojarzenie w H, które nie zawiera »adnych zªych kraw¦dzi. Caªkowity czas dziaªania algorytmu to O(mt) = O(m log m).
4 Pokrycie wierzcholkowe
Pokrycie wierzchoªkowe minimalny pozbiór wierzchoªków C ⊆ V , taki, »e dla
Dowód: (przez przepªywy) Dodajemy do grafu s i t (s poª¡czone z wierz- choªkami X, t poª¡czone z wierzchoªkami Y ), wszystkie kraw¦dzie z/do s, t, maj¡ przepustowo±¢ 1, oryginalne kraw¦dzie grafowe maj¡ przepustowo±¢ ∞.
|f | = |M |, a jako minimalne pokrycie bierzemy zbiór wierzchoªków s¡siaduj¡cy z kraw¦dziami ci¦cia.
Dowód: Niech M maksymalne skojarzenie, w takim razie |C| ≥ |M|. Nale»y jeszcze udowodni¢, »e |M| ≥ |C|.
Niech C minimalne pokrycie wierzchoªkowe, mo»na pokaza¢, »e C∩X mo»na doskonale skojarzy¢ z Y −C (C∩X i Y −C musz¡ speªnia¢ twierdzenie Hall, ina- czej mo»na pokaza¢, mniejsze minimalne pokrycie), oraz C ∩Y mo»na doskonale skojarzy¢ z X − C, co w sumie daje skojarzenie o mocy |C|.
Twierdzenie 2 (Hall, 1935) Niech G graf dwudzielny (o zbiorach wierzchoªków X i Y ). Peªne skojarzenie wierzchoªków X istnieje wtw, |S| ≤ |N(S)| dla dowolnego S ⊆ X.
Je±li graf ma skojarzenie doskonaªe, to warunek jest speªniony.
Niech dla ka»dego S ⊆ X, |S| ≤ |N(S)|, oraz istnieje x0 ∈ X, który nie jest skojarzony. Niech Z bedzie zbiorem wierzchoªków osi¡galnych z x0 przez
±cie»ki alternuj¡ce. Poniewa» M jest najliczniejszym skojarzeniem, nie w±ród nich ±cie»ek rozszerzaj¡cych. Niech S = Z ∩ A, T = Z ∩ B. Ka»dy wierzchoªek w T jest skojarzony z pewnym wierzchoªkiem z S −{x0}, oraz ka»dy wierzchoªek z S − {x0} jest skojarzony z pewnym wierzchoªkiem z T . Wi¦c |T | = |S| − 1, ale T = N(S), st¡d |N(S)| = |S| − 1 sprzeczno±¢.
5 Algorytm Prima
Algorytm 4: MST-Prim(G, w, r) for u ∈ V do
1
key[u] = ∞;
2
π[i] = N IL;
3
key[r] = 0;
4
Q = V ;
5
while Q 6= ∅ do
6
u =Extract-Min(Q) ;
7
for v ∈ adj(u) do
8
if v ∈ Q and w(u, v) < key[v] then
9
π[v] = u;
10
key[v] = w(u, v)
11 12 13 14
6 Problem 211, Minimum oline
Dany ci¡g operacji INSERT (x) (x ∈ 1, . . . , n, ka»da warto±¢ jest dodawana co najwy»ej 1 raz). oraz EXT RACT − MIN. Nale»y obliczy¢ rezultaty poszcze- gólnych operacji EXT RACT − MIN (nale»y pami¦ta¢, »e caªy ci¡g operacji jest z góry dany).
Przykªad:
4, 8, E, 3, E, 9, 2, 6, E, E, E, 1, 7, E, 5 Rozwi¡zanie: Rozbijamy ci¡g wywoªa« na podci¡gi jednorodne:
I1, E, I2, . . . , Im, E, Im+1
Algorytm 5: O-Line-Minimum for i ∈ 1, . . . , n do
1
wyznacz j takie, »e i ∈ Kj ;
2
if j 6= m + 1 then
3
extracted[j]=i ;
4 niech l b¦dzie najmniejsz¡ warto±ci¡ wieksz¡ ni» j, dla której
5 zbiór Klistnieje ;
Kl= Kj∪ Kl (zbiór Kj zostaje zniszczone) ;
6 7 8
7 Problem oline LCA
(w nowym wydaniu Cormena, problem na numer 213)
Dane jest drzewo T , oraz ci¡g P , zapyta« postaci LCA(x, y) pytanie o naj- ni»szego wspólnego przodka w¦zªów x i y.
Algorytm 6: LCA(u) Make-Set(u) ;
1
ancestor[Find-Set(u)]=u ;
2
for v ∈ adj(u) do
3
LCA(v) ;
4
UNION(u, v) ;
5
ancestor[Find-Set(u)]=u ;
6
color[(u)]=CZARNY ;
7
for v : {u, v} ∈ P do
8
if color[v]=CZARNY then
9
najni»szym wspólnym przodkiem u i v jest ancestor[Find-Set(v)]
10 11 12