Bölüm 4.4: Ağ Akışı

Bölüm 4.4: Ağ Akışı · Çalışma Soruları
Akış ağıArtık ağKesimlerFord-FulkersonEdmonds-KarpDinicİtme–yeniden etiketlemeUygulamalar
Sercan KÜLCÜ

Ç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?

xyvzw3/45/52/6f/7

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?

sabt4/63/31/22/42/54/4
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ı?

sabt3/42/51/22/23/6
Cevabı göster

(a) |f| = s'ten çıkan = 3 + 2 = 5 (t'ye giren 2 + 3 = 5).

sabt133211233

(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?

SABT2/50/43/6

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?

s1234t81235610798

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?

sabt54236
Cevabı göster
S tarafıS → T kenarlarıc(S, T)
{s}s→a 5, s→b 49
{s, a}s→b 4, a→b 2, a→t 39
{s, b}s→a 5, b→t 611
{s, a, b}a→t 3, b→t 69

Üç 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?

s1234t0/80/120/30/50/60/100/70/90/8

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).

s1234t3/80/123/30/50/63/103/73/90/8

Yol s → 1 → 2 → 4 → 3 → t, darboğaz min(8, 3, 10, 7, 9) = 3. |f| = 3.

s1234t6/80/123/33/50/63/100/73/93/8

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.

s1234t8/80/123/35/50/63/100/75/93/8

Yol s → 1 → 3 → t, darboğaz min(2, 2, 6) = 2. |f| = 8.

s1234t8/83/120/35/53/63/103/78/93/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.

s1234t8/84/120/35/53/64/104/79/93/8

Yol s → 2 → 4 → 3 → t, darboğaz min(9, 7, 4, 1) = 1. |f| = 12.

s1234t8/89/120/35/53/69/104/79/98/8

Yol s → 2 → 4 → t, darboğaz min(8, 6, 5) = 5. |f| = 17.

s1234t8/89/120/35/53/69/104/79/98/8

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?

sabt11111
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?

s1234t81235610798kuyruks

Edmonds-Karp'ın ilk BFS'i, artık ağ = kapasiteler. s kuyruğa kondu ve işaretlendi.

s1234t81235610798kuyruk12

s çıkarıldı. Artık kapasitesi pozitif, ziyaret edilmemiş komşular 1, 2 kuyruğa eklendi (ebeveyn = s).

s1234t81235610798kuyruk234

1 çıkarıldı. Artık kapasitesi pozitif, ziyaret edilmemiş komşular 3, 4 kuyruğa eklendi (ebeveyn = 1).

s1234t81235610798kuyruk34

2 çıkarıldı. Yeni komşu yok.

s1234t81235610798kuyruk4t

3 çıkarıldı. Artık kapasitesi pozitif, ziyaret edilmemiş komşular t kuyruğa eklendi (ebeveyn = 3).

s1234t81235610798kuyrukt

4 çıkarıldı. Yeni komşu yok.

s1234t81235610798kuyrukboş

t çıkarıldı. Yeni komşu yok.

s1234t81235610798kuyrukboş

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?

s1234t0/80/120/30/50/60/100/70/90/8

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).

s1234t0/80/120/30/50/60/100/70/90/8

BFS en az kenarlı yolu buldu: s → 1 → 3 → t (3 kenar). Darboğaz min(8, 5, 9) = 5.

s1234t5/80/120/35/50/60/100/75/90/8

|f| = 5.

s1234t5/80/120/35/50/60/100/75/90/8

BFS en az kenarlı yolu buldu: s → 1 → 4 → t (3 kenar). Darboğaz min(3, 6, 8) = 3.

s1234t8/80/120/35/53/60/100/75/93/8

|f| = 8.

s1234t8/80/120/35/53/60/100/75/93/8

BFS en az kenarlı yolu buldu: s → 2 → 4 → t (3 kenar). Darboğaz min(12, 10, 5) = 5.

s1234t8/85/120/35/53/65/100/75/98/8

|f| = 13.

s1234t8/85/120/35/53/65/100/75/98/8

BFS en az kenarlı yolu buldu: s → 2 → 4 → 3 → t (4 kenar). Darboğaz min(7, 5, 7, 4) = 4.

s1234t8/89/120/35/53/69/104/79/98/8

|f| = 17.

s1234t8/89/120/35/53/69/104/79/98/8

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?

s1234t8/89/120/35/53/69/104/79/98/8
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?

ABCDEFG43542653
Cevabı göster
  1. A → C → E → G: 3
  2. A → B → D → E → G: 2
  3. 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?

s1234t0/80/120/30/50/60/100/70/90/8

Aynı ağ; tüm akışlar 0. Her faz: BFS ile seviye (sv) hesapla, sonra seviye çizgesinde engelleyici akış bul.

s1234t0/80/120/30/50/60/100/70/90/8sv=0sv=1sv=1sv=2sv=2sv=3

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.

s1234t5/80/120/35/50/60/100/75/90/8sv=0sv=1sv=1sv=2sv=2sv=3

dfs yolu s → 1 → 3 → t, d = 5 → maksAkis = 5.

s1234t8/80/120/35/53/60/100/75/93/8sv=0sv=1sv=1sv=2sv=2sv=3

dfs yolu s → 1 → 4 → t, d = 3 → maksAkis = 8.

s1234t8/85/120/35/53/65/100/75/98/8sv=0sv=1sv=1sv=2sv=2sv=3

dfs yolu s → 2 → 4 → t, d = 5 → maksAkis = 13.

s1234t8/85/120/35/53/65/100/75/98/8sv=0sv=3sv=1sv=3sv=2sv=4

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.

s1234t8/89/120/35/53/69/104/79/98/8sv=0sv=3sv=1sv=3sv=2sv=4

dfs yolu s → 2 → 4 → 3 → t, d = 4 → maksAkis = 17.

s1234t8/89/120/35/53/69/104/79/98/8sv=0sv=3sv=1sv=3sv=2sv=−

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?

s1234t0/80/120/30/50/60/100/70/90/8

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?

sabt0/30/20/10/20/3h=0, e=0h=0, e=0h=0, e=0h=0, e=0

Ağ (akış/kapasite), |V| = 4. Düğüm yanında yükseklik h ve aşırı akış e.

sabt3/32/20/10/20/3h=4, e=-5h=0, e=3h=0, e=2h=0, e=0

h(s) = |V| = 4; s'ten çıkan kenarlar doldurulur: e(a) = 3, e(b) = 2. Ön akış korunumu bozar (aktif düğümler sarı).

sabt3/32/20/10/20/3h=4, e=-5h=1, e=3h=0, e=2h=0, e=0

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.

sabt3/32/21/10/20/3h=4, e=-5h=1, e=2h=0, e=3h=0, e=0

a aktif; h(a) = 1 = h(b) + 1 ve artık kapasite var → itme δ = 1.

sabt3/32/21/12/20/3h=4, e=-5h=1, e=0h=0, e=3h=0, e=2

a aktif; h(a) = 1 = h(t) + 1 ve artık kapasite var → itme δ = 2.

sabt3/32/21/12/20/3h=4, e=-5h=1, e=0h=1, e=3h=0, e=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.

sabt3/32/21/12/23/3h=4, e=-5h=1, e=0h=1, e=0h=0, e=5

b aktif; h(b) = 1 = h(t) + 1 ve artık kapasite var → itme δ = 3.

sabt3/32/21/12/23/3h=4, e=-5h=1, e=0h=1, e=0h=0, e=5

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?

Sa₁a₂a₃b₁b₂b₃T
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?

sabcdet
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?

uvgvçwc(u,v)c(v)c(v,w)
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.

Son

Bölüm 4.4: Ağ Akışı: Çalışma Soruları
Konu anlatımı: Ağ akışı sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.