Algoritmus preflow push řeší problém nalezení maximálního toku v transportní síti . Algoritmus není speciálním případem Ford-Fulkersonova algoritmu . Implementován bez speciálních vylepšení, algoritmus běží v čase . Některá vylepšení dále urychlují algoritmus: pravidlo výběru vrcholů „na začátek“ - až , výběr nejvyššího aktivního vrcholu - až , implementace pomocí datové struktury Seanor a Tarjan - až . Poprvé publikovali v roce 1986 Andrew W. Goldberg a Tarjan. [1] .
V tomto článku nazýváme potomkem vrcholu u libovolný vrchol v takový, že zbytková síť obsahuje hranu (u, v).
Množiny vrcholů a hran sítě značíme a a jejich čísla V a E.
Algoritmus používá preflow , funkci s následujícími vlastnostmi pro libovolné vrcholy a :
První dvě vlastnosti jsou stejné jako u streamu, třetí je oslabení vlastnosti perzistence proudu. Součet obsažený v této vlastnosti se nazývá nadměrný tok (přebytek) a označuje se . Podle této vlastnosti je přebytečný tok nezáporný pro všechny vrcholy kromě zdroje a jímky.
Vrchol nazýváme přetečením , pokud není ani zdrojem, ani propadem a přebytečný tok k tomuto vrcholu je přísně kladný. Je snadné vidět, že předtok je tok právě tehdy, když neexistují žádné vrcholy přetečení.
Algoritmus ukládá následující data:
Zpočátku se předtok rovná kapacitě všech hran opouštějících zdroj a je opačný pro obrácené páry vrcholů:
Pro zbývající dvojice vrcholů je předtok roven nule.
Počáteční výška je V pro počátek a 0 pro všechny ostatní vrcholy.
Algoritmus používá dvě operace: tlačení (tlačení) a zvedání (přepisování).
TlačeníPřesunutí z vrcholu u do vrcholu v je možné za následujících podmínek:
Tlačení znamená, že se průtok zvýší o určité množství
Přebytečný průtok se zvýší o stejnou hodnotu .
Zpětný průtok a přebytečný průtok se sníží o stejnou hodnotu.
Tlačení se nazývá saturace if . Po saturačním tlaku se , rovná , v důsledku čehož je hrana (u, v) vyloučena ze zbytkové sítě. Nenasyceným tlakem tedy učiní vrchol u nepřeplněný.
VzestupZvednutí vrcholu u je možné za následujících podmínek:
Zvednutí znamená, že ze všech potomků u se vybere vrchol v s minimální výškou, poté se výška vrcholu u stane rovna .
Dokažme, že pokud algoritmus někdy skončí, v tu chvíli bude preflow maximální průtok. Po cestě dokazujeme další lemmata, která jsou užitečná pro to, co následuje.
Lemma 1 . Zvednutím libovolného vrcholu se zvětší jeho výška.
Důkaz . Před vzestupem není vrchol výše než nejnižší z jeho potomků. Po vstávání je vyšší než on. Výška dítěte se nezměnila. V důsledku toho se výška zvednutého vršku zvýšila.
Lemma 2 . Výška žádného vrcholu se nikdy nezmenšuje.
Důkaz . Zatlačení nemění výšku vrcholů. Zvýšením se zvýší výška zvednutého vrcholu a nezmění se výška ostatních vrcholů.
Lemma 3 . Výška zdroje a jímky zůstává vždy rovna V a 0.
Důkaz . Zdroj a jímka podle definice nemohou přetékat, a proto nikdy nestoupají. Ani zvedání jiných vrcholů ani tlačení neovlivňuje výšku zdroje nebo jímky. Jejich výšky tedy zůstávají vždy stejné jako v době inicializace, což mělo být prokázáno.
Lemma 4 . f vždy splňuje vlastnosti předfuku.
Důkaz . Dokazujeme to indukcí na počtu provedených operací. Musíme dokázat, že po inicializaci f splňuje vlastnosti předfuku a také, že pokud f splňuje vlastnosti předfuku před operací tlačení nebo zdvihání, bude je splňovat i po něm.
Lemma 5 ( vlastnost výšky ) . Pro libovolnou hranu zbytkové sítě (u, v) je nerovnost
Důkaz . Dokazujeme indukcí na počtu provedených operací podobně jako v předchozím lemmatu.
Lemma 6 . Pokud je vrchol w ve zbytkové síti dosažitelný z vrcholu u, pak . Důkaz . Zvažte nejkratší cestu z u do w. Neobsahuje cykly, proto je jeho délka maximálně . Ale pomocí vlastnosti výšky se na každé hraně této cesty výška zmenší o ne více než 1. Na celé cestě se tedy sníží o ne více než o , což bylo nutné dokázat.
Lemma 7 . Ve zbytkové síti není jímka nikdy dosažitelná ze zdroje.
Důkaz . Ať to tak není. Pak podle předchozího lemmatu . Ale Lemma 3, . Rozpor.
Lemma 8 . Pokud se algoritmus někdy ukončí, v tomto okamžiku bude předběžné zpracování vlákno.
Důkaz . Vzhledem k přetékajícímu vrcholu můžeme vždy buď tlačit (pokud je vrchol výše než alespoň jedno dítě), nebo zvednout (jinak). Vzhledem k tomu, že algoritmus končí pouze tehdy, nejsou-li možné žádné operace, v tuto chvíli neexistují žádné přetékající vrcholy, což implikuje uplatnění lemmatu.
Věta . Pokud se algoritmus někdy ukončí, v tomto okamžiku bude preflow maximální průtok.
Důkaz . Podle lemmatu 8 se předtok stává tokem. Podle lemmatu 7 ve zbytkové síti nebude jímka dosažitelná ze zdroje, jinými slovy, nebude existovat žádná rozšiřující cesta. Proto bude průtok maximální. [2]
V této části nejen prokážeme, že algoritmus bude dokončen v konečném čase, ale také uvedeme horní mez pro maximální počet operací zatlačení a zvednutí.
Lemma 1 . Přebytečný průtok do jímky ( ) nikdy neklesá. Důkaz . Tlačení z u do v snižuje přebytečný průtok pouze u u, zatímco tlačení neovlivňuje přebytečné průtoky vůbec. Jediný způsob, jak snížit , je tedy tlačit z umyvadla do jiného vrcholu. Ale tlačení je možné pouze z přetékajících vrcholů a dřez nemůže být z definice přetečen. Takže to není možné snížit.
Lemma 2 . Přebytečný průtok do dřezu ( ) je vždy nezáporný. Důkaz . Ihned po inicializaci se rovná , je tedy nezáporná. V budoucnu se nesnižuje, proto zůstává nezáporná.
Lemma 3 . Ve zbytkové síti je zdroj vždy dosažitelný z jakéhokoli přeplněného vrcholu.
Důkaz . Nechť je zdroj s nedosažitelný z nějakého vrcholu u. Dokažme, že u nepřetéká. Nechť U, U' jsou množiny vrcholů dosažitelných a nedosažitelných z u ve zbytkové síti. Podle předpokladu, . Uvažujme libovolný pár vrcholů , . Ve zbytkové síti není hrana (v,w), jinak by bylo možné dosáhnout v z u a poté podél této hrany w, což je v rozporu . Na druhou stranu, pokud , pak je zbytková kapacita kladná, takže tam musí být taková hrana. Takže odkud . Nyní shrňme přebytečné toky do všech vrcholů U:
První ze dvou součtů na pravé straně je roven nule, protože pro každou relevantní dvojici vrcholů (v,w) má dva členy f(v,w) a f(w,v), jejichž součet je roven nule. . Druhý je nekladný, protože všechny jeho termíny jsou nekladné. Prostředek,
Na druhou stranu, každý člen v součtu je nezáporný:
Protože součet nezáporných členů je kladný, všechny jeho členy jsou rovny nule. Zejména, , to znamená, že u není přetékající, což bylo třeba dokázat.
Lemma 4 . Výška libovolného vrcholu je vždy menší než 2V.
Důkaz . Zvažte nějaký vrchol u. Jediný způsob, jak změnit výšku vrcholu, je zvednout tento vrchol. Pokud tedy vrchol u nebyl nikdy zvýšen, jeho výška zůstává stejná, jako byla po inicializaci, tedy 0 nebo V, a lemma je dokázáno. Jinak jeho výška zůstala stejná, jakou se stala v důsledku posledního stoupání. Před posledním výstupem se u přelévalo, což znamená, že ve zbytkové síti byl z něj zdroj s dosažitelný. Po výstupu je cesta z u do s ve zbytkové síti zachována, protože výstup neovlivňuje zbytkovou síť. Proto podle lemmatu 6 z předchozí části, , odkud , které mělo být prokázáno.
Věta . Po celou dobu činnosti algoritmu nemůže být více než . Důkaz . Zvednutí vrcholu zvětší jeho výšku alespoň o 1. Počáteční výška každého vrcholu není menší než 0, konečná podle předchozího lemmatu není větší než 2V-1. Výšku vrcholu nelze snížit. To znamená, že každý vrchol nevydrží více než 2V-1 stoupání. Celkově můžete zvednout nejvýše V-2 vrcholy (všechny kromě s a t). To implikuje tvrzení teorému.
Věta . Po celou dobu činnosti algoritmu nemůže být více než . Důkaz . Zvažte dvě po sobě jdoucí saturační tahy z u do v. První z nich vyřadí hranu (u, v) ze zbytkové sítě, v době, kdy je provedena druhá, se tato hrana znovu objeví. Mezi těmito dvěma tlaky se tedy provede tlak z v do u, což je jediný způsob, jak obnovit hranu. Při prvním nasycení zatlačte , při tlačení z v do u naopak . Uvážíme-li, že se výšky nemohou snižovat, dostaneme, že se výška zvýšila alespoň o 2. Protože k tomu dochází mezi každými dvěma po sobě jdoucími saturačními tlačítky od u do v a výška žádného vrcholu se nemůže zvýšit o více než 2V-1 (od 0 do 2V-1), počet zatlačení z u do v nepřesáhne V. Celkem jsou k protlačení vhodné 2E páry vrcholů (všechny hrany a jejich inverze). Tudíž nemůže být více saturačních tlaků než 2VE.
Nakonec, abychom našli horní hranici počtu nesaturujících tahů, použijeme součet výšek všech přetečených vrcholů jako potenciální funkci. Označme tento součet Φ. Nenasycený tlak z u na v nemění výšky, ale mění u z přeplněného na nepřeplněné a může změnit v z nepřeplněného na přeplněné; nemá vliv na stav ostatních vrcholů. Proto se Φ sníží nejméně o . Potlačení je možné pouze tehdy, pokud , nesaturační stlačení sníží Φ alespoň o 1. Zpočátku Φ=0, ale Φ nikdy nemůže být záporné. To znamená, že algoritmus může provést pouze tolik nesaturujících stisků, kolik ostatní operace zvýší Φ. Raise zvýší Φ o ne více než 2V-1 a Saturating Push zvýší Φ maximálně o 2V-1. Celkový počet takových stisků je tedy maximálně , nebo .
Vzhledem k tomu, že izolované vrcholy (které nejsou incidentní s žádnou hranou původní sítě) žádným způsobem neovlivňují operace push nebo lift, můžeme je mentálně vyloučit, abychom odhadli počet operací, po kterých . Počet nesaturujících stisků je tedy . Když sem sečteme maximálně saturující stisky, dostaneme, že celkový počet tahů je také .
Ukládáme sadu přetékajících vrcholů a pro každý vrchol - dvě sady potomků: s nemenší výškou a s menší výškou. Všechny tyto množiny ukládáme jednoduše jako pole (z hlediska C++ - vektory) prvků.
Určení požadované akce a zatlačení se provádí v konstantním čase (všimněte si, že při zatlačení je vždy vyloučen poslední prvek sady). Proto všechny definice požadované akce a push vyžadují operace.
Pro zjištění doby náběhu si všimneme, že přenos vrcholu u do množiny potomků s nemenší výškou vyžaduje jeho vyloučení z množiny potomků s nižší výškou. Protože sady potomků jsou uloženy jako vektory a odstranění prvku vektoru vyžaduje počet operací úměrných jeho délce, může takový přenos vyžadovat operace. To znamená, že provedení překladů pro všechny sousedy vyžaduje operace, kde je stupeň vrcholu u. Ostatní činnosti prováděné během výtahu vyžadují méně operací, což znamená, že výtah vyžaduje operace. Jeden vrchol může vydržet zvedání, proto všechna jeho zvedání vyžadují operace a všechna zvedání všech vrcholů vyžadují operace.
Implementace algoritmu tedy vyžaduje operace.
Algoritmus přeznačení na přední je účinnější implementací předflow push algoritmu, než je popsáno výše. Provozní doba je .
Algoritmus používá koncept přípustných hran . Hrana (u, v) se nazývá přípustná , pokud jsou splněny dvě podmínky:
Všimněte si, že při zohlednění vlastnosti výšky se tyto podmínky shodují s posledními dvěma podmínkami použitelnosti operace tlačení na hrany. Tudíž,
Tlačení se provádí pouze podél přípustných okrajů. |
Kromě toho lze přípustnost zvedání s přihlédnutím k vlastnosti výšky formulovat následovně
Zvedání je přípustné tehdy a pouze tehdy, když zvedaný vrchol přetéká a nevycházejí z něj žádné přípustné hrany |
Kromě toho lze prokázat další dvě vlastnosti přípustných hran.
Vlastnost 1. Pushování nevytváří nové platné hrany.
Důkaz. Předpokládejme, že nějaké zatlačení způsobilo, že hrana (u, v) je přípustná. Přípustnost hrany (u, v) je zcela určena 4 parametry: výškami vrcholů u a v, prouděním podél hrany a její kapacitou. Výšky vrcholů a kapacity hran nejsou ovlivněny žádným tlačením. To znamená, že to ovlivnilo tok f(u, v). To lze provést pouze zatlačením podél okraje (u, v) nebo (v, u). Ale tlačení podél okraje (u, v) vyžaduje, aby bylo přípustné již před tlačením, což je v rozporu s předpokladem. Tlačení podél okraje (v, u) vyžaduje zejména, aby u bylo pod v. Protože zatlačení neovlivňuje výšky, u bude po zatlačení nižší než v, což porušuje druhou podmínku přípustnosti.
Vlastnost 2. Po zvednutí vrcholu v budou všechny hrany obsažené ve v neplatné.
Důkaz. Uvažujme každou takovou hranu (u, v) a dokažme, že po zvednutí bude neplatná.
Kromě preflow a výšek ukládá algoritmus následující:
V této části popíšeme funkci nazvanou vrcholový výboj . Mezery platí pouze pro přeplněné vrcholy.
PopisVybití vrcholu u se provádí následovně:
Krok 1. Zatímco je vrchol u plný, postupujte podle kroků 2-4. Krok 2. Pokud proud přesáhl konec seznamu, zvedněte vrchol u a vraťte proud na začátek seznamu. Krok 3. V opačném případě, pokud je povoleno posunutí z u na proud[u], udělejte to. Krok 4. Jinak posuňte proud o 1 prvek dopředu. VlastnostiLemma 1 . Po každé iteraci cyklu, pokud se funkce nezastavila, vrchol u přeteče.
Důkaz . Vyplývá z kontroly v kroku 1.
Lemma 2 . Po každé iteraci cyklu je hrana (u, proud[u]) neplatná, neexistuje nebo se funkce zastaví. Aktuální je zde hodnota ukazatele na začátek iterace .
Důkaz . Pokud byla splněna podmínka v kroku 2, hrana neexistuje. V opačném případě, pokud nebyla splněna podmínka v kroku 3, byla hrana neplatná; protože push nevytváří nové platné hrany, zůstává neplatný. Nakonec, pokud bylo zatlačení provedeno v kroku 3, bylo buď saturující, nebo nenasycené. V prvním případě hrana (u, v) zmizela ze zbytkové sítě, což znamená, že je pro ni porušena první podmínka přípustnosti. Ve druhém případě vrchol nepřetekal, načež se funkce zastavila v kroku 1.
Lemma 3 . Když je splněna podmínka kroku 2, není povolena žádná hrana vycházející z u.
Důkaz . Uvažujme každou takovou hranu (u, v). Pokud vrchol v nesousedí s vrcholem u, pak ve zbytkové síti není žádná hrana, proto je porušena první podmínka přípustnosti. V opačném případě byl vrchol uvažován v kroku 3. Zvažte, kdy se to stalo naposledy. Ihned poté se hrana (u, v) podle předchozího lemmatu stala neplatnou. Dále nebylo možné ve funkci provádět žádné operace, kromě tlačení podél dalších hran vycházejících z u. Takové zatlačení nemohlo pomocí první vlastnosti přípustnosti učinit hranu (u, v) znovu přípustnou.
Nemovitost 1 . Tlačení a zvedání se provádí pouze tehdy, když je to povoleno.
Důkaz . Přípustnost každého push je kontrolována explicitně. Přípustnost zvedání je zaručena tím, že v kroku 2 bude vrchol u přetékat lemmatem 1, a také tím, že z něj lemma 3 nevycházejí žádné přípustné hrany.
Nemovitost 2 . Po ukončení funkce vrchol u nepřetéká.
Důkaz . Funkce se může zastavit pouze v kroku 1. K zastavení dojde pouze v případě, že vrchol u nepřeteče.
Kromě prestreamu a výšek ukládá algoritmus "navýšení na začátek" seznam vrcholů L a ukazatel na jeden z jeho prvků (v C++ iterátor) it .
Topologický druh digrafu (V,E) je seznam některých jeho vrcholů, seřazených tak, že pro jakoukoli hranu je u v seznamu před v.
Lemma 1. Po každé iteraci vnější smyčky je seznam L topologickým druhem grafu přípustných hran (ATGGR).
Důkaz. Indukce na počtu iterací vnější smyčky.
Základna. Po inicializaci je výška zdroje rovna V, všechny ostatní vrcholy jsou 0. Zároveň , protože existují minimálně 2 vrcholy - zdroj a jímka. Proto je pro jakýkoli pár vrcholů porušena druhá podmínka přípustnosti a neexistují vůbec žádné přípustné hrany. Jakýkoli seznam vrcholů je tedy TSGDR. Krok. Podívejme se na v.
Lemma 2. Po každé iteraci vnější smyčky se skenovaný vrchol a všechny vrcholy nalevo od něj v seznamu nepřetečou.
Důkaz. Indukce na počtu iterací vnější smyčky.
Základna. Po první iteraci není skenovaný vrchol přeplněn vlastností mezery a nalevo od něj nejsou žádné vrcholy.
Krok. Podívejme se na v. Ona sama nepřekypuje vlastností vypouštění. Pokud se zvedne, a proto se přesune na začátek seznamu, pak nalevo od něj nejsou žádné vrcholy a věta je dokázána. Jinak se při této iteraci prováděly pouze operace push z vrcholu v do vrcholů, do kterých vedou přípustné hrany z v. Protože operace push nevytváří nové platné hrany, všechny tyto hrany byly platné před začátkem iterace. Proto podle předchozího lemmatu byly všechny vrcholy, na které byl proveden push, v seznamu vpravo od v. Proto vrcholy nalevo od v v seznamu nemohly být při této iteraci přeplněny. Ale podle indukční hypotézy nebyly ani dříve přeplněné. Věta byla prokázána.
Lemma 3. Po dokončení algoritmu žádný vrchol nepřetéká.
Důkaz. Abychom dokončili algoritmus, musíme se podívat na poslední vrchol v seznamu L. Podle předchozího lemmatu již žádný vrchol seznamu L nepřetéká. Ale seznam L obsahuje všechny vrcholy kromě zdroje a jímky a zdroj a jímku nelze z definice přetékat.
Vlastnictví. Algoritmus lift-to-front (PHA) je speciálním případem algoritmu preflow push (PFP).
Důkaz. Inicializace výšek a předfuku v ALP je stejná jako v APS. Změny nadmořské výšky a před prouděním v ALP nastávají pouze spuštěním výboje, který zase provádí pouze legitimní operace tlačení a zvedání. Konečně na konci APN žádný vrchol nepřetéká, takže operace push nebo lift nejsou možné.
Pojďme odhadnout, kolikrát byly různé akce provedeny, a jejich celkovou dobu trvání.
VýbojePři každém výhozu bez zvedání se posune o jednu pozici doprava. Seznam L obsahuje vrcholy V-2, proto není možné více výbojů než V-2 za sebou bez zvednutí. Počet stoupá , tedy počet výbojů .
Samotné volání absolutoria a související náklady (postup iterátoru, zpětná smyčka) trvají konstantní čas. Celkový čas pro všechny takové akce je tedy .
LezeníUvažujme libovolný vrchol u. Nechť je její stupeň. Vrchol lze zvednout maximálně 2V-1krát a čas strávený na každém výstupu je . Proto čas strávený zvedáním všech vrcholů je , nebo .
TlačeníSaturační tlaky, jak jsme dokázali dříve, nejsou více než O(VE).
Nenasycený tlak způsobí, že vršek není přeplněný, po kterém se vybíjení zastaví. Tudíž neexistuje více nesaturujících push než vybíjecích volání, tedy .
Doba chodu jednoho stisknutí je konstantní. To znamená, že celková doba chodu tlaků je .
Iterátor posouvá aktuálníUvažujme libovolný vrchol u. Nechť je její stupeň. Každý posun proudu[u] způsobí, že vrchol stoupá. Celkové zdvihy ne více než 2V-1. Proto je počet posunů iterátoru pro všechny vrcholy , nebo .
Doba každé směny je konstantní.
Celkový časShrneme-li předchozí sekce, dostaneme, že doba běhu algoritmu je , nebo .