Minimální kostra grafu

5.1 Problém minimální kostry

Formulace problému

Dán je souvislý graf G = (V, E) s ohodnocením hran w(e). Hledáme kostru H, pro kterou je součet ohodnocení všech hran minimální:

w(H) = ∑e ∈ E' w(e) → min

Kostra H se nazývá minimální kostra a w(H) cena kostry.

Historie

Problém vznikl při elektrifikaci jižní Moravy (1925–1926, Otakar Borůvka). Další algoritmy: Jarník (1930), Kruskal (1956).

5.2 Borůvkův algoritmus

Borůvkův algoritmus

  1. Začni s grafem T = (V, ∅) — všechny vrcholy, žádné hrany
  2. Opakuj dokud T má alespoň 2 komponenty:
    • Pro každou komponentu Ti vyber nejlehčí incidentní hranu
    • Všechny vybrané hrany přidej do T
  3. Výstup: minimální kostra T

5.3 Jarníkův algoritmus (Prim)

Jarníkův algoritmus

  1. Inicializace: V' = {x} (libovolný vrchol), E' = {}
  2. Opakuj dokud V' ≠ V:
    • Vyber hranu (u,v) s minimální cenou takovou, že u ∈ V' a v ∉ V'
    • Přidej v do V', přidej (u,v) do E'
  3. Výstup: T(V', E') je minimální kostra
Jarník — tabulková metoda

Vytvoří se tabulka, kde pro každý nezařazený vrchol evidujeme nejlevnější hranu do již zařazené množiny. V každém kroku vybereme vrchol s nejmenší hodnotou.

Příklad — Jarníkův algoritmus

Graf s 8 vrcholy (a–h), začneme z vrcholu a:

KrokPřidaný vrcholHranaCena
1cac2
2dad5
3ece6
4bab7
5gbg8
6hdh11
7fhf3

Cena kostry: 2 + 5 + 6 + 7 + 8 + 11 + 3 = 42

5.4 Kruskalův algoritmus

Kruskalův algoritmus

  1. Setřiď všechny hrany podle ohodnocení od nejmenšího
  2. T = (V, ∅)
  3. Pro každou hranu (od nejlehčí):
    • Pokud přidání hrany nevytvoří kružnici (koncové vrcholy leží v různých komponentách), přidej ji do T
  4. Výstup: minimální kostra T
Příklad — Kruskalův algoritmus

Setříděné hrany: ac-2, fh-3, ad-5, ce-6, ab-7, bd-8, bg-8, dh-11, df-12, ...

HranaCenaKomponentyPřidána?
ac2{a,c}{b}{d}{e}{f}{g}{h}ANO
fh3{a,c}{b}{d}{e}{f,h}{g}ANO
ad5{a,c,d}{b}{e}{f,h}{g}ANO
ce6{a,c,d,e}{b}{f,h}{g}ANO
ab7{a,b,c,d,e}{f,h}{g}ANO
bd8oba v {a,b,c,d,e}NE (kružnice!)
bg8{a,b,c,d,e,g}{f,h}ANO
dh11{a,b,c,d,e,f,g,h}ANO

Cena kostry: 2+3+5+6+7+8+11 = 42

Výsledná minimální kostra:

7 2 5 6 8 11 3 a b c d e g h f 3 Cena = 2+3+5+6+7+8+11 = 42

Cvičení — Minimální kostra

Úkol 20 — Vodovodní trubky: Vodovodní společnost propojuje domácnosti. Hrany s ohodnocením: ae-1, ac-1, bj-1, df-1, eg-1, hi-1, ab-2, cf-2, dj-2, ce-3, ai-4, dg-4, bh-5, bc-6, cj-7, cd-7. Najděte minimální kostru Kruskalovým algoritmem.

Seřazené hrany: ae-1, ac-1, bj-1, df-1, eg-1, hi-1, ab-2, cf-2, dj-2, ce-3, ai-4, dg-4, bh-5, bc-6, cj-7, cd-7

Přidáváme: ae(1), ac(1), bj(1), df(1), eg(1), hi(1), ab(2), cf(2), dj(2)

ce-3 by vytvořilo kružnici (a,c,e už jsou v jedné komponentě) ⇒ přeskočit

Po přidání dj-2 jsou všechny vrcholy v jedné komponentě.

Cena kostry: 1+1+1+1+1+1+2+2+2 = 14 (9 hran pro 10 vrcholů)

Úkol 21 — Chráněná lokalita (Jarník): 7 míst (a–g). Použijte Jarníkův algoritmus s tabulkou. Matice vzdáleností:

abcdefg
a-23
b-3
c2-133
d1-4
e33-
f334-2
g2-

Začneme z vrcholu a:

KrokPřidanýHranaCena
1cac2
2dcd1
3ece3
4beb3
5faf nebo cf3
6gfg2

Hrany kostry: ac, cd, ce, eb, af, fg

Cena: 2+1+3+3+3+2 = 14

Kvíz: Kruskalův algoritmus hrany zpracovává...

  • a) náhodně
  • b) od nejdražší po nejlevnější
  • c) od nejlevnější po nejdražší
  • d) podle abecedy

Správná odpověď: c) od nejlevnější po nejdražší

Kvíz: Při Kruskalově algoritmu hranu nepřidáme, když...

  • a) je příliš drahá
  • b) by vytvořila kružnici
  • c) spojuje dva listy
  • d) je most

Správná odpověď: b) by vytvořila kružnici