Kostra grafu (anglicky spanning tree) je takový podgraf neorientovaného grafu, který:

  • obsahuje všechny vrcholy původního grafu,
  • je souvislý (existuje cesta mezi libovolnou dvojicí vrcholů),
  • neobsahuje žádný cyklus.

Pokud graf obsahuje vrcholů, pak každá jeho kostra obsahuje přesně hran.

Nalezení kostry je klíčové v úlohách, kde je třeba propojit všechny uzly s minimálními náklady:

  • návrh komunikačních sítí (telefonní, počítačové),
  • stavba dopravních sítí,
  • optimalizace elektrických rozvodů,
  • algoritmy pro shlukování dat (například v datové analýze).

Kostra vs. Minimální kostra

Pokud je graf:

  • neohodnocený – všechny kostry jsou si rovnocenné.
  • ohodnocený – je potřeba najít takovou kostru, která má nejnižší možný součet vah hran. Taková kostra se nazývá Minimální kostra (Minimum Spanning Tree)

Důležité vlastnosti:

  • Minimální kostra existuje, pokud je graf souvislý.
  • Minimální kostra nemusí být jednoznačná – různé podgrafy mohou mít stejnou minimální váhu.

Algoritmy pro nalezení minimální kostry

Pro nalezení kostry existují tři základní algoritmy:

  • Jarníkův (Primův)
  • Kruskalův
  • Borůvkův

Jarníkův algoritmus (Primův algoritmus)

  • Začíná v libovolném vrcholu.
  • Postupně vybírá nejlevnější hranu, která spojuje již vybranou množinu vrcholů se zbytkem grafu.
  • Přidá vrchol do kostry a proces opakuje.

Pseudokód

Prim(G):
    MST = {}
    Start s libovolným vrcholem u
    Přidej u do MST
    Dokud existuje hrana z MST ven:
        vyber hranu (u,v) s minimální vahou
        pokud v není v MST:
            přidej hranu (u,v) do MST
            přidej v do MST

Časová složitost

  • při použití binární haldy.
  • V hustých grafech může být rychlejší než Kruskal.

Prostorová složitost

  • pro uložení grafu.
  • pro frontu.

Kruskalův algoritmus

  • Seřadí všechny hrany podle váhy.
  • Prochází hrany od nejmenší váhy.
  • Hranu přidá, pokud nespojuje již propojené komponenty (nevytváří cyklus).

Pseudokód

Kruskal(G):
    MST = {}
    seřaď všechny hrany podle vah
    foreach hrana (u,v) ve vzestupném pořadí:
        pokud u a v nejsou ve stejné komponentě:
            přidej (u,v) do MST
            slouč komponenty u a v

Časová složitost

  • na řazení hran.
  • zbytek algoritmu

Prostorová složitost

Borůvkův algoritmus

  • Každý vrchol tvoří samostatnou komponentu souvislosti.
  • Každá komponenta najde nejlevnější hranu ven.
  • Všechny tyto hrany se přidají současně.
  • Opakuje se, dokud není celý graf spojen do jedné komponenty.

Pseudokód

Boruvka(G):
    každému vrcholu přiřaď vlastní komponentu
    MST = {}
    while počet komponent > 1:
        pro každou komponentu C:
            najdi nejlevnější hranu (u,v) vycházející z C
        přidej všechny tyto hrany do MST
        slouč komponenty propojené nově přidanými hranami

Časová složitost

  • Efektivní zejména v řídkých grafech, protože na každém kroku významně klesá počet komponent.

Prostorová složitost