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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
(Алгоритм)
Строка 11: Строка 11:
  
 
Изначально все вершины, кроме <tex>s</tex> помещаются в множество <tex>M_2</tex>. Вершина <tex>s</tex> помещается в множество <tex>M_1</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> становится пустым.
 
  
 
== Псевдокод ==
 
== Псевдокод ==

Версия 13:08, 19 октября 2013

Алгоритм Левита находит расстояние от заданной вершины [math]s[/math] до всех остальных. Работает с ребрами отрицательного веса.

Алгоритм

Пусть [math]d_i[/math] - текущая длина кратчайшего пути до вершины [math]i[/math]. Изначально, для всех [math]i \neq s : d_i = \infty[/math]; [math]d_s = 0[/math].

Разделим вершины на три множества:

  • [math]M_0[/math] - вершины, расстояние до которых уже вычислено(возможно, не окончательно)
  • [math]M_1[/math] - вершины, расстояние до которых вычисляется
  • [math]M_2[/math] - вершины, расстояние до которых не вычисленно

Изначально все вершины, кроме [math]s[/math] помещаются в множество [math]M_2[/math]. Вершина [math]s[/math] помещается в множество [math]M_1[/math].

Псевдокод

Сложность

См. также

Источники