Bölüm 4.4: Ağ Akışı
Çoktan Seçmeli · Akış Ağları
Soru 1: Akış Korunumu
Ara düğüm v'ye giren ve çıkan kenarlar akış/kapasite biçiminde etiketlidir. Akışın geçerli olması için v → w kenarındaki f kaç olmalıdır?
B: Korunum: giren = 3 + 5 = 8, çıkan = 2 + f → f = 6 ≤ 7 olduğundan kapasite kısıtı da sağlanır. C girişlerin toplamını yazar; A kenarı doymuş sanır. Kaynak ve hedef dışındaki her düğümde giren akış çıkana eşittir.
Çıktı Sorusu · Akış Ağları
Soru 2: Akışın Değeri
Etiketler akış/kapasitedir; b → s kenarı kaynağa geri döner. (a) Akış geçerli mi (kapasite ve korunum)? (b) |f| kaçtır? (c) Hangi kenarlar doymuştur?
Cevabı göster
(a) Kapasite: her f ≤ c. Korunum: a'ya giren 4, çıkan 2 + 2 = 4 ✓; b'ye giren 3 + 2 = 5, çıkan 1 + 4 = 5 ✓. Geçerli.
(b) |f| = s'ten çıkan − s'ye giren = (4 + 3) − 1 = 6; t'ye giren 2 + 4 = 6 ile aynıdır. Yalnızca çıkanları toplamak (7) yanlıştır.
(c) s → b (3/3) ve b → t (4/4) doymuştur; üzerlerinden daha fazla akış gönderilemez.
Çoktan Seçmeli · Artık Ağ
Soru 3: Artık Kapasite
Kapasitesi 7 olan u → v kenarında şu an 3 birim akış var (ters yönde kenar yok). Artık ağda bu kenardan doğan kenarlar ve kapasiteleri nedir?
A: İleri kenar c − f = 7 − 3 = 4 kalan kapasite; ters kenar c_f(v, u) = f = 3, gönderilmiş akışın geri alınabilecek kısmıdır. C ters kenarı unutur; ters kenarlar olmadan algoritma ilk yanlış seçimini düzeltemez. D ikisini karıştırır.
Çıktı Sorusu · Artık Ağ
Soru 4: Artık Ağı Kurmak
Akış ağı akış/kapasite biçiminde verilmiştir. (a) |f| kaçtır? (b) Artık ağı çizin. (c) Artık ağda s'ten t'ye artış yolu var mı?
Cevabı göster
(a) |f| = s'ten çıkan = 3 + 2 = 5 (t'ye giren 2 + 3 = 5).
(b) İleri kenarlar c − f (s → a 1, s → b 3, a → b 1, b → t 3), ters kenarlar (kesikli) f. a → t doymuştur: yalnızca ters kenarı (t → a, 2) kalır.
(c) Evet: s → b → t, darboğaz min(3, 3) = 3. Akış 8 olur; kaynaktan çıkan kapasite 4 + 5 = 9, hedefe giren 2 + 6 = 8 olduğundan 8 maksimumdur.
Çoktan Seçmeli · Kesimler
Soru 5: Kesim Kapasitesi
Yeşil düğümler S = {s, 2}, mavi düğümler T = {1, 3, 4, t} tarafıdır. (S, T) kesiminin kapasitesi kaçtır?
A: Yalnızca S'den T'ye giden kenarlar sayılır: s → 1 (8) + 2 → 4 (10) = 18. 1 → 2 (3) T'den S'ye gider ve kapasiteye eklenmez; eklenirse B (21) çıkar. Her akış için |f| ≤ c(S, T) olduğundan bu ağda maksimum akış 18'i aşamaz.
Çıktı Sorusu · Kesimler
Soru 6: Tüm Kesimler
Kenar etiketleri kapasitedir. Tüm s–t kesimlerini ve kapasitelerini yazın. Minimum kesim hangisidir, maksimum akış kaçtır?
Cevabı göster
| S tarafı | S → T kenarları | c(S, T) |
|---|---|---|
| {s} | s→a 5, s→b 4 | 9 |
| {s, a} | s→b 4, a→b 2, a→t 3 | 9 |
| {s, b} | s→a 5, b→t 6 | 11 |
| {s, a, b} | a→t 3, b→t 6 | 9 |
Üç kesim de 9 ile minimumdur (minimum kesim tek olmayabilir). Maksimum akış minimum kesim teoremine göre 9: örneğin s → a → t 3, s → a → b → t 2, s → b → t 4.
Adım Adım Çalıştırma · Ford-Fulkerson
Soru 7: Ford-Fulkerson (DFS) İzleme
dfs artık kapasitesi pozitif ilk komşuya iniyor. Hangi artış yolları bulunur, maksimum akış kaçtır?
Kapasiteler kenarlarda; başta tüm akışlar 0, artık ağ = özgün ağ. Komşular artan indis sırasıyla denenir (s = 0, t = 5).
Yol s → 1 → 2 → 4 → 3 → t, darboğaz min(8, 3, 10, 7, 9) = 3. |f| = 3.
Yol s → 1 → 3 → 4 → t, darboğaz min(5, 5, 3, 8) = 3. 3 → 4 kenarı ters kenardır: 4 → 3 akışı 3 azalır (iptal). |f| = 6.
Yol s → 1 → 3 → t, darboğaz min(2, 2, 6) = 2. |f| = 8.
Yol s → 2 → 1 → 4 → 3 → t, darboğaz min(12, 3, 6, 7, 4) = 3. 2 → 1 kenarı ters kenardır: 1 → 2 akışı 3 azalır (iptal). |f| = 11.
Yol s → 2 → 4 → 3 → t, darboğaz min(9, 7, 4, 1) = 1. |f| = 12.
Yol s → 2 → 4 → t, darboğaz min(8, 6, 5) = 5. |f| = 17.
DFS t'ye ulaşamaz: 3 → t ve 4 → t doymuştur. return 17; DFS'li Ford-Fulkerson 6 artış yolu kullandı.
int fordFulkerson(int s, int t) { int maksAkis = 0; int[] ata = new int[V]; while (dfs(s, t, new boolean[V], ata)) { int akis = Integer.MAX_VALUE; for (int v = t; v != s; v = ata[v]) akis = Math.min(akis, artik[ata[v]][v]); for (int v = t; v != s; v = ata[v]) { artik[ata[v]][v] -= akis; // ileri artik[v][ata[v]] += akis; // ters } maksAkis += akis; } return maksAkis; }
Çoktan Seçmeli · Ford-Fulkerson
Soru 8: Kötü Yol Seçimi
s → a, s → b, a → t, b → t kenarlarının kapasitesi 10⁶, ortadaki a → b kenarının kapasitesi 1'dir. Her seferinde ortadaki kenarı (ya da tersini) kullanan DFS'li Ford-Fulkerson kaç artış yapar? Edmonds-Karp kaç?
D: Maksimum akış 2 · 10⁶'dır ve ortadan geçen her yol (s → a → b → t ya da s → b → a → t) yalnızca 1 birim ekler: 2 · 10⁶ artış. Edmonds-Karp en kısa (2 kenarlı) yolları seçer: s → a → t ve s → b → t, 2 artış. Süre O(E · |f*|) sayının büyüklüğüne bağlıdır; polinom değildir.
Çıktı Sorusu · Ford-Fulkerson
Soru 9: Ters Kenarlar Olmadan
Tüm kapasiteler 1'dir. İlk artış yolu olarak s → a → b → t seçiliyor. (a) Yalnızca ileri kenarlarla (ters kenar yok) aramaya devam edilirse toplam akış kaç olur? (b) Ters kenarlı artık ağda ne olur?
Cevabı göster
(a) s → a, a → b, b → t doyar. Kalan ileri kenarlar s → b ve a → t'dir; s'ten b'ye gidilir ama b'nin çıkışı doludur. Takılır: akış 1.
(b) Artık ağda b → a ters kenarı (1) vardır: s → b → a → t artış yolu bulunur, a → b'deki akış iptal edilir. Sonuç: s → a → t ve s → b → t, akış 2 = min kesim ({s}: 1 + 1).
Ters kenar "geriye akış göndermek" değil, daha önce gönderilmiş akışı geri almaktır; ilk yanlış seçimi düzeltir.
Adım Adım Çalıştırma · Edmonds-Karp
Soru 10: Edmonds-Karp İzleme
edmondsKarp(0, 5) bu ağda hangi artış yollarını bulur? Kaç artış gerekir?
Kapasiteler kenarlarda; başta tüm akışlar 0, artık ağ = özgün ağ. Komşular artan indis sırasıyla denenir (s = 0, t = 5).
BFS en az kenarlı yolu buldu: s → 1 → 3 → t (3 kenar). Darboğaz min(8, 5, 9) = 5.
|f| = 5.
BFS en az kenarlı yolu buldu: s → 1 → 4 → t (3 kenar). Darboğaz min(3, 6, 8) = 3.
|f| = 8.
BFS en az kenarlı yolu buldu: s → 2 → 4 → t (3 kenar). Darboğaz min(12, 10, 5) = 5.
|f| = 13.
BFS en az kenarlı yolu buldu: s → 2 → 4 → 3 → t (4 kenar). Darboğaz min(7, 5, 7, 4) = 4.
|f| = 17.
BFS t'ye ulaşamaz; s'ten ulaşılabilenler (sarı) {s, 1, 2, 3, 4}. Kesim kapasitesi 3 → t 9 + 4 → t 8 = 17 = |f*|. return 17; 4 artış (DFS'li sürüm 6 yaptı).
int edmondsKarp(int s, int t) { int maksAkis = 0; int[] ata = new int[V]; while (bfs(s, t, ata)) { int akis = Integer.MAX_VALUE; for (int v = t; v != s; v = ata[v]) akis = Math.min(akis, artik[ata[v]][v]); for (int v = t; v != s; v = ata[v]) { int u = ata[v]; artik[u][v] -= akis; // ileri artik[v][u] += akis; // ters } maksAkis += akis; } return maksAkis; }
Çıktı Sorusu · Edmonds-Karp
Soru 11: Hangi Kenar Darboğaz?
Şekildeki ağda maksimum akış 17'dir. Hangi kenarın kapasitesi 1 artırılırsa maksimum akış 18 olur? s → 1'in kapasitesini artırmak neden işe yaramaz?
Cevabı göster
Son artık ağda s'ten ulaşılan küme S = {s, 1, 2, 3, 4}; tek minimum kesim bu kümeden çıkan 3 → t (9) ve 4 → t (8) kenarlarıdır (17). Bu ikisinden birinin kapasitesi artınca akış 18 olur.
Diğer kenarların hiçbiri minimum kesimde değildir; örneğin s → 1 artırılsa da akış 17 kalır: darboğaz hedef tarafındadır. Sonraki en küçük kesim ({s, 2}: 18) olduğu için bir artış en fazla 1 kazandırır.
Çoktan Seçmeli · Edmonds-Karp
Soru 12: Edmonds-Karp Sınırı
Edmonds-Karp'ın O(V · E²) sınırının gerekçesi hangisidir?
D: Bir kenarın yeniden kritik (doymuş) olabilmesi için uzaklığının en az 2 artması gerekir; uzaklık ≤ V olduğundan her kenar O(V) kez kritik olur → O(V · E) artış × O(E) BFS. A, Ford-Fulkerson'ın akış değerine bağlı sınırıdır; C, Dinic'in gerekçesidir.
Adım Adım Çalıştırma · Dinic
Soru 13: Dinic İzleme
Dinic bu ağda kaç faz yapar? Her fazda düzeyler ve engelleyici akışın yolları nelerdir?
Başlangıçta tüm akışlar 0. Her fazda önce BFS ile düzeyler (sv) hesaplanır, sonra düzey çizgesinde engelleyici akış bulunur.
Faz 1 BFS: düzeyler s=0, 1=1, 2=1, 3=2, 4=2, t=3. Soluk kenarlar düzey atlamaz ya da doymuştur, kullanılmaz; s–t uzaklığı 3.
dfs yolu s → 1 → 3 → t, d = 5 → maksAkis = 5.
dfs yolu s → 1 → 4 → t, d = 3 → maksAkis = 8.
dfs yolu s → 2 → 4 → t, d = 5 → maksAkis = 13.
Faz 2 BFS: düzeyler s=0, 1=3, 2=1, 3=3, 4=2, t=4. Soluk kenarlar düzey atlamaz ya da doymuştur, kullanılmaz; s–t uzaklığı 4.
dfs yolu s → 2 → 4 → 3 → t, d = 4 → maksAkis = 17.
Faz 3 BFS: yalnızca {s, 1, 2, 3, 4} ulaşılabilir, t'nin düzeyi yok → döngü biter. return 17; 2 faz, 3 BFS yetti.
int dinic(int s, int t) { int maksAkis = 0; while (bfsSeviye(s, t)) { // düzeyler int[] basla = new int[V]; // kaldığı yer int d; while ((d = dfs(s, t, SONSUZ, basla)) > 0) maksAkis += d; // engelleyici akış } return maksAkis; }
Çoktan Seçmeli · Dinic
Soru 14: Dinic'in Faz Sayısı
Dinic algoritması için aşağıdakilerden hangisi doğrudur?
B: Engelleyici akış o uzunluktaki tüm en kısa yolları doyurur; sonraki BFS'te t daha uzaktadır. Faz başına O(V · E) (kaldığı yer dizisiyle) × O(V) faz = O(V² · E). A Edmonds-Karp'ı tarif eder; C yanlıştır: her fazın başında düzeyler yeniden hesaplanır.
Adım Adım Çalıştırma · İtme–Yeniden Etiketleme
Soru 15: İtme–Yeniden Etiketleme İzleme
aktifDugum() en küçük indisli aktif düğümü, kalan(u, v) c − f değerini döndürüyor; doldur kaynak kenarını doldurur. Hangi itme ve etiketleme işlemleri yapılır, maksimum akış kaçtır?
Ağ (akış/kapasite), |V| = 4. Düğüm yanında yükseklik h ve aşırı akış e.
h(s) = |V| = 4; s'ten çıkan kenarlar doldurulur: e(a) = 3, e(b) = 2. Ön akış korunumu bozar (aktif düğümler sarı).
a aktif ama hiçbir artık komşusu bir alçakta değil → etiketle: h(a) = 1 + min(h(s)=4, h(b)=0, h(t)=0) = 1.
a aktif; h(a) = 1 = h(b) + 1 ve artık kapasite var → itme δ = 1.
a aktif; h(a) = 1 = h(t) + 1 ve artık kapasite var → itme δ = 2.
b aktif ama hiçbir artık komşusu bir alçakta değil → etiketle: h(b) = 1 + min(h(s)=4, h(a)=1, h(t)=0) = 1.
b aktif; h(b) = 1 = h(t) + 1 ve artık kapasite var → itme δ = 3.
Aktif düğüm kalmadı: ön akış gerçek bir akıştır. Maksimum akış = e(t) = 5 (kaynaktan çıkan 3 + 2).
void pushRelabel(int s, int t) { h[s] = V; for (int v = 0; v < V; v++) // ön akış if (c[s][v] > 0) doldur(s, v); int u; while ((u = aktifDugum()) != -1) { // s, t hariç boolean itildi = false; for (int v = 0; v < V && !itildi; v++) if (kalan(u, v) > 0 && h[u] == h[v] + 1) { int d = Math.min(e[u], kalan(u, v)); f[u][v] += d; f[v][u] -= d; e[u] -= d; e[v] += d; itildi = true; } if (!itildi) // etiketle h[u] = 1 + minKomsuYukseklik(u); } }
Çoktan Seçmeli · İtme–Yeniden Etiketleme
Soru 16: Yeniden Etiketleme
Aktif u düğümünün artık ağdaki komşuları x (h = 3), y (h = 5) ve s (h = 6)'dır; u'nun yüksekliği 3'tür. Ne yapılır?
C: İtme için h(u) = h(v) + 1 gerekir; h(u) = 3 iken hiçbir komşu 2 yüksekliğinde değildir, itme yapılamaz. Yeniden etiketleme h(u) = 1 + min(3, 5, 6) = 4 yapar ve x'e itme mümkün olur. A eşit yükseklikte itmeye çalışır.
Klasik Soru · Uygulamalar
Soru 17: İki Parçalı Eşleştirme
Üç çalışan (a₁, a₂, a₃) ve üç iş (b₁, b₂, b₃) var: a₁ b₁ ve b₂'yi, a₂ yalnızca b₁'i, a₃ yalnızca b₁'i yapabiliyor. Her çalışan en çok bir iş, her iş en çok bir çalışan alıyor. Problemi akış ağı olarak kurun; en büyük eşleştirme kaçtır?
Cevabı göster
S → aᵢ, aᵢ → bⱼ (yapabiliyorsa) ve bⱼ → T kenarlarının hepsine kapasite 1 verilir. Tam sayılılık özelliği sayesinde maksimum akış 0/1 değerli bir akıştır; akış taşıyan aᵢ → bⱼ kenarları eşleştirmeyi verir.
Maksimum akış = en büyük eşleştirme = 2: örneğin a₁–b₂, a₂–b₁. a₂ ve a₃ yalnızca b₁'e bağlı olduğundan ikisi birden eşleşemez.
Kontrol: kaynak tarafı {S, a₂, a₃, b₁} olan kesim S → a₁ (1) + b₁ → T (1) = 2 kapasiteli bir minimum kesimdir. b₃'e hiç kimse bağlı değildir.
Çoktan Seçmeli · Uygulamalar
Soru 18: Algoritmaların Ortak Sonucu
Aynı ağa Ford-Fulkerson, Edmonds-Karp, Dinic ve itme–yeniden etiketleme uygulanıyor. Hangisi yanlıştır?
C yanlıştır: itme–yeniden etiketleme artış yolu hiç aramaz, yerel itme ve etiketleme yapar; Ford-Fulkerson ile Edmonds-Karp de farklı yollar bulur (izleme örneğinde 6 ve 4 yol). Değer |f*| hepsinde aynıdır ve minimum kesime eşittir; dağılım farklı olabilir.