X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=3-bipcon%2F3-bipcon.tex;h=362bd7b75a79cb904c7c8009f4040da281cb03ca;hb=b2484e9e3f714201f2c3543a2a265d015e6e5915;hp=7415877436179d48a20784e26e8548300554e2fe;hpb=8d1efdbbecccc98ba81ee706e700d11b1b0a25e8;p=ga.git diff --git a/3-bipcon/3-bipcon.tex b/3-bipcon/3-bipcon.tex index 7415877..362bd7b 100644 --- a/3-bipcon/3-bipcon.tex +++ b/3-bipcon/3-bipcon.tex @@ -1,131 +1,150 @@ -%%%%%%%%%%%% -% Zápisek tøetího semináre z grafových agoritmù - ze dne 20.3.2006 -% Zapsal Jiøí Peinlich - peinlich@seznam.cz a Michal Kùrka - michal.kurka@gmail.com -%%%%%%%%%%% - \input ../sgr.tex -\prednaska{3}{Bipartitní párování a globální k-souvislost}{zapsali Jiøí Peinlich, Michal Kùrka} - -\h{Maximální párování v $k$-regulárním bipartitním grafu} - -\s{Operace Degree Split} provádí rozdìlení sudì-regulárního grafu na dva -podgrafy s polovièní regularitou. Operaci Degree Split definujme na -sudì-regulárním grafu takto: V grafu najdeme eulerovský tah. Sestrojíme dva -grafy, které budou mít oba stejnou mno¾inu vrcholù jako graf pùvodní a ka¾dý -bude mít polovinu jeho hran. Mno¾inu hran prvního grafu budou tvoøit sudé hrany -z nalezeného eulerovského tahu, mno¾inu hran druhého grafu pak hrany liché. Tuto -operaci lze jistì provést v lineárním èase (v lineárním èase najdeme eulerovský -tah i rozklad na sudé a liché hrany). - -Dále budeme pracovat s $2^d$-regulárními grafy. Operací Degree Split tedy získáme dva grafy, které budou $2^{d-1}$-regulární. - -Provedeme-li operaci Degree Split $\log k = d$ krát (polovinu hran v¾dy -zahodíme), získáme 1-regulární podgraf a tedy párování pro zadaný graf (ve -skuteènosti mù¾eme graf rozkládat na párování a vyrobit si 1-faktorizaci -grafu). Slo¾itost nalezení párování bude tedy pro $2^d$ regulární grafy $\O(2^d n -d)$. - -Pokud zadaný graf nebude $2^d$-regulární budeme muset pøidat hrany tak, aby nový -graf tuto vlastnost mìl. Operaci Degree Split pak budeme provádìt tak, abychom -se k párování blí¾ili. - -Místo toho, abychom do grafu hrany jen pøidávali, budeme v pøípadech, kdy je to -mo¾né, pouze zvìt¹ovat násobnost hrany. U ka¾dé hrany si tedy budeme pamatovat -její násobnost. - -\s{Degree Split s~násobnostmi:} Pro sudì-regulární grafy s násobnostmi zavedeme operaci Degree Split takto: -Graf $G=(V,E)$ rozdìlíme na dva grafy $G_1$ a $G_2$, bude platit $V(G_1) = V(G_2) = V$. Hrany nyní pøidìlíme následujícím zpùsobem: -\algo -\:Pokud $e\in E$ v $G$ má sudou násobnost (znaèíme $n(e)$), umístíme ji do $E_1$ i do $E_2$ s násobností ${n(e) \over 2}$, v opaèném pøípadì pøidáme do obou grafù hranu s násobností $\lfloor {n(e) \over 2} \rfloor$. -\:Graf se zbylých hran má v¹echny stupnì sudé a je bez multiplicit. Provedeme na nìj pùvodní operaci Degree Split a rozdìlené mno¾iny hran pøidáme do $G_1$ a $G_2$. -\endalgo - -Celý proces lze stihnout v èase $\O(m)$ ($m$ je poèet hran $G$), nebo» v první èásti u ka¾dé hrany pouze zjistíme, zda má sudou násobnost, pøidáme nové hrany v konstantním èase (upravíme násobnosti), a v druhé èásti se provede Split, který má té¾ lineární slo¾itost. Operace Degree Split má tedy slo¾itost $\O(m)$ i v grafu s násobnostmi. - -Mìjme nyní $k$-regulární bipartitní graf. Zvolme $t$ tak aby $2^t\geq kn$. -Zvolme dále -$\alpha := \lfloor {2^t \over k} \rfloor$ a +\prednaska{3}{Bipartitní párování a globální k-souvislost}{} + +V~předeÅ¡lých kapitolách jsme se zabývali aplikacemi toků na~hledání maximálního párování +a minimálního $st$-řezu. Nyní si předvedeme dva algoritmy pro podobné problémy, +které se obejdou bez toků. + +\h{Maximální párování v regulárním bipartitním grafu \cite{alon:matching}} + +Nejprve si nadefinujme operaci {\I Å¡těpení grafu,} která zadaný graf $G=(V,E)$ +se vÅ¡emi vrcholy sudého stupně a sudým počtem hran v~každé komponentě souvislosti +rozloží na~disjunktní podgrafy $G_1=(V,E_1)$ a $G_2=(V,E_2)$, +v~nichž bude pro každý vrchol~$v$ platit ${\rm deg}_{G_1}(v) = {\rm +deg}_{G_2}(v) = {\rm deg}_G(v)/2$. Tuto operaci můžeme snadno +provést v~lineárním čase tak, že si graf rozdělíme na~komponenty, v~každé +nalezneme eulerovský tah a jeho hrany budeme přidávat střídavě do~$G_1$ a do~$G_2$. + +Å těpení nám pomůže ke~snadnému algoritmu pro nalezení maximálního párování ve~$2^t$-regulárním +bipartitním grafu.\foot{VÅ¡imněte si, že takové párování bude vždy perfektní (viz Hallova věta).} +Komponenty takového grafu mají určitě sudý počet hran, takže jej můžeme +rozÅ¡těpit na~dva $2^{t-1}$-regulární grafy. Libovolný jeden z~nich pak opět rozÅ¡těpíme +atd., až dostaneme $1$-regulární graf, který je perfektním párováním v~$G$. +To vÅ¡e jsme schopni stihnout v~lineárním čase, jelikož velikosti grafů, které +Å¡těpíme, exponenciálně klesají. Také bychom mohli rekurzivně zpracovávat obě +části a tak se v~čase $\O(m\log n)$ dobrat ke~kompletní 1-faktorizaci +zadaného grafu.\foot{To je rozklad hran grafu na~disjunktní perfektní párování +a má ho každý regulární bipartitní graf.} + +Pokud zadaný graf nebude $2^t$-regulární, pomůžeme si tím, že ho novými hranami +doplníme na $2^t$-regulární a pak si při Å¡těpeních budeme vybírat ten podgraf, +do~kterého padlo méně nových hran, a ukážeme, že nakonec vÅ¡echny zmizí. +Abychom graf příliÅ¡ nezvětÅ¡ili, budeme se snažit místo přidávání úplně nových +hran pouze zvyÅ¡ovat násobnost hran existujících. Pro každou hranu $e$ si tedy +budeme pamatovat její násobnost $n(e)$. + +{\I Å těpení grafu s~násobnostmi} pak budeme provádět následovně: hranu~$e$ +s~násobností $n(e)$ umístíme do~$G_1$ i~do~$G_2$ s~násobností $\lfloor n(e)/2 +\rfloor$ a pokud bylo $n(e)$ liché, přidáme hranu do~pomocného grafu +$G^\prime$. VÅ¡imněte si, že $G^\prime$ bude graf bez násobností, v~němž mají +vÅ¡echny vrcholy sudý stupeň, takže na~něj můžeme aplikovat původní Å¡těpící algoritmus +a $G^\prime_i$ přiřadit ke~$G_i$. To~vÅ¡e zvládneme v~čase $\O(m)$. + +Mějme nyní $k$-regulární bipartitní graf. Obě jeho partity jsou stejně velké, +označme si počet vrcholů v~každé z~nich~$n$. Zvolme $t$ tak aby $2^t\geq kn$. +Zvolme dále parametry +$\alpha := \lfloor 2^t/k \rfloor$ a $\beta := 2^t \bmod k$. -Do grafu pøidáme hrany a upravíme násobnosti hran tak, aby byl $2^t$ regulární. Dále pøidáme triviální párování ($i$-tý vrchol vlevo se spojí s $i$-tým vrcholem vpravo) s násobností $\beta$. Tuto mno¾inu hran oznaème $F$. Platí $\beta < k \Rightarrow \vert F \vert < 2^t$. +Každé původní hraně nastavíme násobnost~$\alpha$ a přidáme triviální párování~$F$ +($i$-tý vrchol vlevo se spojí s~$i$-tým vrcholem vpravo) s~násobností~$\beta$. +VÅ¡imněte si, že $\betaProblém zji¹tìní {\I stupnì hranové souvislosti} grafu lze pøevést na problém hledání minimálního øezu, -který ji¾ pro zadanou dvojici vrcholù umíme øe¹it pomocí Dinicova algoritmu v~èase $\O(n^{2/3}m)$. -Pokud chceme najít minimum pøes v¹echny dvojice, mù¾eme vyzkou¹et v¹echny dvojice $(s,t)$. -To v¹ak lze snadno zrychlit, pokud si uvìdomíme, ¾e jeden z vrcholù $s$ nebo $t$ lze zvolit -pevnì. Pokud pracujeme s orientovanými grafy, musíme projít jak øezy pro $s \rightarrow t$, tak i $t \rightarrow s$. -Algoritmus bude mít slo¾itost $\O(n^{{5/3}}m)$. +Problém zjiÅ¡tění {\I stupně hranové souvislosti} grafu lze převést na problém hledání minimálního řezu, +který již pro zadanou dvojici vrcholů umíme řeÅ¡it pomocí Dinicova algoritmu v~čase $\O(n^{2/3}m)$. +Pokud chceme najít minimum ze~vÅ¡ech řezů v~grafu, můžeme vyzkouÅ¡et vÅ¡echny dvojice $(s,t)$. +To vÅ¡ak lze snadno zrychlit, pokud si uvědomíme, že jeden z~vrcholů (třeba $s$) můžeme zvolit +pevně: vezmeme-li libovolný řez $C$, pak jistě najdeme alespoň jedno~$t$, které padne +do~jiné komponenty než pevně zvolené~$s$, takže minimální $st$-řez bude nejvýše tak velký jako~$C$. +V~orientovaném grafu musíme projít jak řezy pro $s \rightarrow t$, tak i $t \rightarrow s$. +Algoritmus bude mít složitost $\O(n^{{5/3}}m)$. -U~{\I vrcholové $k$-souvislosti} to ov¹em tak snadno nepùjde. Pokud by toti¾ fixovaný vrchol byl souèástí nìjakého -minimálního separátoru, algoritmus mù¾e selhat. Pøesto ale nemusíme procházet v¹echny dvojice vrcholù. Staèí si -pamatovat, kolik vrcholù $s$ jsme u¾ pro v¹echny $t$ zkontrolovali a nejmen¹í zatím nalezený separátor. Kdy¾ bude poèet -vrcholù vìt¹í ne¾ nejmen¹í separátor, tak u¾ jsme jistì na¹li jeden z minimálních øezù. Slo¾itost takového algoritmu pak -bude $\O(\kappa (G) n^{3/2} m)$, kde $\kappa(G)$ je stupeò souvislosti $G$, který hledáme. +U~{\I vrcholové $k$-souvislosti} to ovÅ¡em tak snadno nepůjde. Pokud by totiž fixovaný vrchol byl součástí nějakého +minimálního separátoru, algoritmus může selhat. Přesto ale nemusíme procházet vÅ¡echny dvojice vrcholů. Stačí jako +$s$ postupně zvolit více vrcholů, než je velikost minimálního separátoru. Algoritmus si tedy bude pamatovat, kolik +vrcholů už proÅ¡el a nejmenší zatím nalezený $st$-separátor, a jakmile počet vrcholů překročí velikost separátoru, +prohlásí separátor za~minimální. To zvládne v~čase $\O(\kappa (G) \cdot n^{3/2} m)$, kde $\kappa(G)$ je nalezený stupeň souvislosti~$G$. -Pro minimální øezy v~neorientovaných grafech ov¹em existuje rychlej¹í algoritmus, který toky nepou¾ívá. +Pro minimální řezy v~neorientovaných grafech ovÅ¡em existuje následující rychlejší algoritmus: -\h{Algoritmus Namagochiho a Ibarakiho} +\h{Globálně minimální řez (Nagamochi, Ibaraki \cite{nagaiba:conn})} -\>Buï $G$ neorientovaný graf s~ohodnocením na~hranách. Oznaèíme si: +Buď $G$ neorientovaný multigraf s~nezáporným ohodnocením hran. Označíme si: -\s{Znaèení:} +\s{Značení:} \itemize\ibull -\:$r(u,v)$ buï kapacita minimálního $uv$-øezu, -\:$d(P,Q)$ buï kapacita hran vedoucích mezi mno¾inami $P,Q \subseteq V$, -\:$d(P) = d(P,\overline P)$ buï kapacita hran vedoucích mezi $P\subseteq V$ a zbytkem grafu, -\:$d(v) = d(\{v\})$ buï kapacita hran vedoucích z~$v$ (tedy pro neohodnocené grafy stupeò~$v$), +\:$r(u,v)$ buď kapacita minimálního $uv$-řezu, +\:$d(P,Q)$ buď kapacita hran vedoucích mezi množinami $P,Q \subseteq V$, +\:$d(P) = d(P,\overline P)$ buď kapacita hran vedoucích mezi $P\subseteq V$ a zbytkem grafu, +\:$d(v) = d(\{v\})$ buď kapacita hran vedoucích z~$v$ (tedy pro neohodnocené grafy stupeň~$v$), \:analogicky zavedeme $d(v,w)$ a $d(v,P)$. \endlist \s{Definice:} -{\it Legálním uspoøádáním vrcholù} (LU) budeme nazývat lineární uspoøádání vrcholù $v_1 \ldots v_n$ takové, ¾e platí -$d(\{v_1 \ldots v_{i-1}\},v_i) \geq d(\{v_1 \ldots v_{i-1}\},v_j)$ pro $1 \leq ii$, $v_i$ a $v_j$ jsou oddìleny øezem $C$ a $j$ je minimální takové. +\:$u_i := v_j$ tak, že $j>i$, $v_i$ a $v_j$ jsou odděleny řezem $C$ a $j$ je minimální takové. +[Tedy $v_j$ je nejbližší vrchol na~druhé straně řezu.] \endalgo -Ka¾dé $u_{i-1}$ je tedy buï $u_i$, pokud jsou $v_i$ a $v_{i-1}$ na stejné stranì øezu, nebo $u_{i-1}$ je $v_i$ pokud -jsou $v_i$ a $v_{i-1}$ na opaèné stranì øezu. Dostáváme tedy, ¾e $d(\{v_1\ldots v_{i-1}\},u_i)\leq d(\{v_1\ldots -v_{i-1}\},u_{i-1})$, proto¾e buïto $u_i=u_{i-1}$, a pak je nerovnost splnìna jako rovnost, nebo je $u_i=v_j$, $j>i$ a -nerovnost plyne z LU vrcholù $v_i$. - -Chceme ukázat, ¾e velikost libovolného øezu je alespoò taková, jako velikost øezu kolem vrcholu $v_n$. -Platí, ¾e $ \vert C \vert \geq \sum_{i=1}^{n-1} d(v_i,u_i)$. Uká¾eme, ¾e pravá strana je alespoò $d(v_n)$: +Každé $u_{i-1}$ je tedy buď rovno $u_i$, pokud jsou $v_i$ a $v_{i-1}$ na stejné straně řezu, nebo rovno $v_i$, pokud +jsou $v_i$ a $v_{i-1}$ na~stranách opačných. Z~toho dostáváme, že $d(\{v_1\ldots v_{i-1}\},u_i)\leq d(\{v_1\ldots +v_{i-1}\},u_{i-1})$, protože buďto $u_{i-1}=u_i$, a pak je nerovnost splněna jako rovnost, nebo je $u_{i-1}=v_i$ a +nerovnost plyne z~legálnosti uspořádání. +Chceme ukázat, že velikost naÅ¡eho řezu~$C$ je alespoň taková, jako velikost řezu kolem vrcholu $v_n$. +VÅ¡imneme si, že $\vert C \vert \geq \sum_{i=1}^{n-1} d(v_i,u_i)$. Hrany mezi $v_i$ a $u_i$ jsou totiž navzájem +různé a každá z~nich je součástí řezu~$C$. Ukážeme, že pravá strana je alespoň $d(v_n)$: $$\eqalign{ -\sum_{i=1}^{n-1} d(v_i,u_i) &= \sum_{i=1}^{n-1} d(\{v_1\ldots v_i\},u_i) - d(\{v_1 \ldots v_{i-1}\},u_i) \geq \sum_{i=1}^{n-1} d(\{v_1 \ldots v_i\},u_i) - d(\{v_1 \ldots v_{i-1}\},u_{i-1}) = \cr -&= d(\{v_1 \ldots v_{n-1}\},u_{n-1}) - d(\{v_1 \ldots v_0\},u_0) = d(\{v_1 \ldots v_{n-1}\},v_n) - 0 = d(v_n).\cr +\sum_{i=1}^{n-1} d(v_i,u_i) &= \sum_{i=1}^{n-1} d(\{v_1\ldots v_i\},u_i) - d(\{v_1 \ldots v_{i-1}\},u_i) \geq \cr +&\geq \sum_{i=1}^{n-1} d(\{v_1 \ldots v_i\},u_i) - d(\{v_1 \ldots v_{i-1}\},u_{i-1}) = \cr +&= d(\{v_1 \ldots v_{n-1}\},u_{n-1}) - d(\{v_1 \ldots v_0\},u_0) = \cr +&=d(\{v_1 \ldots v_{n-1}\},v_n) - 0 = d(v_n).\cr }$$ \qed -Dokázali jsme, ¾e libovolný øez separující $v_{n-1}$ a $v_n$ je vìt¹í ne¾ jednoduchý øez skládající se jen z hran kolem~$v_n$. Kdy¾ tedy sestavíme nìjakou LU posloupnost vrcholù, budeme mít k dispozici jednoduchý minimální øez $v_{n-1}$ a~$v_n$. Následnì vytvoøíme graf $G'$, v nìm¾ $v_{n-1}$ a $v_n$ skontrahujeme. Rekurzivnì najdeme minimální øez v $G'$. Hledaný minimální øez poté buïto oddìluje vrcholy $v_n$ a $v_{n-1}$ a potom je øez kolem vrcholu $v_n$ minimální, nebo vrcholy $v_n$ a $v_{n-1}$ neoddìluje, a v takovém pøípadì jej najdeme rekurzivnì. Hledaný øez je tedy men¹í z rekurzivnì nalezeného øezu a øezu kolem $v_n$. - -Zbývá ukázat, jak konstruovat LU. Postaèí hladovì: Pamatujeme si $\forall v\neq v_1 \ldots v_{i-1}$ hodnotu $d(\{v_1 \ldots v_{i-1},v)$, oznaème ji $z_v$. V ka¾dém kroku vybereme vrchol $v$ s maximální hodnotou $z_v$ a prohlásíme ho za $v_i$ a pøepoèítáme~$z_v$. - -Zde se hodí datová struktura, která doká¾e rychle hledat maxima a zvy¹ovat hodnoty prvkù, -napøíklad Fibonacciho halda. Ta zvládne \ v~èase $\O(\log n)$ a \ v~$\O(1)$ -amortizovanì. Celkem pak ná¹ algoritmus bude mít slo¾itost $\O(n(m+n\log n))$ pro obecné kapacity. - -Pokud jsou kapacity malá celá èísla, mù¾eme vyu¾ít pøíhrádkové struktury. Budeme -si udr¾ovat obousmìrný seznam zatím pou¾itých hodnot $z_v$, ka¾dý prvek takového -seznamu bude obsahovat v¹echny vrcholy se spoleènou hodnotou $z_v$. Kdy¾ budeme -mít seznam seøazený, vybrání minimálního prvku znamená pouze podívat se na -první prvek seznamu a z nìj odebrat jeden vrchol, pøípadnì celý prvek ze seznamu -odstranit. Operace \ poté bude reprezentovat pouze pøesunutí vrcholu o -malý poèet pøihrádek, pøípadnì zalo¾ení nové pøihrádky na správném místì. -\ i \ pak budou mít slo¾itost $\O(1)$ a celý algoritmus $\O(mn)$. - +Dokázali jsme, že libovolný řez separující $v_{n-1}$ a $v_n$ je alespoň tak velký jako jednoduchý řez skládající se jen z hran +kolem~$v_n$. Když tedy sestavíme nějakou LU posloupnost vrcholů, budeme mít k dispozici jednoduchý minimální řez +$v_{n-1}$ a~$v_n$. Následně vytvoříme graf $G'$, v němž $v_{n-1}$ a $v_n$ kontrahujeme. Rekurzivně najdeme minimální +řez v $G'$ (sestrojíme nové LU atd.). Hledaný minimální řez poté buďto odděluje vrcholy $v_n$ a $v_{n-1}$, a potom je řez +kolem vrcholu $v_n$ minimální, nebo vrcholy $v_n$ a $v_{n-1}$ neodděluje, a v takovém případě jej najdeme +rekurzivně. Hledaný řez je tedy menší z rekurzivně nalezeného řezu a řezu kolem $v_n$. + +Zbývá ukázat, jak konstruovat LU. Postačí hladově: Pamatujeme si $\forall v\neq v_1 \ldots v_{i-1}$ hodnotu $d(\{v_1 \ldots v_{i-1}\},v)$, označme ji $z_v$. V každém kroku vybereme vrchol $v$ s maximální hodnotou $z_v$, prohlásíme ho za $v_i$ a přepočítáme~$z_v$. + +Zde se hodí datová struktura, která dokáže rychle hledat maxima a zvyÅ¡ovat hodnoty prvků, +například Fibonacciho halda. Ta zvládne \ v~čase $\O(\log n)$ a \ v~$\O(1)$ +amortizovaně. Celkem pak náš algoritmus bude mít složitost $\O(n(m+n\log n))$ pro obecné kapacity. + +Pokud jsou kapacity malá celá čísla, můžeme využít přihrádkové struktury. Budeme +si udržovat obousměrný seznam zatím použitých hodnot $z_v$, každý prvek takového +seznamu bude obsahovat vÅ¡echny vrcholy se společnou hodnotou $z_v$. Když budeme +mít seznam seřazený, vybrání minimálního prvku bude znamenat pouze podívat se na +první prvek seznamu a z něj odebrat jeden vrchol, případně celý prvek ze seznamu +odstranit. Operace \ poté bude reprezentovat pouze přesunutí vrcholu o +malý počet přihrádek, případně založení nové přihrádky na správném místě. +\ proto bude mít složitost $\O(1)$, vÅ¡echny \ dohromady $\O(m)$, +jelikož za~každou hranu přeskakujeme maximálně jednu přihrádku, a celý algoritmus $\O(mn)$. + +\references \bye