Алгоритм Джонсона — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
(Псевдокод)
Строка 81: Строка 81:
 
             '''for''' для каждой вершины <tex>v \in V</tex>
 
             '''for''' для каждой вершины <tex>v \in V</tex>
 
                 '''do''' <tex>d_{uv} \leftarrow \delta_\varphi(u,\;v) + \varphi(v) - \varphi(u)</tex>
 
                 '''do''' <tex>d_{uv} \leftarrow \delta_\varphi(u,\;v) + \varphi(v) - \varphi(u)</tex>
     '''return''' d
+
     '''return''' <tex>d</tex>
  
 
Итого, в начале алгоритм Форда-Беллмана либо строит потенциальную функцию такую, что после перевзвешивания все веса ребер будут неотрицательны, либо выдает сообщение о том, что в графе присутствует отрицательный цикл.
 
Итого, в начале алгоритм Форда-Беллмана либо строит потенциальную функцию такую, что после перевзвешивания все веса ребер будут неотрицательны, либо выдает сообщение о том, что в графе присутствует отрицательный цикл.

Версия 20:42, 3 ноября 2011

Алгоритм Джонсона находит кратчайшие пути между всеми парами вершин взвешенного ориентированного графа с положительными или отрицательными ребрами, но не имеющем отрицательных циклов.

Алгоритм

Описание

Алгоритм Джонсона позволяет найти кратчайшие пути между всеми парами вершин в течение времени O(V2log(V)+VE). Для разреженных графов этот алгоритм ведет себя асимптотически быстрее алгоритма Флойда. Этот алгоритм либо возвращает матрицу кратчайших расстояний между всеми парами вершин, либо сообщение о том, что в графе существует цикл отрицательной длины.

В этом алгоритме используется метод изменения веса (англ. reweighting). Суть его заключается в том, что для заданного графа G строится новая весовая функция ˆω, неотрицательная для всех ребер графа G и сохраняющая кратчайшие пути. Такая весовая функция строится при помощи так называемой потенциальной функции.


Определение:
Пусть φ:VR - произвольное отображение из множества вершин в вещественные числа. Тогда новой весовой функцией будет ωφ(u,v)=ω(u,v)+φ(u)φ(v).


Такая потенциальная функция строится при помощи добавлении фиктивной вершины в G и запуском алгоритма Форда-Беллмана из нее. На этом же этапе мы сможем обнаружить наличие отрицательного цикла в графе.

Теперь, когда мы знаем, что веса всех ребер неотрицательны, и кратчайшие пути сохранятся, можно запустить алгоритм Дейкстры из каждой вершины и таким образом найти кратчайшие расстояния между всеми парами вершин.

Сохранение кратчайших путей

Утверждается, что если какой-то путь P был кратчайшим относительно весовой функции ω, то он будет кратчайшим и относительно новой весовой функции ˆω.

Лемма:
Пусть P,Q:ab и w(P)<w(Q). Тогда φ:wφ(P)<wφ(Q)
Доказательство:
P:u0u1u2...uk
wφ(P)=wφ(u0u1)+wφ(u1u2)+...+wφ(uk1uk)=φ(u0)+w(u0u1)φ(u1)+...+φ(uk1)+w(uk1uk)φ(uk)=φ(u0)+w(P)φ(uk)
w(P)<w(Q)
wφ(P)=φ(a)+w(P)φ(b)
wφ(Q)=φ(a)+w(Q)φ(b)
Отсюда, wφ(P)<wφ(Q)

Теорема о существовании потенциальной функции

Теорема:
В графе G нет отрицательных циклов существует потенциальная функция ϕ:uvEwφ(uv)0
Доказательство:

: C - цикл в графе G

w(C)=wφ(C)uvC(φ(u)φ(v))=wφ(C)0

: Добавим вершину s в граф, соединим её со всеми вершинами графа G ребрами весом w=0.

Обозначение : δ(i,j) - минимальное расстояние между вершинами i,j графа G.
ϕ(u)=δ(s,u)
wϕ(uv)=ϕ(u)+w(uv)ϕ(v)=δ(s,u)+w(uv)δ(s,v).
δ(s,u)+w(uv)= {какой-то путь sv}.
δ(s,v)= {минимальный путь sv}.
Следовательно, wϕ(uv)0

Псевдокод

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

Строится граф G=(V,E), где V=V{s}, 
для некоторой новой вершины sV, а E=E{(s,v):ω(s,v)=0, vV}
if Bellman_Ford(G,ω,s) == FALSE
   then out << «Входной граф содержит цикл с отрицательным весом»
   else for для каждой vV
        do присвоить величине φ(v) значение δ(s,v),
           вычисленное алгоритмом Беллмана — Форда
        for для каждого ребра (u,v)E
            do wφ(u,v)w(u,v)+φ(u)φ(v)
        for для каждой вершины uV
            do вычисление с помощью алгоритма Дейкстры
            (G,wφ,u) величин δφ(u,v)
            для всех вершин vV
            for для каждой вершины vV
                do duvδφ(u,v)+φ(v)φ(u)
   return d

Итого, в начале алгоритм Форда-Беллмана либо строит потенциальную функцию такую, что после перевзвешивания все веса ребер будут неотрицательны, либо выдает сообщение о том, что в графе присутствует отрицательный цикл.

Затем из каждой вершины запускается алгоритм Дейкстры для составления искомой матрицы. Так как все веса ребер теперь неотрицательны, алгоритм Дейкстры будет работать корректно. А поскольку перевзвешивание таково, что кратчайшие пути относительно обеих весовых функций совпадают, алгоритм Джонсона в итоге корректно найдет все кратчайшие пути между всеми парами вершин.

Сложность

Алгоритм Джонсона работает за O(VE+VD), где O(D) - время работы алгоритма Дейкстры. Если в алгоритме Дейкстры неубывающая очередь с приоритетами реализована в виде фибоначчиевой кучи, то время работы алгоритма Джонсона равно O(V2logV+VE).

См. также

Литература

  • Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ.[1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.