Алгоритм Левита
Алгоритм Левита находит расстояние от заданной вершины
до всех остальных. Позволяет работать с ребрами отрицательного веса при отсутствии отрицательных циклов.Алгоритм
Пусть
— текущая длина кратчайшего пути до вершины . Изначально, для всех ; .Разделим вершины на три множества:
- — вершины, расстояние до которых уже вычислено(возможно, не окончательно)
- — вершины, расстояние до которых вычисляется. Это множество в свою очередь делится на два упорядоченных подмножества:
- — основная очередь
- — срочная очередь
- — вершины, расстояние до которых не вычисленно
Изначально все вершины, кроме
помещаются в множество . Вершина помещается в множество .
Шаг алгоритма: выбирается вершина из . Если подмножество не пусто, то вершина берется из него, иначе из . Далее, для каждого ребра :
- если , то переводится в конец очереди . При этом
- если , то происходит релаксация ребра
- если и , то происходит релаксация ребра и помещается в
В конце шага помещаем вершину
в множество .
Алгоритм заканчивает работу, когда множество становится пустым.
Псевдокод
for uV : .add(s) for u s V : .add(u) while : if : u .pop() else : u .pop() for uv E : if v : .push(v) relax(uv) if v : relax(uv) if v and : relax(uv) .push(v) .add(u)
Сложность
В худшем случае алгоритм Левита работает за
. Это происходит вследствие того, что некоторые вершины приходится обрабатывать повторно. Однако эксперементы показывают, что для реальных графов(например, карт дорог) данный алгоритм оказывается достаточно быстрым. Эксперементальная оценка данного алгоритма составляет .См. также
Источники
- Алгоритм Левита - Википедия, свободная энциклопедия
- Алгоритм Левита - MAXimal::algo
- И. В. Романовский, Дискретный анализ, ISBN 5-7940-0138-0; 2008 г., стр. 228-234.