Алгоритм Джонсона: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) (→Ссылки) |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
== Идея == | |||
* Добавим в граф фиктивную вершину s, из которой во все остальные вершины идут рёбра нулевого веса. | * Добавим в граф фиктивную вершину s, из которой во все остальные вершины идут рёбра нулевого веса. | ||
* Запустим алгоритм Форда-Беллмана из вершины s. | * Запустим алгоритм Форда-Беллмана из вершины s. | ||
* Зададим новые веса для всех рёбер: w'(v, to) = w(v, to) + | * Зададим новые веса для всех рёбер: w'(v, to) = w(v, to) + fordBellmanDist[v] - fordBellmanDist[to]. | ||
* Утверждается, что новые веса неотрицательны, а кратчайшие пути остались теми же; это позволяет запустить из каждой вершины алгоритм Дейкстры. | * Утверждается, что новые веса неотрицательны, а кратчайшие пути остались теми же; это позволяет запустить из каждой вершины алгоритм Дейкстры. | ||
* Восстановим длины кратчайших путей: dist[a][b] = dijkstraDist[a][b] - fordBellmanDist[a] + fordBellmanDist[b]. | |||
== Сложность == | |||
Запуск Форда-Беллмана — O(VE), V запусков Дейкстры — O(V<sup>3</sup>) или O(VElogV). | |||
Если граф разреженный (E ~ V) и используется разреженный вариант Дейкстры, то общая сложность составит O(V<sup>2</sup>logV), что лучше, чем у алгоритма Флойда. | |||
== Ссылки == | == Ссылки == |
Версия от 08:18, 5 июля 2022
Идея
- Добавим в граф фиктивную вершину s, из которой во все остальные вершины идут рёбра нулевого веса.
- Запустим алгоритм Форда-Беллмана из вершины s.
- Зададим новые веса для всех рёбер: w'(v, to) = w(v, to) + fordBellmanDist[v] - fordBellmanDist[to].
- Утверждается, что новые веса неотрицательны, а кратчайшие пути остались теми же; это позволяет запустить из каждой вершины алгоритм Дейкстры.
- Восстановим длины кратчайших путей: dist[a][b] = dijkstraDist[a][b] - fordBellmanDist[a] + fordBellmanDist[b].
Сложность
Запуск Форда-Беллмана — O(VE), V запусков Дейкстры — O(V3) или O(VElogV).
Если граф разреженный (E ~ V) и используется разреженный вариант Дейкстры, то общая сложность составит O(V2logV), что лучше, чем у алгоритма Флойда.