Bc. Vojtěch Hordějčuk

„Čas je způsob, jakým příroda zajišťuje, aby se vše neodehrálo najednou.” - J. A. Wheeler

Domů » Wiki » Grafové algoritmy » Algoritmus Dijkstra

Algoritmus Dijkstra

Dijkstrův algoritmus je grafový algoritmus vytvořený nizozemským vědcem Edsgerem Wybem Dijkstrou (1930–2002). Slouží k vyhledání nejkratší cesty z počátečního uzlu do všech ostatních uzlů ohodnoceného grafu. Poradí si však jen s nezáporným ohodnocením hran. Často se používá v routovacích protokolech, například v algoritmu OSPF (Open Shortest Path First).

Vstupem algoritmu je nezáporně ohodnocený graf a počáteční uzel, výstupem je datová struktura (například pole nebo tabulka) obsahující délky nejkratších cest z počátečního uzlu do ostatních uzlů.

Kroky algoritmu

Vstup: ohodnocený graf G, počáteční uzel s Výstup: asociativní pole D(u), udávající nejkratší vzdálenost mezi uzlem s a uzlem u

  • INICIALIZACE:
  • Vytvoř množinu uzlů X.
  • Do množiny X vlož počáteční uzel s.
  • Vytvoř asociativní pole čísel pro každý uzel D(u).
  • Inicializuj hodnoty pole D takto:
    • pro počáteční uzel s = 0
    • pro každý uzel u sousedící s počátečním uzlem s = ohodnocení hrany (s,u)
    • pro ostatní uzly = nekonečno
  • VÝPOČET:
  • Dokud nejsou v množině X všechny uzly grafu G, opakuj:
    • Najdi uzel w s minimální hodnotou D(w).
    • Přidej uzel w do množiny X.
    • Pro každý uzel u sousedící s uzlem w který není v množině X proveď:
      • hodnota D(u) je minimum ze stávající hodnoty a D(w) plus ohodnocení hrany (w,u).

Příklad

Inicializace

Vstupem algoritmu je následující graf, počátečním uzlem s je uzel A.

vstupní ohodocený graf

Všechny kroky v tabulce

Každý řádek tabulky představuje jeden krok algoritmu, ve sloupcích jsou uzly grafu G a množina X. Jednotlivé buňky obsahují hodnotu D(u) odpovídajícího uzlu u ve sloupci. Zkratka „max“ označuje nekonečno.

A B C D E F množina X
0 10, A 3, A 4, A max max A
8, C 4, A 11, C max A, C
8, C 11, C 11, D A, C, D
11, C 11, D A, C, D, B
11, D A, C, D, B, E
A, C, D, B, E

Výsledek

A B C D E F
0 8, C 3, A 4, A 11, C 11, D

Časová složitost

Dijkstrův algoritmus lze naimplementovat s následující asymptotickou složitostí:

O (|E| + |V| \log |V|)

Reference