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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
(Алгоритм)
Строка 3: Строка 3:
 
== Алгоритм ==
 
== Алгоритм ==
  
Пусть <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 \gets \infty</tex>; <tex>d_s \gets 0</tex>.
  
 
Разделим вершины на три множества:
 
Разделим вершины на три множества:
* <tex>M_0</tex> - вершины, расстояние до которых уже вычислено(возможно, не окончательно)
+
* <tex>M_0</tex> {{---}} вершины, расстояние до которых уже вычислено(возможно, не окончательно)
* <tex>M_1</tex> - вершины, расстояние до которых вычисляется
+
* <tex>M_1</tex> {{---}} вершины, расстояние до которых вычисляется. Это множество в свою очередь делится на два упорядоченных подмножества:
* <tex>M_2</tex> - вершины, расстояние до которых не вычисленно
+
# <tex>M_1^{'}</tex> {{---}} основная очередь
 +
# <tex>M_1^{''}</tex> {{---}} срочная очередь
 +
* <tex>M_2</tex> {{---}} вершины, расстояние до которых не вычисленно
  
 
Изначально все вершины, кроме <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_1^{''}</tex> не пусто, то вершина берется из него, иначе из <tex>M_1^{'}</tex>. Далее, для каждого ребра <tex>uv \in E</tex>:
 +
* если <tex>v \in M_2</tex>, то <tex>v</tex> переводится в конец очереди <tex>M_1^{'}</tex>. При этом <tex>d_v \gets d_u + w_{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>M_1</tex> становится пустым.
  
 
== Псевдокод ==
 
== Псевдокод ==

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

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

Алгоритм

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

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

  • [math]M_0[/math] — вершины, расстояние до которых уже вычислено(возможно, не окончательно)
  • [math]M_1[/math] — вершины, расстояние до которых вычисляется. Это множество в свою очередь делится на два упорядоченных подмножества:
  1. [math]M_1^{'}[/math] — основная очередь
  2. [math]M_1^{''}[/math] — срочная очередь
  • [math]M_2[/math] — вершины, расстояние до которых не вычисленно

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


Шаг алгоритма: выбирается вершина [math]u[/math] из [math]M_1[/math]. Если подмножество [math]M_1^{''}[/math] не пусто, то вершина берется из него, иначе из [math]M_1^{'}[/math]. Далее, для каждого ребра [math]uv \in E[/math]:

  • если [math]v \in M_2[/math], то [math]v[/math] переводится в конец очереди [math]M_1^{'}[/math]. При этом [math]d_v \gets d_u + w_{uv}[/math]
  • если [math]v \in M_1[/math], то происходит релаксация ребра [math]uv[/math]
  • если [math]v \in M_0[/math] и [math]d_v \gt d_u + w_{uv}[/math], то происходит релаксация ребра [math]uv[/math] и [math]v[/math] помещается в [math]M_1^{''}[/math]

Алгоритм заканчивает работу, когда множество [math]M_1[/math] становится пустым.

Псевдокод

Сложность

См. также

Источники