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.
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.
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 .
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 DPokud 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 .
Algoritmy pro vyhledávání grafů | ||
---|---|---|
Neinformované metody | ||
Informované metody | ||
Zkratky | ||
Minimální kostra | ||
jiný |