19  Bellman-Ford

DAG kısıtını kaldırırız: herhangi bir ağırlıklı çizgede (çevrim ve negatif ağırlık dahil) tek-kaynak en kısa yol; sonlu en kısa yol V−1 kenardan uzun olamaz (basittir), çizgeyi V+1 seviyeye çoğaltıp DAG yaparak DAG relaxation çağırırız, V kenarda hâlâ kısalan tanıkları bulup onlardan eksi sonsuz yayarız — hepsi O(V·E)

NotBölüm bilgisi

Bir önceki ünite dersinde (Ders 16) DAG relaxation, ağırlıklı SSSP’yi yalnızca çevrimsiz çizgelerde \(O(V+E)\)’de çözdü. Bu ders DAG kısıtını kaldırır: Bellman-Ford herhangi bir çizgede çalışır, negatif ağırlıklı çevrimleri tespit eder ve onlardan erişilen düğümlere \(-\infty\) atar.

19.1 Bu Derste Ne Var?

DAG relaxation (Ders 16) yalnızca çevrimsiz çizgelerde çalışıyordu. Bu ders (Jason Ku), en genel tek-kaynak en kısa yol algoritmasını verir: Bellman-Ford. Herhangi bir ağırlıklı çizgede — çevrimler ve negatif ağırlıklar dahil — çalışır; negatif ağırlıklı çevrimleri tespit eder ve onlardan erişilen düğümlere \(-\infty\) atar.

“if a negative weight cycle is reachable from our source, then the vertices in that cycle and anything reachable from that cycle will potentially have an unbounded number of edges.” — Ku, 2:22

Üç ana fikir:

  1. En kısa yollar basittir\(\delta\) sonluysa düğüm tekrarsız (simple) bir en kısa yol vardır; bu da en fazla \(V-1\) kenar demektir.
  2. k-kenar mesafesi + tanık — “en fazla \(k\) kenarlı” mesafeyi izleyerek, \(V\) kenarda hâlâ kısalan düğüm bir tanıktır (witness) → negatif çevrim kanıtı.
  3. Graf çoğaltma — çizgeyi \(V+1\) seviyeye kopyalayıp DAG’a çevir; DAG relaxation’ı çağır → \(O(V \cdot E)\).
flowchart TD
    A["Ders 18 (L12): Bellman-Ford"] --> S["en kısa yollar basittir"]
    S --> S1["delta sonlu → tekrarsız yol<br/>en fazla V−1 kenar"]
    A --> K["k-kenar mesafesi + tanık"]
    K --> K1["delta_k = en fazla k kenarlı en kısa<br/>V kenarda kısalan = tanık → negatif çevrim"]
    A --> D["graf çoğaltma"]
    D --> D1["V+1 seviye + 0 kalma kenarı<br/>seviye-içi kenar yok → DAG → relaxation"]
    A --> G["algoritma — dört adım"]
    G --> G1["G' kur → DAG relaxation → sonlu ata<br/>tanıktan eksi sonsuz yay → O(V·E)"]

    classDef root fill:#fef3c7,stroke:#b45309,stroke-width:3px,color:#1f2937
    classDef branch fill:#f3f4f6,stroke:#374151,stroke-width:2px,color:#1f2937
    classDef leaf fill:#ffffff,stroke:#9ca3af,stroke-width:1px,color:#1f2937
    class A root
    class S,K,D,G branch
    class S1,K1,D1,G1 leaf
Şekil 19.1: Ders 18’in (L12) kavram haritası: kök = Bellman-Ford (Ku) — herhangi ağırlıklı çizgede en genel SSSP. Dört dal — (1) en kısa yollar basittir: delta sonlu ise düğüm tekrarsız yol var → en fazla V−1 kenar; bu, sonsuz yol kümesini sonlandırır. (2) k-kenar mesafesi delta_k = en fazla k kenarlı en kısa mesafe; V kenarda hâlâ kısalan düğüm bir tanıktır → negatif çevrim kanıtı; delta = eksi sonsuz ise düğüm bir tanıktan erişilir. (3) graf çoğaltma: çizgeyi V+1 seviyeye kopyala, kenarlar yalnız bir üst seviyeye gider + 0 ağırlıklı kalma kenarı → seviye-içi kenar yok → DAG; şimdi DAG relaxation kara kutusu çağrılır. (4) algoritma dört adım: G’ kur → DAG relaxation → sonlu mesafeleri ata → tanıktan eksi sonsuz yay; toplam O(V·E). Sonuç: çevrimli/negatif problemi, çözmeyi bildiğimiz çevrimsiz bir probleme indirger; bedeli yalnız bir V çarpanı.
İpucuBuilder Notu — DAG Kısıtı Kalkınca

DAG relaxation (Ders 16) topolojik sıraya dayanıyordu, çevrim olduğunda topolojik sıra yoktur. Bellman-Ford aynı “relax” tekniğini korur ama çevrime ve negatif ağırlığa izin verir; karşılığında bir \(V\) çarpanı öder. Püf noktası tek bir gözlemdir: sonlu bir en kısa yol \(V-1\) kenardan uzun olamaz.

  • İleriye → yönlendirme: Bellman-Ford, distance-vector yönlendirme protokollerinin (RIP) temelidir — her router komşularından mesafe alıp gevşetir.
  • İleriye → arbitraj: negatif ağırlıklı çevrim tespiti, döviz çevrim grafında kâr döngüsü (arbitraj) bulmaktır.
  • İleriye → graf çoğaltma: “düğümü duruma göre çoğalt” tekniği, durum-augmentasyonlu birçok problemde (zaman, yakıt, mod) tekrar eder.
  • Geriye → DAG relaxation (Ders 16): Bellman-Ford, problemi bir DAG’a indirgeyip o algoritmayı kara kutu olarak kullanır.

Tek cümle: En kısa yol sonluysa \(V-1\) kenardan uzun olamaz; çizgeyi \(V+1\) seviyeye çoğaltıp DAG yaparak DAG relaxation çağırırız, \(V\) kenarda hâlâ kısalan düğümleri tanık olarak işaretleyip \(-\infty\) yayarız — hepsi \(O(V \cdot E)\).

19.2 1. Bellman-Ford’un Hedefi

Çizge çevrim ve negatif ağırlık içerebilir. Hedef: her düğüm için \(\delta(s, v)\) hesapla — erişilemez ise \(+\infty\), negatif ağırlıklı çevrimden erişilen ise \(-\infty\), diğerleri sonlu. Ek olarak, varsa bir negatif çevrim döndür. Çalışma süresi hedefi \(O(V \cdot E)\).

19.3 2. Isınma: Yönsüz Çevrim ve İndirgeme

İki kısa alıştırma:

  • Yönsüz çizgede negatif çevrim \(\Leftrightarrow\) negatif kenar. Yönsüz bir negatif kenar üzerinde ileri-geri gidersek (uzunluk-2 çevrim) negatif çevrim olur. Yani yönsüz hâl ilginç değil; bu ders yönlü çizgelere odaklanır.
  • \(O(V \cdot (V+E)) \to O(V \cdot E)\) indirgemesi. Bir algoritma SSSP’yi \(O(V \cdot (V+E))\)’de çözüyorsa: önce BFS/DFS ile \(s\)’den erişilebilenleri bul, gerisini at. Kalan çizgede \(V = O(E)\) (bağlı bileşen en fazla \(E+1\) düğüm), dolayısıyla \(V+E = O(E)\) → toplam \(O(V \cdot E)\). (Bu yüzden \(V \cdot (V+E)\) hedefiyle \(V \cdot E\) aynı.)

19.4 3. En Kısa Yollar Basittir

Çalışılan Örnek — Claim 1. \(\delta(s, v)\) sonlu ise, \(s\)’den \(v\)’ye basit (simple, düğüm tekrarsız) bir en kısa yol vardır.

“if my shortest path distance from S to some vertex is finite… there exists a shortest S to V path that is simple.” — Ku, 11:06

Kanıt: bir en kısa yol bir çevrim \(C\) içerse, \(\delta\) sonlu olduğundan \(w(C)\) negatif olamaz (negatif olsaydı tekrar tekrar dolaşıp \(-\infty\) yapardık). \(w(C) \geq 0\) ise çevrimi atıp daha kısa (veya eşit) bir yol elde ederiz; tekrar tekrar atarak basit bir yola ineriz.

Sonuç (kutula): basit yol en fazla \(V\) düğüm → en fazla \(V-1\) kenar kullanır.

“simple paths have at most V minus 1 edges.” — Ku, 14:06

Yani \(\delta\) sonluysa, yalnızca en fazla \(V-1\) kenarlı yolları kontrol etmek yeter (sonsuz değil, sonlu bir küme).

Şekil 19.2 bu gözlemi iki panelde gösterir: solda pozitif/sıfır ağırlıklı çevrimi atınca basit yolun daha kısa/eşit olduğu mini örnek (çevrimli yol 11 vs basit yol 7), sağda zincir akışı (\(\delta\) sonlu → basit yol → en fazla \(V-1\) kenar) ve sonlu arama uzayı.

Şekil 19.2: En kısa yollar BASİTTİR: δ sonlu → çevrim at → en fazla V−1 kenar (Bellman-Ford’u SONLANDIRIR) (L12 §3 İMZA). SOL panel pozitif/sıfır çevrim durumu: mini çizge s→a→b→t + b→a geri kenarı (çevrim a→b→a, w(C) = 3+1 = 4 ≥ 0). Çevrimli yol s→a→b→a→b→t (çevrim parçası soluk + makas ✂) ağırlık 11 üstü çizili vs çevrimi ATILMIŞ BASİT yol s→a→b→t (amber kalın) ağırlık 7 — w(C) ≥ 0 ise çevrimi at → daha kısa/eşit. Dipnot: çevrim NEGATİF olursa (build_bf_example w(C) = −2 < 0) δ = −∞, en kısa yol YOK. SAĞ panel kural kutusu: δ(s,v) SONLU → BASİT en kısa yol VAR → en fazla V düğüm → en fazla V−1 kenar (Ku 14:06); altında 0..V−1 sonlu sayı doğrusu (sonsuz yol uzayı yerine sonlu arama). Veri MOTORDAN: path_weight basit = 7 ≤ çevrimli = 11 (w(C)=4≥0); build_bf_example çevrim = −2 (Ku 11:06, 14:06).

19.5 4. k-Kenar Mesafesi

k-kenar mesafesi \(\delta_k(s, v)\): en fazla \(k\) kenar kullanan en kısa \(s \to v\) yolunun ağırlığı. Eğer \(\delta_k\)’yı \(k = V-1\) için hesaplarsak ve \(\delta(s, v)\) sonluysa, gerçek en kısa yolu bulmuş oluruz (çünkü sonlu en kısa yol \(\leq V-1\) kenar).

Bu, problemi sonlandırır: sonsuz sayıda yol yerine, kenar sayısını \(V-1\) ile sınırlayıp adım adım mesafe hesaplarız.

19.6 5. Tanık (Witness) ve −∞

Peki \(-\infty\) düğümleri? Anahtar gözlem: eğer \(V\) kenarlı en kısa mesafe (\(\delta\), \(k = V\)), \((V-1)\) kenarlı mesafeden (\(\delta\), \(k = V-1\)) kesinlikle küçükse, bu yeni (daha kısa) yol basit olamaz (\(V\) kenar \(> V-1\) düğüm → tekrar var) → içinde bir negatif çevrim vardır. Böyle bir \(v\)’ye tanık (witness) denir.

“I’m going to call V is a witness.” — Ku, 19:53

İddia: \(\delta(s, v) = -\infty \Leftrightarrow v\), bir tanıktan erişilebilir. Yani tüm tanıkları bulup onlardan erişilen her düğümü \(-\infty\) işaretlemek yeter.

Şekil 19.3 örnek çizgeyi ve \(\delta_k\) tablosunu birlikte gösterir: üstte negatif çevrimli çizge (kaynak a), altta \(k = 0 \ldots 5\) satırları; \(k = V = 4\) satırında b düğümünün \(-5 \to -7\) düşmesi tanık vurgusudur (kenar tablosu motordan: b sütunu \([\infty, -5, -5, -5, -7, -7]\)).

Şekil 19.3: k-kenar mesafesi δₖ + TANIK: δ_V < δ_{V−1} ise basit yol olamaz → negatif çevrim → −∞ (L12 §4-5 İMZA). ÜST: örnek çizge — a→b(−5) girişi + b/c/d çevrim üçgeni (b→c −4, c→d 3, d→b −1; toplam −2 amber negatif rozet). ALT: δₖ(a, v) tablosu — satırlar k = 0..5, sütunlar a/b/c/d; hücrelerde δ değerleri (∞ glifi). k = V = 4 satırında DÜŞEN b hücresi (−5 → −7) AMBER dolgu + aşağı-ok = TANIK; çevrim her turda −2 kazandırır. Sağ kenar TANIK kutusu (Ku 19:53): δ_V(v) < δ_{V−1}(v) → V-kenarlı yol (V−1)-kenarlıdan kısa → o yol BASİT OLAMAZ → negatif çevrim içerir → δ(a,v) = −∞. ALT NOT: δ(a,v) = −∞ ⟺ v bir tanıktan erişilebilir; burada b,c,d hepsi çevrimden erişilir → −∞, yalnız a = 0 sonlu. Veri MOTORDAN: k_edge_distances b = [∞,−5,−5,−5,−7,−7], c = [∞,∞,−9,−9,−9,−11], d = [∞,∞,∞,−6,−6,−6]; k=V=4’te −5→−7 TANIK düşüşü.

19.7 6. Her Negatif Çevrim Bir Tanık İçerir

Çalışılan Örnek — kanıt. İddiayı kanıtlamak için şunu göstermek yeter:

“It suffices to prove that every negative weight cycle contains a witness.” — Ku, 22:43

Bir negatif çevrim \(C\) al; her \(v\) için üçgen eşitsizliği: \(\delta_V(s, v) \leq \delta_{V-1}(s, v') + w(v', v)\) (\(v' = v\)’nin çevrimdeki öncülü). Bu eşitsizliği çevrimdeki tüm düğümler üzerinde topla: sol taraf \(\sum \delta_V\), sağ taraf \(\sum \delta_{V-1} + w(C)\). \(w(C) < 0\) olduğundan, sol toplam sağ toplamdan kesinlikle küçük olur. O hâlde çevrimde en az bir düğüm \(\delta_V < \delta_{V-1}\) eşitsizliğini sağlamalı — yani bir tanık içerir. (Hiçbiri tanık olmasaydı toplam eşitsizliği çökerdi: çelişki.)

Şekil 19.4 bu kanıtı üç panelde toplar: solda örnek çizge (tanık b yıldızlı, çevrimden erişilen b/c/d koyu \(-\infty\)), ortada yayılım akışı (tanık → DFS erişilebilirlik → \(-\infty\) boyaması), sağda çevrim üzerinde toplama + \(w(C) < 0\) çelişki argümanı.

Şekil 19.4: Bellman-Ford: TANIK (V. turda düşer) → DFS erişilebilirlik → −∞ yayılımı · her negatif çevrim bir tanık içerir (L12 §5-6 İMZA). SOL panel örnek çizge (kaynak a): çevrim b→c→d→b (toplam −2 < 0); TANIK olan b amber yıldızlı; çevrimden erişilen b,c,d koyu dolgulu δ = −∞; a = 0 temiz. ORTA panel yayılım akışı (3 aşama dikey): TANIK (δ_V(b) < δ_{V−1}(b), V. turda hâlâ düşer) → ERİŞİLEBİLİRLİK TARAMASI (DFS, tanıktan ulaşılan her düğüm) → −∞ BOYAMASI; erişilen küme { b, c, d }. SAĞ panel kanıt kutusu (Ku 22:43): çevrim C üzerinde her kenar için üçgen eşitsizliği δ_V(v_i) ≤ δ_{V−1}(v_{i−1}) + w(v_{i−1}, v_i); çevrim boyunca TOPLA → Σ δ_V ≤ Σ δ_{V−1} + w(C); w(C) = −2 < 0 → Σ δ_V < Σ δ_{V−1} → en az bir v_i’de düşüş = TANIK (çelişki: tanık yoksa düşüş olmaz ama w(C) < 0 zorlar). Veri MOTORDAN: bellman_ford_classic(a) = {a:0, b:−∞, c:−∞, d:−∞}; V. tur tanık = [b] (δ₄(b)=−7 < δ₃(b)=−5); erişilen = {b,c,d}; çevrim w = −2.

19.8 7. Graf Çoğaltma

Modifiye Bellman-Ford’un fikri: bir düğümün birçok sürümünü yap; \(v\)’nin \(k\). sürümü “\(v\)’ye en fazla \(k\) kenarla ulaşmak” durumunu temsil etsin. Buna graf çoğaltma (graph duplication) denir.

“this is an idea called graph duplication.” — Ku, 30:51

\(V+1\) seviye kur; seviye \(k\)’daki v_k düğümü, “\(v\)’ye en fazla \(k\) kenarla ulaşmak”. Kenarlar yalnızca daha yüksek seviyeye gider → çizge bir DAG olur (geriye kenar yok).

“if we connect edges from one level to only higher levels… then this graph is going to be a DAG.” — Ku, 33:14

DAG olduğu için DAG relaxation’ı (doğrusal) çağırabiliriz. Çoğaltılmış çizge \(V\) kat büyür: \(V \cdot (V+1)\) düğüm, \(V \cdot (V+E)\) kenar — bu da DAG relaxation’ı \(O(V \cdot (V+E)) = O(V \cdot E)\) yapar (Bölüm 2 indirgemesiyle).

Şekil 19.5 örnek çizgeyi \(V+1 = 5\) seviyeye açar (20 düğüm = \(4 \times 5\)): orijinal kenarlar seviye atlar, her düğüme \(0\)-ağırlıklı kalma kenarı eklenir, seviye-içi kenar olmadığından sonuç bir DAG’dır; vurgulu yol \(a_0 \to b_1 \to c_2 \to d_3 \to b_4\) çevrimin “açılmış” hâlidir.

Şekil 19.5: Graf çoğaltma: V+1 seviye + 0-kalma kenarları → DAG (Bellman-Ford’un kalbi) (L12 §7-8 İMZA). Tek panel, 5 yatay şerit k = 0..4 (V+1 = 5 seviye, solda seviye etiketi + ≤ k kenar). Her şeritte a, b, c, d kopyaları küçük daireler. Orijinal kenarlar SEVİYE ATLAYAN oklar: a0→b1 (−5) amber örnek vurgulu; çevrim kenarları b→c(−4), c→d(3), d→b(−1) bir seviye atlayarak çizilir (orijinalde çevrim, burada düz). Her düğüme dik kesikli 0-ağırlıklı KALMA kenarı (v,k) → (v,k+1) (δₖ ≤ δₖ₋₁). VURGU YOLU a0 → b1 → c2 → d3 → b4 amber kalın = çevrimin AÇILMIŞ hali. Sağ NOT kutusu (Ku §7-8): (v,k) = v’ye en fazla k kenarla (31:36); orijinal kenar → (u,k)→(v,k+1); kalma kenarı (v,k)→(v,k+1); seviye-içi kenar YOK → geri kenar YOK → bu çizge bir DAG (33:14); şimdi D16 dag_relaxation kara kutusu çağrılabilir; boyut V(V+1) düğüm → toplam O(V·E). Veri MOTORDAN: build_duplicated_dag → 4*5 = 20 düğüm; w2[(a0,b1)] = −5 (seviye atlar), w2[(a0,a1)] = 0 (kalma); adj2[a0] = [(a,1),(b,1)].

19.9 8. Graf Dönüşümü Örneği

Örnek: \(a, b, c, d\) düğümlü yönlü çizge; \(b \to c \to d \to b\) çevrimi (\(-4 + 3 + (-1) = -2\), negatif). \(V+1 = 5\) kopya (seviye 0-4). Kurallar:

  • Seviye içi kenar YOK (çevrimleri kırar).
  • Orijinal her \((u, v)\) kenarı için: seviye \(k\)’daki \(u\)’yu, seviye \(k+1\)’deki \(v\)’ye bağla (aynı ağırlık). Örn. a_0 → b_1 (ağırlık \(-5\)).
  • Her düğüm için \(0\)-ağırlıklı “kalma” kenarı: v_k → v_{k+1} (“bir kenar kullanmadan aynı yerde dur” — en fazla \(k\) kenar koşulunu simüle eder).

“vertex Vk in level k represents reaching vertex V using at most k edges.” — Ku, 31:36

Böylece a_0’dan b_3’e bir yol = orijinal çizgede en fazla 3 kenarlı bir \(a \to b\) yolu (örn. \(a \to c \to d \to b\)). Kenarlar daima seviye atladığından çizge çevrimsizdir.

NotAynı çevrim, iki yerde

Şekil 19.5 ve bu bölümün örneği aynı çizgeyi kullanır: motorun build_bf_example çevrimi \(b \to c \to d \to b = (-4) + 3 + (-1) = -2\), Notion §8 anlatısıyla birebir aynı çevrim. Yani çoğaltma figüründeki vurgu yolu, buradaki dönüşüm örneğinin sayısal karşılığıdır.

19.10 9. Bellman-Ford Algoritması

Dört adım:

def bellman_ford(graph, s):
    # 1. V+1 seviyeli cogaltilmis DAG G' kur (seviye-atlamali + 0-agirlikli kalma kenarlari)
    G_prime = build_duplicated_dag(graph)              # O(V(V+E))
    # 2. DAG relaxation ile s_0'dan tum v_k'ya delta hesapla
    delta = dag_relaxation(G_prime, source=(s, 0))     # O(V(V+E))
    # 3. Sonlu mesafeleri ata: d(s,v) = delta(s_0, v_{V-1})
    d = {v: delta[(v, V - 1)] for v in graph.vertices}
    # 4. Taniklari bul, eristikleri -inf isaretle
    for v in graph.vertices:
        if delta[(v, V)] < delta[(v, V - 1)]:          # tanik kosulu
            for u in reachable_from(graph, v):         # O(E) her tanik
                d[u] = float('-inf')
    return d

Üçüncü adımda \(d(s, v) = \delta(s_0, v_{V-1})\) (\(V-1\) kenarlı mesafe) atanır; bu, sonlu mesafeler için doğrudur.

Şekil 19.6 bu dört adımı dikey bir akışta toplar: (1) \(G'\) kur (çoğaltma), (2) DAG relaxation (Ders 16 kara kutusu), (3) sonlu ata, (4) tanık + \(-\infty\) yay; toplam \(O(V \cdot E)\). Yan notta motorun iki bağımsız sürümü (via_dag ve classic) örnek çizgede ve 100 rastgele çizgede birebir aynı sonucu verir.

Şekil 19.6: Bellman-Ford = graf çoğaltma + Ders 16 DAG relaxation kara kutusu → O(V·E) (L12 §9 İMZA). Dikey akış, dört adım kutusu (numara + başlık + açıklama + süre rozeti). (1) G′ KUR — graf çoğaltma: V+1 seviye, (u,k)→(v,k+1) kenar + (v,k)→(v,k+1) 0-kalma kenarı [O(V·(V+E))]; sağında V+1 seviye katman ikonu. (2) DAG RELAXATION — s₀’dan tüm vₖ’ye Ders 16 kara kutusu (topolojik sıra = seviye) [O(V·(V+E))]; sağında ‘Ders 16 kara kutu’ rozeti. (3) SONLU ATA — d(v) = δ(s₀, v_{V−1}); en kısa yollar BASİT → ≤ V−1 kenar [O(V)]. (4) TANIK + −∞ YAY — δ(v_V) < δ(v_{V−1}) → tanık; erişilenlere −∞ (negatif çevrim) [O(V·E)]; sağında örnek çizge a→b(−5) + çevrim b→c→d→b = −2, çevrimden erişilen b,c,d düğümleri −∞ boyalı. En altta TOPLAM = O(V·E) (Ku 54:30). Yan not: klasik BF bu çoğaltmayı YAPMAZ — V−1 tur kenar gevşetir, V. turda hâlâ gevşeyen = tanık (Egzersiz 4); motor iki sürümü de çalıştırdı, via_dag == classic == {a:0, b,c,d:−∞} (örnek + 100 rastgele çizgede birebir). Veri MOTORDAN: bellman_ford_via_dag == bellman_ford_classic; tanık δ_V(b)=−7 < δ_{V−1}(b)=−5.

19.11 10. Doğruluk ve Çalışma Süresi

Doğruluk (\(k\) üzerinden tümevarım). İddia: \(\delta(s_0,\) v_k \() = \delta_k(s, v)\). Temel (\(k = 0\)): yalnız \(s_0\) erişilir (0), gerisi \(\infty\). Adım: v_k’ya en kısa yol, bir önceki seviyedeki bir komşudan gelir; \(G'\)’nin komşulukları orijinal komşuluklar + “kalma” kenarıdır → minimum, tam olarak \(\delta_k\) tanımını verir. Böylece sonlu mesafeler doğru atanır; tanık koşulu da \(-\infty\)’ları yakalar.

Çalışma süresi. \(G'\) kurma \(O(V \cdot (V+E))\) + DAG relaxation aynı + her tanık için erişilebilirlik \(O(E)\), en fazla \(V\) tanık → \(O(V \cdot E)\). Toplam \(O(V \cdot E)\).

“this thing takes order V times E work.” — Ku, 54:30

(Not: orijinal Bellman-Ford bu çoğaltmayı yapmaz\(V\) tur kenar gevşetir; recitation’da \(O(V)\) yer kullanan optimizasyon gösterilir.)

Şekil 19.7 bu dersi SSSP algoritma manzarasına yerleştirir: BFS (ağırlıksız), DAG relaxation (Ders 16, DAG), Bellman-Ford (bu ders, herhangi çizge \(O(V \cdot E)\), amber vurgulu), Dijkstra (Ders 19, \(\geq 0\)); altında Bellman-Ford’un indirgeme şeridi (çoğalt → DAG → çözülmüş kara kutu) ve motorun tutarlılık tanığı (bellman_ford_classic == dag_sssp).

Şekil 19.7: SSSP algoritma manzarası: Bellman-Ford en geneli — herhangi çizge, negatif çevrim tespiti (O(V·E)) (L12 SENTEZ). Dört satırlık karşılaştırma panosu (algoritma | kabul ettiği çizge/kısıt | çalışma süresi | ders): (1) BFS — ağırlıksız çizge — O(V+E) [Ders 13]; (2) DAG relaxation — DAG + her ağırlık — O(V+E) [Ders 16]; (3) BELLMAN-FORD — HERHANGİ çizge, negatif çevrim TESPİT + −∞ — O(V·E) [BU DERS, amber vurgulu]; (4) Dijkstra — ağırlık ≥ 0 — O(V log V + E) [Ders 19]. Altında BF indirgeme şeridi: çoğalt (V+1 seviye) → DAG’a indirge (0-kalma kenarları) → çözülmüş kara kutu DAG relaxation — BF yeni algoritma icat etmez, problemi çözülmüş bir DAG SSSP’sine İNDİRGER (OMSCS reduction refleksi). Alt kutu: BF = en GENEL SSSP çözücü, negatif çevrimi bile tespit eder (δ = −∞); bedeli V çarpanı O(V·E); çizge kısıtlıysa DAG (O(V+E)) veya Dijkstra (≥0) daha hızlı. Tutarlılık tanığı (motordan): bellman_ford_classic == dag_sssp (D16 DAG, kaynak e) → δ = {e:0, f:3, g:5, h:6, d:3, c:8}. Veri MOTORDAN: BF classic == via_dag == {a:0, b:−∞, c:−∞, d:−∞}; çoğaltılmış DAG V+1 seviye = 20 düğüm.

19.12 Bu Dersin Özeti

  1. Hedef: genel çizgede SSSP; \(\infty\) (erişilemez), \(-\infty\) (negatif çevrimden), sonlu; \(O(V \cdot E)\).
  2. Basit yol: \(\delta\) sonlu → tekrarsız yol → en fazla \(V-1\) kenar.
  3. k-kenar mesafesi \(\delta_k\): en fazla \(k\) kenarlı en kısa yol; \(k = V-1\) yeter (sonlu için).
  4. Tanık: \(\delta_V < \delta_{V-1}\) → negatif çevrim; \(\delta = -\infty \Leftrightarrow\) tanıktan erişilir.
  5. Her negatif çevrim bir tanık içerir (çevrim üzerinde toplam + üçgen eşitsizliği + \(w(C) < 0\)).
  6. Graf çoğaltma: \(V+1\) seviye, seviye-atlamalı kenarlar + \(0\)-ağırlıklı kalma → DAG.
  7. Algoritma: \(G'\) kur → DAG relaxation → \(\delta(s_0, v_{V-1})\) ata → tanıktan \(-\infty\) yay; \(O(V \cdot E)\).
ÖnemliTek Bir Cümle

Bellman-Ford, “sonlu en kısa yol \(V-1\) kenardan uzun olamaz” gerçeğini kullanır: çizgeyi \(V+1\) seviyeye çoğaltıp DAG yapar, DAG relaxation çağırır, \(V\) kenarda hâlâ kısalan tanıkları bulup onlardan \(-\infty\) yayar — hepsi \(O(V \cdot E)\).

19.13 Kontrol Soruları

Cevap: \(\delta(s, v)\) sonluysa, en kısa yolların içindeki her çevrimin ağırlığı \(\geq 0\) olmalıdır (negatif olsaydı tekrar dolaşıp \(-\infty\) yapardık). Sıfır/pozitif çevrimleri atarak basit (düğüm-tekrarsız) bir en kısa yol elde ederiz; basit yol en fazla \(V\) düğüm → \(V-1\) kenar içerir. Böylece sonsuz sayıda yol yerine, kenar sayısını \(V-1\) ile sınırlı sonlu bir kümeye bakarız — algoritma sonlanır (her \(k = 0 \ldots V-1\) için adım adım mesafe).

Cevap: Tanık, \(V\) kenarlı en kısa mesafesi \((V-1)\) kenarlı mesafesinden kesinlikle küçük olan bir düğümdür. Bu, \(V\) kenarlık daha kısa bir yolun var olması demektir; ama \(V\) kenar \(> V-1\) düğüm olduğundan o yol bir düğümü tekrar eder → içinde bir negatif ağırlıklı çevrim vardır. İlişki: \(\delta(s, v) = -\infty \Leftrightarrow v\) bir tanıktan erişilebilir. Çünkü her negatif çevrim bir tanık içerir (kanıtlandı) ve negatif çevrimden erişilen her düğüm sınırsızca kısalan bir yola sahiptir. Algoritma tüm tanıkları bulur, onlardan erişilenleri \(-\infty\) yapar.

Cevap: Çoğaltmada her düğümün \(V+1\) sürümü (her seviye için biri) yapılır ve kenarlar yalnız daha yüksek seviyeye gider (v_k → v_{k+1} seviye atlamalı ve “kalma” v_k → v_{k+1}). Geriye kenar olmadığından çevrim oluşamaz → DAG. İşe yarar çünkü DAG relaxation’ı (Ders 16, doğrusal \(O(V+E)\)) bu çoğaltılmış çizgeye uygulayabiliriz; çizge \(V\) kat büyüdüğünden \(O(V \cdot (V+E)) = O(V \cdot E)\) elde ederiz. Yani çevrimli problemi, çözmeyi bildiğimiz çevrimsiz bir probleme indirgemiş oluruz.

Cevap: Yönsüz bir çizgede tek bir negatif ağırlıklı kenar bile bir negatif çevrim üretir: o kenar üzerinde ileri-geri gidersek (uzunluk-2 çevrim) toplam ağırlık negatiftir, sonsuza dek tekrarlanabilir. Yani yönsüzde “negatif çevrim var mı?” sorusu “negatif kenar var mı?” ile aynıdır (\(O(E)\) basit kontrol) ve \(s\)’nin bağlı bileşeninde negatif kenar varsa her şey \(-\infty\) olur. Bu yüzden problem yalnızca yönlü çizgelerde anlamlı; ders yönlü hâle odaklanır.

19.14 Egzersizler

Egzersiz 1. Küçük bir negatif-çevrimli yönlü çizgede, \(k = 0 \ldots V\) için \(\delta_k(s, v)\) tablosunu elle doldur; hangi düğümlerin tanık olduğunu (\(\delta_V < \delta_{V-1}\)) işaretle.

Egzersiz 2. Bir çizge için çoğaltılmış DAG \(G'\)’yi (\(V+1\) seviye, kalma kenarları) çiz; a_0’dan bir v_{V-1}’e bir yolun, orijinalde en fazla \(V-1\) kenarlı bir yola karşılık geldiğini doğrula.

Egzersiz 3. “Her negatif çevrim bir tanık içerir” kanıtını, çevrim üzerinde toplama ve üçgen eşitsizliği adımlarını yazarak yeniden üret.

Egzersiz 4. Bellman-Ford’u Python’da yaz (çoğaltma olmadan, klasik \(V\)-tur kenar gevşetme); negatif çevrim tespitini \(V\). turda bir gevşetme olup olmadığına bakarak ekle.

Egzersiz 5. \(O(V \cdot (V+E)) \to O(V \cdot E)\) indirgemesini bir çizgede uygula: BFS ile erişilemeyenleri at, kalan çizgede \(V = O(E)\) olduğunu doğrula.

19.15 Sonraki Ders İçin Hazırlık

UyarıSonraki: Ders 19 (L13) — Dijkstra

Ders 19 (L13): Dijkstra — Jason Ku ile, ağırlıklar negatif değilse çok daha hızlı bir algoritma: Dijkstra. Negatif çevrim derdi olmadığından, açgözlü (greedy) bir öncelik kuyruğuyla her düğümü bir kez “kesinleştirir” → \(O(V \log V + E)\), doğrusala yakın. Bellman-Ford’un \(V \cdot E\)’sinden hızlı; çoğu gerçek problem (yol ağı) için tercih edilen.

Ders 19 Öncesi Yapılacak:

  • Bu dersin egzersizlerini, özellikle Egzersiz 1 (\(\delta_k\) tablosu) ve 4 (klasik Bellman-Ford) çöz.
  • “Simple yol \(\leq V-1\) kenar” ve “tanık” tanımlarını ezberden anlat.
  • Ana cümleyi tekrar oku: “Sonlu en kısa yol \(V-1\) kenardan uzun olamaz; çoğalt, DAG yap, gevşet, tanıkları \(-\infty\) yap.”

19.16 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Sayfada
Bellman-Ford hedefi Genel çizgede SSSP; \(\infty\) / \(-\infty\) / sonlu; \(O(V \cdot E)\) Böl. 1
Basit en kısa yol \(\delta\) sonlu → tekrarsız → \(\leq V-1\) kenar Böl. 3
k-kenar mesafesi \(\delta_k\) En fazla \(k\) kenarlı en kısa yol; \(k = V-1\) yeter Böl. 4
Tanık (witness) \(\delta_V < \delta_{V-1}\) → negatif çevrim kanıtı Böl. 5-6
\(-\infty\) kuralı \(\delta = -\infty \Leftrightarrow\) bir tanıktan erişilebilir Böl. 5
Graf çoğaltma \(V+1\) seviye, seviye-atlamalı + kalma kenarı → DAG Böl. 7-8
Algoritma \(G'\) kur → DAG relaxation → \(\delta\) (\(s_0\)\(V-1\) seviyesi) → tanık \(-\infty\) Böl. 9
Çalışma süresi \(O(V \cdot E)\) (DAG relaxation \(V\) kat büyük çizgede) Böl. 10

19.17 Builder ve OMSCS Bağlantıları

İpucu6 köprü

Bu ders, “DAG kısıtını kaldıran en genel SSSP” fikrini kurar ve graf çoğaltma ile çevrimli/negatif problemi çözülmüş bir DAG’a indirger — köprülerin özeti:

  1. Bellman-Ford → distance-vector yönlendirme (RIP), ağ topoloji keşfi, gecikme tabanlı yol.
  2. Negatif çevrim tespiti → arbitraj (döviz çevrim grafı kâr döngüsü), kısıt tutarsızlığı (fark kısıtları).
  3. Graf çoğaltma → durum-augmentasyonu: zaman-genişletilmiş çizge, yakıt/mod katmanları, takvim çakışması.
  4. k-kenar mesafesi → sınırlı-atlama en kısa yol (en fazla \(k\) aktarma), kademeli yayılım.
  5. DAG’a indirgeme → “zor problemi kolay kara kutuya çevir” (reduction); OMSCS CS 6515 ana teması.
  6. Üçgen eşitsizliği + toplama argümanı → ortalama/amortize analiz, potansiyel fonksiyon kanıtları.

ÖnemliTek bir şey alıp gideceksen

Bellman-Ford’un sırrı tek bir gözlemdir — sonlu bir en kısa yol \(V-1\) kenardan uzun olamaz. Çizgeyi \(V+1\) seviyeye çoğaltıp çevrimsiz (DAG) hâle getirir, çözmeyi bildiğimiz DAG relaxation’ı çağırır; \(V\) kenarda hâlâ kısalan düğümleri “tanık” olarak yakalayıp onlardan erişilen her şeye \(-\infty\) yayar. Çevrimli/negatif problemi, çevrimsiz bir probleme indirger — bedeli yalnızca bir \(V\) faktörü, yani \(O(V \cdot E)\).