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

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Джонсона — позволяет найти кратчайшие пути между всеми парами вершин взвешенного ориентированного графа. Данный алгоритм работает, если в графе содержатся рёбра с положительным или отрицательным весом, но отсутствуют циклы с отрицательным весом. Назван в честь Шаблон:Нп5, опубликовавшего алгоритм в 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 do print «Входной граф содержит цикл с отрицательным весом»
           return ø
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), но для разреженных графов эта величина в асимптотическом пределе ведёт себя лучше, чем время работы алгоритма Флойда — Уоршелла.

См. также

Ссылки

Литература

Шаблон:Алгоритмы поиска на графах