27
правок
Изменения
Нет описания правки
* <tex>v \in M_2</tex>, то <tex>v</tex> переводится в конец очереди <tex>M_1^{'}</tex>. При этом <tex>d_v \gets d_u + w_{uv}</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>u</tex> в множество <tex>M_0</tex>.
== Сложность ==
В плохих случаях алгоритм Левита работает очень долгоза экспоненциальное время. Например, в полном графе <tex>K_n</tex> Рассмотрим граф с достаточно большим <tex>3\cdot n</tex> вершинами и весами такими рёбрами: от вершины <tex>w_{uv} =\begin{cases} v - u - 1, & u > 1\\ w_{un}\cdot2, & u = 1, v = n - 1 \\ n-2, & u = 1, v = n\\ w_{uv+1} + v - u, & u = 1, v < n-1\end{cases}</tex>, рёбра идут в [[Лексикографический порядок|лексикографическом порядке]]. Добавление вершины до <tex>in</tex> в очередь и последующая её обработка влекут добавление из ребро веса <tex>M_02^n</tex> в <tex>M_1{''}</tex> всех её предыдущих вершин, начиная со цепь <tex>2n-1</tex>-ой; дойдя до вершины рёбер через одну вершину (<tex>i-1n</tex>, в <tex>M_1{''}n+2</tex> снова добавятся вершины меньше <tex>i-1...</tex> (кроме первой). Таким образом, вершину <tex>i3 \cdot n</tex> добавят в ; вес <tex>M_1{''}i</tex> -ого звена <tex dpi="130">\sum\limits_{k=1}2^{n-i}k = \dfrac 12\cdot(n-i)\cdot(n-i+1)</tex> раз), всего в а также цепь рёбер от <tex>M_1{''}1</tex> будет до <tex>\dfrac 16\cdot n3 \cdot(n^2-3n+2)</tex> добавлений. В очень плохих случаях вершина (вес каждого звена <tex>i0</tex> может помещаться в очередь ). Ясно, что кратчайший путь до каждой вершины равен <tex>M_1{''}0</tex> , но в плохом случае алгоритм будет постепенно улучшать расстояние до <tex>2^{n-i}</tex> последней вершины, пересчитывая его огромное число раз, что даёт экспоненциальное время. Однако, на реальных графах алгоритм Левита работает быстрее, чем алгоритм [[Алгоритм Форда-Беллмана|Форда Беллмана]] и не многим уступает алгоритму [[Алгоритм Дейкстры|Дейкстры]].
==См. также==