Bölüm 4.3: Minimum Kapsayan Ağaç Algoritmaları

Bölüm 4.3: Minimum Kapsayan Ağaç Algoritmaları · Çalışma Soruları
MST kavramıKesim ve döngü özelliğiKruskalUnion-findPrimBorůvkaTers silme
Sercan KÜLCÜ

Çoktan Seçmeli · MST Kavramı

Soru 1: Kenar Sayıları

12 düğümlü, 20 kenarlı bağlı, yönsüz ve ağırlıklı bir çizgenin minimum kapsayan ağacında kaç kenar vardır ve kaç kenar ağacın dışında kalır?

B: Her kapsayan ağaç bağlı ve döngüsüzdür, V − 1 = 11 kenarı vardır; kalan 20 − 11 = 9 kenar dışarıda kalır. Bu 9 kenarın her biri ağaca eklenirse bir döngü kapatır. A, düğüm sayısı kadar kenar sanır (o zaman bir döngü olurdu).

Çoktan Seçmeli · MST Kavramı

Soru 2: Kesim Özelliği

Düğümler {a, b} (yeşil) ve {c, d, e} (mavi) olarak ikiye ayrılıyor; kesimi geçen kenarlar kesikli çizilmiştir. Kesim özelliğine göre hangi kenar kesinlikle bir MST'ye aittir?

abcde6245387

C: Kesimi geçen kenarlar a–e (6), b–e (4), b–c (5); en hafifi b–e'dir ve bir MST'de yer alır. a–b ve e–c de MST'dedir ama bu kesim onları açıklamaz: kesimi geçmezler. Kruskal ve Prim her adımda bu özelliği kullanır.

Çoktan Seçmeli · MST Kavramı

Soru 3: Döngü Özelliği

Aynı çizgede b–e–c döngüsü kesikli çizilmiştir. Döngü özelliği yalnızca bu döngüye uygulanırsa hangi kenarın hiçbir MST'de yer almadığı söylenebilir?

abcde6245387

A: Bir döngünün tek en ağır kenarı hiçbir MST'de olamaz; onu çıkarıp döngünün öteki kenarlarıyla bağlantıyı korumak her zaman daha ucuzdur. B ve C bu döngüden dolayı dışlanamaz (gerçekten de MST'dedirler). Ters silme algoritması bu özelliğe dayanır.

Çoktan Seçmeli · MST Kavramı

Soru 4: Ağırlıklara Sabit Eklemek

6 düğümlü bağlı bir çizgenin MST ağırlığı 20'dir. Her kenarın ağırlığına 3 eklenirse ne olur?

C: Her kapsayan ağaçta tam V − 1 = 5 kenar vardır; hepsinin ağırlığı 5 · 3 = 15 artar, sıralama korunur: aynı ağaç minimum kalır ve toplam 20 + 15 = 35 olur. B, 6 kenar sayar. En kısa yol için bu doğru değildir: farklı kenar sayılı yollar farklı miktarda uzar.

Klasik Soru · MST Kavramı

Soru 5: Birden Çok MST

Bir çizgenin birden fazla minimum kapsayan ağacı olabilir mi? Yandaki çizge üzerinde açıklayın. Hangi koşulda MST tektir?

STAB1122
Cevabı göster

Evet. Eşit ağırlıklı kenarlar arasında seçim yapılabiliyorsa farklı ağaçlar aynı toplamı verir.

STAB1122STAB1122

S–T ve A–B (1) her iki ağaçta da vardır; dört düğümü bağlamak için bir kenar daha gerekir: T–B ya da S–A (ikisi de 2). İki MST de 4 ağırlığındadır.

Tüm kenar ağırlıkları farklıysa MST tektir: her kesimin en hafif kenarı tektir ve her MST'de bulunmak zorundadır.

Çoktan Seçmeli · MST Kavramı

Soru 6: Kaç Kapsayan Ağaç?

4 düğümlü tam çizgenin (K₄, 6 kenar) kaç farklı kapsayan ağacı vardır?

C: Cayley formülü n düğümlü tam çizge için nⁿ⁻² kapsayan ağaç verir: 4² = 16. Sayma ile de görülebilir: 6 kenardan 3'ünü seçmenin C(6, 3) = 20 yolu vardır; bunlardan 4'ü bir üçgen oluşturur (K₄'te 4 üçgen var) → 20 − 4 = 16. D, döngü oluşturan seçimleri de sayar. Bu sayı hızla büyüdüğü için hepsini denemek yerine açgözlü algoritmalar kullanılır.

Klasik Soru · MST Kavramı

Soru 7: MST'nin Tekliği

Tüm kenar ağırlıkları birbirinden farklı olan bağlı bir çizgede MST'nin tek olduğunu kesim özelliğiyle gösterin.

Cevabı göster

T ve T′ iki farklı MST olsun. T'de olup T′'de olmayan bir e = u–v kenarı seçelim. T'den e silinince ağaç iki parçaya ayrılır: bu bir kesim (S, V − S) tanımlar ve e onu geçer.

T′ bağlı olduğu için bu kesimi geçen bir e′ kenarı içerir. Ağırlıklar farklı olduğundan kesimi geçen en hafif kenar tektir. e en hafifse T′ − e′ + e, T′'den hafif bir kapsayan ağaç olur (çelişki); e′ en hafifse T − e + e′, T'den hafif olur (çelişki).

Yani her MST kenarı, tanımladığı kesimin tek en hafif kenarıdır ve her MST'de bulunmak zorundadır → MST tektir. Eşit ağırlıklar olunca bu tekliği kaybedebiliriz (Birden Çok MST sorusu).

Çoktan Seçmeli · MST Kavramı

Soru 8: MST ve En Kısa Yol

Minimum kapsayan ağaç için aşağıdakilerden hangisi doğrudur?

B: MST algoritmaları yalnızca ağırlıkları karşılaştırır; negatif değer bir sorun oluşturmaz (sorun Dijkstra'ya özgüdür). A yanlıştır: MST toplam ağırlığı küçültür, düğüm çiftlerinin uzaklığını değil. C: Prim'in başlangıcı toplamı değiştirmez. D: yönlü karşılığı Chu–Liu/Edmonds algoritmasıdır.

Çıktı Sorusu · Kruskal

Soru 9: Kruskal Kenar Sırası

Kruskal algoritması bu çizgede hangi kenarları hangi sırayla inceler? Hangileri eklenir, hangileri reddedilir? MST'nin toplam ağırlığı nedir?

ABCDEF413685729
Cevabı göster
kenarA–CD–FB–CA–BC–EB–D
ağırlık123456
sonuç✓✓✓✗ döngü✓✓

A–B (4) reddedilir: A ve B, A–C–B yoluyla zaten aynı ağaçtadır. B–D (6) beşinci kenardır: V − 1 = 5 kenar tamamlandı, kalan kenarlara (D–E, C–D, E–F) bakılmaz.

w(T) = 1 + 2 + 3 + 5 + 6 = 17.

Adım Adım Çalıştırma · Kruskal

Soru 10: Kruskal Kodu İzleme

kruskal(6, ke) hangi kenarları ekler? Ebeveyn dizisi (ata) ve w(T) nasıl değişir?

12345642536178

Kenarlar artan sıralandı: (4,5)=1, (1,3)=2, (2,4)=3, (1,2)=4, (2,3)=5, (3,5)=6, (4,6)=7, (5,6)=8.

12345642536178

ata[i] = i: her düğüm kendi ağacının kökü (6 ağaçlı orman). Ebeveyn dizisi 1..6 için gösteriliyor.

12345642536178

(4,5) = 1: bul(4) = 4, bul(5) = 5 → farklı ağaçlar, kenar eklenir; ata[4] = 5.

12345642536178

(1,3) = 2: bul(1) = 1, bul(3) = 3 → farklı ağaçlar, kenar eklenir; ata[1] = 3.

12345642536178

(2,4) = 3: bul(2) = 2, bul(4) = 5 → farklı ağaçlar, kenar eklenir; ata[2] = 5.

12345642536178

(1,2) = 4: bul(1) = 3, bul(2) = 5 → farklı ağaçlar, kenar eklenir; ata[3] = 5.

12345642536178

(2,3) = 5: bul(2) = bul(3) = 5 → aynı ağaç, eklenirse döngü oluşur; atlanır.

12345642536178

(3,5) = 6: bul(3) = bul(5) = 5 → aynı ağaç, eklenirse döngü oluşur; atlanır.

12345642536178

(4,6) = 7: bul(4) = 5, bul(6) = 6 → farklı ağaçlar, kenar eklenir; ata[5] = 6.

12345642536178

agac.size() = 5 = V − 1: döngü biter; (5,6) = 8 hiç incelenmez. w(T) = 17.

void kruskal(int V, List<Kenar> ke) {
  Collections.sort(ke);         // artan
  int[] ata = new int[V + 1];
  for (int i = 1; i <= V; i++) ata[i] = i;
  List<Kenar> agac = new ArrayList<>();
  int k = 0;
  while (agac.size() < V - 1) {
    Kenar e = ke.get(k++);
    int x = bul(ata, e.u);
    int y = bul(ata, e.v);
    if (x != y) {               // ayrı ağaç
      agac.add(e);
      ata[x] = y;               // birleştir
    }
  }
}

Çoktan Seçmeli · Kruskal

Soru 11: Kruskal'ın Karmaşıklığı

Kruskal algoritmasının zaman karmaşıklığı O(E log E)'dir. Bu sınırı hangi adım belirler?

D: Sıralama O(E log E) sürer; yol kısaltma ve rütbeyle bul/birleştir işlemleri toplam O(E · α(V)), yani neredeyse doğrusaldır. Kenarlar zaten sıralıysa ya da ağırlıklar küçük tam sayıysa (saymalı sıralama) Kruskal neredeyse doğrusal çalışır. E ≤ V² olduğundan O(E log E) = O(E log V).

Çoktan Seçmeli · Kruskal

Soru 12: Maksimum Kapsayan Ağaç

Toplam ağırlığı en büyük kapsayan ağacı bulmak için Kruskal algoritmasında ne değiştirilmelidir?

A: Kesim özelliğinin simetriği (kesimin en ağır kenarı bir maksimum kapsayan ağaca aittir) aynı açgözlü yaklaşımı doğrular. Eşdeğer olarak tüm ağırlıklar −w yapılıp standart Kruskal çalıştırılabilir. C yanlıştır: en ağır V − 1 kenar döngü oluşturabilir ve ağaç olmayabilir.

Çoktan Seçmeli · Kruskal

Soru 13: Döngü Denetimi

Bir öğrenci Kruskal'da döngü denetimini "u ile v arasında MST'de doğrudan kenar var mı?" sorusuyla yapıyor. Bu neden yanlıştır?

B: Kenar yine döngü kapatır. Döngü, u ve v'nin aynı bileşende olmasıyla oluşur; aradaki yolun uzunluğu önemli değildir. Örneğin a–b ve b–c eklendikten sonra a–c'nin doğrudan karşılığı yoktur ama a–c bir döngü kapatır. Doğru soru "bul(u) == bul(v) mi?"dir.

Adım Adım Çalıştırma · Union-Find

Soru 14: Union-Find İzleme

Program ne yazdırır? Birleştirmeler ve yol kısaltma ormanı nasıl değiştirir?

012345

Her düğüm kendi kümesinin kökü (yeşil). Oklar ata[i]'yi gösterir; kök kendini gösterir.

012345

birlestir(0, 1): bul(0) = 0, bul(1) = 1 → ata[0] = 1.

012345

birlestir(1, 2): bul(1) = 1, bul(2) = 2 → ata[1] = 2.

012345

birlestir(3, 4): bul(3) = 3, bul(4) = 4 → ata[3] = 4.

012345

birlestir(2, 4): bul(2) = 2 (0 → 1 → 2 zincirinin kökü), bul(4) = 4 → ata[2] = 4. Zincir uzadı: bul(0) artık 3 adım sürer.

012345

birlestir(5, 0): bul(5) = 5; bul(0) 0 → 1 → 2 → 4 yolunu izler ve dönerken yol kısaltma ile 0, 1, 2'yi doğrudan 4'e bağlar. Sonra ata[5] = 4.

012345

Tek küme kaldı, kökü 4. Çıktı: [4, 4, 4, 4, 4, 4]. Sonraki tüm bul çağrıları en çok 1 adım sürer.

int bul(int[] ata, int i) {
  if (ata[i] != i)
    ata[i] = bul(ata, ata[i]); // yol kısaltma
  return ata[i];
}
void birlestir(int[] ata, int x, int y) {
  ata[bul(ata, x)] = bul(ata, y);
}
// main
for (int i = 0; i < 6; i++) ata[i] = i;
birlestir(ata, 0, 1); birlestir(ata, 1, 2);
birlestir(ata, 3, 4); birlestir(ata, 2, 4);
birlestir(ata, 5, 0);
System.out.println(Arrays.toString(ata));

Çıktı Sorusu · Union-Find

Soru 15: Union-Find Durumu

Union-find izleme sorusundaki bul ve birlestir ile 0..5 için sırayla birlestir(0, 3), birlestir(1, 3), birlestir(4, 5), birlestir(5, 2) çağrılıyor. Son ebeveyn dizisi (ata) nedir? Sonra bul(4) çağrılırsa bu dizi ne olur? Kaç küme vardır?

Cevabı göster

birlestir(0, 3): ata[0] = 3 · birlestir(1, 3): ata[1] = 3 · birlestir(4, 5): ata[4] = 5 · birlestir(5, 2): ata[5] = 2.

ata = [3, 3, 2, 3, 5, 2]. Kümeler: {0, 1, 3} (kök 3) ve {2, 4, 5} (kök 2) → 2 küme.

bul(4): 4 → 5 → 2; dönüşte ata[4] = 2 olur: ata = [3, 3, 2, 3, 2, 2]. Yol kısaltma yalnızca izlenen yoldaki düğümleri değiştirir.

Çıktı Sorusu · Kruskal

Soru 16: Bağlı Olmayan Çizge

Kruskal kodu V = 5 ve kenarlar (1,2,3), (2,3,1), (1,3,2), (4,5,4) ile çağrılıyor. Ne olur? Kodu minimum kapsayan orman döndürecek biçimde nasıl düzeltirsiniz?

while (agac.size() < V - 1) {
  Kenar e = ke.get(k++);
  ...
}
Cevabı göster

Sıralı kenarlar: (2,3) ✓, (1,3) ✓, (1,2) ✗ döngü, (4,5) ✓. agac.size() = 3 < V − 1 = 4 olduğundan döngü sürer ve ke.get(4) çağrılır: IndexOutOfBoundsException. Çizge bağlı değildir ({1, 2, 3} ve {4, 5}); MST yoktur.

Düzeltme: while (k < ke.size() && agac.size() < V - 1). Sonda agac.size() < V − 1 ise çizge bağlı değildir; agac minimum kapsayan ormandır (burada 3 kenar, ağırlık 1 + 2 + 4 = 7).

Adım Adım Çalıştırma · Prim

Soru 17: Prim Kodu İzleme

prim(G, 0) düğümleri hangi sırayla ağaca alır? anahtar ve ebeveyn dizileri nasıl değişir?

012342638579a=0a=∞a=∞a=∞a=∞

Komşuluk matrisli Prim, kaynak 0. anahtar[0] = 0, diğerleri ∞ (etiket a = anahtar).

012342638579a=0a=∞a=∞a=∞a=∞

En küçük anahtarlı u = 0 ağaca girer.

012342638579a=0a=2a=∞a=6a=∞

Ağaçta olmayan komşular güncellenir: anahtar[1]: ∞ → 2, anahtar[3]: ∞ → 6; ebeveynleri 0.

012342638579a=0a=2a=∞a=6a=∞

En küçük anahtarlı u = 1 ağaca girer ve (0,1) = 2 kenarı MST'ye eklenir.

012342638579a=0a=2a=3a=6a=5

Ağaçta olmayan komşular güncellenir: anahtar[2]: ∞ → 3, anahtar[4]: ∞ → 5; ebeveynleri 1.

012342638579a=0a=2a=3a=6a=5

En küçük anahtarlı u = 2 ağaca girer ve (1,2) = 3 kenarı MST'ye eklenir.

012342638579a=0a=2a=3a=6a=5

En küçük anahtarlı u = 4 ağaca girer ve (1,4) = 5 kenarı MST'ye eklenir.

012342638579a=0a=2a=3a=6a=5

Döngü V − 1 = 4 kez döndü; son kalan düğüm 3'ün kenarı (0,3) = 6 de hazırdır. MST = (ata[v], v) kenarları, w(T) = 16.

void prim(int[][] G, int kaynak) {
  int V = G.length;
  Arrays.fill(anahtar, Integer.MAX_VALUE);
  anahtar[kaynak] = 0; ata[kaynak] = -1;
  for (int s = 0; s < V - 1; s++) {
    int u = enKucukAnahtar(anahtar, agacta);
    agacta[u] = true;
    for (int v = 0; v < V; v++)
      if (G[u][v] != 0 && !agacta[v]
          && G[u][v] < anahtar[v]) {
        anahtar[v] = G[u][v];
        ata[v] = u;
      }
  }
}

Çıktı Sorusu · Prim

Soru 18: Prim Ekleme Sırası

Kruskal kenar sırası sorusundaki çizgede Prim algoritması A'dan başlatılıyor. Kenarlar MST'ye hangi sırayla eklenir? Sonuç Kruskal'ınkiyle aynı mıdır?

ABCDEF413685729
Cevabı göster

Prim: A–C (1), C–B (3), C–E (5), B–D (6), D–F (2)

Her adımda ağaçla dışarısı arasındaki en ucuz kenar seçilir: A–C (1), sonra C–B (3); ağaçtan çıkan adaylar C–E (5), B–D (6) → C–E; sonra B–D (6) (E–D 7'den ucuz); en son D–F (2).

Kruskal: A–C, D–F, B–C, C–E, B–D. Aynı ağaç (toplam 17), farklı sıra: D–F en hafif ikinci kenar olduğu hâlde Prim onu ancak D ağaca girince ekleyebilir.

Çıktı Sorusu · Prim

Soru 19: Prim'de Toplam Yazmak

Prim kodundaki koşul ve atama anahtar[u] + G[u][v] < anahtar[v] ve anahtar[v] = anahtar[u] + G[u][v] olarak yanlış yazılıyor. Kaynak 0 için (ata[v], v) kenarlarından oluşan ağaç ve toplam ağırlığı nedir? Doğru Prim ne verir?

012322324
Cevabı göster

Hatalı kod Dijkstra olur ve en kısa yollar ağacını verir: ata = [−, 0, 0, 0] → kenarlar 0–1, 0–2, 0–3, toplam 9. (0'dan 2'ye 3, 3'e 4 en kısa uzaklıktır.)

Doğru Prim: ata = [−, 0, 1, 2] → 0–1, 1–2, 2–3, toplam 6.

Prim'de anahtar, düğümü ağaca bağlayan tek kenarın ağırlığıdır; Dijkstra'da ise kaynaktan toplam uzaklıktır. En kısa yollar ağacı kapsayan bir ağaçtır ama minimum olmak zorunda değildir.

Çoktan Seçmeli · Prim

Soru 20: Prim: Matris mi, Heap mi?

V = 1000 düğümlü bir çizgede Prim'in matris sürümü (O(V²)) ile ikili heap sürümü (O(E log V)) karşılaştırılıyor. E = 5 000 ve E = 500 000 için hangisi daha az iş yapar?

C: V² = 10⁶. E log V ≈ 5 000 · 10 = 5 · 10⁴ (seyrek: heap kazanır) ve ≈ 500 000 · 10 = 5 · 10⁶ (yoğun: matris kazanır). Yoğun çizgede (E ≈ V²) heap sürümü O(V² log V)'ye çıkar.

Adım Adım Çalıştırma · Borůvka

Soru 21: Borůvka İzleme

Borůvka her turda hangi kenarları seçer? Kaç tur sürer, MST ağırlığı nedir?

ABCDEFG7411910515612813

Başlangıçta her düğüm ayrı bir bileşen (7 bileşen, farklı renkler).

ABCDEFG7411910515612813

Tur 1, en ucuz dış kenarlar (kesikli): {A}: AD=4, {B}: AB=7, {C}: CE=5, {D}: AD=4, {E}: CE=5, {F}: DF=6, {G}: EG=8.

ABCDEFG7411910515612813

Eklenen: AD=4, AB=7, CE=5, DF=6, EG=8 (iki kez seçilen kenar ikinci kez atlanır). Kalan bileşen: 2; toplam 30.

ABCDEFG7411910515612813

Tur 2, en ucuz dış kenarlar (kesikli): {ABDF}: BE=10, {CEG}: BE=10.

ABCDEFG7411910515612813

Eklenen: BE=10 (iki kez seçilen kenar ikinci kez atlanır). Kalan bileşen: 1; toplam 40.

ABCDEFG7411910515612813

Tek bileşen kaldı: 2 turda MST = 40 (6 kenar). Kenarlar sıralanmadı; her tur tüm kenarları bir kez taradı.

while (bilesenSayisi > 1) {
  Kenar[] enUcuz = new Kenar[V];
  for (Kenar e : kenarlar) {        // 1) en ucuzlar
    int k1 = bul(ata, e.u), k2 = bul(ata, e.v);
    if (k1 == k2) continue;
    if (enUcuz[k1] == null || e.w < enUcuz[k1].w)
      enUcuz[k1] = e;
    if (enUcuz[k2] == null || e.w < enUcuz[k2].w)
      enUcuz[k2] = e;
  }
  for (Kenar e : enUcuz) {          // 2) hepsini ekle
    if (e == null) continue;
    int k1 = bul(ata, e.u), k2 = bul(ata, e.v);
    if (k1 == k2) continue;
    agac.add(e); ata[k1] = k2; bilesenSayisi--;
  }
}

Çıktı Sorusu · Borůvka

Soru 22: Borůvka Turları

Borůvka bu çizgede kaç tur çalışır? Her turda hangi kenarlar eklenir? MST ağırlığı nedir?

ABCDEF231456789
Cevabı göster

Tur 1: A → AB (2), B → BC (1), C → BC (1), D → BD (4), E → CE (6), F → EF (8). Farklı kenarlar: AB, BC, BD, CE, EF. BC iki kez seçilir ama bir kez eklenir.

Eklenen 5 kenar 6 düğümü tek bileşene bağlar: 1 tur yeter. MST = 2 + 1 + 4 + 6 + 8 = 21.

Kruskal aynı kenarları 1, 2, 4, 6, 8 sırasıyla tek tek eklerdi; C–A (3) ve C–D (5) gibi kenarlar döngü kapatır.

Çoktan Seçmeli · Borůvka

Soru 23: Borůvka Tur Sayısı

V = 1000 düğümlü bağlı bir çizgede Borůvka algoritması en fazla kaç tur çalışır ve toplam zaman nedir?

C: Her turda her bileşen en az bir başka bileşenle birleşir, bileşen sayısı en az yarıya iner: ⌈log₂ 1000⌉ = 10 tur. Her tur tüm kenarları bir kez tarar (O(E)) → O(E log V). A, her turda yalnızca bir kenar eklendiğini varsayar (Kruskal'ın adım sayısı).

Çoktan Seçmeli · Borůvka

Soru 24: Eşitlik Bozucu

Üç kenarı da 5 olan x–y–z üçgeninde Borůvka'nın ilk turunda x en ucuz kenar olarak x–y'yi, y y–z'yi, z z–x'i seçiyor (tutarsız eşitlik bozma). Seçilenler eklenirse ne olur?

xyz555

A: Kenarlar "hepsi birden" eklendiğinde her biri iki farklı bileşeni bağlıyor gibi görünür ve x–y–z döngüsü oluşur. Bu yüzden tutarlı bir eşitlik bozucu (ör. ağırlık eşitse küçük indisli kenar) şarttır. Ders kodundaki birleştirme öncesi k1 == k2 denetimi kenarları tek tek eklerken bu sorunu da yakalar: üçüncü kenar atlanır.

Adım Adım Çalıştırma · Ters Silme

Soru 25: Ters Silme İzleme

tersSil hangi kenarları siler, hangilerini geri koyar? Kalan ağacın ağırlığı nedir?

ABCDE4365782

Kenarlar azalan sıralandı: CE(8), CD(7), BC(6), BD(5), AB(4), AC(3), DE(2).

ABCDE4365782

CE(8) silindi, çizge hâlâ bağlı: kenar bir döngünün en ağırıdır, silinmiş kalır.

ABCDE4365782

CD(7) silindi, çizge hâlâ bağlı: kenar bir döngünün en ağırıdır, silinmiş kalır.

ABCDE4365782

BC(6) silindi, çizge hâlâ bağlı: kenar bir döngünün en ağırıdır, silinmiş kalır.

ABCDE4365782

BD(5) silinirse çizge kopar (köprü) → geri konur, i = 1.

ABCDE4365782

AB(4) silinirse çizge kopar (köprü) → geri konur, i = 2.

ABCDE4365782

AC(3) silinirse çizge kopar (köprü) → geri konur, i = 3.

ABCDE4365782

DE(2) silinirse çizge kopar (köprü) → geri konur, i = 4.

ABCDE4365782

i = boyut = 4: döngü biter. Kalan ağaç BD(5), AB(4), AC(3), DE(2) → w = 14.

void tersSil(int V, List<Kenar> ke) {
  ke.sort((a, b) -> b.w - a.w); // azalan
  int i = 0;
  while (i < ke.size()) {
    Kenar e = ke.remove(i);     // geçici sil
    if (!bagliMi(V, ke)) {
      ke.add(i, e);             // geri koy
      i++;
    }
  }
}

Çıktı Sorusu · Ters Silme

Soru 26: Ters Silme Sonucu

Kruskal kenar sırası sorusundaki çizgeye ters silme uygulanıyor. Hangi kenarlar silinir, hangileri kalır? Sonuç Kruskal'ınkiyle karşılaştırın.

ABCDEF413685729
Cevabı göster

Azalan sıra: E–F 9, C–D 8, D–E 7, B–D 6, C–E 5, A–B 4, B–C 3, D–F 2, A–C 1.

  • E–F (9): silinir (döngüde)
  • C–D (8): silinir (döngüde)
  • D–E (7): silinir (döngüde)
  • B–D (6): kalır (silinirse çizge kopar)
  • C–E (5): kalır (silinirse çizge kopar)
  • A–B (4): silinir (döngüde)
  • B–C (3): kalır (silinirse çizge kopar)
  • D–F (2): kalır (silinirse çizge kopar)
  • A–C (1): kalır (silinirse çizge kopar)

Kalan 5 kenar: A–C, B–C, C–E, B–D, D–F → toplam 17: Kruskal'ın bulduğu ağacın aynısı (ağırlıklar farklı olduğu için MST tektir).

Çoktan Seçmeli · Ters Silme

Soru 27: Ters Silmenin Maliyeti

Ters silme algoritması her kenar için bir BFS/DFS ile bağlılık testi yapıyor. Toplam zaman karmaşıklığı nedir?

D: E kenarın her biri için O(V + E)'lik bir bağlılık testi yapılır; sıralamanın O(E log E)'si bunun yanında küçük kalır. Bu yüzden ters silme daha çok öğreticidir: Kruskal'ın aynasıdır (küçükleri eklemek yerine büyükleri siler) ve döngü özelliğine dayanır.

Çıktı Sorusu · Karşılaştırma

Soru 28: Darboğaz Yol

Kruskal kenar sırası sorusundaki çizgede E'den F'ye giden yollar arasında en ağır kenarı en hafif olan yol (darboğaz yol) hangisidir? MST'yi kullanarak bulun. Bu yol en kısa yol mudur?

ABCDEF413685729
Cevabı göster

MST: A–C, D–F, B–C, C–E, B–D. MST'de E'den F'ye tek yol vardır: E → C → B → D → F; kenarları 5, 3, 6, 2 → en ağır kenar 6.

E → F (9), E → D → F (7), E → C → D → F (8) daha ağır bir kenar içerir; E → C → A → B → D → F de 6'da kalır, yani darboğaz değeri 6'dır. MST'deki yol her zaman bir darboğaz yoldur.

En kısa yol değildir: E → C → B → D → F'nin toplamı 16'dır; E → D → F'nin toplamı 9'dur. MST toplam ağırlığı küçültür, iki düğüm arasındaki uzaklığı değil.

Çoktan Seçmeli · Karşılaştırma

Soru 29: Hangi Algoritma?

Aşağıdaki eşleştirmelerden hangisi yanlıştır?

D yanlıştır: Prim tek bir ağacı büyütür; bağlı olmayan çizgede yalnızca başlangıç düğümünün bileşenini kapsar. Kruskal ve Borůvka doğal olarak minimum kapsayan ormanı verir. Diğer eşleştirmeler sunumdaki karşılaştırma tablosuyla uyumludur.

Klasik Soru · Karşılaştırma

Soru 30: MST ile Kümeleme

Kruskal kodu izleme sorusundaki çizgenin MST'si (1,3), (2,4), (4,5), (1,2), (4,6) kenarlarından oluşuyor. Düğümleri 3 kümeye ayırmak için MST'den hangi kenarlar silinir? Kümeler nelerdir? Yöntemin adı nedir?

12345642536178
Cevabı göster

k = 3 küme için MST'nin en ağır k − 1 = 2 kenarı silinir: (4,6) = 7 ve (1,2) = 4.

Kümeler: {1, 3}, {2, 4, 5}, {6}.

Bu, tek bağlantılı kümelemedir (single-linkage): Kruskal'ı V − k kenar ekledikten sonra durdurmakla aynı sonucu verir. Kümeler arası en yakın iki nokta uzaklığı (en küçük ayrım) en büyük olur.

Son

Bölüm 4.3: Minimum Kapsayan Ağaç Algoritmaları: Çalışma Soruları
Konu anlatımı: Minimum kapsayan ağaç sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.