Алгоритм Левита — различия между версиями
Никита (обсуждение | вклад) (→Алгоритм) |
Никита (обсуждение | вклад) (→Алгоритм) |
||
Строка 5: | Строка 5: | ||
Пусть <tex>d_i</tex> - текущая длина кратчайшего пути до вершины <tex>i</tex>. Изначально, для всех <tex>i \neq s : d_i = \infty</tex>; <tex>d_s = 0</tex>. | Пусть <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_0</tex> - вершины, расстояние до которых уже вычислено(возможно, не окончательно) | ||
* <tex>M_1</tex> - вершины, расстояние до которых вычисляется | * <tex>M_1</tex> - вершины, расстояние до которых вычисляется |
Версия 11:57, 19 октября 2013
Алгоритм Левита находит расстояние от заданной вершины
до всех остальных. Работает с ребрами отрицательного веса.Содержание
Алгоритм
Пусть
- текущая длина кратчайшего пути до вершины . Изначально, для всех ; .Разделим вершины на три множества:
- - вершины, расстояние до которых уже вычислено(возможно, не окончательно)
- - вершины, расстояние до которых вычисляется
- - вершины, расстояние до которых не вычисленно
Изначально все вершины, кроме
помещаются в множество . Вершина помещается в множество .
На каждом шаге выбирается вершина из множества . Переводим эту вершину во множество . Для каждого ребра :
- если , то переносим в и релаксируем ребро
- если , то релаксируем ребро
- если , то переносим в и релаксируем ребро
Алгоритм завершается, когда множество становится пустым.