Алгоритм Джонсона — это способ поиска кратчайших путей между всеми парами вершин в ориентированном графе с рёберным весом . Он допускает, чтобы некоторые веса рёбер были отрицательными числами , но циклы с отрицательным весом не могут существовать. Он работает с использованием алгоритма Беллмана–Форда для вычисления преобразования входного графа, которое удаляет все отрицательные веса, позволяя использовать алгоритм Дейкстры на преобразованном графе. [1] [2] Он назван в честь Дональда Б. Джонсона , который впервые опубликовал эту технику в 1977 году. [3]
Похожий метод перевеса также используется в алгоритме Суурбалле для нахождения двух непересекающихся путей минимальной общей длины между теми же двумя вершинами в графе с неотрицательными весами ребер. [4]
Алгоритм Джонсона состоит из следующих шагов: [1] [2]
Первые три этапа алгоритма Джонсона изображены на рисунке ниже.
Граф слева на иллюстрации имеет два отрицательных ребра, но нет отрицательных циклов. Центральный граф показывает новую вершину q , дерево кратчайших путей, вычисленное алгоритмом Беллмана–Форда с q в качестве начальной вершины, и значения h ( v ), вычисленные в каждом другом узле как длина кратчайшего пути от q до этого узла. Обратите внимание, что все эти значения неположительны, поскольку q имеет ребро нулевой длины к каждой вершине, а кратчайший путь не может быть длиннее этого ребра. Справа показан перевзвешенный граф, образованный заменой каждого веса ребра на w ( u , v ) + h ( u ) − h ( v ) . В этом перевзвешенном графе все веса ребер неотрицательны, но кратчайший путь между любыми двумя узлами использует ту же последовательность ребер, что и кратчайший путь между теми же двумя узлами в исходном графе. Алгоритм завершается применением алгоритма Дейкстры к каждому из четырех начальных узлов в перевзвешенном графе.
В перевзвешенном графе все пути между парой узлов s и t имеют одинаковое количество h ( s ) − h ( t ), добавленное к ним. Предыдущее утверждение можно доказать следующим образом: Пусть p — путь . Его вес W в перевзвешенном графе задается следующим выражением:
Каждое из них сокращается на в предыдущем выражении в скобках; поэтому у нас остается следующее выражение для W :
Выражение в скобках представляет собой вес p в исходном взвешивании.
Поскольку перевзвешивание добавляет одинаковую величину к весу каждого пути , путь является кратчайшим путем в исходном взвешивании тогда и только тогда, когда он является кратчайшим путем после перевзвешивания. Вес ребер, принадлежащих кратчайшему пути от q до любого узла, равен нулю, и поэтому длины кратчайших путей от q до каждого узла становятся нулевыми в перевзвешенном графе; однако они по-прежнему остаются кратчайшими путями. Следовательно, не может быть отрицательных ребер: если бы ребро uv имело отрицательный вес после перевзвешивания, то путь нулевой длины от q до u вместе с этим ребром образовал бы путь отрицательной длины от q до v , что противоречит тому факту, что все вершины имеют нулевое расстояние от q . Отсутствие отрицательных ребер гарантирует оптимальность путей, найденных алгоритмом Дейкстры. Расстояния в исходном графе могут быть рассчитаны из расстояний, рассчитанных алгоритмом Дейкстры в перевзвешенном графе, путем обратного преобразования перевзвешивания. [1]
Временная сложность этого алгоритма, использующего кучи Фибоначчи в реализации алгоритма Дейкстры, составляет : алгоритм использует время для этапа Беллмана–Форда алгоритма и для каждого из экземпляров алгоритма Дейкстры. Таким образом, когда граф разрежен , общее время может быть быстрее, чем у алгоритма Флойда–Уоршелла , который решает ту же задачу за время . [1]