Алгоритм Левита — различия между версиями
Никита (обсуждение | вклад) |
Никита (обсуждение | вклад) (→Алгоритм) |
||
Строка 19: | Строка 19: | ||
* если <tex>v \in M_1</tex>, то происходит релаксация ребра <tex>uv</tex> | * если <tex>v \in M_1</tex>, то происходит релаксация ребра <tex>uv</tex> | ||
* если <tex>v \in M_0</tex> и <tex>d_v > d_u + w_{uv}</tex>, то происходит релаксация ребра <tex>uv</tex> и <tex>v</tex> помещается в <tex>M_1^{''}</tex> | * если <tex>v \in M_0</tex> и <tex>d_v > d_u + w_{uv}</tex>, то происходит релаксация ребра <tex>uv</tex> и <tex>v</tex> помещается в <tex>M_1^{''}</tex> | ||
+ | В конце шага помещаем вершину <tex>u</tex> в множество <tex>M_0</tex>. | ||
Версия 14:02, 19 октября 2013
Алгоритм Левита находит расстояние от заданной вершины алгоритмы Дейкстры, которая позволяет работать с ребрами отрицательного веса.
до всех остальных. Данный алгоритм является модификациейСодержание
Алгоритм
Пусть
— текущая длина кратчайшего пути до вершины . Изначально, для всех ; .Разделим вершины на три множества:
- — вершины, расстояние до которых уже вычислено(возможно, не окончательно)
- — вершины, расстояние до которых вычисляется. Это множество в свою очередь делится на два упорядоченных подмножества:
- — основная очередь
- — срочная очередь
- — вершины, расстояние до которых не вычисленно
Изначально все вершины, кроме
помещаются в множество . Вершина помещается в множество .
Шаг алгоритма: выбирается вершина из . Если подмножество не пусто, то вершина берется из него, иначе из . Далее, для каждого ребра :
- если , то переводится в конец очереди . При этом
- если , то происходит релаксация ребра
- если и , то происходит релаксация ребра и помещается в
В конце шага помещаем вершину
в множество .
Алгоритм заканчивает работу, когда множество становится пустым.