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.
Çoktan Seçmeli · Akış Ağları
Soru 2: Birden Çok Kaynak
Bir ağda üç fabrika (s₁, s₂, s₃) ve iki depo (t₁, t₂) var. Tek kaynaklı, tek hedefli maksimum akış algoritması nasıl kullanılır?
C: Süper kaynak ve süper hedef, problemi tek kaynak–tek hedefe dönüştürür; ∞ kapasite yeni bir darboğaz eklemez. A yanlıştır: çiftler aynı kenarları paylaştığı için ayrı akışlar toplanınca kapasiteler aşılabilir.
Çıktı Sorusu · Akış Ağları
Soru 3: 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 4: 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 5: 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 · Artık Ağ
Soru 6: Darboğaz
S → A → B → T yolundaki kenarlar akış/kapasite biçiminde verilmiştir. Bu yol artış yolu olarak kullanılırsa en fazla kaç birim akış eklenebilir?
D: Darboğaz artık kapasitelerin minimumudur: 5 − 2 = 3, 4 − 0 = 4, 6 − 3 = 3 → 3. A, kapasitelerin minimumunu alır (sık yapılan hata). Akış eklenince S → A ve B → T doyar.
Çoktan Seçmeli · Kesimler
Soru 7: 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 8: 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.
Çoktan Seçmeli · Kesimler
Soru 9: Maksimum Akış Minimum Kesim
Bir f akışı için aşağıdakilerden hangisi "f maksimumdur" ifadesine denk değildir?
C: Kaynak kenarlarının doyması yeterli koşul olabilir ama gerekli değildir: darboğaz kaynaktan uzakta olabilir (ör. Tüm Kesimler sorusunda s → a doymadan akış 9'dur). A, B ve D maksimum akış minimum kesim teoreminin denk ifadeleridir. Min kesim, son artık ağda s'ten ulaşılan düğümler S alınarak bulunur.
Adım Adım Çalıştırma · Ford-Fulkerson
Soru 10: 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 11: DFS mi, BFS mi?
Artış yolu bulmak için Ford-Fulkerson'ın DFS, Edmonds-Karp'ın BFS kullanması nasıl bir sonuç doğurur?
B: Sınır |f*|'den bağımsızdır. Edmonds-Karp'ta s'ten uzaklıklar hiç azalmaz ve her kenar en çok ~V/2 kez kritik olur: O(V · E) artış, toplam O(V · E²). DFS'li sürüm kötü seçimlerle |f*| kadar artış yapabilir: O(E · |f*|). Bulunan maksimum akış değeri aynıdır (A yanlış); BFS de ters kenarları kullanır (D yanlış). İzleme örneğinde DFS 6, BFS 4 artış yaptı.
Çoktan Seçmeli · Ford-Fulkerson
Soru 12: 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 13: 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 14: Artış Yolu İçin BFS
İzleme ağında ilk bfs(0, 5, ata) çağrısı ebeveyn dizisini nasıl doldurur? Hangi artış yolu bulunur?
Edmonds-Karp'ın ilk BFS'i, artık ağ = kapasiteler. s kuyruğa kondu ve işaretlendi.
s çıkarıldı. Artık kapasitesi pozitif, ziyaret edilmemiş komşular 1, 2 kuyruğa eklendi (ebeveyn = s).
1 çıkarıldı. Artık kapasitesi pozitif, ziyaret edilmemiş komşular 3, 4 kuyruğa eklendi (ebeveyn = 1).
2 çıkarıldı. Yeni komşu yok.
3 çıkarıldı. Artık kapasitesi pozitif, ziyaret edilmemiş komşular t kuyruğa eklendi (ebeveyn = 3).
4 çıkarıldı. Yeni komşu yok.
t çıkarıldı. Yeni komşu yok.
ziyaret[t] = true → true döner. Ebeveynlerle t'den geriye: yol s → 1 → 3 → t (3 kenar, en az kenarlı).
boolean bfs(int kaynak, int hedef, int[] ata) { boolean[] ziyaret = new boolean[V]; Queue<Integer> kuyruk = new LinkedList<>(); kuyruk.add(kaynak); ziyaret[kaynak] = true; ata[kaynak] = -1; while (!kuyruk.isEmpty()) { int u = kuyruk.poll(); for (int v = 0; v < V; v++) if (!ziyaret[v] && artik[u][v] > 0) { kuyruk.add(v); ata[v] = u; ziyaret[v] = true; } } return ziyaret[hedef]; }
Adım Adım Çalıştırma · Edmonds-Karp
Soru 15: Edmonds-Karp İzleme
Aynı ağda edmondsKarp(0, 5) 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 16: Hangi Kenar Darboğaz?
İzleme ağında 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 17: 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.
Çıktı Sorusu · Edmonds-Karp
Soru 18: Artış Yolları ve Minimum Kesim
A'dan G'ye maksimum akışı Edmonds-Karp ile bulun (BFS komşuları alfabetik dener). Her artış yolunu ve gönderilen akışı yazın. Bir minimum kesim nedir?
Cevabı göster
- A → C → E → G: 3
- A → B → D → E → G: 2
- A → B → D → F → G: 2
Maksimum akış 7 (A'dan çıkan kapasite 4 + 3 = 7 de bir üst sınırdır).
Son artık ağda A'dan ulaşılabilenler: {A}. Bu kümeden çıkan kenarlar A → B 4 + A → C 3 → 7 = |f*|.
DFS'li Ford-Fulkerson başka yollar bulabilir (ör. A → B → D → E → G (2); A → B → D → F → G (2); A → C → E → D → F → G (1); A → C → E → G (2)) ama değer yine 7 olur.
Adım Adım Çalıştırma · Dinic
Soru 19: Dinic İzleme
Aynı ağda Dinic kaç faz yapar? Her fazda seviyeler ve engelleyici akışın yolları nelerdir?
Aynı ağ; tüm akışlar 0. Her faz: BFS ile seviye (sv) hesapla, sonra seviye çizgesinde engelleyici akış bul.
Faz 1 BFS: seviyeler s=0, 1=1, 2=1, 3=2, 4=2, t=3. Soluk kenarlar seviye 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: seviyeler s=0, 1=3, 2=1, 3=3, 4=2, t=4. Soluk kenarlar seviye 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 seviyesi yok → döngü biter. return 17; 2 faz, 3 BFS yetti.
int dinic(int s, int t) { int maksAkis = 0; while (bfsSeviye(s, t)) { // seviyeler 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 20: Seviye Çizgesi
İzleme ağında Dinic'in ilk BFS'i seviyeleri s = 0; 1, 2 = 1; 3, 4 = 2; t = 3 olarak buluyor. Hangi kenar seviye çizgesinde yer almaz?
B: Seviye çizgesinde yalnızca seviye(v) = seviye(u) + 1 olan kenarlar tutulur. 1 → 2 aynı seviyedeki (1 → 1) iki düğümü bağlar; 4 → 3 de (2 → 2) dışarıda kalır. Diğerleri bir seviye ileri gider.
Çoktan Seçmeli · Dinic
Soru 21: Dinic'in Faz Sayısı
Dinic algoritması için aşağıdakilerden hangisi doğrudur?
D: 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 seviyeler yeniden hesaplanır.
Adım Adım Çalıştırma · İtme–Yeniden Etiketleme
Soru 22: İ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 23: Başlangıç Değerleri
7 düğümlü bir ağda kaynak s'ten çıkan kenarlar s → a (8) ve s → b (5)'tir. İtme–yeniden etiketleme başlangıcından sonra h ve e değerleri nedir?
B: h(s) = |V| = 7, diğer yükseklikler 0; kaynağın tüm kenarları doldurulur ve uçlarında aşırı akış oluşur. h(s) = |V| seçilir, çünkü artık ağda bir s–t yolu olsaydı uzunluğu ≤ |V| − 1 olurdu ve h(u) ≤ h(v) + 1 değişmeziyle çelişirdi. D, |V| − 1 alır.
Çoktan Seçmeli · İtme–Yeniden Etiketleme
Soru 24: 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.
Çoktan Seçmeli · Uygulamalar
Soru 25: Kapasite Değişince
Maksimum akışı 17 olan bir ağda (i) bir kenarın kapasitesi 1 artırılıyor, (ii) ayrıca tüm kapasiteler 3 ile çarpılıyor. Sırasıyla ne olur?
A: Bir kenarın kapasitesi artınca her kesimin kapasitesi en çok 1 artar; kenar hiçbir minimum kesimde değilse akış hiç artmayabilir (B yanlış). Tüm kapasiteler k ile çarpılınca her kesim k katına çıkar, aynı kesim minimum kalır ve akış k katına çıkar.
Klasik Soru · Uygulamalar
Soru 26: İ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: S = {S, a₂, a₃, b₁} kesimi S → a₁ (1) + b₁ → T (1) = 2 kapasiteli bir minimum kesimdir. b₃'e hiç kimse bağlı değildir.
Çıktı Sorusu · Uygulamalar
Soru 27: Kenar Ayrık Yollar
s'ten t'ye kenar ayrık (ortak kenarı olmayan) en fazla kaç yönlü yol vardır? Maksimum akışla nasıl bulunur?
Cevabı göster
Her kenara kapasite 1 verilip maksimum akış hesaplanır: akış = kenar ayrık yol sayısı (Menger teoremi). Burada 2.
Örnek yollar: s → a → d → t; s → b → e → t.
Neden 2'den fazla değil? t'ye yalnızca d → t ve e → t girer: {t} dışındaki her şeyi S'ye koyan kesimin kapasitesi 2'dir. s'ten 3 kenar çıksa da darboğaz hedeftedir.
Klasik Soru · Uygulamalar
Soru 28: Artık Ağdan Minimum Kesim
Maksimum akış hesaplandıktan sonra artik[u][v] matrisinden bir minimum kesimin kenarlarını yazdıran bir metot yazın. Neden doğru çalışır?
Cevabı göster
void minKesim(int s) { boolean[] z = new boolean[V]; Queue<Integer> q = new LinkedList<>(); q.add(s); z[s] = true; while (!q.isEmpty()) { // artık ağda BFS int u = q.poll(); for (int v = 0; v < V; v++) if (!z[v] && artik[u][v] > 0) { z[v] = true; q.add(v); } } for (int u = 0; u < V; u++) for (int v = 0; v < V; v++) if (z[u] && !z[v] && kapasite[u][v] > 0) System.out.println(u + " -> " + v); }
Akış maksimum olduğunda artık ağda s–t yolu yoktur; s'ten ulaşılan küme S, t'yi içermez. S'den T'ye giden her özgün kenar doymuştur (yoksa ucu da ulaşılabilir olurdu), T'den S'ye giden kenarlarda akış 0'dır. Bu yüzden c(S, T) = |f| ve kesim minimumdur. Zaman O(V²) (matris).
Klasik Soru · Uygulamalar
Soru 29: Düğüm Kapasiteleri
Bir ağda kenarların yanı sıra düğümlerin de kapasitesi var: v düğümünden birim zamanda en çok c(v) birim geçebilir (ör. bir yönlendiricinin işlem gücü). Bu problem standart maksimum akışa nasıl dönüştürülür?
Cevabı göster
Her v düğümü iki düğüme bölünür: vg (giriş) ve vç (çıkış); aralarına kapasitesi c(v) olan vg → vç kenarı eklenir. v'ye gelen kenarlar vg'ye, v'den çıkanlar vç'den bağlanır.
v'den geçen tüm akış bu tek kenardan geçmek zorunda olduğu için düğüm kapasitesi kenar kapasitesine dönüşür. Düğüm sayısı 2V, kenar sayısı E + V olur; herhangi bir maksimum akış algoritması uygulanır. Aynı fikirle düğüm ayrık yol sayısı (birim düğüm kapasitesi) bulunur.
Çoktan Seçmeli · Uygulamalar
Soru 30: 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.