Алгоритм Левита — различия между версиями
Никита (обсуждение | вклад) (Создание статьи) |
Никита (обсуждение | вклад) (→Алгоритм) |
||
Строка 2: | Строка 2: | ||
== Алгоритм == | == Алгоритм == | ||
+ | |||
+ | Пусть <tex>d_i</tex> - текущая длина кратчайшего пути до вершины <tex>i</tex>. Изначально, для всех <tex>i \neq s : d_i = \infty</tex>; <tex>d_s = 0</tex>. | ||
+ | |||
+ | Разделим вершины на три '''множества''': | ||
+ | * <tex>M_0</tex> - вершины, расстояние до которых уже вычислено(возможно, не окончательно) | ||
+ | * <tex>M_1</tex> - вершины, расстояние до которых вычисляется | ||
+ | * <tex>M_2</tex> - вершины, расстояние до которых не вычисленно | ||
+ | |||
+ | Изначально все вершины, кроме <tex>s</tex> помещаются в множество <tex>M_2</tex>. Вершина <tex>s</tex> помещается в множество <tex>M_1</tex>. | ||
+ | |||
+ | |||
+ | На каждом шаге выбирается вершина <tex>u</tex> из множества <tex>M_1</tex>. Переводим эту вершину во множество <tex>M_0</tex>. Для каждого ребра <tex>uv</tex>: | ||
+ | * если <tex>v \in M_2</tex>, то переносим <tex>v</tex> в <tex>M_1</tex> и релаксируем ребро <tex>uv</tex> | ||
+ | * если <tex>v \in M_1</tex>, то релаксируем ребро <tex>uv</tex> | ||
+ | * если <tex>c \in M_0</tex>, то переносим <tex>v</tex> в <tex>M_1</tex> и релаксируем ребро <tex>uv</tex> | ||
+ | |||
+ | |||
+ | Алгоритм завершается, когда множество <tex>M_1</tex> становится пустым. | ||
== Псевдокод == | == Псевдокод == |
Версия 11:56, 19 октября 2013
Алгоритм Левита находит расстояние от заданной вершины
до всех остальных. Работает с ребрами отрицательного веса.Содержание
Алгоритм
Пусть
- текущая длина кратчайшего пути до вершины . Изначально, для всех ; .Разделим вершины на три множества:
- - вершины, расстояние до которых уже вычислено(возможно, не окончательно)
- - вершины, расстояние до которых вычисляется
- - вершины, расстояние до которых не вычисленно
Изначально все вершины, кроме
помещаются в множество . Вершина помещается в множество .
На каждом шаге выбирается вершина из множества . Переводим эту вершину во множество . Для каждого ребра :
- если , то переносим в и релаксируем ребро
- если , то релаксируем ребро
- если , то переносим в и релаксируем ребро
Алгоритм завершается, когда множество становится пустым.