Johnsonův algoritmus

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 7. listopadu 2019; ověření vyžaduje 1 úpravu .

Johnsonův algoritmus – umožňuje vám najít nejkratší cesty mezi všemi dvojicemi vrcholů ve váženém orientovaném grafu . Tento algoritmus funguje, pokud graf obsahuje hrany s kladnou nebo zápornou váhou, ale neexistují žádné cykly se zápornou váhou. Pojmenován po D. B. Johnson , který publikoval algoritmus v roce 1977.

Algoritmus

Daný graf s váhovou funkcí . Pokud jsou váhy všech hran v grafu nezáporné, můžete najít nejkratší cesty mezi všemi páry vrcholů spuštěním Dijkstrova algoritmu jednou pro každý vrchol. Pokud graf obsahuje hrany se zápornými vahami, ale žádné cykly se zápornými vahami, lze vypočítat novou sadu hran s nezápornými vahami, což umožňuje použít předchozí metodu. Nová sada sestávající ze závaží hran musí splňovat následující vlastnosti.

Zachování nejkratších cest

Lemma (Změna vah zachovává nejkratší cesty). Nechť je vážený orientovaný graf s váhovou funkcí a nechť  je libovolná funkce, která mapuje vrcholy na reálná čísla. Pro každou hranu definujeme

Dovolit být  libovolná cesta od vrcholu k vrcholu . je nejkratší cesta s váhovou funkcí právě tehdy, když je to nejkratší cesta s váhovou funkcí , tj. rovnost je ekvivalentní rovnosti . Kromě toho graf obsahuje cyklus se zápornou váhou pomocí váhové funkce právě tehdy, pokud obsahuje cyklus se zápornou váhou pomocí váhové funkce .

Změna hmotnosti

  1. Pro tento graf vytvořte nový graf , kde , pro nějaký nový vrchol a .
  2. Rozšiřme váhovou funkci tak, aby rovnost platila pro všechny vrcholy .
  3. Dále definujeme pro všechny vrcholy hodnotu a nové váhy pro všechny hrany .

Základní postup

Johnsonův algoritmus používá Bellman-Fordův algoritmus a Dijkstrův algoritmus implementované jako podprogramy. Hrany jsou uloženy jako seznamy sousedních vrcholů. Algoritmus vrací běžnou matici velikosti , kde , nebo dává zprávu, že vstupní graf obsahuje cyklus se zápornou váhou.

Johnson's Algorithm Sestavte graf , pokud Bellman_Ford = FALSE , pak vytiskněte "Vstupní graf obsahuje cyklus se zápornou váhou" vraťte ø pro každou hodnotu nastavte na , vypočítané Bellman-Fordovým algoritmem for pro každou hranu proveďte pro pro každý vrchol do Dijkstrův algoritmus vypočítá hodnoty pro všechny vrcholy pro pro každý vrchol do return D

Obtížnost

Pokud je fronta s neklesající prioritou v Dijkstrově algoritmu implementována jako Fibonacciho halda , pak je doba běhu Johnsonova algoritmu . S jednodušší implementací fronty s neklesající prioritou se doba běhu rovná , ale u řídkých grafů se tato hodnota v asymptotickém limitu chová lépe než doba běhu Floyd-Warshallova algoritmu .

Viz také

Odkazy

Literatura