Folyam Algoritmusok

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 40

Folyam algoritmusok

Ismétlés

Múlt órán: Folyamok


Hálózat (D, s, t, g)
D = (V, E) irányított gráf
s forrás (csak kilépő élek), t nyelő (csak belépő élek)
g : E 7→ R+ ∪ {0, ∞} kapacítás függvény
.
folyam: f : E 7→ R+ ∪ {0}, hogy
∀e ∈ E élre 0 ≤ f (e) ≤ g(e) (megengedettség)
∀v ∈ V \ {s, t} esetén teljesül, hogy δf (v) = ρf (v)
(megmaradás törvénye).
Cél: s-ből t-be minél nagyobb folyam
Max folyam keresése - Ford-Fulkerson algoritmusok
1 Kiindulás f ≡ 0 folyamból
2 Ismételjük a következő lépéseket amíg lehet
1 Elkészítjük a Df segédgráfot a nem telített(előre) és a
pozitív (hátra) élekből
2 Keresünk utat s − t utat Df -ben
3 Ha létezik ilyen út, akkor az út mentén növeljük f -et.
3 Ha nincs st javító út Df -ben, akkor leáll az algoritmus, a
folyam maximális
FF futásideje nem korlátos
Edmonds-Karp: legrövidebb út mentén javít - polinomiális
futásidő
MFMC : max folyam = min vágás
Max folyam keresése - Ford-Fulkerson algoritmusok
1 Kiindulás f ≡ 0 folyamból
2 Ismételjük a következő lépéseket amíg lehet
1 Elkészítjük a Df segédgráfot a nem telített(előre) és a
pozitív (hátra) élekből
2 Keresünk utat s − t utat Df -ben
3 Ha létezik ilyen út, akkor az út mentén növeljük f -et.
3 Ha nincs st javító út Df -ben, akkor leáll az algoritmus, a
folyam maximális
FF futásideje nem korlátos
Edmonds-Karp: legrövidebb út mentén javít - polinomiális
futásidő
MFMC : max folyam = min vágás
Skálázási technika
1 g értékeit írjuk fel 2-es számrendszerben, tfh mindegyik
legfeljebb M jegyet használ. gi a kapacitás első i (bináris)
számjegye (pl g(e) = 13 = 11012 , i = 2 esetén gi (e) = 112 )
2 f ≡ 0-ból indulva megkeressük a g1 -re nézve max
folyamot.
3 TFH, gi -re már megtaláltuk a maximális folyamértéket, ez
fi .
4 2fi megengedett folyam gi+1 -re. 2fi -ből kiindulva
megkeressük a max folyamot gi+1 kapacitásra nézve
5 2fi max folyam 2gi -re nézve is. gi+1 legfeljebb 1-gyel tér el
2gi -től ⇒ a minimális vágás gi+1 -re nézve legfeljebb |E|-val
nagyobb, mint gi -re nézve ⇒ |E| lépés alatt megtaláljuk
fi+1 -et.
6 Összesen M |E| növelés szükséges, a teljes futásidő
M |E|2 .
Skálázási technika
1 g értékeit írjuk fel 2-es számrendszerben, tfh mindegyik
legfeljebb M jegyet használ. gi a kapacitás első i (bináris)
számjegye (pl g(e) = 13 = 11012 , i = 2 esetén gi (e) = 112 )
2 f ≡ 0-ból indulva megkeressük a g1 -re nézve max
folyamot.
3 TFH, gi -re már megtaláltuk a maximális folyamértéket, ez
fi .
4 2fi megengedett folyam gi+1 -re. 2fi -ből kiindulva
megkeressük a max folyamot gi+1 kapacitásra nézve
5 2fi max folyam 2gi -re nézve is. gi+1 legfeljebb 1-gyel tér el
2gi -től ⇒ a minimális vágás gi+1 -re nézve legfeljebb |E|-val
nagyobb, mint gi -re nézve ⇒ |E| lépés alatt megtaláljuk
fi+1 -et.
6 Összesen M |E| növelés szükséges, a teljes futásidő
M |E|2 .
Skálázási technika
1 g értékeit írjuk fel 2-es számrendszerben, tfh mindegyik
legfeljebb M jegyet használ. gi a kapacitás első i (bináris)
számjegye (pl g(e) = 13 = 11012 , i = 2 esetén gi (e) = 112 )
2 f ≡ 0-ból indulva megkeressük a g1 -re nézve max
folyamot.
3 TFH, gi -re már megtaláltuk a maximális folyamértéket, ez
fi .
4 2fi megengedett folyam gi+1 -re. 2fi -ből kiindulva
megkeressük a max folyamot gi+1 kapacitásra nézve
5 2fi max folyam 2gi -re nézve is. gi+1 legfeljebb 1-gyel tér el
2gi -től ⇒ a minimális vágás gi+1 -re nézve legfeljebb |E|-val
nagyobb, mint gi -re nézve ⇒ |E| lépés alatt megtaláljuk
fi+1 -et.
6 Összesen M |E| növelés szükséges, a teljes futásidő
M |E|2 .
Skálázási technika
1 g értékeit írjuk fel 2-es számrendszerben, tfh mindegyik
legfeljebb M jegyet használ. gi a kapacitás első i (bináris)
számjegye (pl g(e) = 13 = 11012 , i = 2 esetén gi (e) = 112 )
2 f ≡ 0-ból indulva megkeressük a g1 -re nézve max
folyamot.
3 TFH, gi -re már megtaláltuk a maximális folyamértéket, ez
fi .
4 2fi megengedett folyam gi+1 -re. 2fi -ből kiindulva
megkeressük a max folyamot gi+1 kapacitásra nézve
5 2fi max folyam 2gi -re nézve is. gi+1 legfeljebb 1-gyel tér el
2gi -től ⇒ a minimális vágás gi+1 -re nézve legfeljebb |E|-val
nagyobb, mint gi -re nézve ⇒ |E| lépés alatt megtaláljuk
fi+1 -et.
6 Összesen M |E| növelés szükséges, a teljes futásidő
M |E|2 .
Skálázási technika
1 g értékeit írjuk fel 2-es számrendszerben, tfh mindegyik
legfeljebb M jegyet használ. gi a kapacitás első i (bináris)
számjegye (pl g(e) = 13 = 11012 , i = 2 esetén gi (e) = 112 )
2 f ≡ 0-ból indulva megkeressük a g1 -re nézve max
folyamot.
3 TFH, gi -re már megtaláltuk a maximális folyamértéket, ez
fi .
4 2fi megengedett folyam gi+1 -re. 2fi -ből kiindulva
megkeressük a max folyamot gi+1 kapacitásra nézve
5 2fi max folyam 2gi -re nézve is. gi+1 legfeljebb 1-gyel tér el
2gi -től ⇒ a minimális vágás gi+1 -re nézve legfeljebb |E|-val
nagyobb, mint gi -re nézve ⇒ |E| lépés alatt megtaláljuk
fi+1 -et.
6 Összesen M |E| növelés szükséges, a teljes futásidő
M |E|2 .
Skálázási technika
1 g értékeit írjuk fel 2-es számrendszerben, tfh mindegyik
legfeljebb M jegyet használ. gi a kapacitás első i (bináris)
számjegye (pl g(e) = 13 = 11012 , i = 2 esetén gi (e) = 112 )
2 f ≡ 0-ból indulva megkeressük a g1 -re nézve max
folyamot.
3 TFH, gi -re már megtaláltuk a maximális folyamértéket, ez
fi .
4 2fi megengedett folyam gi+1 -re. 2fi -ből kiindulva
megkeressük a max folyamot gi+1 kapacitásra nézve
5 2fi max folyam 2gi -re nézve is. gi+1 legfeljebb 1-gyel tér el
2gi -től ⇒ a minimális vágás gi+1 -re nézve legfeljebb |E|-val
nagyobb, mint gi -re nézve ⇒ |E| lépés alatt megtaláljuk
fi+1 -et.
6 Összesen M |E| növelés szükséges, a teljes futásidő
M |E|2 .
Futtassuk le a következő gráfra a skálázási technika
algoritmusát:

4 1 100 001
2 010
2 3 010 011
3 011
2 3 010 011

0/1 0/0 0/2 0/0


0/0 0/1
0/0 0/0 0/1 0/1
0/0 0/1
0/0 0/0 0/1 0/1
Futtassuk le a következő gráfra a skálázási technika
algoritmusát:

4 1 100 001
2 010
2 3 010 011
3 011
2 3 010 011

0/1 0/0 0/2 0/0


0/0 0/1
0/0 0/0 0/1 0/1
0/0 0/1
0/0 0/0 0/1 0/1
Futtassuk le a következő gráfra a skálázási technika
algoritmusát:

4 1 100 001
2 010
2 3 010 011
3 011
2 3 010 011

0/1 0/0 0/2 0/0


0/0 0/1
0/0 0/0 0/1 0/1
0/0 0/1
0/0 0/0 0/1 0/1
Futtassuk le a következő gráfra a skálázási technika
algoritmusát:

4 1 100 001
2 010
2 3 010 011
3 011
2 3 010 011

0/1 0/0 0/2 0/0


0/0 0/1
0/0 0/0 0/1 0/1
0/0 0/1
0/0 0/0 0/1 0/1
1/2 0/0 2/4 0/1
1/1 2/2
1/1 1/1 2/2 2/3
1/1 2/3
0/1 1/1 0/2 2/3

2/4 0/1 3/4 1/1


2/2 2/2
2/2 2/3 2/2 2/3
2/3 2/3
0/2 2/3 1/2 3/3
1/2 0/0 2/4 0/1
1/1 2/2
1/1 1/1 2/2 2/3
1/1 2/3
0/1 1/1 0/2 2/3

2/4 0/1 3/4 1/1


2/2 2/2
2/2 2/3 2/2 2/3
2/3 2/3
0/2 2/3 1/2 3/3
1/2 0/0 2/4 0/1
1/1 2/2
1/1 1/1 2/2 2/3
1/1 2/3
0/1 1/1 0/2 2/3

2/4 0/1 3/4 1/1


2/2 2/2
2/2 2/3 2/2 2/3
2/3 2/3
0/2 2/3 1/2 3/3
1/2 0/0 2/4 0/1
1/1 2/2
1/1 1/1 2/2 2/3
1/1 2/3
0/1 1/1 0/2 2/3

2/4 0/1 3/4 1/1


2/2 2/2
2/2 2/3 2/2 2/3
2/3 2/3
0/2 2/3 1/2 3/3
Dinic-algoritmus

Egyszerre több út mentán, azaz folyam mentén javít


Elkészítjük a szintezett maradékhálózatot:
f folyamra elkészítjük a Hf = (Df , s, t, gf )
maradék-(reziduális)hálózatot. Df az F.F. algoritmus során
megkonstruált digráf, és gf (e) értéke g(e) − f (e) ha e előre
él, és f (e) ha e hátra él.
s-ből indulva BFS-sel beszintezzük.
Töröljük a nem szomszédos szintek közötti éleket, és az
s-től t-nél messzebb lévő csúcsokat
Blokkoló folyam: Olyan f 0 folyam Hf -ben, hogy az f 0 által
telített éleket törölve nem marad út s-ből t-be.
Keressünk Hf -ben blokkolófolyamot, és a mentén javítjuk f -et.
Tétel
Ha a hálózatban az aktuális f folyamra nézve a legrövidebb
javító út k hosszú, és f -et javítjuk a szintezett maradékhálózat
egy f 0 blokkoló folyamával, akkor a javított folyamra nézve a
legrövidebb javító út már legalább k + 1 hosszú lesz.

Nem bizonyítjuk
Tétel
Egy szintezett maradékhálózatban egy blokkoló folyamot
megkereshetünk O(|V ||E|) lépésben. A Dinic algoritmus
futásideje O(|V |2 |E|).
Bizonyítás: A mélységi keresés egy módosított változatát
használjuk Hf -ben:
Mélységi kereséssel elindulunk s-ből t-be.
Ha egy v 6= t csúcsból már nem tudunk továbbmenni, v-t
töröljük, és visszalépünk az előző csúcsba
Ha találunk egy P s − t utat, a P mentén növeljük f 0 -t és
csökkentjük gf -et a minimális P -beli kapacitással.
Egyik él kapacitása 0-ra csökken. Legyen uv az s-től
legtávolabbi ilyen él.
Töröljük uv-t és visszalépünk egészen u-ig. Folytatjuk a
mélységi bejárást.
A keresés során minden élen max kétszer haladunk keresztül
(a javítást nem számolva), mert egy sima DFS szerint járjuk be
az éleket. Amikor javítunk, egy élet törlünk, tehát maximum
O(|E|) javítás lehetséges. Egy javításhoz O(|V |) lépés
szükséges.
Előfolyam

D = (V, E) digráf, f → R+ függvényt előfolyamnak


nevezünk, ha az s pont kivételével minden v csúcsra
γf (v) ≥ 0, ahol γf (v) = ρf (v) − δf (v) (tehát minden
csúcsba legalább, annyi bemegy, mint ami kijön).
Egy t-től különböző v csúcsot aktívnak mondunk, ha
γf (v) > 0, míg ha γf (v) = 0, akkor passzívnak.
Az f előfolyam akkor folyam, ha minden V − {s, t} passzív.
Egy e él csökkenthető (pozitív), ha f (e) > 0 és növelhető
(telítetlen), ha g(e) − f (e) > 0.
h : V → N szintfüggvény. A csúcsok időnként magasabb
szintre lépnek (lejjebb soha).
Végig h(t) = 0 és h(s) = n (n a csúcsok száma). n + 1
szint, n csúcs⇒ ∃ üres szint.
uv felmenő (lemenő), ha h(v) > h(u) (h(u) > h(v)).
Az algoritmus bármely közbenső állapotában adott egy f
előfolyam és h szintfüggvény, melyekre teljesülnek az
illeszkedési feltételek, azaz:
1 f (uv) > 0 esetén h(v) ≤ h(u) + 1 azaz csökkenthető él
legfeljebb egy szintet lép fel.
2 f (uv) < g(uv) esetén h(v) ≥ h(u) − 1 azaz növelhető él
legfeljebb egy szintet lép le.
Feszes él:
uv felmenő csökkenthető és h(v) = h(u) + 1
uv lemenő növelhető és h(v) = h(u) − 1.
Lemma
Ha az f előfolyam kielégíti az illeszkedési feltételeket, úgy
létezik olyan 0 < i < n index, amelyekre a {v : h(v) = i} szint
üres. Az S = {v : h(v) > i} halmazba nem lép be csökkenthető
él és S-ből nem lép ki növelhető él.

Az illeszkedési feltételek miatt S-ből csak telített élek léphet ki,


és csak 0 él léphet be. Ha f folyam, akkor maximális, S, V − S
pedig egy minimális vágás.
Lemma
Tetszőleges v 6= t aktív pont szintje legfeljebb 2n − 2.
Algoritmus:
0 Kezdetben h(s) = n, h(v) = 0 ∀v ∈ V − s. f (e) = g(e) ha e
s-ből lép ki, és f (e) = 0 egyébként.
1 Ha létezik aktív csúcs, válasszuk ki a maximális szintűt,
jelölje ezt z.
2 Ha nem létezik sem z-be felmenő csökkenthető, sem z-ből
lemenő növelhető él (feszes él), akkor z szintjét 1-gyel
növeljük.
3 Ha létezik z-be belépő e = uz feszes él (felmenő,
csökkenthető), csökkentsük f (e)-t a min{f (e), γf (z)}
értékkel.
Ha létezik z-ből kilépő e = zu feszes él (lemenő, növelhető),
növeljük f (e)-t a min{g(e) − f (e), γf (z)} értékkel.
Előfolyam módosítás kiegyenlítő, ha a minimum, a γf (v)-n
vétetik fel, azaz v csúcs passzívvá válik
Ha a módosítás az e = uv élen nem kiegyenlítő, akkor e
megszűnik feszes lenni
Max szint 2n ⇒ egy élen legfeljebb 2n nem kiegyenlítő
módosítás történhet ⇒ a nem kiegyenlítő módosítások
száma legfeljebb 2nm.
Egy fázis (két egymást követő szint emelés közötti idő)
során legfeljebb n kiegyenlítő módosítás lehet.
A fázisok száma legfeljebb 2n2 ⇒ kiegyenlítő módosítások
teljes száma legfeljebb 2n3 .
u

4 1
2
v
s 2 3 t
3
2 3
w
Az algoritmus futása a példa gráfon:
5 5
4 4
3 3
422 422
2 2
1 1
0 s u v w 0 s u v w
t t
u

4 1
2
v
s 2 3 t
3
2 3
w
Az algoritmus futása a példa gráfon:
5 5
4 4
3 3
422 422
2 2
1 1
0 s u v w 0 s u v w
t t
5 5
4 4
3 3
422 422
2 2
1 1
2 2 1
0 s u v w 0 s u v w
t t
6 6
4 3
5 5
4 4
3 2 1 3 2 1
22 22
2 2
1 1
0 s u v w 0 s u v w
t t
5 5
4 4
3 3
422 422
2 2
1 1
2 2 1
0 s u v w 0 s u v w
t t
6 6
4 3
5 5
4 4
3 2 1 3 2 1
22 22
2 2
1 1
0 s u v w 0 s u v w
t t
5 5
4 4
3 3
422 422
2 2
1 1
2 2 1
0 s u v w 0 s u v w
t t
6 6
4 3
5 5
4 4
3 2 1 3 2 1
22 22
2 2
1 1
0 s u v w 0 s u v w
t t
5 5
4 4
3 3
422 422
2 2
1 1
2 2 1
0 s u v w 0 s u v w
t t
6 6
4 3
5 5
4 4
3 2 1 3 2 1
22 22
2 2
1 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 1 3 1
22 22
2 2
1 1
3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 1
2 2
2 2
1 1 3
31 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 1 3 1
22 22
2 2
1 1
3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 1
2 2
2 2
1 1 3
31 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 1 3 1
22 22
2 2
1 1
3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 1
2 2
2 2
1 1 3
31 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 1 3 1
22 22
2 2
1 1
3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 1
2 2
2 2
1 1 3
31 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 2 1
2
2 2
3
1 3 1 3
13 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 2 1 3 2 2 1
2 2
1 1
1 3 1 3
1 3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 2 1
2
2 2
3
1 3 1 3
13 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 2 1 3 2 2 1
2 2
1 1
1 3 1 3
1 3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 2 1
2
2 2
3
1 3 1 3
13 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 2 1 3 2 2 1
2 2
1 1
1 3 1 3
1 3
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 1 3 2 2 1
2
2 2
3
1 3 1 3
13 1
0 s u v w 0 s u v w
t t
6 6
3 3
5 5
4 4
2 2
3 2 2 1 3 2 2 1
2 2
1 1
1 3 1 3
1 3
0 s u v w 0 s u v w
t t

You might also like