A preflow push algoritmus megoldja a maximális áramlás megtalálásának problémáját a szállítási hálózatban . Az algoritmus nem a Ford-Fulkerson algoritmus speciális esete . Különleges fejlesztések nélkül megvalósítva az algoritmus időben fut . Néhány fejlesztés tovább gyorsítja az algoritmust: az „elejére emelés” csúcskiválasztási szabály - ig , a legmagasabb aktív csúcs kiválasztása -ig , a Senor és a Tarjan adatszerkezet használatával történő megvalósítás - ig . Először 1986 -ban publikálta Andrew W. Goldberg és Tarjan. [1] .
Ebben a cikkben az u csúcs gyermekének nevezünk minden olyan v csúcsot, amelyben a maradék hálózat tartalmaz egy élt (u, v).
A hálózat csúcsainak és éleinek halmazait és -vel , számukat pedig V-vel és E- vel jelöljük.
Az algoritmus a preflow függvényt használja, amely a következő tulajdonságokkal rendelkezik bármely csúcshoz és :
Az első két tulajdonság megegyezik a folyaméval, a harmadik pedig az adatfolyam perzisztencia tulajdonságának gyengülése. Az ebben a tulajdonságban foglalt összeget többletáramlásnak (többletnek) nevezzük , és jelöli . E tulajdonság szerint a többletáramlás nem negatív az összes csúcsra, kivéve a forrást és a nyelőt.
Túlcsordulásnak nevezünk egy csúcsot , ha az nem forrás és nem is nyelő, és az adott csúcs felé irányuló többletáramlás szigorúan pozitív. Könnyen belátható, hogy az előfolyam akkor és csak akkor áramlás, ha nincsenek túlcsordulási csúcsok.
Az algoritmus a következő adatokat tárolja:
Kezdetben az előfolyam egyenlő a forrásból kilépő összes él kapacitásával, és ellentétes a fordított csúcspárok esetében:
A fennmaradó csúcspárok esetében az előfolyamat egyenlő nullával.
A kezdeti magasság V az origónál, és 0 az összes többi csúcsnál.
Az algoritmus két műveletet használ: lökést (push) és emelést (újracímkézés).
PushingAz u csúcsból a v csúcsba tolni a következő feltételek mellett lehetséges:
A tolás azt jelenti, hogy az áramlás egy mennyiséggel megnő
A többletáramlás ugyanennyivel növekszik .
A fordított áramlás és a többletáramlás ugyanannyival csökken.
A tolást telítésnek nevezzük, ha . Egy telítés után egyenlővé válik -vel , aminek következtében az (u, v) él kiesik a maradék hálózatból. Nem telítõ nyomással tehát zsúfolttá teszi az u csúcsot.
RiseAz u csúcs megemelése a következő feltételek mellett lehetséges:
Az emelés azt jelenti, hogy az u összes leszármazottja közül kiválasztjuk a minimális magasságú v csúcsot, ami után az u csúcs magassága egyenlő lesz a -val .
Bizonyítsuk be, hogy ha az algoritmus valaha is véget ér, abban a pillanatban az előfolyam lesz a maximális áramlás. Útközben más lemmákat is bebizonyítunk, amelyek hasznosak a következőkben.
1. lemma . Bármely csúcs felemelése növeli a magasságát.
Bizonyíték . Felemelkedés előtt a teteje nem magasabb, mint a legalacsonyabb leszármazottai. Felkelés után magasabb nála. A gyermek magassága nem változott. Következésképpen az emelt felső magassága megnőtt.
2. lemma . Egyetlen csúcs magassága sem csökken.
Bizonyíték . A tolás nem változtatja meg a csúcsok magasságát. Az emelés növeli a felemelt csúcs magasságát, és nem változtatja meg a többi csúcs magasságát.
3. lemma . A forrás és a nyelő magassága mindig V, illetve 0 marad.
Bizonyíték . A forrás és a nyelő definíció szerint nem csordulhat túl, ezért soha nem emelkedhet fel. Sem a többi csúcs megemelése, sem a tolás nem befolyásolja a forrás vagy a nyelő magasságát. Ezért a magasságuk mindig ugyanaz marad, mint az inicializáláskor, ami bizonyítandó volt.
4. lemma . f mindig kielégíti az előáramlási tulajdonságokat.
Bizonyíték . Az elvégzett műveletek számának indukciójával igazoljuk. Bizonyítanunk kell, hogy inicializálás után f kielégíti az előfolyam tulajdonságait, és azt is, hogy ha f kielégíti az előfolyam tulajdonságait a push vagy lift művelet előtt, akkor azt követően is kielégíti azokat.
5. lemma ( magasság tulajdonság ) . A maradékhálózat bármely élére (u, v) az egyenlőtlenség
Bizonyíték . Indukcióval igazoljuk a végrehajtott műveletek számát az előző lemmához hasonlóan.
6. lemma . Ha a maradék hálózat w csúcsa elérhető az u csúcsból, akkor . Bizonyíték . Tekintsük a legrövidebb utat u-tól w-ig. Nem tartalmaz ciklusokat, ezért a hossza legfeljebb . De a magasság tulajdonsága alapján ennek az útnak minden szélén a magasság legfeljebb 1-gyel csökken. Ezért a teljes pályán legfeljebb -kal csökken , amit bizonyítani kellett.
7. lemma . A maradék hálózatban a mosogató soha nem érhető el a forrásból.
Bizonyíték . Ne legyen így. Aztán az előző lemma szerint . De a 3. Lemma szerint . Ellentmondás.
8. lemma . Ha az algoritmus valaha is véget ér, akkor az előfolyamat egy szál lesz.
Bizonyíték . Adott egy túlcsorduló csúcs, mindig tudunk tolni (ha a csúcs legalább egy gyereknél magasabb), vagy emelni (egyébként). Mivel az algoritmus csak akkor fejeződik be, ha nem lehetséges a művelet, ezért ebben a pillanatban nincsenek túlcsordulási csúcsok, ami a lemma érvényesülését jelenti.
Tétel . Ha az algoritmus valaha is leáll, akkor az előfolyamat lesz a maximális áramlás.
Bizonyíték . A 8. lemma szerint az előáramlás áramlássá válik. A 7. lemmára a maradék hálózatban a nyelő nem lesz elérhető a forrásból, vagyis nem lesz bővítési út. Ezért az áramlás maximális lesz. [2]
Ebben a részben nemcsak azt bizonyítjuk be, hogy az algoritmus véges időn belül elkészül, hanem felső korlátot is adunk a toló- és emelési műveletek maximális számára.
1. lemma . A mosogatóhoz vezető felesleges áramlás ( ) soha nem csökken. Bizonyíték . Az u-ból v-be tolás csak az u-nál csökkenti a többletáramlást, míg a tolás egyáltalán nem befolyásolja a többletáramlást. Ezért az egyetlen módja a csökkentésnek , ha a süllyesztőből egy másik csúcsba toljuk. De tolni csak túlcsorduló csúcsokból lehet, a süllyesztőt pedig értelemszerűen nem lehet túlcsordulni. Tehát lehetetlen csökkenteni.
2. lemma . A mosogatóba ( ) irányuló többletáramlás mindig nem negatív. Bizonyíték . Közvetlenül az inicializálás után egyenlő a -val, ezért nem negatív. A jövőben nem csökken, ezért nem negatív marad.
3. lemma . A maradék hálózatban a forrás mindig elérhető bármely zsúfolt csúcsból.
Bizonyíték . Legyen az s forrás elérhetetlen valamelyik u csúcsból. Bizonyítsuk be, hogy nem vagy túlcsordulva. Legyen U, U' az u-ból elérhető és el nem érhető csúcsok halmaza a maradék hálózatban. Feltételezve ,. Tekintsünk egy tetszőleges csúcspárt , . A maradék hálózatban nincs (v,w) él, különben u-ból, majd ezen a w él mentén el lehetne érni v-t, ami ellentmond -nek . Másrészt, ha , akkor a maradék kapacitás pozitív, tehát kell lennie egy ilyen élnek. Szóval, honnan . Most összegezzük az U összes csúcsához tartozó többletáramlásokat:
A jobb oldalon lévő két összeg közül az első egyenlő nullával, mert minden releváns csúcspárhoz (v,w) van két olyan f(v,w) és f(w,v) tag, amelyek összege nullával egyenlő. . A második nem pozitív, mivel minden kifejezése nem pozitív. Eszközök,
Másrészt az összeg minden tagja nem negatív:
Mivel a nem negatív tagok összege nem pozitív, ebből az következik, hogy minden tagja egyenlő nullával. Konkrétan , azaz u nem túlcsorduló, amit bizonyítani kellett.
4. lemma . Bármely csúcs magassága mindig kisebb, mint 2 V.
Bizonyíték . Tekintsünk néhány u csúcsot. Egy csúcs magasságának megváltoztatásának egyetlen módja a csúcs felemelése. Ezért, ha az u csúcsot soha nem emeltük meg, akkor a magassága ugyanaz marad, mint az inicializálás után, azaz 0 vagy V, és a lemma bizonyítást nyer. Egyébként a magassága ugyanaz maradt, mint amilyenné az utolsó emelkedés eredményeként lett. Az utolsó emelkedés előtt u túlcsordult, ami azt jelenti, hogy a maradék hálózatban az s forrás elérhető volt onnan. Az emelkedés után az u-tól s-ig tartó út a maradék hálózatban megmarad, mert az emelkedés nem érinti a maradék hálózatot. Ezért az előző szakasz 6. lemmája alapján , ahonnan , amit bizonyítani kellett.
Tétel . Az algoritmus működésének teljes ideje alatt nem lehet több, mint . Bizonyíték . Egy csúcs felemelése legalább 1-gyel növeli a magasságát. Minden csúcs kezdeti magassága nem kisebb, mint 0, a végső magassága az előző lemma szerint legfeljebb 2V-1. A csúcsmagasság nem csökkenthető. Ez azt jelenti, hogy minden csúcs legfeljebb 2V-1 mászást bír ki. Összességében legfeljebb V-2 csúcsot emelhet fel (s és t kivételével). Ez magában foglalja a tétel érvényesítését.
Tétel . Az algoritmus működésének teljes ideje alatt nem lehet több, mint . Bizonyíték . Tekintsünk két egymást követő telítő lökést u-ból v-be. Az első kizárja az (u, v) élt a maradék hálózatból, mire a második végrehajtódik, ez az él újra megjelenik. Tehát e két lökés között egy v-ről u-ra történő lökést hajtanak végre, ami az él visszaállításának egyetlen módja. Az első telítési lökés során, miközben v-ről u-ra nyomjuk, éppen ellenkezőleg, . Figyelembe véve, hogy a magasságok nem csökkenhetnek, azt kapjuk, hogy a magasság legalább 2-vel nőtt. Mivel ez minden két egymást követő telítési lökés között történik u-ból v-be, és egyetlen csúcs magassága sem nőhet 2V-1-nél nagyobb mértékben (0-ról). 2V-1-re), az u-ból v-be történő lökések száma nem haladja meg a V-t. Összesen 2E tolásra alkalmas csúcspár van (minden él és azok inverzei). Ennélfogva nem lehet több telítési nyomás, mint 2VE.
Végül, hogy megtaláljuk a nem telítetlen lökések számának felső korlátját, az összes túlcsordult csúcs magasságának összegét használjuk potenciálfüggvényként. Jelöljük ezt az összeget Φ-vel. Az u-ból v-be történő nem telítő hatás nem változtatja meg a magasságokat, hanem u-t zsúfoltból zsúfolttá változtat, és v-t zsúfoltból zsúfolttá változtathatja; nem befolyásolja a többi csúcs állapotát. Ezért Φ legalább -kal csökken . A tolás csak akkor lehetséges, ha tehát a nem telítõ nyomás legalább 1-gyel csökkenti Φ-t. Kezdetben Φ=0, de Φ soha nem válhat negatívvá. Ez azt jelenti, hogy az algoritmus csak annyi nem telítõ lökést tud végrehajtani, amennyit a többi mûvelet Φ-vel növel. Az emelés legfeljebb 2V-1-gyel növeli a Φ-t, a Saturating Push pedig legfeljebb 2V-1-gyel növeli a Φ-t. Ezért az ilyen lökések teljes száma legfeljebb , vagy .
Mivel az izolált csúcsok (amelyek nem esnek az eredeti hálózat egyik szélére) semmilyen módon nem befolyásolják a push vagy lift műveleteket, ezért mentálisan kizárhatjuk őket, hogy megbecsüljük a műveletek számát, amelyek után . Ezért a nem telítő lökések száma . Ha ide hozzáadjuk a legfeljebb telítő lökéseket, akkor azt kapjuk, hogy az összes lökések száma is .
Egy sor túlcsorduló csúcsot tárolunk, és minden csúcshoz - két utódot: nem kisebb magassággal és kisebb magassággal. Mindezeket a halmazokat egyszerűen elemek tömbjeként tároljuk (C++ - vektorok szempontjából).
A szükséges művelet meghatározása és a tolás állandó időben történik (megjegyzendő, hogy a tolásnál a halmaz utolsó eleme mindig kizárt). Ezért a kívánt művelet és push minden meghatározása műveleteket igényel.
Az emelkedési idő meghatározásához megjegyezzük, hogy az u csúcsnak a nem kisebb magasságú leszármazottak halmazába való áttételéhez ki kell zárni az alacsonyabb magasságú leszármazottak halmazából. Mivel a leszármazottak halmazai vektorokként vannak tárolva, és egy vektor elemének törléséhez a hosszával arányos számú műveletre van szükség, az ilyen átvitel műveleteket igényelhet. Ez azt jelenti, hogy az összes szomszéd fordítása műveleteket igényel, ahol az u csúcs foka. Az emelés során végrehajtott többi művelet kevesebb műveletet igényel, ami azt jelenti, hogy az emelés műveleteket igényel. Egy csúcs kibírja az emelést, ezért minden emelése műveleteket igényel, az összes csúcs minden emelése pedig műveletet igényel .
Ezért az algoritmus megvalósítása műveleteket igényel.
Az átcímkézés a frontra algoritmus a fent leírtaknál hatékonyabb megvalósítása a preflow push algoritmusnak. A működési idő .
Az algoritmus a megengedett élek fogalmát használja . Egy élt (u, v) elfogadhatónak nevezünk, ha két feltétel teljesül:
Vegye figyelembe, hogy a magasság tulajdonságot figyelembe véve ezek a feltételek egybeesnek a push művelet élekre való alkalmazhatóságának utolsó két feltételével. Következésképpen,
A tolás csak a megengedett élek mentén történik. |
Ezen túlmenően az emelés megengedhetősége a magasság tulajdonságát figyelembe véve a következőképpen fogalmazható meg
Az emelés akkor és csak akkor megengedett, ha az emelendő csúcs túlcsordul, és nem jönnek ki belőle megengedett élek |
Ezen túlmenően a megengedhető élek további két tulajdonsága igazolható.
Tulajdonság 1. A tolás nem hoz létre új érvényes éleket.
Bizonyíték. Tegyük fel, hogy valamilyen lökdösődés megengedhetővé tette az élt (u, v). Egy él (u, v) megengedettségét 4 paraméter határozza meg teljesen: az u és v csúcsok magassága, az él mentén való áramlás és a kapacitása. A csúcsok magasságát és élkapacitását semmilyen tolás nem befolyásolja. Ez azt jelenti, hogy befolyásolta az f(u, v) áramlást. Ez csak az (u, v) vagy (v, u) él mentén történhet. De az él mentén (u, v) való toláshoz az már a tolás előtt megengedhető, ami ellentmond a feltételezésnek. A (v, u) él mentén történő toláshoz különösen szükséges, hogy u v alatt legyen. Mivel a tolás nem befolyásolja a magasságot, u kisebb lesz, mint v, lökést követően, ami sérti a második elfogadhatósági feltételt.
Tulajdonság 2. A v csúcs felemelése után a v-ben szereplő összes él érvénytelen lesz.
Bizonyíték. Tekintsünk egy ilyen élt (u, v), és bizonyítsuk be, hogy felemelés után érvénytelen lesz.
Az előfolyamon és a magasságokon kívül az algoritmus a következőket tárolja:
Ebben a részben egy csúcskisülés nevű függvényt írunk le . A távolság csak a zsúfolt csúcsokra vonatkozik.
LeírásAz u csúcs kisütése a következőképpen történik:
1. lépés. Amíg az u csúcs megtelt, kövesse a 2-4 lépéseket. 2. lépés: Ha az áram túllép a lista végén, emelje fel az u csúcsot, és térjen vissza a lista elejére. 3. lépés. Egyébként, ha megengedett az u-ból az aktuális[u]-ra tolni, tedd meg. 4. lépés. Ellenkező esetben mozgassa előre az aktuális 1 elemet. Tulajdonságok1. lemma . A ciklus minden iterációja után, ha a függvény nem állt le, az u csúcs túlcsordul.
Bizonyíték . Az 1. lépésben végzett ellenőrzésből következik.
2. lemma . A ciklus minden iterációja után az él (u, current[u]) érvénytelen, nem létezik, vagy a függvény leáll. Itt az aktuális az iteráció kezdetére mutató mutató értéke .
Bizonyíték . Ha a 2. lépés feltétele teljesült, az él nem létezik. Ellenkező esetben, ha a 3. lépés feltétele nem teljesül, az él érvénytelen; mivel a push nem hoz létre új érvényes éleket, érvénytelen marad. Végül, ha a nyomást a 3. lépésben hajtották végre, az vagy telítő vagy nem telítő volt. Az első esetben az él (u, v) eltűnt a maradék hálózatból, ami azt jelenti, hogy az első elfogadhatósági feltétel sérül. A második esetben a csúcs nem túlcsordult, ami után a függvény az 1. lépésnél megállt.
3. lemma . Ha a 2. lépés feltétele teljesül, az u-ból kimenő él nem megengedett.
Bizonyíték . Tekintsünk minden ilyen élt (u, v). Ha a v csúcs nem szomszédos az u csúcstal, akkor nincs él a maradék hálózatban, így az első elfogadhatósági feltétel megsérül. Ellenkező esetben a csúcsot a 3. lépésben vettük figyelembe. Tekintsük az utolsó alkalmat, amikor ez történt. Közvetlenül ezután az előző lemma (u, v) éle érvénytelenné vált. Ezen túlmenően a funkcióban semmilyen műveletet nem lehetett végrehajtani, kivéve az u-ból kiinduló egyéb élek mentén történő nyomkodást. Az ilyen lökések az első elfogadhatósági tulajdonság alapján nem tehetik újra megengedhetővé az (u, v) élt.
1. ingatlan . Tolásra és emelésre csak akkor kerül sor, ha ez megengedett.
Bizonyíték . Minden egyes lökések megengedettségét kifejezetten ellenőrzik. Az emelés megengedhetőségét garantálja, hogy a 2. lépésben az u csúcsot az 1. lemma túlcsordítja, valamint az is, hogy a 3. lemma által nem jön ki belőle megengedett él.
2. ingatlan . A függvény befejezése után az u csúcs nem túlcsordul.
Bizonyíték . A függvény csak az 1. lépésnél állhat meg. A leállítás csak akkor következik be, ha az u csúcs nem túlcsordul.
A prestream és a magasságok mellett a "raise to the elejéig" algoritmus tárolja az L csúcsok listáját és egy mutatót az egyik elemére (C++ kifejezéssel egy iterátor ) .
A digráf topológiai rendezése (V,E) néhány csúcsának listája, oly módon rendezve, hogy bármely él esetén u a v előtti listában szerepel.
1. lemma. A külső hurok minden iterációja után az L lista a megengedett élgráf (ATGGR) topológiai fajtája.
Bizonyíték. A külső hurok iterációinak számának indukciója.
Bázis. Inicializálás után a forrás magassága egyenlő V-vel, az összes többi csúcs 0. Ugyanakkor , mivel legalább 2 csúcs van - forrás és süllyesztő. Ezért bármely csúcspár esetében a második elfogadhatósági feltétel sérül, és egyáltalán nincsenek megengedhető élek. Ezért a csúcsok bármely listája TSGDR. Lépés. Nézzük a v.
2. lemma. A külső ciklus minden egyes iterációja után a beolvasott csúcs és a listában attól balra lévő összes csúcs nem kerül túlrepülésre.
Bizonyíték. A külső hurok iterációinak számának indukciója.
Bázis. Az első iteráció után a beolvasott csúcsot nem csordítja túl a térköz tulajdonság, és nincsenek csúcsok tőle balra.
Lépés. Nézzük a v. Őt magát nem árasztja el az elbocsátás tulajdonsága. Ha felemeljük, és ezért a lista elejére kerül, akkor balra nincsenek csúcsok, és a tétel bizonyítást nyer. Egyébként ennél az iterációnál csak push műveleteket hajtottak végre a v csúcsból azokhoz a csúcsokhoz, amelyekhez a megengedett élek v-ből vezetnek. Mivel a push művelet nem hoz létre új érvényes éleket, ezek az élek mindegyike érvényes volt az iteráció kezdete előtt. Ezért az előző lemma szerint az összes csúcs, amelyre a lökést végrehajtották, a listában a v jobb oldalán volt. Ezért a listában a v-től balra lévő csúcsok nem lehetnek túlcsordultak ennél az iterációnál. De az indukciós hipotézis szerint korábban sem voltak túlzsúfoltak. A tétel bizonyítást nyert.
3. lemma. Az algoritmus befejezése után egyetlen csúcs sem csordul túl.
Bizonyíték. Az algoritmus befejezéséhez meg kell nézni az L lista utolsó csúcsát. Az előző lemma szerint ezután az L lista egyik csúcsa sem csordult ki. De az L lista a forrás és a nyelő kivételével minden csúcsot tartalmaz, és a forrást és a nyelőt definíció szerint nem lehet túlcsordulni.
Ingatlan. A lift-to-front (PHA) algoritmus a preflow push (PFP) algoritmus egy speciális esete.
Bizonyíték. A magasságok és az előáramlás inicializálása az ALP-ben ugyanaz, mint az APS-ben. A magasság és az áramlás előtti változások az ALP-ben csak kisülés indításával fordulnak elő, amely viszont csak törvényes tolási és emelési műveleteket hajt végre. Végül, az APN végén nincs túlcsordulás, így a push vagy lift műveletek nem lehetségesek.
Becsüljük meg a különböző műveletek végrehajtásának számát és teljes futási idejét.
KisülésekMinden emelés nélküli kisütésnél egy pozíciót jobbra tol. Az L lista V-2 csúcsokat tartalmaz, ezért V-2-nél több kisütés egymás után emelés nélkül lehetetlen. Az emelkedések száma tehát a kisülések száma .
Maga a kisülési hívás és a kapcsolódó költségek (az iterátor előrelépése, visszahurkolása) állandó időt vesz igénybe. Ezért az összes ilyen művelet teljes ideje .
HegymászásTekintsünk egy tetszőleges u csúcsot. Legyen a mértéke. A teteje legfeljebb 2V-1-szer emelhető fel, és az egyes emelkedőkre fordított idő . Ezért az összes csúcs felemelésére fordított idő , vagy .
PushingA telítő lökések, amint azt korábban bebizonyítottuk, nem több, mint O(VE).
A nem telítő nyomás zsúfolttá teszi a tetejét, ami után a kisülés leáll. Ezért nincs több nem telítést okozó push, mint a kisütési hívás, azaz .
Egy nyomás futási ideje állandó. Ez azt jelenti, hogy a lökések teljes futási ideje .
Az iterátor eltolja az aktuálisatTekintsünk egy tetszőleges u csúcsot. Legyen a mértéke. Az áram[u] minden eltolódása a csúcs emelkedését okozza. Az összes emelés legfeljebb 2V-1. Ezért az iterátoreltolások száma minden csúcsra , vagy .
Az egyes műszakok ideje állandó.
Teljes időAz előző szakaszokat összegezve azt kapjuk, hogy az algoritmus futási ideje , vagy .