17  Ağırlıklı En Kısa Yollar

Kenarlara tamsayı ağırlık w: E → ℤ verince en kısa yol = toplam ağırlığın minimumu; iki yeni tuzak (yol yok → +∞, negatif çevrim erişilir → −∞); mesafe yeter (ebeveyn işaretçileri δ’dan O(V+E)’de kurulur); bir DAG’da SSSP’yi ∞’dan başlayan tahminleri topolojik sırada üçgen eşitsizliğine göre güvenle gevşeterek O(V+E)’de çöz; algoritma haritası DAG / Bellman-Ford / Dijkstra

NotBölüm bilgisi

Bir önceki ders BFS/DFS ile uzaklığı kenar sayısıyla ölçtü; bu ders her kenara bir tamsayı ağırlık verir ve “en az kenar” yerine “en az toplam ağırlık” arar. Bu, sonraki dört dersin (DAG relaxation, Bellman-Ford, Dijkstra, Johnson) temelidir.

17.1 Bu Derste Ne Var?

Şimdiye dek uzaklığı kenar sayısıyla ölçtük (BFS/DFS). Bugün Jason Ku ile ağırlıklı en kısa yollar ünitesini açıyoruz: her kenara bir tamsayı ağırlık veririz ve iki düğüm arasında “en az kenar” yerine “en az toplam ağırlık” ararız. Bu genelleştirme, sonraki dört dersin (DAG relaxation, Bellman-Ford, Dijkstra, Johnson) temelidir.

“instead of… the number of edges in a path… we’re going to count an integer associated with that edge. It’s going to be called a weight.” — Ku, 3:33

Üç ana fikir bu derste yan yana gelir:

  1. Ağırlıklı en kısa yol \(\delta(s, t)\) — yol ağırlıklarının minimumu; iki yeni tuzak: yol yoksa \(+\infty\), negatif ağırlıklı çevrim erişilirse \(-\infty\).
  2. Mesafe yeter — yalnızca \(\delta\) mesafelerini hesapla; ebeveyn işaretçilerini sonradan doğrusal zamanda kur.
  3. DAG relaxation — bir DAG’da, topolojik sırada kenar gevşetme (relax) ile SSSP’yi \(O(V + E)\)’de çöz.
flowchart TD
    A["Ders 16 (L11): Ağırlıklı En Kısa Yollar"] --> W["ağırlık fonksiyonu w<br/>her kenara tamsayı ağırlık"]
    W --> W1["yol ağırlığı = kenar ağırlıkları toplamı<br/>en kısa yol = minimum toplam ağırlık"]
    A --> T["iki tuzak<br/>arti sonsuz / eksi sonsuz"]
    T --> T1["yol yok → arti sonsuz (erişilemez)<br/>negatif çevrim → eksi sonsuz (infimum)"]
    A --> M["algoritma haritası<br/>DAG · Bellman-Ford · Dijkstra"]
    M --> M1["kısıt azaldıkça süre artar<br/>DAG doğrusal → Bellman-Ford genel"]
    A --> P["mesafe yeter<br/>ebeveyn sonradan"]
    P --> P1["yalnız mesafeyi hesapla<br/>ebeveyn işaretçisi δ'dan doğrusal"]
    A --> R["DAG relaxation<br/>üçgen eşitsizliği"]
    R --> R1["sonsuzdan başla, topolojik sırada gevşet<br/>güvenli relax → doğrusal"]

    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 W,T,M,P,R branch
    class W1,T1,M1,P1,R1 leaf
Şekil 17.1: Ders 16’nın (L11) kavram haritası: kök = ağırlıklı en kısa yollar (Ku). Beş dal — (1) ağırlık fonksiyonu w: her kenara tamsayı ağırlık (pozitif, negatif ya da sıfır); yol ağırlığı = kenar ağırlıklarının toplamı; en kısa yol = minimum toplam ağırlık. (2) iki tuzak: yol yoksa arti sonsuz (erişilemez); negatif ağırlıklı çevrim erişilirse eksi sonsuz (minimum yok, infimum). (3) algoritma haritası: kısıt azaldıkça süre doğrusaldan uzaklaşır — DAG relaxation doğrusal, Bellman-Ford genel, Dijkstra negatif yok. (4) mesafe yeter: yalnız mesafeyi hesapla; ebeveyn işaretçileri sonradan doğrusal zamanda kurulur. (5) DAG relaxation: tahminleri sonsuzdan başlat, topolojik sırada üçgen eşitsizliğine göre güvenle gevşet, doğrusalda bitir. Sonuç: tek gevşetme tekniği, dört dersin temeli.
İpucuBuilder Notu — Ağırlık Girince Dünya Değişir

BFS/DFS, “en az kenar” sorusunu doğrusal zamanda çözdü. Kenarlara ağırlık verince soru değişir: artık kenar saymıyoruz, toplam ağırlığı topluyoruz — ve iki yeni tuzak doğuyor (yol yok, negatif çevrim). Önce neyi sorduğumuzu (ağırlıklı en kısa yol), sonra nasıl çözdüğümüzü (DAG relaxation) ele alırız.

  • İleriye → GPS/yönlendirme: ağırlıklı en kısa yol, Google Maps’in özüdür (kenar = yol, ağırlık = süre/mesafe); ağ gecikmesi (latency) yönlendirmesi de aynı.
  • İleriye → kritik yol/zamanlama: DAG relaxation, proje zamanlama (PERT/CPM) ve build sistemlerinde “en uzun/en kısa yol” hesabıdır.
  • İleriye → sezgisel arama: üçgen eşitsizliği (triangle inequality), sezgisel-yönlü A* aramasının teorik dayanağıdır.
  • Geriye → BFS (Ders 13): ağırlıksız en kısa yolu BFS verdi; bu ders onu genelleştirir — BFS, tüm ağırlıklar eşit olan özel durumdur.

Tek cümle: Kenarlara ağırlık verince “en kısa yol” toplam ağırlığın minimumu olur; bir DAG’da bunu, mesafe tahminlerini topolojik sırada üçgen eşitsizliğine göre gevşeterek \(O(V + E)\)’de çözeriz.

17.2 1. Ağırlıksızdan Ağırlığa: Neden ve Nasıl

Son iki ders BFS/DFS ile ağırlıksız problemleri (SSSP, erişilebilirlik, bağlı bileşenler, topolojik sıralama) doğrusal zamanda çözdü. Şimdi genelleştiriyoruz: her kenara bir tamsayı ağırlık atayan bir ağırlık fonksiyonu \(w: E \to \mathbb{Z}\). Ağırlıklar pozitif, negatif veya sıfır olabilir.

Neden? Gerçek uygulamalar: yol ağında mesafe/süre (Vassar Street ile Amherst arası kısa, köprü uzun), ağ gecikmesi, sosyal ağda ilişki gücü (hatta “frenemy” için negatif).

17.3 2. Ağırlık Gösterimi

Çizgeyi komşuluk listesiyle saklıyorduk; ağırlığı iki yolla ekleriz:

  • Komşulukla birlikte: her komşuyu ağırlığıyla bir ikili (tuple) olarak sakla.
  • Ayrı sözlük: kenarları ağırlıklarına eşleyen ayrı bir hash tablosu (edge → weight).

Tek varsayım: bir kenarın ağırlığı \(O(1)\)’de sorgulanabilir (hash tablosu veya hash-tablosu-of-hash-tablosu).

17.4 3. Ağırlıklı Yol ve En Kısa Yol

Bir yolun ağırlığı \(w(\pi)\), yoldaki kenarların ağırlıklarının toplamıdır.

“the weight of a path… is just going to be the sum of the weights in the edges in the path.” — Ku, 11:08

Örneğin §4’te kullanacağımız çizgede \(a \to b \to f \to g = -5 + (-4) + 2 = -7\). Ağırlıklı en kısa yol, iki düğüm arasında minimum ağırlıklı yoldur.

“a shortest path… is a minimum weight path from s to t.” — Ku, 13:29

Mesafeyi \(\delta(s, t)\) ile gösteririz: \(s\)’den \(t\)’ye tüm yolların ağırlık minimumu. (Uyarı: ağırlıklı yol bir kenarı birden çok kez kullanabilir — basit yol değilse; en kısa yolların bunu yapmadığını sonra göreceğiz.)

Şekil 17.2 ağırlıklı bir DAG üzerinde yol ağırlığı fikrini gösterir: her kenarda bir ağırlık rozeti var (negatif \(g \to d = -2\) amber vurgulu), vurgulu yol \(\pi = e \to f \to g \to d\) amber kalın, altta toplam kutusu \(w(\pi) = 3 + 2 + (-2) = 3\) — kenar ağırlıklarının toplamı (kenar sayısı değil).

Şekil 17.2: Ağırlıklı çizge: w: E → ℤ ve yol ağırlığı = kenar ağırlıklarının TOPLAMI (L11 §1-3). Örnek ağırlıklı DAG (kaynak e): kenarlar e→f(3), f→h(8), f→g(2), g→h(1), g→d(−2 AMBER negatif), d→c(5); a, b ayrık üst köşe (e’den ERİŞİLMEZ → δ=+∞, soluk çizilir). Vurgulu yol π = e→f→g→d amber kalın; sağ alt toplam kutusu w(π) = 3 + 2 + (−2) = 3 (kenar ağırlıklarının TOPLAMI, kenar SAYISI değil). Yan kutu: ağırlık fonksiyonu w: E → ℤ — pozitif, negatif ya da sıfır olabilir (gerçek hayat: yol = süre, ağ = gecikme). Alt not: en kısa yol δ(s,t) = MİNİMUM toplam ağırlıklı yol (artık en az kenar değil; negatif kenar daha uzun bir yolu kısaltabilir). Veri MOTORDAN: path_weight(w, [e,f,g,d]) = 3 + 2 + (−2) = 3 (Ku 11:08, 13:29).

17.5 4. İki Tuzak: +∞ ve −∞

\(\delta\) tanımında iki şey ters gidebilir:

  1. Yol yoksa: \(\delta(s, t) = +\infty\) (uzlaşım, BFS’teki gibi).
  2. Sonlu en kısa yol yoksa: kenarları döne döne giderek daha kısa bir yol bulunabiliyorsa \(\delta\) tanımsızdır; bu durumda \(\delta = -\infty\) (minimum değil, infimum).

“It’s possible that a finite length shortest path doesn’t exist.” — Ku, 15:26

Çalışılan Örnek — negatif ağırlıklı çevrim. Bu, negatif ağırlıklı çevrim olduğunda olur. Örnek çizgede \(b \to f \to g \to c \to b = (-4) + 2 + 1 + (-1) = -2\). \(b\)’ye \(-5\) ağırlıklı kenarla varıp bu çevrimde her tur \(-2\) kazanırsak, sonsuza dek küçülürüz → sonlu en kısa yol yok.

“we could have negative weight cycles.” — Ku, 18:46

Kural: \(s\)’den \(v\)’ye giden bir yol bir negatif ağırlıklı çevrim üzerindeki düğümden geçiyorsa, \(\delta(s, v) = -\infty\). Bu durumda ebeveyn işaretçisiyle uğraşmayız (sonlu yol yok); bunun yerine bir negatif çevrim döndürmek isteyebiliriz (bu, sonraki dersin Bellman-Ford konusudur).

Şekil 17.3 iki tuzağı yan yana koyar: solda \(+\infty\) (iki ayrık küme, geçiş yok), sağda \(-\infty\) (negatif çevrim \(b \to f \to g \to c \to b\) erişilir, her tur \(-2\) kazanç).

Şekil 17.3: Ağırlıklı en kısa yolun iki tuzağı: +∞ (erişilemez) ve −∞ (negatif çevrim) (L11 §4, İMZA figür). SOL panel +∞ TUZAĞI: iki ayrık küme — kaynak s’nin erişebildiği küme (s→p, ağırlık 4) ve t’nin kopuk bileşeni (t→q); aralarında kesikli ‘?’ engeli, geçiş yok → δ(s,t) = +∞ (erişilemez). SAĞ panel −∞ TUZAĞI: kaynak s’den çevrime −5 ile giriş (b’ye); çevrim b→f→g→c→b elmas yerleşimle, kenar ağırlıkları MOTORDAN: b→f(−4 amber), f→g(2), g→c(1), c→b(−1 amber); çevrim çevresinde dönen kavisli oklar. Çevrim toplamı kutusu (−4)+2+1+(−1) = −2 (AMBER): her tur −2 kazanç → istediğin kadar küçült → δ = −∞ (minimum yok, infimum). Alt şerit: +∞ = erişilemez, −∞ = negatif çevrim erişilir (sonlu en kısa yol YOK). Veri MOTORDAN: build_negative_cycle_example çevrim [b,f,g,c,b], path_weight = −2 (Ku 15:26, 18:46).

17.6 5. BFS’e İndirgenebilen Özel Durumlar

Ağırlıklı SSSP’nin bazı özel halleri BFS’e indirgenir:

  • Tüm ağırlıklar = 1: zaten ağırlıksız çizge — BFS doğrudan çözer.
  • Tüm ağırlıklar = aynı pozitif değer \(c\): \(c\)’ye böl → ağırlıksız çöz → sonuçları \(c\) ile çarp.
  • Pozitif ağırlıkları seri kenarlara aç: ağırlık 4’lük bir kenar, 4 ardışık (seri) ağırlık-1 kenara dönüştürülür. Tüm ağırlıklar toplamı asimptotik olarak \(V + E\)’den küçükse, bu dönüşüm + BFS yine doğrusal.

Genel ağırlıklı SSSP’yi doğrusal zamanda çözmek açık problemdir (bilinmiyor).

17.7 6. Genel Manzara: DAG / Bellman-Ford / Dijkstra

Üç algoritma, üç kısıt seviyesi:

  • DAG relaxation (bu ders): çizge bir DAG ise — ağırlıklar herhangi bir tamsayı olabilir (negatif dahil, çevrim olmadığından sorun yok) — \(O(V + E)\) doğrusal.
  • Bellman-Ford (Ders 18, L12): herhangi çizge (çevrim, negatif çevrim dahil); \(\sim O(V \cdot E)\) (karesel benzeri); pratik ve yaygın.
  • Dijkstra (Ders 19, L13): ağırlıklar negatif değilse; \(\sim O(V \log V + E)\) (doğrusala yakın, \(V\)’de bir log faktörü). Çoğu gerçek problem (yol ağı) negatif olmadığından Dijkstra en sık kullanılandır.

Şekil 17.4 bu üç algoritmayı kısıt seviyesine göre dizer ve çalışılan DAG örneğinde \(\delta\) değerlerini gösterir (motor kanıtı: \(e=0, f=3, g=5, h=6, d=3, c=8\)).

Şekil 17.4: Ağırlıklı SSSP: üç algoritma, üç kısıt seviyesi — kısıt azaldıkça süre doğrusaldan uzaklaşır (L11 §6, İMZA figür). ÜST: örnek ağırlıklı DAG (kaynak e); her düğümün yanında motordan δ değeri (e=0, f=3, g=5, h=6, d=3, c=8; a,b = +∞ erişilmez, soluk). g→d = −2 negatif kenar AMBER (gevşetmeyi bozmaz). ALT: 3 satırlık karşılaştırma panosu, kısıt azaldıkça süre artar. Satır 1 DAG RELAXATION (bu ders L11, AMBER çerçeve): kısıt çizge DAG + ağırlık ∈ ℤ negatif OK → O(V+E) doğrusal. Satır 2 BELLMAN-FORD (Ders 18 L12): kısıt YOK, genel çizge, negatif çevrimi TESPİT eder (δ=−∞) → O(V·E) en genel/en yavaş. Satır 3 DIJKSTRA (Ders 19 L13): kısıt ağırlık ≥ 0 → O(V log V + E) doğrusala yakın. Alt not: genel SSSP’yi doğrusal zamanda çözmek hâlâ AÇIK PROBLEM; çoğu gerçek problem (yol ağı, mesafe) negatif içermez → Dijkstra en yaygın. Veri MOTORDAN: dag_sssp(e) = {e:0,f:3,g:5,h:6,d:3,c:8,a:∞,b:∞}.

17.8 7. En Kısa Yol Ağacı: Mesafeden Ebeveyn

BFS gibi iki şey döndürürüz: mesafeler \(\delta\) ve ebeveyn işaretçileri (en kısa yol ağacı). Ama ikisini de her algoritmada taşımak angaryadır. İddia: yalnızca mesafeler verilirse, ebeveyn işaretçileri doğrusal zamanda geri kurulabilir.

“distances are actually sufficient for us to reconstruct parent pointers if we need them later.” — Ku, 28:57

Algoritma (yalnız \(\delta\) sonlu olan \(v\)’ler için): her \(u\) için, her \(v \in \text{Adj}^{+}(u)\): \(v\)’ye henüz ebeveyn atanmamışsa ve \(\delta(s, v) = \delta(s, u) + w(u, v)\) ise (bu kenar bir en kısa yolun parçası), \(P(v) = u\) ata. Tüm düğümler + komşular üzerinde bir geçiş → \(O(V + E)\). Bu yüzden bundan sonra yalnızca mesafeleri hesaplamaya odaklanırız.

Şekil 17.5 bu fikri üç blokta gösterir: solda yalnız \(\delta\) tablosu (figürün tek girdisi), ortada kontrol kuralı (\(\delta(h)=6=\delta(g)+1\) ✓, \(\delta(h)=6\neq\delta(f)+8=11\) ✗), sağda kurulan en kısa yol ağacı (ebeveyn kenarları kalın).

Şekil 17.5: Mesafe YETER: en kısa yol ağacı yalnızca δ tablosundan kurulur (L11 §7, İMZA figür). SOL blok: yalnız δ(e,·) tablosu (figürün TEK girdisi) — e:0, f:3, g:5, h:6, d:3, c:8; a, b ∞ (erişilmez köşeler soluk). ORTA blok: kontrol kuralı — her (u,v) kenarı için δ(v) = δ(u)+w(u,v) mi? EŞİTSE bu kenar bir en kısa yolun parçası → P(v)=u. İki örnek: δ(h)=6 = δ(g)+1 = 5+1 ✓ (P(h)=g, yeşil onay); δ(h)=6 ≠ δ(f)+8 = 11 ✗ (f→h en kısa yolda DEĞİL, üstü çizili). SAĞ blok: kurulan en kısa yol ağacı — ebeveyn kenarları KALIN slate ok (f←e, g←f, h←g, d←g, c←d); en kısa yola katılmayan kenar (f→h) soluk; erişilmez a→b soluk. Alt not: tek geçiş O(V+E) — bu yüzden TÜM en kısa yol algoritmaları yalnız MESAFEYE odaklanır; ebeveynler δ’dan ücretsizce kurulur. Veri MOTORDAN: parents_from_distances → f←e, g←f, h←g, d←g, c←d (Ku 28:57).

17.9 8. DAG Relaxation: Mesafe Tahminleri ve Üçgen Eşitsizliği

Fikir: her \(v\) için bir mesafe tahmini \(d(s, v)\) tut; başta \(+\infty\) (kaynak için 0). Değişmez: tahmin daima \(\delta\)’yı yukarıdan sınırlar (üst sınır); bilgi geldikçe kademeli olarak düşür.

“we’re going to maintain that they upper-bound this thing and gradually lower until they’re equal.” — Ku, 38:20

Ne zaman düşürürüz? Tahmin üçgen eşitsizliğini (triangle inequality) ihlal ettiğinde. Üçgen eşitsizliği: herhangi bir \(x\) için \(\delta(u, v) \leq \delta(u, x) + \delta(x, v)\) (yolları \(x\)’ten geçenlerle kısıtlamak minimumu küçültemez).

“the shortest path distance from u to v can’t be bigger than… from u to x plus… from x to v.” — Ku, 41:07

Kenar gevşetme (relax). Bir \((u, v)\) kenarı için \(d(s, v) > d(s, u) + w(u, v)\) ise (yani \(u\) üzerinden \(v\)’ye gitmek mevcut tahminden iyiyse), tahmini düşür: \(d(s, v) \leftarrow d(s, u) + w(u, v)\). “Relax” tarihsel bir terimdir; ihlal edilen bir kısıtı yerel olarak çözer (başka yerde yeni ihlal doğabilir, ama bu kısıt artık sağlanır).

17.10 9. Relax Güvenlidir

Gevşetme güvenlidir (safe): her mesafe tahmini \(d(s, v)\) daima ya \(+\infty\)’dur ya da \(s\)’den \(v\)’ye gerçek bir yolun ağırlığıdır — asla “uydurma” bir değer değil.

“each distance estimate s, v is weight of some path from s to v or infinite.” — Ku, 45:17

Kanıt (kısa): \((u, v)\)’yi gevşetirken \(d(s, v) \leftarrow d(s, u) + w(u, v)\). Varsayımla \(d(s, u)\) zaten \(s\)’den \(u\)’ya bir yolun ağırlığıydı; ona \(u \to v\) kenarını eklersek sonuç yine \(s\)’den \(v\)’ye bir yolun ağırlığıdır. Değişmez korunur. Bu yüzden tahmin hiçbir zaman gerçek en kısa mesafenin altına inmez — yalnızca ona yaklaşır.

Şekil 17.6 bu iki temeli yan yana koyar: solda üçgen eşitsizliği \(\delta(u,v) \leq \delta(u,x) + \delta(x,v)\), sağda relax öncesi/sonrası — \(d(v)=12\) üstü çizili, \(d(u)+w = 5+4 = 9\) amber yeni değer.

Şekil 17.6: Gevşetme (relax) GÜVENLİDİR — üçgen eşitsizliği + tahmin asla δ’nın altına inmez (L11 §8-9, İMZA figür). SOL panel ÜÇGEN EŞİTSİZLİĞİ (§8): üç düğüm u, x, v üçgen yerleşim; alt düz kenar = doğrudan en kısa yol δ(u,v), üstte iki kenarlı kırık yol δ(u,x) + δ(x,v) kesikli. Eşitsizlik kutusu δ(u,v) ≤ δ(u,x) + δ(x,v); not: x’ten geçmeye ZORLAMAK minimumu KÜÇÜLTEMEZ. SAĞ panel RELAX (§9, öncesi/sonrası): mini durum s →(d(u)=5) u →(w(u,v)=4) v; eski d(v)=12 üstü çizili (soluk), yeni d(u)+w = 5+4 = 9 amber. Koşul kutusu d(v) > d(u)+w(u,v) ise DÜŞÜR (12 > 9 → evet, relax_edge = True). GÜVENLİ rozeti (yeşil): her d(v) tahmini ya ∞ ya GERÇEK bir yolun ağırlığıdır → asla çok-küçük uydurma değer üretilmez → d(v) hiçbir zaman δ(s,v)‘nin altına inmez. Alt not: ’relax’ tarihsel terim, ihlal edilen kısıtı yerel çözer. Veri MOTORDAN: relax_edge(d={s:0,u:5,v:12}, w(u,v)=4) → d(v) 12→9 (5+4) True; ikinci çağrı False (Ku 41:07 + 45:17).

17.11 10. DAG Relaxation Algoritması ve Doğruluğu

Algoritma: tüm \(d(s, v) = +\infty\); \(d(s, s) = 0\); sonra düğümleri topolojik sırada işle, her \(u\) için tüm çıkış komşularını gevşet.

“we’re going to process each vertex u in a topological sort order.” — Ku, 48:30

def dag_relaxation(adj, weight, s, topo_order):
    d = {v: float('inf') for v in adj}   # tahminler
    d[s] = 0
    for u in topo_order:                 # topolojik sirada
        for v in adj[u]:                 # cikis komsulari
            if d[u] + weight[(u, v)] < d[v]:   # ucgen esitsizligi ihlali
                d[v] = d[u] + weight[(u, v)]    # relax (guvenli)
    return d

Çalışılan Örnek — e’den en kısa yollar. Topolojik sıra \(a, b, e, f, g, h, d, c\). \(a\) ve \(b\) kaynaktan (\(e\)) önce geldiğinden \(\infty\) kalır (\(e\)’den onlara yol yok). \(e = 0\). \(e \to f\) kenarı (ağırlık 3): \(d(f) = 3\). \(f\)’yi işle: \(3+8 = 11\), \(3+2 = 5\). \(g\)’yi işle: \(5+1 = 6\) (11’i 6 ile değiştir), \(5+(-2) = 3\). Devam… sonuçta \(\delta\): \(a=b=+\infty\), \(e=0\), \(f=3\), \(g=5\), \(h=6\), \(d=3\), \(c=8\).

Doğruluk (topolojik tümevarım). Topolojik sıradaki \(k.\) düğüm \(v\); ondan öncekiler doğru (tümevarım varsayımı). \(s\)’den \(v\)’ye en kısa yolda \(v\)’den hemen önceki \(u\), topolojik sırada \(v\)’den önce gelmek zorundadır (yoksa DAG değil) → \(u\) doğru hesaplanmıştır; \(u\) işlenirken \((u, v)\) kenarı gevşetildiğinden \(d(v)\) doğru en kısa mesafeye iner. Her düğüm + komşuları bir kez → \(O(V + E)\) doğrusal.

Şekil 17.7 algoritmayı tek bir akışta gösterir: üstte ağırlıklı DAG, altta topolojik sıra şeridi (\(a, b, e, f, g, h, d, c\)) ve her düğümün altında \(d\)-tahmini evrimi — \(h\)’nin \(\infty \to 11 \to 6\) geçişi imza an (\(g\) işlenirken daha iyi yol bulunur).

Şekil 17.7: DAG relaxation: ∞‘dan başla, topolojik sırada gevşet — h ∞→11→6 (g daha iyi yol bulur) (L11 §10, İMZA figür). ÜST: örnek ağırlıklı DAG (kaynak e); kenar ağırlıkları rozette, g→d(−2) negatif amber (DAG’da sorun değil); a, b ayrık üst köşe (e’den erişilmez, soluk). ALT: topolojik sıra işleme şeridi a, b, e, f, g, h, d, c (soldan sağa, #1..#8 rozeti). a, b soluk + ’d = ∞ kaldı’ (erişilmez). e = 0 (kaynak). Her düğümün altında d-tahmini evrimi mini sütun: f ∞→3; g ∞→5; h ∞→11→6 (11 üstü çizili, 6 amber — KLİMAKS: g işlenirken daha iyi yol! d[g]+w(g,h)=5+1=6 < 11); d ∞→3; c ∞→8. Alt not: topolojik sıra garantisi — bir düğüm işlenirken TÜM öncülleri zaten DOĞRU (tümevarım), tek geçiş yeter → O(V+E); negatif ağırlık (g→d=−2) sorun değil, çevrim olmadığından her kenar tek kez gevşetilir, −∞ tuzağı yok. Veri MOTORDAN: topo = [a,b,e,f,g,h,d,c]; dag_relaxation(e) = {a:∞,b:∞,e:0,f:3,g:5,h:6,d:3,c:8}; g adımı relaxed = [(h,11,6),(d,∞,3)] (Ku 48:30).

17.12 Bu Dersin Özeti

  1. Ağırlık \(w: E \to \mathbb{Z}\); yol ağırlığı = kenar ağırlıkları toplamı; en kısa yol = minimum ağırlık.
  2. İki tuzak: yol yoksa \(\delta = +\infty\); negatif ağırlıklı çevrim erişiliyorsa \(\delta = -\infty\).
  3. BFS özel durumları: ağırlık 1 / aynı pozitif / küçük-toplamlı seri açma → doğrusal.
  4. Algoritma haritası: DAG → \(O(V+E)\); Bellman-Ford → \(O(V \cdot E)\); Dijkstra (negatif yok) → \(O(V \log V + E)\).
  5. Mesafe yeter: ebeveyn işaretçileri \(\delta\)’dan \(O(V+E)\)’de kurulur.
  6. DAG relaxation: \(d\) tahmini \(\infty\)’dan başlar, üçgen eşitsizliği ihlalinde gevşet; relax güvenli.
  7. Doğruluk: topolojik sırada işle; tümevarımla tüm \(d = \delta\); \(O(V + E)\).
ÖnemliTek Bir Cümle

Ağırlıklı en kısa yol, toplam kenar ağırlığının minimumudur; bir DAG’da bunu, \(\infty\)’dan başlayan mesafe tahminlerini topolojik sırada üçgen eşitsizliğine göre güvenle gevşeterek \(O(V + E)\)’de tam olarak çözeriz.

17.13 Kontrol Soruları

Cevap: \(+\infty\), \(s\)’den \(t\)’ye hiç yol olmadığı durumdur (erişilemez). \(-\infty\) ise yol vardır ama sonlu en kısa yol yoktur: \(s\)’den \(v\)’ye giden yol negatif ağırlıklı bir çevrim üzerindeki bir düğümden geçiyorsa, o çevrimi her dolaştığımızda ağırlık azalır (örn. tur başına \(-2\)), bu yüzden istediğimiz kadar küçük bir değere inebiliriz. Minimum erişilemez → infimum \(-\infty\). Bu yüzden negatif çevrim erişilen düğümler için ebeveyn ağacı kurmayız.

Cevap: Çünkü her algoritmada ikisini birden taşımak gereksiz angaryadır ve mesafeler ebeveyni belirlemeye yeter. \(\delta\) verilince, her \(u\) için her çıkış komşusu \(v\)’yi tara; \(\delta(s, v) = \delta(s, u) + w(u, v)\) ise \((u, v)\) bir en kısa yolun son kenarıdır, \(P(v) = u\) ata. Tüm düğüm + komşu üzerinde bir geçiş \(O(V+E)\) — algoritmanın kendi alt sınırı zaten doğrusal olduğundan ek maliyet yok. Böylece tüm en kısa yol algoritmaları tek bir işe (mesafe) odaklanır.

Cevap: Güvenli (safe) = her mesafe tahmini \(d(s, v)\) daima ya \(+\infty\)’dur ya da \(s\)’den \(v\)’ye gerçek bir yolun ağırlığıdır; asla hiçbir yola karşılık gelmeyen bir sayı olamaz. Gevşetmede \(d(s, v) \leftarrow d(s, u) + w(u, v)\) yaparız; \(d(s, u)\) zaten bir yolun ağırlığıysa, \(u \to v\) kenarını ekleyince yine bir yolun ağırlığı olur. Önemi: tahmin hiçbir zaman gerçek en kısa mesafenin altına inemez (çünkü bir yol var, en kısa yol ondan kısa olamaz) — yani algoritma yukarıdan \(\delta\)’ya doğru iner ve doğru değerde durur.

Cevap: Doğruluk, “bir düğümü işlerken tüm geçerli öncüllerinin (incoming neighbors) zaten doğru hesaplanmış olması”na dayanır. Topolojik sıra tam bunu garanti eder: \(s \to v\) en kısa yolunda \(v\)’den önceki \(u\), topolojik sırada \(v\)’den önce gelir (DAG olduğundan), dolayısıyla \(u\) işlenirken \(d(u) = \delta(s, u)\) olmuştur ve \((u, v)\) gevşetilince \(d(v)\) doğru değere iner. Rastgele sırada bir düğümü öncülü hesaplanmadan işlersek, onu eksik bilgiyle bırakırız; ayrıca çevrim olsaydı topolojik sıra zaten var olmazdı (bu yüzden DAG şart).

17.14 Egzersizler

Egzersiz 1. Verilen küçük ağırlıklı çizgede, belirtilen kaynaktan tüm \(\delta\) değerlerini elle DAG relaxation ile hesapla; topolojik sıra seçimini de göster.

Egzersiz 2. Bir negatif ağırlıklı çevrim içeren çizge çiz; hangi düğümlerin \(\delta = -\infty\), hangilerinin sonlu olduğunu işaretle.

Egzersiz 3. Pozitif ağırlıkları seri kenarlara açma dönüşümünü küçük bir çizgede uygula; toplam ağırlık \(V + E\)’yi aşmazsa BFS’in doğrusal kaldığını argümanla göster.

Egzersiz 4. Yalnızca \(\delta\) mesafeleri verilen bir çizgede ebeveyn işaretçilerini kuran fonksiyonu Python’da yaz; süresinin \(O(V + E)\) olduğunu doğrula.

Egzersiz 5. DAG relaxation’ın üçgen eşitsizliği koşulunu, “en uzun yol” (longest path) bulacak şekilde değiştir; bunun neden yalnızca DAG’da anlamlı olduğunu açıkla.

17.15 Sonraki Ders İçin Hazırlık

UyarıSonraki: Ders 18 (L12) — Bellman-Ford (araya Ders 17 = PS5 girer)

Ders 18 (L12): Bellman-Ford (araya Ders 17 = PS5 problem oturumu girer) — Jason Ku ile, DAG kısıtını kaldırıyoruz: herhangi bir çizgede (çevrim, hatta negatif ağırlıklı çevrim dahil) SSSP. Aynı “relax” tekniğini kullanır ama topolojik sıra olmadığından kenarları tekrar tekrar gevşetir; karesel-benzeri \(O(V \cdot E)\) ama pratik. Negatif çevrimleri de tespit eder.

Ders 18 Öncesi Yapılacak:

  • Bu dersin egzersizlerini, özellikle Egzersiz 1 (DAG relaxation) ve 2 (negatif çevrim) çöz.
  • Üçgen eşitsizliği + relax-güvenli değişmezini ezberden anlat.
  • Ana cümleyi tekrar oku: “DAG relaxation: \(\infty\)’dan başla, topolojik sırada güvenle gevşet, \(O(V+E)\)’de bitir.”

17.16 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Sayfada
Ağırlık fonksiyonu \(w: E \to \mathbb{Z}\); \(O(1)\) sorgu (tuple veya hash) Böl. 1-2
Yol ağırlığı \(w(\pi)\) Yoldaki kenar ağırlıklarının toplamı Böl. 3
En kısa yol \(\delta(s,t)\) Minimum ağırlıklı yol; yok → \(+\infty\) Böl. 3-4
Negatif çevrim Erişilen düğüm için \(\delta = -\infty\) (infimum) Böl. 4
Algoritma haritası DAG \(O(V+E)\) / Bellman-Ford \(O(V \cdot E)\) / Dijkstra \(O(V \log V + E)\) Böl. 6
Üçgen eşitsizliği \(\delta(u,v) \leq \delta(u,x) + \delta(x,v)\) Böl. 8
Relax \((u,v)\) \(d(s,v) > d(s,u)+w(u,v)\) ise düşür; güvenli Böl. 8-9
DAG relaxation Topolojik sırada relax; \(O(V+E)\) Böl. 10

17.17 Builder ve OMSCS Bağlantıları

İpucu6 köprü

Bu ders, “ağırlık girince en kısa yol = toplam ağırlığın minimumu” sezgisini kurar ve DAG relaxation ile gevşetme tekniğini açar — köprülerin özeti:

  1. Ağırlıklı en kısa yol → GPS/yönlendirme (Google Maps, Waze), ağ yönlendirme (OSPF latency), oyun yol bulma.
  2. DAG relaxation → proje zamanlama (kritik yol, PERT/CPM), build sistemi süre tahmini, elektronik tablo hesap sırası.
  3. Üçgen eşitsizliğiA* sezgisel araması, metrik uzaylar, yer gömme (embedding) kalitesi.
  4. Relax (gevşetme) → kısıt çözme (constraint relaxation), iteratif optimizasyon, label-correcting algoritmalar.
  5. Negatif çevrim tespiti → arbitraj (döviz çevrim grafı), kâr döngüsü, tutarsızlık tespiti.
  6. Topolojik sıra + DP → DAG üzerinde dinamik programlama; en kısa/en uzun yol DP’nin habercisidir (Ders 23-26, L15-L18).

ÖnemliTek bir şey alıp gideceksen

Kenarlara ağırlık verince “en kısa yol” toplam ağırlığın minimumu olur ve iki yeni tuzak doğar (\(+\infty\) yol yok, \(-\infty\) negatif çevrim). Bir DAG’da bu problemi, \(\infty\)’dan başlayan mesafe tahminlerini topolojik sırada üçgen eşitsizliğine göre güvenle gevşeterek \(O(V + E)\)’de çözeriz — ve mesafeler, ebeveyn işaretçilerini sonradan kurmaya yeter.