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Ü · Giresun Üniversitesi · Bilgisayar Mühendisliği

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

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

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

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

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 6: 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.

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?

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

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 10: Edmonds-Karp İzleme

edmondsKarp(0, 5) bu ağda 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 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?

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

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

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.

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

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.

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

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

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

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

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.