Алгоритм Джонсона

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Шаблон:Алгоритми пошуку графами

Алгоритм Джонсона дозволяє знайти найкоротші шляхи між усіма парами вершин зваженого орієнтованого графу. Цей алгоритм працює, якщо у графі містяться ребра з додатною чи від'ємною вагою, але відсутні цикли з від'ємною вагою. Названо на честь Шаблон:Нп, який опублікував цей алгоритм 1977 року.

Алгоритм

Дано граф G=(V,E) з ваговою функцією ω:ER. Якщо ваги всіх ребер ω у графі є невід'ємними, то можливо знайти найкоротші шляхи між усіма парами вершин, запустивши алгоритм Дейкстри по одному разу для кожної з вершин. Якщо в графі містяться ребра з від'ємною вагою, але відсутні цикли з від'ємною вагою, то можливо обчислити нову множину ребер з невід'ємними вагами, що дозволяє скористатися попереднім методом. Нова множина, що складається з ваг ребер ω^, повинна відповідати таким властивостям:

  • Для всіх ребер (u,v) нова вага ω^(u,v)>0.
  • Для всіх пар вершин u,vV шлях p є найкоротшим шляхом з вершини u до вершини v з використанням вагової функції ω тоді й лише тоді, коли p є також найкоротшим шляхом з вершини u до вершини v з ваговою функцією ω^.

Збереження найкоротших шляхів

Лема (Зміна ваг зберігає найкоротші шляхи). Нехай дано зважений орієнтований граф G=(V,E) з ваговою функцією ω:ER, і нехай h:VR — довільна функція, що відображує вершини на дійсні числа. Для кожного ребра (u,v)E визначмо

ω^(u,v)=ω(u,v)+h(u)h(v).

Нехай p=v0,v1,,vk є довільним шляхом з вершини v0 до вершини vk. p є найкоротшим шляхом з ваговою функцією ω тоді й лише тоді, коли він є найкоротшим шляхом з ваговою функцією ω^, тобто рівність ω(p)=δ(v0,vk) є рівносильною рівності ω^(p)=δ^(v0,vk). Крім того, граф G містить цикл з від'ємною вагою з використанням вагової функції ω тоді й лише тоді, коли він містить цикл з від'ємною вагою з використанням вагової функції ω^.

Зміна ваги

  1. Для даного графу створімо новий граф G=(V,E), де V=V{s}, для деякої нової вершини s∉V, а E=E{(s,v):vV}.
  2. Розширмо вагову функцію ω таким чином, щоби для всіх вершин vV зберігалася рівність ω(s,v)=0.
  3. Далі визначмо для всіх вершин vV величину h(v)=δ(s,v) та нові ваги для всіх ребер ω^(u,v)=ω(u,v)+h(u)h(v)0.

Основна процедура

В алгоритмі Джонсона використовують алгоритм Беллмана — Форда та алгоритм Дейкстри, втілені у вигляді підпрограм. Ребра зберігають у вигляді переліків суміжних вершин. Алгоритм повертає звичайну матрицю D=dij розміром |V|×|V|, де dij=δ(i,j), або видає повідомлення про те, що вхідний граф містить цикл із від'ємною вагою.

Алгоритм Джонсона

 Збудувати граф G
 if Bellman_Ford (G,ω,s) = FALSE
    then print «Вхідний граф містить цикл з від'ємною вагою»
    else for для кожної vV
         do призначити величині h(v) значення δ(s,v),
            обчислене алгоритмом Беллмана — Форда
         for для кожного ребра (u,v)E
             do ω^(u,v)ω(u,v)+h(u)h(v)
         for для кожної вершини uV
             do обчислення за допомогою алгоритму Дейкстри
             (G,ω^,u) величин δ^(u,v)
             для всіх вершин vV
             for для кожної вершини vV
                 do duvδ^(u,v)+h(v)h(u)
    return D

Складність

Якщо в алгоритмі Дейкстри неспадну чергу з пріоритетами втілено у вигляді фібоначчієвої купи, то тривалість роботи алгоритму Джонсона дорівнює O(V2logV+VE). За простішого втілення неспадної черги з пріоритетами тривалість роботи стає рівною O(VElogV), але для розріджених графів ця величина в асимптотичній границі поводиться краще, ніж тривалість роботи алгоритму Флойда — Воршелла.

Див. також

Посилання

Література