]> mj.ucw.cz Git - ads2.git/commitdiff
Pribyla prednaska o Goldbergove algoritmu.
authorMartin Mares <mj@ucw.cz>
Sat, 17 Oct 2009 21:43:33 +0000 (23:43 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 17 Oct 2009 21:43:33 +0000 (23:43 +0200)
3-goldberg/3-goldberg.stamp [new file with mode: 0644]
3-goldberg/3-goldberg.tex [new file with mode: 0644]
3-goldberg/Goldberg01.eps [new file with mode: 0644]
3-goldberg/Makefile [new file with mode: 0644]

diff --git a/3-goldberg/3-goldberg.stamp b/3-goldberg/3-goldberg.stamp
new file mode 100644 (file)
index 0000000..e9c6ece
--- /dev/null
@@ -0,0 +1 @@
+2009-10-17
diff --git a/3-goldberg/3-goldberg.tex b/3-goldberg/3-goldberg.tex
new file mode 100644 (file)
index 0000000..b301a26
--- /dev/null
@@ -0,0 +1,216 @@
+\input lecnotes.tex
+
+\prednaska{3}{Goldbergùv algoritmus}{(zapsala Markéta Popelová)}
+
+Pøedstavíme si~nový algoritmus pro~hledání maximálního toku v~síti, který se~uká¾e být stejnì dobrý jako {\I Dinicùv algoritmus} ($\O(MN^{2})$) a~po~nìkolika vylep¹eních bude i~lep¹í. Nejdøíve si~pøipomeòme definice, které budeme potøebovat:
+
+\s{Definice:} Mìjme sí» $S=(V,E,z,s,c)$, tok~$f$ a~libovolný vrchol~$v$. Pak $f^{\Delta}(v)$ nazýváme {\I pøebytek} ve~vrcholu~$v$ a~definujeme ho: $$f^{\Delta}(v):=\sum_{uv \in E}{f(uv)} - \sum_{vu \in E}{f(vu)}.$$ Pøebytek ve~vrcholu~$v$ je tedy souèet v¹eho, co do~vrcholu~$v$ pøiteèe, minus souèet v¹eho, co z~$v$ odteèe. 
+
+\s{Definice:} Mìjme sí» $S=(V,E,z,s,c)$, tok~$f$ a~libovolnou hranu~$uv$. Pak $r(uv)$ je {\I rezerva} hrany $uv$ a~je definovaná: $$r(uv) = c(uv) - f(uv) + f(vu).$$ Rezerva hrany znaèí, co je¹tì je mo¾no po~té hranì poslat.
+
+\s{Poznámka:} Budeme pou¾ívat znaèení, ¾e~$N$ je poèet vrcholù a~$M$ je poèet hran, tedy~$N = \vert V \vert$ a~$M = \vert E \vert$.
+
+Goldbergùv algoritmus na~rozdíl od~Dinicova algoritmu zaèíná s~nìèím, co pravdìpodobnì tok není (budeme to nazývat {\I vlna}), a~postupnì to zmen¹uje a¾ na~korektní tok.
+
+\s{Definice:} Funkce $f:E \rightarrow {\bb R}_{0}^{+}$ je {\I vlna} v~síti~$(V, E, z, s, c)$ tehdy, kdy¾ jsou splnìny následující dvì podmínky:
+       \itemize\idot
+       \:$\forall e \in E : f(e) \leq c(e) $
+       \:$ \forall v \in V \setminus \{z, s\} : f^{\Delta}(v) \geq 0 $. 
+       \endlist
+
+\s{Pozorování:} Ka¾dý tok~$f$ je vlna. Nebo» $\forall e \in E : f(e) \leq c(e) $ a~$\forall v \ne z,s: f^{\Delta}(v) = 0$.
+
+\s{Operace:} {\I Pøevedení pøebytku}
+
+Algoritmus bude potøebovat pøevádìt pøebytky z~vrcholu~$u$ na~sousední vrcholL~$v$. Mìjme hranu~$uv$ s~kladnou rezervou: $r(uv) > 0$ a~kladným pøebytkem ve~vrcholu~$u$: $f^\Delta(u) > 0$. Èást pøebytku budeme chtít poslat z~vrcholu~$u$ do~vrcholu~$v$. Vezmeme $\delta := \min (f^\Delta(u), r(uv))$ a~po~hranì~$uv$ po¹leme tok o velikosti~$\delta$. Výsledná situace bude vypadat následovnì:
+       \itemize\idot
+       \:$f'^\Delta(u) = f^\Delta(u) - \delta$.
+       \:$f'^\Delta(v) = f^\Delta(v) + \delta$.
+       \:$r'(uv) = r(uv) - \delta$.
+       \:$r'(vu) = r(vu) + \delta$.
+       \endlist
+       
+Kdybychom ov¹em nepøidali ¾ádnou jinou podmínku, ná¹ algoritmus by se~mohl krásnì zacyklit (napø. posílat pøebytek z~$u$ do~$v$ a~zase zpátky). Abychom se~tomu vyhnuli, zavedeme {\I vý¹ku vrcholu} $h: V \to {\bb N}$ a~dovolíme pøevádìt pøebytek pouze z~vy¹¹ího vrcholu~$u$ na~ni¾¹í $v$: $h(u) > h(v)$.
+
+\s{Shrnutí:} Podímnky pro~pøevedení pøebytku po~hranì $uv \in E$:
+       \numlist\ndotted
+       \:Ve~vrcholu~$u$ je nenulový pøebytek: $f^{\Delta}(u) > 0$.
+       \:Vrchol~$u$ je vý¹ ne¾ vrchol~$v$: $h(u) > h(v)$.
+       \:Hrana~$uv$ má nenulovou rezervu: $r(uv)>0$.
+       \endlist
+
+\s{Definice:} Øekneme, ¾e pøevedení je {\I nasycené}, pokud po~pøevodu rezerva na~hranì~$uv$ klesla na~nulu, tedy $r(uv)=0$. Naopak pøevedení je {\I nenasycené}, pokud po~pøevodu klesl pøebytek ve~vrcholu~$u$ na~nulu, tedy $f^{\Delta}(u) = 0$. Pokud $r(uv)=0$ a~$f^{\Delta}(u) = 0$, budeme pøevedení pova¾ovat za~{\I nasycené}.
+
+\s{Operace:} Pro~vrchol~$u \in V$ definujme {\I zvednutí vrcholu}: 
+Pokud bìhem výpoètu narazíme ve~vrcholu~$u$ na~pøebytek, který nelze nikam pøevést, zvìt¹íme vý¹ku vrcholu~$u$ o~jednièku, tj. $h(u) \leftarrow h(u)+1$.
+
+
+\s{Algoritmus (Goldbergùv)}
+
+\algo
+\:$\forall v \in V: h(v)\leftarrow 0$ (v¹em vrcholùm nastavíme poèáteèní vý¹ku nula) a~$h(z)\leftarrow N$ (zdroj zvedneme do~vý¹ky~$N$).
+\:$\forall e \in E: f(e)\leftarrow 0$ (po~hranách nejdøíve nenecháme protékat nic) a~$\forall zu \in E : f(zu)\leftarrow c(zu)$ (ze~zdroje pustíme maximální mo¾nou vlnu).
+\:Dokud $\exists u \in V \setminus \{z,s\}: f^{\Delta}(u)>0$: 
+\::Pokud $\exists v \in V: uv \in E,~r(uv)>0$ a~$h(u)>h(v)$, pak pøevedeme pøebytek po~hranì z~$u$ do~$v$.
+\::V~opaèném pøípadì zvedneme $u$:~$h(u) \leftarrow h(u) + 1$.
+\:Vrátíme tok~$f$ jako výsledek.
+\endalgo
+
+\noindent
+Nyní bude následovat nìkolik lemmat a~invariantù, jimi¾ doká¾eme správnost a~koneènost Goldbergova algoritmu.
+
+\s{Invariant A (základ):} 
+       \numlist \ndotted
+       \:Funkce~$f$ je v~ka¾dém kroku algoritmu vlna.
+       \:$h(v)$ nikdy neklesá pro~¾ádné~$v$.
+       \:$h(z)=N$ a~$h(s)=0$ po~celou dobu algoritmu.
+       \endlist
+
+\proof Indukcí dle bìhu algoritmu.
+
+Na zaèátku je v¹e v~poøádku ($f$ je nulová funkce, pøebytky v¹ech vrcholù jsou nezáporné, tedy~$f$ je vlna, $h(z)=N$ a~$h(s)=0$. V~prùbìhu se~tyto hodnoty mìní pouze pøi:
+       \itemize\ibull
+       \:Pøevedení po~hranì~$uv$: Po hranì~$uv$ se~nepo¹le více ne¾ její rezerva. Pøebytek~$u$ se~sní¾í, ale nejménì na~nulu. Pøebytek~$v$ se~zvý¹í. Tedy~$f$ zùstává vlnou. Vý¹ky se~nemìní.
+       \:Zvednutí vrcholu~$u$: Mìní pouze vý¹ky -- a~to vrcholù rùzných od zdroje èi stoku -- a~pouze je zvy¹uje.
+       \qeditem
+       \endlist
+
+\s{Invariant S (o~Spádu):} Neexistuje hrana $uv \in E: r(uv)>0$ \& $h(u) > h(v)+1$ (s~kladnou rezervou a~spádem vìt¹ím ne¾ jedna).
+
+\proof Indukcí dle bìhu algoritmu.
+
+Na zaèátku mají v¹echny hrany ze~zdroje rezervu nulovou a~v¹echny ostatní vedou mezi vrcholy s~vý¹kou 0. V~prùbìhu by se~tento invariant mohl pokazit pouze dvìma zpùsoby:
+       \itemize\ibull
+       \:Zvednutím vrcholu~$u$, ze~kterého vede hrana~$uv$ s~kladnou rezervou a~spádem 1. Tento pøípad nemù¾e nastat, nebo» hranu zvedáme pouze tehdy, kdy¾ neexistuje vrchol~$v$ takový, ¾e hrana~$uv$ má kladnou rezervu a~spád alespoò 1. Takový vrchol v~na¹em pøípadì existuje, proto se~místo zvednutí vrcholu~$u$ po¹le pøebytek po~hranì~$uv$.
+       \:Zvìt¹ením rezervy hrany se~spádem vìt¹ím ne¾ 1. Toto také nemù¾e nastat, nebo» rezervu bychom mohli zvìt¹it jedinì tak, ¾e bychom poslali nìco v~protismìru -- a~to nesmíme, jeliko¾ bychom poslali pøebytek z~ni¾¹ího vrcholu na~vy¹¹í.
+       \qeditem
+       \endlist
+
+\s{Lemma K (o~Korektnosti):} Kdy¾ se~algoritmus zastaví, je~$f$ maximální tok.
+
+\proof Dùkaz rozlo¾me do~dvou krokù. Nejdøíve uká¾eme, ¾e~$f$ je tok, a~pak jeho maximalitu.
+
+       \numlist\ndotted
+       \:Nech» se~algoritmus zastavil. Pak nemohl existovat ¾ádný vrchol~$v$ (kromì zdroje a~stoku) s~kladným pøebytkem. Tedy $\forall v \in V~\setminus \{z,s\}: f^\Delta(v) = 0$. (Víme ji¾, ¾e~$f$ je po~celou dobu vlna, tak¾e pøebytek nemù¾e být nikdy záporný.) V~tom pøípadì splòuje~$f$ podmínky toku.
+       \:Pro spor pøedpokládejme, ¾e tok~$f$ není maximální. Pak existuje zlep¹ující cesta, tedy cesta ze~zdroje do~stoku, její¾ v¹echny hrany mají kladnou rezervu. Vezmìme si~libovolnou takovou cestu. Zdroj je stále ve~vý¹ce~$N$ a~spotøebiè ve~vý¹ce 0 (viz invariant A). Tato cesta tedy pøekonává vý¹ku~$N$, ale mù¾e mít nejvý¹e~$N-1$ hran. Proto existuje alespoò jedna hrana se~spádem alespoò 2. Tato hrana tedy nemù¾e mít kladnou rezervu (viz invariant S). Tato cesta proto nemù¾e být zlep¹ující, co¾ je spor. Tím jsme dokázali, ¾e~$f$ je nutnì maximální tok.
+       \qeditem
+       \endlist
+
+\s{Definice:} Cestu~$P$ nazveme {\I nenasycenou}, pokud v¹echny její hrany mají kladnou rezervu. Neboli $\forall e \in P: r(e) > 0$.
+
+\s{Lemma C (Cesta):} Mìjme vrchol $v \in V$. Pokud $f^{\Delta}(v) > 0$, pak existuje nenasycená cesta z~vrcholu~$v$ do~zdroje.
+
+
+\proof
+Mìjme nìjaký vrchol~$v \in V$ takový, ¾e $f^{\Delta}(v) > 0$. Potom definujme mno¾inu $A := \{ u \in V : \exists$ nenasycená cesta z~$v$ do~$u \}$. 
+
+Seètìme pøebytky ve~v¹ech vrcholech mno¾iny~$A$. Pøebytek ka¾dého vrcholu se~spoèítá jako souèet tokù do~nìj vstupujících minus souèet tokù z~nìj vystupujících. V¹echny hrany, jejich¾ oba vrcholy le¾í v~$A$, se~jednou pøiètou a~jednou odeètou. Proto nás budou zajímat pouze hrany mezi~$A$ a~$V \setminus A$. 
+
+ $$\sum_{u \in A}f^{\Delta}(u) = \underbrace{ \sum_{ab \in E \cap ( V \setminus A \times A )} f(ab) }\limits_{=0} -  \underbrace{ \sum_{ab \in E \cap (  A \times V \setminus A )} f(ab) }\limits_{\geq 0}~\leq~0.$$
+
+Uka¾me si, proè $\sum_{ab \in E \cap ( V \setminus A \times A )} f(ab) = 0$. Mìjme vrcholy $a \in V \setminus A$ a~$b \in A$ takové, ¾e $ab\in E$. O~nich víme, ¾e $r(ab) = 0$ (jinak by~$a$ patøilo do~$A$) $\Rightarrow f(ab)=0$. Proto do~$A$ nic nepøitéká.
+
+\figure{Goldberg01.eps}{Obrázek k dùkazu lemmatu C}{0.2\hsize}
+
+Druhý èlen $\sum_{ab \in E \cap (  A \times V \setminus A )} f(ab) \geq 0$ je zøejmý, nebo» tok na~hranì je v¾dy nezáporný a~souèet nezáporných èísel je nezáporné èíslo.
+
+Proto $\sum_{u \in A}{f^\Delta(u) \le 0}$. Zároveò v¹ak v~$A$ je aspoò jeden vrchol s~kladným pøebytkem, toti¾~$v$, proto v~$A$ musí být také vrchol se~záporným pøebytkem -- a~jediný takový je zdroj. Tím je dokázáno, ¾e $z \in A$, tedy ¾e vede nenasycená cesta z~vrcholu~$v$ do~zdroje.
+
+\qed
+
+\s{Invariant V (Vý¹ka):} $\forall v \in V$ platí $h(v)\leq 2N$.
+
+\proof
+Kdyby existoval vrchol~$v$ s~vý¹kou $h(v) > 2N$, tak by musel být nìkdy zvednut z~vý¹ky~$2N$. Tehdy musel mít kladný pøebytek $f^\Delta(v)>0$ (jinak by nemohl být zvednut). Dle lemmatu C musela existovat nenasycená cesta z~$v$ do~zdroje. Tato cesta mìla spád alespoò~$N$, ale mohla mít nejvý¹e~$N-1$ hran (jinak by to nebyla cesta v~síti na~$N$ vrcholech). Tudí¾ musela na~této cestì existovat hrana se~spádem alespoò 2, co¾ je spor s~invariantem S (nebo» v¹echny hrany této cesty mají z~definice nenasycené cesty kladné rezervy).
+\qed
+
+\s{Lemma Z (poèet Zvednutí):} Poèet v¹ech zvednutí je maximálnì~$2N^{2}$.
+
+\proof
+Staèí si~uvìdomit, ¾e ka¾dý vrchol mù¾eme zvednout maximálnì~$2N$-krát a~vrcholù je~$N$.
+\qed
+
+\s{Lemma S (naSycená pøevedení):} Poèet v¹ech nasycených pøevedení je nejvý¹~$NM$.
+
+\proof
+Pro ka¾dou hranu~$uv$ spoèítejme poèet nasycených pøevedení (tedy takových pøevedení, ¾e po~nich klesne rezerva hrany na~nulu). Abychom dvakrát nasycenì pøevedli pøebytek (nebo jeho èást) z~vrcholu~$u$ do~vrcholu~$v$, tak jsme museli~$u$ mezitím alespoò dvakrát zvednout. Ale nejvý¹e mù¾eme hranu zvednout~$2N$-krát. V¹ech hran je~$M$, proto poèet v¹ech nasycených pøevedení je nejvý¹e~$NM$.
+\qed
+
+\s{Lemma N (Nenasycená pøevedení):} Poèet v¹ech nenasycených pøevedení je~$\O(N^2M)$.
+
+\proof
+Dùkaz provedeme pomocí potenciálové metody -- nadefinujme si~následující funkci jako potenciál:
+ $$ \Phi := \sum_{\scriptstyle{v: f^{\Delta}(v) > 0} \atop \scriptstyle{v \ne z,s}} h(v). $$
+Nyní se~podívejme, jak se~ná¹ potenciál bìhem algoritmu vyvíjí a~jaké má vlastnosti:
+
+       \itemize\ibull
+       \:Na poèátku je $ \Phi = 0 $.
+       \:Bìhem celého algoritmu je $ \Phi \ge 0 $, nebo» je souètem nezáporných èlenù.
+       \:Zvednutí vrcholu zvý¹í $\Phi$ o~jednièku (Aby byl vrchol zvednut, musel mít kladný pøebytek $\Rightarrow$ vrchol do~sumy ji¾ pøispíval, teï jen pøispìje èíslem o 1 vy¹¹ím.). Ji¾ víme, ¾e za~celý prùbìh algoritmu je v¹ech zvednutí maximálnì~$2N^2$, proto zvedáním vrcholù zvý¹íme potenciál dohromady nejvý¹e o~$2N^2$.
+       \:Nasycené pøevedení zvý¹í~$\Phi$ nejvý¹e o~$2N$, proto¾e buï po~pøevodu hranou~$uv$ v~$u$ zùstal nìjaký pøebytek, tak¾e se~mohl potenciál zvý¹it nejvý¹e o~$h(v) \leq 2N$, nebo je pøebytek v~$u$ po~pøevodu nulový a~potenciál se~dokonce o~jedna sní¾il. Za~celý prùbìh tak dojde k~maximálnì~$NM$ takovýmto pøevedením, díky nim¾ se~potenciál zvý¹í maximálnì o~$2N^2M$.
+       \:Koneènì kdy¾ pøevádíme po~hranì~$uv$ nenasycenì, tak od~potenciálu urèitì odeèteme vý¹ku vrcholu~$u$ (nebo» se~vynuluje pøebytek ve~vrcholu~$u$) a~mo¾ná pøièteme vý¹ku vrcholu~$v$. Jen¾e $h(v) = h(u) - 1$, a~proto nenasycené pøevedení potenciál v¾dy sní¾í alespoò o~jedna. 
+       \endlist
+
+\>Z~tohoto rozboru chování potenciálu~$\Phi$ v~prùbìhu algoritmu získáváme, ¾e poèet v¹ech nenasycených pøevedení mù¾e být nejvý¹e $2N^2 + 2N^2M$, co¾ je $\O(N^2M)$.
+\qed
+
+\s{Implementace:}
+
+Budeme si~pamatovat seznam~$P$ v¹ech vrcholù~$v \ne z,s$ s~kladným pøebytkem. Neboli 
+$$P = \{ v \in V \setminus \{z,s\} ~\vert~ f^{\Delta}(v) > 0 \}.$$ 
+Kdy¾ mìníme pøebytek nìjakého vrcholu, mù¾eme ná¹ seznam v~konstantním èase aktualizovat (napø. tak, ¾e si~ka¾dý vrchol pamatuje pozici, na~které v~seznamu~$P$ je). V~konstantním èase také umíme odpovìdìt, zda existuje nìjaký vrchol s~pøebytkem. 
+
+Dále si~pro ka¾dý vrchol~$u \in V$ budeme pamatovat~$L(u)$ seznam hran~$uv \in E$ takových, které vedou dolù (mají spád alespoò 1) a~kladnou rezervu. Neboli 
+$$L(u) = \{ uv \in E ~\vert~ v \in V,~ r(uv) > 0,~ h(v) < h(u)\}.$$
+Díky tomu mù¾eme pøistupovat k~patøièným sousedùm~$u$ v~èase $\O(1)$, stejnì jako pøidávat hrany do~$L(u)$, resp. je mazat. Opìt ka¾dá hrana si~bude pamatovat pozici, na~které se~nachází v~seznamu~$L$. %TODO
+
+\s{Rozbor èasové slo¾itosti algoritmu:}
+
+\numlist\ndotted
+\:Inicializace vý¹ek \dots $\O(1)$.
+\:Inicializace vlny~$f$ \dots $\O(M)$.
+\:Výbìr vrcholu~$u$ s~kladným pøebytkem -- vezmeme první vrchol v~$P$ \dots $\O(1)$.
+\:Výbìr vrcholu~$v$, do~kterého vede z~$u$ hrana s~kladnou rezervou a~který je ní¾e ne¾~$u$ -- vezmeme první hranu z~$L(u)$ \dots $\O(1)$.
+       
+       Pøevedení pøebytku: \dots $\O(1)$.
+               \itemize\idot
+               \:Nasycené pøevedení \dots $\O(1)$.
+                       \itemize\idot
+                       \:Rezerva hrany~$uv$ klesne na~nulu $\Rightarrow$ hrana~$uv$ vypadne z~$L(u)$ \dots $\O(1)$.
+                       \:Pøebytek vrcholu~$v$ se~zvý¹í $\Rightarrow$ pokud je¹tì nebyl v~seznamu~$P$, tak se~tam pøidá \dots $\O(1)$.
+                       \:Pøebytek vrcholu~$u$ mo¾ná také klesne na~nulu $\Rightarrow$ pak by vrchol~$u$ vypadnul z~$P$ \dots $\O(1)$.
+                       \endlist
+               \:Nenasycené pøevedení \dots $\O(1)$.
+                       \itemize\idot
+                       \:Rezerva hrany~$uv$ zùstane nezáporná $\Rightarrow$ hrana~$uv$ zùstane v~$L(u)$ \dots $\O(1)$.
+                       \:Vynuluje se~pøebytek vrcholu~$u$~$\Rightarrow$ vrchol $u$ vypadne z~$P$ \dots~$\O(1)$.
+                       \:Pøebytek vrcholu~$v$ se~zvý¹í~$\Rightarrow$ pokud je¹tì nebyl v~seznamu~$P$, tak se~tam pøidá \dots $\O(1)$.
+                       \endlist
+               \endlist
+\:Zvednutí vrcholu~$u$ \dots $\O(N)$.
+
+       Musíme obejít v¹echny hrany do~$u$ a~z~$u$, kterých je nejvý¹e~$2N-2$, porovnat vý¹ky a~pøípadnì tyto hrany~$uv$ odebrat ze~seznamu~$L(u)$ resp. pøidat do~$L(v)$. Abychom pro~odebrání hrany~$uv$ ze~seznamu~$L(u)$ nemuseli procházet celý seznam, budeme si~$\forall v \in V$ pamatovat je¹tì $L^{-1}(v) := $ seznam ukazatelù na~hrany~$uv$ v~seznamech~$L(u)$.
+\endlist
+
+Vidíme, ¾e ka¾dé zvednutí je sice drahé, ale je jich zase pomìrnì málo. Naopak pøevádìní pøebytkù je èastá operace, tak¾e je výhodné, ¾e trvá konstantní èas.
+
+\s{Shrnutí:}
+
+\itemize\ibull
+\:V¹ech zvednutí je $\O(N^2)$ (viz lemma Z), ka¾dé trvá $\O(N) \dots \O(N^3).$ 
+\:V¹ech nasycených pøevedení je $\O(NM)$ (viz lemma S), ka¾dé trvá $\O(1) \dots \O(NM).$ 
+\:V¹ech nenasycených pøevedení je $\O(N^2M)$ (viz lemma N), ka¾dé trvá $\O(1) \dots \O(N^2M).$ 
+\endlist
+
+Dohromady má tedy Goldbergùv algoritmus èasovou slo¾itost $\O(N^2M)$. Vidíme, ¾e u¾ v~tomto obecném pøípadì to není hor¹í ne¾ Dinicùv algoritmus. Pøí¹tì si~uká¾eme, ¾e mù¾e mít i~mnohem lep¹í. Nejdøíve ale zformulujme v¹echna dokázaná tvrzení do~následující vìty:
+
+\s{Vìta:} Goldbergùv algoritmus najde maximální tok v~èase $\O(N^2M)$.
+
+%Dokázali jsme, ¾e algoritmus má èasovou slo¾itost $\O(N^2M)$ pro~libovolnou posloupnost zvedání a~pøevádìní. Nabízí se~otázka, zda není mo¾né vhodným výbìrem tìchto operací výpoèet zrychlit. Uká¾eme, ¾e pokud v~$5.$ kroku algoritmu budeme v¾dy brát vrchol~$u$ takový, ¾e~$h(u)$ je maximální, poèet nenasycených pøevedení se~sní¾í.
+
+%\s{Lemma N':} Poèet nenasycených pøevedení v~upravené verzi Goldbergova algoritmu je $\O(N^2\sqrt{M})$, co¾ je maximálnì $\O(N^3)$. Díky tomu je i~slo¾itost celého algoritmu $\O(N^3)$.
+
+%\proof 
+%Viz pøí¹tí pøedná¹ku.
+
+\bye
diff --git a/3-goldberg/Goldberg01.eps b/3-goldberg/Goldberg01.eps
new file mode 100644 (file)
index 0000000..70be6d9
--- /dev/null
@@ -0,0 +1,517 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: inkscape 0.46
+%%Pages: 1
+%%Orientation: Portrait
+%%BoundingBox: 0 0 311 196
+%%HiResBoundingBox: 7.6535002e-09 -2.5149246e-06 310.80097 195.23405
+%%EndComments
+%%Page: 1 1
+0 196 translate
+0.8 -0.8 scale
+0 0 0 setrgbcolor
+[] 0 setdash
+1 setlinewidth
+0 setlinejoin
+0 setlinecap
+gsave [1 0 0 1 0 0] concat
+gsave [1 0 0 1 -7.2922934 -15.871617] concat
+gsave [1 0 0 1 -105.66802 -41.295546] concat
+0 0 0 setrgbcolor
+[] 0 setdash
+0.80000001 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+327.93522 188.25911 moveto
+327.93522 250.38705 279.87044 300.80972 220.64777 300.80972 curveto
+161.42509 300.80972 113.36031 250.38705 113.36031 188.25911 curveto
+113.36031 126.13117 161.42509 75.708496 220.64777 75.708496 curveto
+279.87044 75.708496 327.93522 126.13117 327.93522 188.25911 curveto
+closepath
+stroke
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+0.80000001 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+280.82453 35.083625 moveto
+274.32214 36.15662 267.81146 37.271113 261.46388 39.07255 curveto
+256.08401 40.577261 250.81811 42.517725 245.82341 45.028881 curveto
+242.79426 46.611213 239.80154 48.311743 237.07234 50.377073 curveto
+234.88576 52.176848 232.73392 54.282673 231.7761 57.010153 curveto
+230.78471 60.185495 231.63558 63.732075 233.65009 66.325725 curveto
+236.75865 70.711495 240.33853 74.740745 243.39187 79.167695 curveto
+247.43465 84.791545 250.49703 91.075895 252.79232 97.599345 curveto
+255.73385 105.89744 257.62345 114.54784 258.74508 123.2725 curveto
+259.85691 132.25533 260.47539 141.30252 260.54328 150.35388 curveto
+260.61846 156.41558 260.15107 162.46548 259.4918 168.48702 curveto
+258.79686 174.88094 257.75376 181.2491 256.18144 187.48805 curveto
+254.45425 194.02304 252.04233 200.40052 248.79575 206.33576 curveto
+247.2219 209.23818 245.37178 211.98356 243.24102 214.50717 curveto
+239.09684 219.50186 234.37978 223.98307 229.5905 228.35067 curveto
+228.29104 229.49906 226.85166 230.63983 226.19953 232.30237 curveto
+225.88232 233.85635 227.01743 235.15405 228.04206 236.16404 curveto
+230.86374 238.84504 234.40416 240.56607 237.77898 242.42967 curveto
+244.47556 245.58462 251.01265 249.15643 258.0782 251.44753 curveto
+263.50053 253.31902 269.10056 254.64678 274.77642 255.46817 curveto
+281.19473 256.48978 287.71445 256.73692 294.20191 256.45025 curveto
+299.14227 256.2547 304.06877 255.67187 308.93321 254.79402 curveto
+314.84679 253.66015 320.68583 252.06888 326.29328 249.86487 curveto
+335.79003 246.03402 344.80686 240.95359 352.85154 234.60416 curveto
+359.46392 229.40402 365.5126 223.47549 370.79463 216.92672 curveto
+375.60643 210.82002 379.79681 204.2236 383.33905 197.30459 curveto
+387.6165 188.82584 390.7268 179.78059 392.82506 170.52565 curveto
+394.15871 164.50115 394.96709 158.35759 395.28813 152.19661 curveto
+395.7406 141.38443 394.72997 130.5209 392.3705 119.96144 curveto
+390.72701 112.77723 388.56478 105.6875 385.51691 98.966625 curveto
+382.44736 92.078085 378.75152 85.457485 374.33557 79.338215 curveto
+369.33811 72.377305 363.48786 66.041715 357.08025 60.359605 curveto
+351.79315 55.738659 346.09511 51.583256 339.99622 48.096383 curveto
+334.45248 44.913288 328.59052 42.258109 322.49914 40.311008 curveto
+314.227 37.734459 305.64752 36.306252 297.06034 35.276544 curveto
+292.71018 34.814917 288.33133 34.464891 283.95627 34.610909 curveto
+282.91236 34.768481 281.86844 34.926053 280.82453 35.083625 curveto
+closepath
+stroke
+0 0 0 setrgbcolor
+[] 0 setdash
+1 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+280.5668 226.72064 moveto
+148.58299 192.30769 lineto
+stroke
+gsave [0.77411904 0.20184081 -0.20184081 0.77411904 158.25948 194.8307] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+eofill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1.25 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+stroke
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+286.23483 122.89173 moveto
+163.96762 131.39375 lineto
+stroke
+gsave [0.79807286 -0.055495103 0.055495103 0.79807286 173.94353 130.70006] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+eofill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1.25 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+stroke
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+267.20648 73.68421 moveto
+156.27531 100.80972 lineto
+stroke
+gsave [0.77710466 -0.19002198 0.19002198 0.77710466 165.98912 98.434445] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+eofill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1.25 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+stroke
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+284.1675 181.73326 moveto
+163.31146 161.35254 lineto
+stroke
+gsave [0.78886172 0.13303075 -0.13303075 0.78886172 173.17223 163.01542] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+eofill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+1.25 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+0 0 moveto
+5 -5 lineto
+-12.5 0 lineto
+5 5 lineto
+0 0 lineto
+closepath
+stroke
+grestore
+gsave [1 0 0 1 -10.931174 -14.170041] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+69.75 150.46416 moveto
+69.749976 149.90952 69.301976 149.20552 68.406 148.35216 curveto
+67.509978 147.49885 67.061979 146.62419 67.062 145.72816 curveto
+67.061979 145.04552 67.275312 144.51219 67.702 144.12816 curveto
+68.128644 143.74419 68.704644 143.55219 69.43 143.55216 curveto
+70.411309 143.55219 71.243308 143.93619 71.926 144.70416 curveto
+72.651306 145.42952 73.013973 146.30419 73.014 147.32816 curveto
+73.013973 148.52285 72.629973 150.05885 71.862 151.93616 curveto
+71.136641 153.77085 70.219309 155.47751 69.11 157.05616 curveto
+65.824647 161.66417 62.859316 165.4615 60.214 168.44816 curveto
+57.568655 171.43483 55.840657 172.92816 55.03 172.92816 curveto
+54.645991 172.92816 54.453991 172.1815 54.454 170.68816 curveto
+54.453991 168.8535 54.304658 165.99484 54.006 162.11216 curveto
+53.707325 158.18684 53.387326 155.11485 53.046 152.89616 curveto
+52.619326 149.95218 52.149994 148.05352 51.638 147.20016 curveto
+51.125995 146.34685 50.251329 145.92019 49.014 145.92016 curveto
+48.203331 145.92019 47.563332 145.94152 47.094 145.98416 curveto
+47.094 145.15216 lineto
+48.58733 144.89619 49.888663 144.66152 50.998 144.44816 curveto
+52.107327 144.23486 52.875326 144.06419 53.302 143.93616 curveto
+53.728659 143.80819 54.112658 143.72286 54.454 143.68016 curveto
+54.795324 143.59486 55.136657 143.55219 55.478 143.55216 curveto
+56.160656 143.55219 56.843322 146.06952 57.526 151.10416 curveto
+58.251321 156.13885 58.741987 161.53617 58.998 167.29616 curveto
+60.982 165.24816 lineto
+63.243316 162.85884 65.26998 160.17084 67.062 157.18416 curveto
+68.853977 154.15485 69.749976 151.91485 69.75 150.46416 curveto
+fill
+grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+112.67278 62.815617 moveto
+112.67278 63.967617 lineto
+94.960781 63.967617 lineto
+94.960781 62.815617 lineto
+97.264756 62.575618 98.776754 62.215619 99.496781 61.735617 curveto
+100.21675 61.25562 100.57675 60.343621 100.57678 58.999617 curveto
+100.57675 58.615622 100.52875 57.991623 100.43278 57.127617 curveto
+98.992781 47.695617 lineto
+83.152781 47.695617 lineto
+79.048781 55.831617 lineto
+78.088775 57.751623 77.608776 59.239622 77.608781 60.295617 curveto
+77.608776 61.20762 77.848775 61.807619 78.328781 62.095617 curveto
+78.856774 62.383619 80.032773 62.623618 81.856781 62.815617 curveto
+81.856781 63.967617 lineto
+68.392781 63.967617 lineto
+68.392781 62.815617 lineto
+69.880783 62.527618 71.104782 61.807619 72.064781 60.655617 curveto
+73.07278 59.503621 74.944778 56.575624 77.680781 51.871617 curveto
+98.560781 15.871617 lineto
+100.43278 15.871617 lineto
+107.20078 56.623617 lineto
+107.68075 59.263622 108.20875 60.91962 108.78478 61.591617 curveto
+109.36074 62.215619 110.65674 62.623618 112.67278 62.815617 curveto
+84.664781 45.103617 moveto
+98.632781 45.103617 lineto
+95.464781 26.383617 lineto
+84.664781 45.103617 lineto
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+287.18781 17.761328 moveto
+287.18781 18.913328 lineto
+285.65176 18.961374 284.30776 19.921373 283.15581 21.793328 curveto
+256.29981 66.073328 lineto
+254.93181 66.073328 lineto
+248.81181 28.633328 lineto
+248.0438 24.121369 247.3958 21.433372 246.86781 20.569328 curveto
+246.3878 19.705374 245.1398 19.153374 243.12381 18.913328 curveto
+243.12381 17.761328 lineto
+260.47581 17.761328 lineto
+260.47581 18.913328 lineto
+258.21979 19.153374 256.73179 19.513374 256.01181 19.993328 curveto
+255.29179 20.473373 254.93179 21.337372 254.93181 22.585328 curveto
+254.93179 23.06537 254.95579 23.42537 255.00381 23.665328 curveto
+259.75581 55.561328 lineto
+274.58781 29.929328 lineto
+277.08377 25.609368 278.33177 22.753371 278.33181 21.361328 curveto
+278.33177 20.065373 276.81977 19.249374 273.79581 18.913328 curveto
+273.79581 17.761328 lineto
+287.18781 17.761328 lineto
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+296.71543 16.825328 moveto
+301.89943 16.825328 lineto
+322.63543 66.073328 lineto
+317.52343 66.073328 lineto
+296.71543 16.825328 lineto
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+378.24418 63.625328 moveto
+378.24418 64.777328 lineto
+360.53218 64.777328 lineto
+360.53218 63.625328 lineto
+362.83616 63.38533 364.34816 63.02533 365.06818 62.545328 curveto
+365.78816 62.065331 366.14816 61.153332 366.14818 59.809328 curveto
+366.14816 59.425334 366.10016 58.801334 366.00418 57.937328 curveto
+364.56418 48.505328 lineto
+348.72418 48.505328 lineto
+344.62018 56.641328 lineto
+343.66018 58.561335 343.18018 60.049333 343.18018 61.105328 curveto
+343.18018 62.017331 343.42018 62.617331 343.90018 62.905328 curveto
+344.42818 63.19333 345.60418 63.43333 347.42818 63.625328 curveto
+347.42818 64.777328 lineto
+333.96418 64.777328 lineto
+333.96418 63.625328 lineto
+335.45219 63.33733 336.67619 62.617331 337.63618 61.465328 curveto
+338.64418 60.313333 340.51618 57.385336 343.25218 52.681328 curveto
+364.13218 16.681328 lineto
+366.00418 16.681328 lineto
+372.77218 57.433328 lineto
+373.25215 60.073333 373.78015 61.729332 374.35618 62.401328 curveto
+374.93215 63.02533 376.22815 63.43333 378.24418 63.625328 curveto
+350.23618 45.913328 moveto
+364.20418 45.913328 lineto
+361.03618 27.193328 lineto
+350.23618 45.913328 lineto
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+321.33714 220.85778 moveto
+321.76378 220.85778 322.46778 220.40978 323.44914 219.51378 curveto
+324.43044 218.57512 325.43311 217.55112 326.45714 216.44178 curveto
+327.22514 217.08178 lineto
+324.87844 219.98312 323.12911 221.88178 321.97714 222.77778 curveto
+320.82511 223.67378 319.60912 224.12178 318.32914 224.12178 curveto
+316.62245 224.12178 315.76912 223.24711 315.76914 221.49778 curveto
+315.76912 220.43112 316.25979 217.97779 317.24114 214.13778 curveto
+314.42512 218.10579 312.14246 220.77245 310.39314 222.13778 curveto
+308.64379 223.50311 306.63846 224.18578 304.37714 224.18578 curveto
+302.32913 224.18578 300.72913 223.56711 299.57714 222.32978 curveto
+298.42514 221.04978 297.84914 219.30045 297.84914 217.08178 curveto
+297.84914 213.79646 298.76647 210.44713 300.60114 207.03378 curveto
+302.47847 203.62047 304.84646 200.80447 307.70514 198.58578 curveto
+310.60646 196.36714 313.42246 195.25781 316.15314 195.25778 curveto
+319.01178 195.25781 320.71845 196.49514 321.27314 198.96978 curveto
+321.97714 195.89778 lineto
+322.16914 195.70578 lineto
+326.07314 195.25778 lineto
+326.52114 195.44978 lineto
+326.47844 195.62048 326.35044 196.06848 326.13714 196.79378 curveto
+322.33978 210.70313 320.44112 218.44712 320.44114 220.02578 curveto
+320.44112 220.58045 320.73978 220.85778 321.33714 220.85778 curveto
+320.12114 200.56978 moveto
+320.12112 199.37514 319.75845 198.43647 319.03314 197.75378 curveto
+318.35045 197.02847 317.41178 196.66581 316.21714 196.66578 curveto
+313.87046 196.66581 311.63046 198.03114 309.49714 200.76178 curveto
+307.40646 203.49247 305.8278 206.35113 304.76114 209.33778 curveto
+303.73713 212.28179 303.22513 214.58579 303.22514 216.24978 curveto
+303.22513 217.70045 303.56647 218.87379 304.24914 219.76978 curveto
+304.9318 220.62312 305.8278 221.04978 306.93714 221.04978 curveto
+308.94246 221.04978 310.99046 219.89778 313.08114 217.59378 curveto
+315.17179 215.24712 316.85712 212.47379 318.13714 209.27378 curveto
+319.45978 206.0738 320.12112 203.17247 320.12114 200.56978 curveto
+fill
+grestore
+gsave
+0 0 0 setrgbcolor
+newpath
+116.35173 140.22451 moveto
+116.35173 139.13651 lineto
+119.55172 138.75255 122.81572 138.26189 126.14373 137.66451 curveto
+126.46373 137.98451 lineto
+119.80773 162.81651 lineto
+122.06905 159.2752 124.13838 156.7792 126.01573 155.32851 curveto
+127.89304 153.87787 129.94104 153.15254 132.15973 153.15251 curveto
+134.29304 153.15254 136.0637 153.87787 137.47173 155.32851 curveto
+138.8797 156.7792 139.5837 158.61387 139.58373 160.83251 curveto
+139.5837 164.11786 138.5597 167.42452 136.51173 170.75251 curveto
+134.50637 174.03785 131.92504 176.74718 128.76773 178.88051 curveto
+125.61038 181.01384 122.45305 182.08051 119.29573 182.08051 curveto
+117.50372 182.08051 115.62639 181.69651 113.66373 180.92851 curveto
+111.74373 180.16051 110.78373 179.41385 110.78373 178.68851 curveto
+110.78373 178.43251 lineto
+119.48773 146.36851 lineto
+120.17039 143.97921 120.51172 142.50722 120.51173 141.95251 curveto
+120.51172 141.22722 120.27705 140.77922 119.80773 140.60851 curveto
+119.38105 140.39522 118.22905 140.26722 116.35173 140.22451 curveto
+119.23173 180.60851 moveto
+121.40772 180.60851 123.47705 179.84051 125.43973 178.30451 curveto
+127.44504 176.76852 129.04504 174.93385 130.23973 172.80051 curveto
+131.43437 170.66719 132.37304 168.59786 133.05573 166.59251 curveto
+133.78104 164.58719 134.1437 162.9872 134.14373 161.79251 curveto
+134.1437 160.08587 133.73837 158.74187 132.92773 157.76051 curveto
+132.11704 156.7792 131.02904 156.28854 129.66373 156.28851 curveto
+127.74371 156.28854 125.90905 157.20587 124.15973 159.04051 curveto
+122.41038 160.83253 120.98105 162.9872 119.87173 165.50451 curveto
+118.76239 168.02186 117.88772 170.47519 117.24773 172.86451 curveto
+116.60772 175.21118 116.28772 177.06718 116.28773 178.43251 curveto
+116.28772 179.88318 117.26905 180.60851 119.23173 180.60851 curveto
+fill
+grestore
+gsave [3.8010801 0 0 3.658223 -475.86267 -552.55121] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+144.12956 193.31984 moveto
+144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto
+141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto
+141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto
+143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto
+closepath
+fill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+0.80000001 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+144.12956 193.31984 moveto
+144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto
+141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto
+141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto
+143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto
+closepath
+stroke
+grestore
+gsave [3.8010801 0 0 3.658223 -403.59545 -516.51882] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+144.12956 193.31984 moveto
+144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto
+141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto
+141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto
+143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto
+closepath
+fill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+0.80000001 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+144.12956 193.31984 moveto
+144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto
+141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto
+141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto
+143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto
+closepath
+stroke
+grestore
+gsave [3.8010801 0 0 3.658223 -253.79788 -476.43785] concat
+gsave
+0 0 0 setrgbcolor
+newpath
+144.12956 193.31984 moveto
+144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto
+141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto
+141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto
+143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto
+closepath
+fill
+grestore
+0 0 0 setrgbcolor
+[] 0 setdash
+0.80000001 setlinewidth
+0 setlinejoin
+0 setlinecap
+newpath
+144.12956 193.31984 moveto
+144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto
+141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto
+141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto
+143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto
+closepath
+stroke
+grestore
+grestore
+grestore
+showpage
+%%EOF
diff --git a/3-goldberg/Makefile b/3-goldberg/Makefile
new file mode 100644 (file)
index 0000000..6330e4c
--- /dev/null
@@ -0,0 +1,3 @@
+P=3-goldberg
+
+include ../Makerules