22  Tüm-Çiftler En Kısa Yollar (Johnson)

Her düğüme süpernode’dan en kısa mesafeyi potansiyel atayıp kenarları w′ = w + h(u) − h(v) ile yeniden ağırlıklandırırsak (üçgen eşitsizliği bunu negatif-olmayan yapar, telescoping en kısa yolları korur), negatif ağırlıklı tüm-çiftler en kısa yolu V×Dijkstra hızında O(V² log V + V·E) çözeriz — Johnson yeni bir algoritma değil, Bellman-Ford ile Dijkstra’yı birleştiren akıllı bir indirgemedir; çizge ünitesinin son dersi

NotBölüm bilgisi

Bu, çizge ünitesinin son dersidir. Tek kaynak yerine tüm düğüm çiftleri arasında en kısa yol: APSP (all-pairs shortest paths). Naif yol — her düğümden Bellman-Ford — \(O(V^2 \cdot E)\) (yoğun çizgede \(V^4\)’e yakın). Johnson, negatif ağırlıklı bir çizgeyi akıllıca yeniden ağırlıklandırıp Dijkstra’yı \(V\) kez çalıştırmayı mümkün kılar → \(O(V^2 \log V + V \cdot E)\), neredeyse doğrusal.

22.1 Bu Derste Ne Var?

Bu, çizge ünitesinin son dersi (Jason Ku). Tek kaynak yerine tüm düğüm çiftleri arasında en kısa yol: APSP. Naif yol — her düğümden Bellman-Ford — \(O(V^2 \cdot E)\) (yoğun çizgede \(V^4\)’e yakın). Johnson algoritması ise, negatif ağırlıklı bir çizgeyi akıllıca yeniden ağırlıklandırıp Dijkstra’yı \(V\) kez çalıştırmayı mümkün kılar → \(O(V^2 \log V + V \cdot E)\), neredeyse doğrusal.

“make edge weights non-negative while preserving shortest paths.” — Ku, 14:35

Üç ana fikir:

  1. APSP çıktısı \(\Theta(V^2)\) — her çift için bir sayı; doğrusaldan iyisini umut edemeyiz, ama V×Dijkstra’yı negatif ağırlıkta da istiyoruz.
  2. Potansiyel ile yeniden ağırlıklandırma — her düğüme bir potansiyel \(h(v)\) atayıp \(w'(u,v) = w(u,v) + h(u) - h(v)\); bu en kısa yolları korur (telescoping).
  3. \(h = \delta(s, v)\) — süpernode’dan en kısa mesafeyi potansiyel seçince, üçgen eşitsizliği kenarları negatif-olmayan yapar; sonra V×Dijkstra.
flowchart TD
    A["Ders 21 (L14): APSP ve Johnson"] --> O["APSP çıktısı Theta(V kare)"]
    O --> Oa["her (u,v) için bir sayı, doğrusaldan<br/>iyisi umulamaz; naif = V kez SSSP"]
    A --> B["Kötü fikir: sabit ekle"]
    B --> Ba["az-kenarlı yola önyargı,<br/>en kısa yolu BOZAR"]
    A --> P["Potansiyel dönüşümü"]
    P --> Pa["w-prime = w arti h(u) eksi h(v); telescoping<br/>iç potansiyeller iptal, en kısa yol KORUNUR"]
    A --> T["Üçgen eşitsizliği = h = delta(s,v)"]
    T --> Ta["h(v) en çok h(u) arti w(u,v), w-prime negatif-olmayan GARANTİ<br/>negatif-olmama = üçgen eşitsizliği"]
    A --> S["Süpernode + Bellman-Ford"]
    S --> Sa["s-yıldız her düğüme sıfır; gelen kenarı yok<br/>h = delta(s-yıldız), sonra V kez Dijkstra"]

    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 O,B,P,T,S branch
    class Oa,Ba,Pa,Ta,Sa leaf
Şekil 22.1: Ders 21’in (L14) kavram haritası: kök = APSP ve Johnson (Ku) — çizge ünitesinin son dersi; tüm-çiftler en kısa yol. Beş dal — (1) APSP çıktısı Theta(V kare): her (u,v) çifti için bir sayı, doğrusaldan iyisi umulamaz; naif = V kez SSSP. (2) Kötü fikir: her kenara sabit ekle; az-kenarlı yola önyargı, en kısa yolu bozar. (3) Potansiyel dönüşümü w’ = w + h(u) - h(v); telescoping ile iç potansiyeller iptal, en kısa yol korunur. (4) Üçgen eşitsizliği: negatif-olmama koşulu h(v) <= h(u) + w(u,v) tam olarak üçgen eşitsizliği; h = delta(s,v) seçimi w’ >= 0 garanti eder. (5) Süpernode: s* her düğüme sıfır ağırlık, gelen kenarı yok; Bellman-Ford ile h, sonra V kez Dijkstra. Sonuç: Johnson yeni algoritma değil, Bellman-Ford ile Dijkstra’yı birleştiren akıllı tutkal; O(V kare log V artı V çarpı E).
İpucuBuilder Notu — Johnson = Akıllı Tutkal

APSP’nin çıktısı zaten \(\Theta(V^2)\) — her çift için bir mesafe. Naif yol her düğümden Bellman-Ford’dur (\(O(V^2 \cdot E)\), yoğun çizgede \(V^4\)’e yakın). Johnson, negatif ağırlığı bir potansiyelle ortadan kaldırıp Dijkstra’yı \(V\) kez çalıştırarak bunu \(O(V^2 \log V + V \cdot E)\)’ye indirir. Yeni bir kanıt yoktur — ağır iş Bellman-Ford (bir kez) ve Dijkstra (V kez) kara kutularındadır.

  • İleriye → mesafe matrisi: APSP, yol ağında “tüm-çiftler süre matrisi” önbelleği (rota servisleri, lojistik optimizasyon) demektir.
  • İleriye → fark kısıtları: potansiyel/yeniden-ağırlıklandırma, fark-kısıt sistemleri (difference constraints) ve doğrusal programlama dualitesiyle akrabadır.
  • İleriye → reduction ustalığı: Johnson yeni bir algoritma değil — “imzalı problemi negatif-olmayan probleme indirgeyen tutkal”; OMSCS CS 6515 ana refleksi.
  • Geriye → Bellman-Ford + Dijkstra: Johnson ikisini kara kutu olarak birleştirir.

Tek cümle: Her düğüme süpernode’dan en kısa mesafeyi potansiyel atayıp kenarları \(w' = w + h(u) - h(v)\) ile yeniden ağırlıklandırırsak (üçgen eşitsizliği bunu negatif-olmayan yapar, telescoping en kısa yolları korur), negatif ağırlıklı APSP’yi V×Dijkstra hızında \(O(V^2 \log V + V \cdot E)\) çözeriz.

22.2 1. APSP Problemi ve \(\Theta(V^2)\) Çıktısı

APSP: ağırlıklı bir çizgede her \((u, v)\) çifti için \(\delta(u, v)\) döndür. (Negatif ağırlıklı çevrim varsa iptal et — bu derste yok varsayıyoruz, ama negatif kenarlar olabilir.)

“the shortest path distance from u to v for every u and v.” — Ku, 1:42

Çıktı boyutu \(\Theta(V^2)\) (her çift için bir sayı); dolayısıyla doğrusaldan (çizge boyutu) iyisini umut edemeyiz — en az karesel.

22.3 2. Naif Çözüm: V × SSSP

En basit yol: her düğümden bir SSSP algoritması. Seçeneğe göre:

  • V × Bellman-Ford: \(O(V^2 \cdot E)\) — genel ama yavaş (yoğun çizgede \(V^4\)’e yakın).
  • V × Dijkstra (ağırlık \(\geq 0\)): \(O(V^2 \log V + V \cdot E)\) — seyrek çizgede neredeyse doğrusal.

Seyrek çizgede fark: V×Bellman-Ford \(\sim V^3\), V×Dijkstra \(\sim V^2 \log V\) — tıpkı insertion sort (\(n^2\)) ile merge sort (\(n \log n\)) arasındaki ayrım. Hedef: negatif ağırlıklı çizgede de V×Dijkstra hızını elde etmek.

Şekil 22.2 bu manzarayı tek panelde toplar: solda örnek çizge ve \(4 \times 4\) \(\delta\) matrisi (motorun Johnson çıktısı; çıktı boyutu \(\Theta(V^2) = 16\) hücre), sağda iki naif yöntem — V×Bellman-Ford (\(O(V^2 \cdot E)\), yavaş) ile V×Dijkstra (hızlı, ama “\(w \geq 0\) şart” kilidiyle). Hedef, en altta: negatif ağırlıkta da V×Dijkstra hızını yakalamak → Johnson.

Şekil 22.2: APSP problemi + naif çözümler (Ku L14 §1-2): çıktı Θ(V²); naif = V × SSSP. SOL ÜST: örnek çizge (build_johnson_example) sabit yerleşim; düğüm = daire, kenar = yönlü ok + ağırlık rozeti; negatif kenarlar a→b(−2), c→d(−1) amber vurgulu. SOL ALT: 4×4 δ matrisi (motor johnson çıktısı; satır=kaynak, sütun=hedef; +∞ erişilmez; köşegen 0) + sağında “çıktı boyutu Θ(V²) = 16 hücre, doğrusaldan iyisi umulamaz” rozeti. SAĞ: iki naif yöntem — (1) V × Bellman-Ford O(V²·E) slate “yoğun graf ~V⁴ YAVAŞ”; (2) V × Dijkstra O(V² log V + V·E) amber “HIZLI” ama kilit ikonu “ağırlık ≥ 0 ŞART”. ALT NOT: hedef = negatif ağırlıkta da V × Dijkstra hızı → Johnson (make non-negative while preserving, Ku 14:35). Veri MOTORDAN: johnson == brute_apsp (V×BF bağımsız tanık BİREBİR); 4×4 = 16 hücre; δ[a]={a:0,b:−2,c:1,d:0}; δ[d]={a,b,c:+∞,d:0}.

22.4 3. Fikir: Yeniden Ağırlıklandırma

Anahtar fikir: kenar ağırlıklarını negatif-olmayan yapacak şekilde değiştir — ama en kısa yolları koruyarak.

“make edge weights non-negative while preserving shortest paths.” — Ku, 14:35

Başarırsak, yeni çizge \(G'\) üzerinde V×Dijkstra çalıştırıp, mesafeleri orijinal \(G\)’ye geri çeviririz. (Mümkün değildir eğer \(G\) negatif ağırlıklı çevrim içeriyorsa — o zaman en kısa yol basit değildir, oysa negatif-olmayan çizgede en kısa yollar basittir → çelişki.)

22.5 4. Kötü Fikir: Her Kenara Sabit Ekle

Akla gelen ilk şey: en küçük (negatif) ağırlığın tersini her kenara ekle → hepsi negatif-olmayan. Ama en kısa yolları bozar.

“Makes weights non-negative, but does not preserve shortest paths.” — Ku, 23:45

Neden? Her kenara aynı sabit eklemek, az kenarlı yollara önyargı (bias) yaratır: 3-kenarlı bir yol \(+3c\), 1-kenarlı yol \(+c\) artar. Kenar sayısı farklı yollar farklı değişir → en kısa yol değişebilir.

Şekil 22.3 bunu birebir bir karşı-örnekle gösterir: solda orijinal çizge (\(s \to t\) doğrudan = 3; \(s \to m \to t\) = 2; en kısa = 2-kenarlı yol), sağda her kenara \(+2\) eklenmiş hâli (doğrudan = 5; iki-kenarlı = 6; en kısa değişti → doğrudan kenar). Sebep: 2-kenarlı yol \(+2c\) kayar, 1-kenarlı yol \(+c\) kayar — farklı kayma sıralamayı bozar. Doğru dönüşüm (potansiyel) her yolu aynı sabitle kaydırmalıdır.

Şekil 22.3: KÖTÜ FİKİR (Ku L14 §4): her kenara sabit ekle — kenar sayısına bağlı kayma en kısa yolu DEĞİŞTİRİR. İki panel, aynı üçgen çizge (s, m, t; doğrudan s→t alt kenar). SOL — ORİJİNAL: s→t (1 kenar) = 3, s→m→t (2 kenar) = 2; KAZANAN iki-kenarlı yol amber (2 < 3). SAĞ — HER KENARA +2: s→t = 5, s→m→t = 6; KAZANAN DEĞİŞTİ → doğrudan kenar amber + “✗ en kısa yol DEĞİŞTİ” uyarı rozeti (2-kenarlı +2c=+4 ≠ 1-kenarlı +c=+2). ORTA kutu: k-kenarlı yol +k·c kayar; farklı kenar sayısı → farklı kayma → sıralama bozulur (Ku 23:45). ALT NOT: doğru dönüşüm her yolu AYNI sabitle kaydırmalı → potansiyel h: w′ = w + h(u) − h(v) telescoping; sağlama (motor) build_johnson_example reweight w′ = {ab:0, ac:4, bc:1, bd:1, cd:0} HEPSİ ≥ 0. Veri MOTORDAN (path_weight): orijinal 3 vs 2, +c sonrası 5 vs 6; kayma 1-kenarlı +2, 2-kenarlı +4; kazanan yer değiştirdi.

22.6 5. İyi Fikir: Potansiyel Dönüşümü

Daha akıllı dönüşüm: bir düğüm \(v\) için, tüm çıkış kenarlarına \(h\) ekle, tüm giriş kenarlarından \(h\) çıkar.

“If I add a number to all outgoing edges from a vertex, and I subtract that same number from the weights of all of the incoming edges… preserves shortest paths.” — Ku, 25:20

Çalışılan Örnek — neden korur. Bir yolu düşün: \(v\)’den geçen her yol, \(v\)’ye bir giriş kenarı (\(-h\)) ve bir çıkış kenarı (\(+h\)) kullanır → değişim iptal olur (net 0). \(v\)’ye hiç değmeyen yol etkilenmez. Yalnızca \(v\)’nin başlangıç (yol \(+h\)) veya bitiş (yol \(-h\)) olduğu durumda değişir — ama o zaman \(v\)’den çıkan/giren tüm yollar aynı miktarda değişir → en kısa yol yine en kısa kalır.

22.7 6. Potansiyel Fonksiyon ve Telescoping

Bunu her düğüme bağımsız uygula: bir potansiyel fonksiyonu \(h: V \to \mathbb{Z}\). Yeni çizge \(G'\): her kenar \(w'(u, v) = w(u, v) + h(u) - h(v)\).

“define a potential function h that maps vertices to integers.” — Ku, 31:39

Çalışılan Örnek — telescoping kanıtı. \(v_0 \to v_1 \to \ldots \to v_k\) yolunun yeni ağırlığı: \(\sum [w(v_{i-1}, v_i) + h(v_{i-1}) - h(v_i)]\). Ara terimler teleskoplanır (her iç düğümün \(+h\) ve \(-h\)’si iptal) → \(w'(v_0 \to v_k) = w(v_0 \to v_k) + h(v_0) - h(v_k)\). Yani \(v_0\)’dan \(v_k\)’ya her yol aynı sabit (\(h(v_0) - h(v_k)\)) kadar değişir → en kısa yol değişmez.

Şekil 22.4 Johnson’ın imza fikrini gösterir: üstte \(a \to b \to c\) yolu, her kenarın üstünde dönüşüm açılımı (\(w'(a,b) = -2 + 0 - (-2) = 0\), \(w'(b,c) = 3 + (-2) - 0 = 1\)); ortada telescoping — iki açılım alt alta, iç terimler \(-h(b)\) ve \(+h(b)\) amber çift-çizgiyle iptal, geriye \(w(a \to c) + h(a) - h(c)\) kalır; sağda geçiş düğümü sezgisi (\(-h(v) + h(v) = 0\)); altta sonuç — her yol aynı sabitle kayar, en kısa yol korunur, üstelik \(h = \delta(s^*, v)\) seçimiyle \(w' \geq 0\).

Şekil 22.4: Potansiyel dönüşümü + telescoping (Ku L14 §5-6 İMZA): w′(yol) = w(yol) + h(başlangıç) − h(bitiş). ÜST: yol a → b → c, her kenar üstünde dönüşüm açılımı w′(a,b)=w(a,b)+h(a)−h(b) (= −2+0−(−2) = 0) ve w′(b,c)=w(b,c)+h(b)−h(c) (= 3+(−2)−0 = 1). ORTA TELESCOPING: iki açılım alt alta; iç terimler −h(b) (satır 1) ve +h(b) (satır 2) AMBER çift-çizgiyle iptal (−h(b)+h(b)=0); kalan w(yol)+h(a)−h(c) kutuda (= 1+0−0 = 1). SAĞ mini panel: v’den GEÇEN yol için ara düğüm gelen kenar … −h(v), giden kenar +h(v) … → net 0 (Ku 25:20). ALT şerit SONUÇ: aynı (u,v) çifti arasındaki HER yol AYNI sabitle h(u)−h(v) kayar → SIRALAMA değişmez, en kısa yol KORUNUR; ayrıca h(v)=δ(s*,v) seçimiyle w′ ≥ 0 (üçgen eşitsizliği) → Dijkstra. Veri MOTORDAN: h = {a:0, b:−2, c:0, d:−1}; w′ = {ab:0, ac:4, bc:1, bd:1, cd:0} HEPSİ ≥ 0; path_weight(wp,[a,b,c]) == path_weight(w,[a,b,c]) + h[a] − h[c] (1 == 1+0−0); johnson == brute_apsp (telescoping en kısa yolu korur).

22.8 7. Negatif-Olmama Koşulu = Üçgen Eşitsizliği

Hangi \(h\) kenarları negatif-olmayan yapar? \(w'(u, v) = w(u, v) + h(u) - h(v) \geq 0\) koşulunu düzenle:

\[h(v) \leq h(u) + w(u, v)\]

“That looks like almost exactly the definition of the triangle inequality.” — Ku, 40:16

Bu, üçgen eşitsizliğinin ta kendisi! Demek ki \(h(v) = \delta(s, v)\) (bir kaynaktan en kısa mesafe) seçersek — ve bu mesafeler sonluysa — koşul kendiliğinden sağlanır. Reweight sonrası tüm kenarlar negatif-olmayan olur.

Şekil 22.5 bu denkliği üç bölgede gösterir: solda cebirsel türetme (\(w'(u,v) \geq 0 \Leftrightarrow w(u,v) + h(u) - h(v) \geq 0 \Leftrightarrow h(v) \leq h(u) + w(u,v)\) = üçgen eşitsizliği), ortada üçgen şeması (\(s^*\) tepe, \(u\) ve \(v\) alt; \(h(v) \leq h(u) + w\)), sağda 5-kenarlı reweight tablosu (her satırda \(w / h(u) / h(v) / w'\); hepsi \(\geq 0\)). Altta: \(h = \delta(s^*, \cdot)\) seçersek üçgen eşitsizliği otomatik sağlanır.

Şekil 22.5: Negatif-olmama koşulu w′(u,v) ≥ 0 = üçgen eşitsizliği h(v) ≤ h(u) + w(u,v) (Ku L14 §7, 40:16 “almost exactly the definition”). SOL: cebir kutusu adım adım — w′(u,v) ≥ 0 İSTE ⇕ w(u,v)+h(u)−h(v) ≥ 0 ⇕ h(v) ≤ h(u)+w(u,v); son satır amber “BU ÜÇGEN EŞİTSİZLİĞİ”. ORTA: üçgen şeması s* (süpernode/kaynak, tepe) → u (mesafe h(u)) + s* → v (mesafe h(v)) + kenar u→v (ağırlık w, amber kapanış); sonuç rozeti h(v) ≤ h(u) + w(u,v); “s’tan v’ye en kısa yol u üzerinden gitmekten kötü olamaz”. SAĞ: 5 kenar tablosu (a→b, a→c, b→c, b→d, c→d), her satırda w / h(u) / h(v) / w′ = w+h(u)−h(v) ve ✓ (hepsi ≥ 0); altta “TÜM w′ ≥ 0 — negatif-olmama SAĞLANDI”. ALT NOT: h = δ(s,·) en kısa mesafe SEÇERSEK üçgen eşitsizliği OTOMATİK → tüm w′ ≥ 0 GARANTİ; süpernode s* her düğüme erişir + gelen kenarı yok → yeni negatif çevrim yaratmaz. Veri MOTORDAN: h = {a:0, b:−2, c:0, d:−1}; w′ = {ab:0, ac:4, bc:1, bd:1, cd:0} HEPSİ ≥ 0; johnson == brute_apsp (V×BF bağımsız tanık BİREBİR).

22.9 8. Süpernode ile Potansiyeli Hesapla

Sorun: tüm düğümlere erişebilen bir kaynak olmayabilir (çizge bağlı olmayabilir). Çözüm: süpernode.

“Add new vertex s with 0-weight edge to every vertex.” — Ku, 42:00

Yeni süpernode \(s\)’ten her düğüme 0-ağırlıklı kenar ekle (\(G_s\)). \(s\)’ten Bellman-Ford ile \(\delta(s, v)\) hesapla (negatif ağırlık olabileceğinden Dijkstra değil). İki durum: $(s, v) = $ eksi sonsuz ise negatif çevrim vardır (\(s\)’in gelen kenarı yok → çevrim \(s\)’ten geçemez → orijinal \(G\)’de) → iptal et. Aksi halde tüm \(\delta(s, v)\) sonlu → \(h(v) = \delta(s, v)\) geçerli potansiyel.

Şekil 22.6 bu adımı gösterir: solda örnek çizge + üstte süpernode \(s^*\), ondan her düğüme 0-ağırlıklı kesikli kenarlar, “\(s^*\)’e gelen kenar yok → yeni çevrim yaratmaz” rozeti, her düğümün altında Bellman-Ford’la hesaplanan \(h(v)\) (\(a{:}0\), \(b{:}{-2}\), \(c{:}0\), \(d{:}{-1}\)); sağda İPTAL durumu — D18’in negatif-çevrimli örneği (\(b \to c \to d \to b = -2\)), johnson() None döner ($= $ eksi sonsuz tespit).

Şekil 22.6: Johnson §8 (Ku L14, 42:00): süpernode s* + Bellman-Ford → potansiyel h(v) = δ(s, v) → reweight w′ ≥ 0. SOL: örnek çizge (build_johnson_example) + ÜSTTE süpernode s (büyük amber); s’den her düğüme 0-ağırlıklı KESİKLİ kenar (“0” rozetli); “s’e GELEN kenar YOK → yeni çevrim yaratmaz” amber rozeti; her düğüm altında h = δ(s, v) rozeti (a:0, b:−2, c:0, d:−1); orijinal negatif kenarlar a→b(−2), c→d(−1) amber;”h Bellman-Ford ile — negatif kenar var → Dijkstra OLMAZ” notu. SAĞ mini panel — İPTAL durumu: D18 örnek çizgesi (çevrim b→c→d→b = −2); s eklenip Bellman-Ford koşunca çevrimden erişilen b,c,d → δ = −∞ → johnson() = None → “NEGATİF ÇEVRİM → İPTAL” kutusu. ALT NOT: Ku 42:00 “add new vertex with 0-weight edges”; s*’e gelen kenar yok → çevrim yaratmaz; h sonsuz değilse w′ = w + h(u) − h(v) ≥ 0 GARANTİ (üçgen eşitsizliği) → V × Dijkstra mümkün. Veri MOTORDAN: h = {a:0, b:−2, c:0, d:−1}; w′ = {ab:0, ac:4, bc:1, bd:1, cd:0} HEPSİ ≥ 0; johnson == brute_apsp; johnson(build_bf_example()) is None (İPTAL); çevrim b→c→d→b ağırlığı = −2.

22.10 9. Johnson Algoritması ve Çalışma Süresi

Johnson, bir indirgeme algoritmasıdır: imzalı (signed) APSP → negatif-olmayan APSP.

“It’s really a reduction problem or a reduction algorithm.” — Ku, 47:08

def johnson(graph):
    # 1. Supernode s ekle: s'ten her dugume 0-agirlikli kenar
    Gs = add_supernode(graph)
    # 2. Bellman-Ford ile h(v) = delta(s, v)
    h = bellman_ford(Gs, source=s)          # O(V*E)
    if any(h[v] == float('-inf') for v in graph):
        return "NEGATIF CEVRIM"             # iptal
    # 3. Yeniden agirliklandir: w'(u,v) = w(u,v) + h(u) - h(v)  >= 0
    G_prime = reweight(graph, h)            # O(E)
    # 4. Her dugumden Dijkstra (G' negatif-olmayan)
    delta_prime = {u: dijkstra(G_prime, u) for u in graph}   # V * Dijkstra
    # 5. G mesafelerini geri cevir: delta(u,v) = delta'(u,v) - h(u) + h(v)
    return recover_original_distances(delta_prime, h)        # O(V*(V+E))

Çalışma süresi. (1) \(O(V+E)\), (2) Bellman-Ford \(O(V \cdot E)\), (3) \(O(E)\), (4) V×Dijkstra \(O(V^2 \log V + V \cdot E)\), (5) \(O(V \cdot (V+E))\). Baskın terim (4) → \(O(V^2 \log V + V \cdot E)\).

“Johnson’s is really just glue to transform a graph in a clever way.” — Ku, 56:24

Yeni bir tümevarım/kanıt yok; ağır iş Bellman-Ford (bir kez) + Dijkstra (V kez) kara kutularında. Johnson yalnızca “akıllı tutkal”. Negatif ağırlıklı APSP’yi, V×Bellman-Ford’un \(V^3\)’ünden çok daha hızlı, seyrek çizgede neredeyse doğrusal çözer.

Şekil 22.7 beş adımı dikey bir akışta toplar: (1) süpernode ekle \(O(V+E)\), (2) Bellman-Ford \(O(V \cdot E)\) — Ders 18 kara kutusu, eksi sonsuz çıkarsa İPTAL, (3) reweight \(O(E)\), (4) V×Dijkstra \(O(V^2 \log V + V \cdot E)\) — Ders 19 kara kutusu, BASKIN terim, (5) geri çevir \(O(V(V+E))\); toplam \(O(V^2 \log V + V \cdot E)\). Sağda örnek çizge (\(w \to w'\) rozetleriyle) ve “Johnson = yeni algoritma değil, akıllı tutkal/indirgeme” yan notu.

Şekil 22.7: Johnson APSP boru hattı (Ku L14 §9 İMZA): süpernode + Bellman-Ford potansiyeli + V×Dijkstra → O(V² log V + V·E). 5 adım dikey akış: (1) SÜPERNODE EKLE — s* → her düğüme 0 ağırlık, GELEN kenarı yok, O(V+E); (2) BELLMAN-FORD — h = δ(s*,·) potansiyeli (Ders 18 KARA KUTU), −∞ çıkarsa NEGATİF ÇEVRİM → İPTAL, O(V·E); (3) REWEIGHT — w′ = w + h(u) − h(v) ≥ 0 (üçgen garanti, en kısa yolları KORUR), O(E); (4) V × DIJKSTRA — her düğümden Dijkstra (Ders 19 KARA KUTU, w′ ≥ 0 geçerli), BASKIN terim, O(V²logV + V·E); (5) GERİ ÇEVİR — δ(u,v) = δ′(u,v) − h(u) + h(v), O(V(V+E)). TOPLAM O(V²logV + V·E). Sağ panel: örnek çizge, kenar rozeti w → w′ (a→b −2→0, a→c 4→4, b→c 3→1, b→d 2→1, c→d −1→0), düğüm potansiyeli h = {a:0, b:−2, c:0, d:−1}. Yan not: Johnson = YENİ algoritma DEĞİL, akıllı TUTKAL/indirgeme; iki büyük kara kutuyu (Ders 18 + Ders 19) birleştirir; çizge ünitesinin KAPANIŞ dersi (Ku 47:08 + 56:24 “just glue”). Veri MOTORDAN: h ve w′ EXACT; johnson == brute_apsp (V×BF BAĞIMSIZ tanık); δ(a,d) = 0 = path_weight(w,[a,b,d]).

22.11 Bu Dersin Özeti

  1. APSP: tüm çift \(\delta(u, v)\); çıktı \(\Theta(V^2)\); negatif çevrim → iptal.
  2. Naif: V×Bellman-Ford \(O(V^2 \cdot E)\) / V×Dijkstra \(O(V^2 \log V + V \cdot E)\).
  3. Yeniden ağırlıklandırma: kenarları negatif-olmayan yap ama en kısa yolları koru → \(G'\)’de V×Dijkstra.
  4. Kötü fikir: sabit ekle → az-kenarlı yollara bias, bozar.
  5. Potansiyel \(h\): \(w' = w + h(u) - h(v)\); telescoping ile en kısa yol korunur.
  6. \(h(v) = \delta(s, v)\): negatif-olmama koşulu = üçgen eşitsizliği.
  7. Süpernode + Bellman-Ford: \(h\)’yi hesapla, negatif çevrimi yakala; sonra V×Dijkstra → \(O(V^2 \log V + V \cdot E)\).
ÖnemliTek Bir Cümle

Johnson, süpernode’dan Bellman-Ford ile bulduğu \(\delta(s,v)\)’yi potansiyel yapıp kenarları \(w' = w + h(u) - h(v)\) ile negatif-olmayana çevirir (üçgen eşitsizliği garanti eder, telescoping en kısa yolları korur), sonra V×Dijkstra çağırarak imzalı APSP’yi \(O(V^2 \log V + V \cdot E)\)’de çözer.

22.12 Kontrol Soruları

Cevap: Her kenara aynı \(c\) eklemek, bir yolun ağırlığını (kenar sayısı)×\(c\) kadar artırır — yani farklı kenar sayılı yollar farklı değişir, az-kenarlı yola önyargı doğar; eskiden en kısa olan çok-kenarlı yol artık en kısa olmayabilir. Potansiyel dönüşümünde \(w' = w + h(u) - h(v)\); bir yol boyunca ara düğümlerin \(+h(u)\) ve \(-h(v)\) terimleri teleskoplanır, yalnızca \(h(v_0) - h(v_k)\) kalır. Yani aynı \((v_0, v_k)\) çifti arasındaki her yol aynı sabit kadar değişir — göreli sıralama korunur, en kısa yol yine en kısa kalır.

Cevap: Reweight sonrası kenarların negatif-olmaması için \(w(u, v) + h(u) - h(v) \geq 0\), yani \(h(v) \leq h(u) + w(u, v)\) gerekir — bu tam olarak üçgen eşitsizliğidir. En kısa yol mesafeleri \(\delta(s, \cdot)\) üçgen eşitsizliğini her zaman sağlar (\(\delta(s, v) \leq \delta(s, u) + w(u, v)\)). Dolayısıyla \(h(v) = \delta(s, v)\) seçilirse, tüm yeni kenar ağırlıkları otomatik olarak negatif-olmayan olur — başka bir koşul aramaya gerek kalmaz.

Cevap: \(h(v) = \delta(s, v)\)’yi hesaplamak için tüm düğümlere sonlu mesafede ulaşan bir kaynak gerekir; ama orijinal çizge bağlı olmayabilir, hiçbir düğüm hepsine ulaşamayabilir (ulaşılamayan için $= $ artı sonsuz, işe yaramaz). Süpernode \(s\), her düğüme 0-ağırlıklı kenarla bağlanır → her düğüme sonlu (\(\leq 0\)) mesafe. Yeni negatif çevrim yaratmaz çünkü \(s\)’in hiç gelen kenarı yoktur — hiçbir çevrim \(s\)’ten geçemez. Dolayısıyla Bellman-Ford bir eksi sonsuz bulursa, o çevrim zaten orijinal \(G\)’de vardı → güvenle iptal edilir.

Cevap: Johnson kendi başına yeni bir tümevarım/kanıt veya çekirdek hesaplama içermez; ağır işi zaten bildiğimiz iki kara kutu yapar: Bellman-Ford (potansiyeli bulmak için bir kez) ve Dijkstra (negatif-olmayan \(G'\) üzerinde V kez). Johnson’ın katkısı, imzalı (negatif ağırlıklı) problemi, Dijkstra’nın çalışabileceği negatif-olmayan bir probleme indirgeyen akıllı yeniden-ağırlıklandırmadır. Yani bir reduction: zor bağlamı, hızlı çözebildiğimiz kolay bağlama çeviren tutkal.

22.13 Egzersizler

Egzersiz 1. Küçük bir negatif-kenarlı (çevrimsiz) çizgede süpernode ekle, Bellman-Ford ile \(h(v) = \delta(s, v)\) hesapla, kenarları \(w'\) ile yeniden ağırlıklandır; tüm \(w' \geq 0\) olduğunu doğrula.

Egzersiz 2. Telescoping kanıtını bir yol üzerinde adım adım yaz: ara terimlerin iptal olup \(w(v_0 \to v_k) + h(v_0) - h(v_k)\) kaldığını göster.

Egzersiz 3. “Her kenara sabit ekle” fikrinin bir karşı-örneğini kur: iki düğüm arasında farklı kenar sayılı iki yolla, sabit eklemenin en kısayı değiştirdiğini göster.

Egzersiz 4. Johnson’ı Python’da yaz (Bellman-Ford + reweight + V×Dijkstra); çalışma süresinin \(O(V^2 \log V + V \cdot E)\) olduğunu argümanla göster.

Egzersiz 5. Süpernode’un gelen kenarı olmamasının neden kritik olduğunu, gelen kenarı olsaydı hangi yanlış sonucun doğabileceğini açıkla.

22.14 Sonraki Ders İçin Hazırlık

UyarıSonraki: Ders 23 (L15) — Dinamik Programlama 1 (Erik Demaine)

Ders 23 (L15): Dinamik Programlama — 1 (Erik Demaine). Araya Ders 22 (Quiz 2 Gözden Geçirme) girer; çizge ünitesinin son dersi olan bu Johnson dersini ve önceki ağırlıklı en kısa yol derslerini quizden önce gözden geçirme fırsatıdır.

Yeni bir üniteye geçiyoruz: artık size hazır bir algoritma sunmak yerine, kendi algoritmanızı tasarlamayı öğreteceğiz — dinamik programlama (DP). En kısa yolların “optimal alt yapı” ve “örtüşen alt problemler” sezgileri, DP’nin temelini oluşturur.

Ders 23 Öncesi Yapılacak:

  • Bu dersin egzersizlerini, özellikle Egzersiz 1 (reweight) ve 2 (telescoping) çöz.
  • Johnson’ın 5 adımını ve her adımın süresini ezberden anlat.
  • Ana cümleyi tekrar oku: “Süpernode’dan δ(s,v)’yi potansiyel yap, reweight et, V×Dijkstra çalıştır.”

22.15 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Sayfada
APSP Tüm çift \(\delta(u,v)\); çıktı \(\Theta(V^2)\); negatif çevrim → iptal Böl. 1
Naif çözüm V×Bellman-Ford \(O(V^2 \cdot E)\) / V×Dijkstra \(O(V^2 \log V + V \cdot E)\) Böl. 2
Yeniden ağırlıklandırma Kenarları \(\geq 0\) yap, en kısa yolları koru Böl. 3
Sabit ekleme (kötü) Az-kenarlı yola bias → bozar Böl. 4
Potansiyel \(h\) \(w' = w + h(u) - h(v)\); telescoping korur Böl. 5-6
\(h = \delta(s,v)\) Negatif-olmama = üçgen eşitsizliği Böl. 7
Süpernode \(s \to\) her düğüm 0-ağırlık; Bellman-Ford; eksi sonsuz → iptal Böl. 8
Johnson süresi \(O(V^2 \log V + V \cdot E)\) (V×Dijkstra baskın) Böl. 9

22.16 Builder ve OMSCS Bağlantıları

İpucu6 köprü

Bu ders, APSP çıktısının zorunlu \(\Theta(V^2)\) alt sınırından başlayıp Johnson’ın akıllı indirgemesiyle negatif ağırlıklı tüm-çiftler en kısa yolu neredeyse doğrusala indirir — köprülerin özeti:

  1. APSP → yol ağı mesafe matrisi (rota servisi önbelleği), lojistik, ağ gecikme matrisi.
  2. Potansiyel / yeniden ağırlıklandırma → fark-kısıt sistemleri (difference constraints), doğrusal programlama dualitesi.
  3. Üçgen eşitsizliği = negatif-olmama → metrik gömme, geçerli sezgisel (admissible heuristic) tasarımı.
  4. Süpernode → çok-kaynak/çok-hedef indirgemesi (akış, kümeleme).
  5. Johnson = reduction → “zor bağlamı kolay kara kutuya çevir”; OMSCS CS 6515 indirgeme refleksi.
  6. Negatif çevrim tespiti (tek Bellman-Ford) → erken durma ile büyük iş tasarrufu; arbitraj/tutarsızlık kontrolü.

ÖnemliTek bir şey alıp gideceksen

Johnson, negatif ağırlıklı tüm-çiftler en kısa yolu, V×Bellman-Ford’un yavaşlığına katlanmadan çözer. Sırrı bir potansiyel fonksiyonudur: süpernode’dan Bellman-Ford ile bulunan \(\delta(s,v)\)’yi her düğüme atayıp kenarları \(w' = w + h(u) - h(v)\) ile yeniden ağırlıklandırır. Üçgen eşitsizliği bunu negatif-olmayan yapar, telescoping en kısa yolları korur — böylece hızlı Dijkstra’yı V kez çalıştırabiliriz. Johnson yeni bir algoritma değil; zor problemi kolay kara kutuya çeviren akıllı bir indirgemedir. Bununla çizge ünitesi kapanır; sırada algoritma tasarlamayı öğreten dinamik programlama var.