На самом деле существует алгоритм, который использует алгоритм Дейкстры в среде с отрицательным путем; это делается путем удаления всех отрицательных ребер и перебалансировки графика в первую очередь. Этот алгоритм называется «Алгоритм Джонсона».
Способ, которым это работает, заключается в добавлении нового узла (скажем, Q), стоимость которого равна 0 для прохождения к каждому другому узлу в графе. Затем он запускает Беллмана-Форда на графике из точки Q, получая стоимость для каждого узла по отношению к Q, которую мы будем называть q [x], которая будет либо 0, либо отрицательным числом (так как использовался один из отрицательных путей ).
например. a -> -3 -> b, поэтому, если мы добавим узел Q, стоимость которого равна 0, для всех этих узлов, то q [a] = 0, q [b] = -3.
Затем мы перебалансируем ребра, используя формулу: weight + q [source] - q [destination], поэтому новый вес a-> b равен -3 + 0 - (-3) = 0. Мы делаем это для всех остальных ребер в графе, затем удалите Q и его исходящие ребра и вуаля! Теперь у нас есть ребалансированный граф без отрицательных ребер, к которому мы можем запустить dijkstra's!
Время работы: O (нм) [Беллман-форд] + n x O (m log n) [n Дейкстры] + O (n ^ 2) [вычисление веса] = O (нм log n) время
Дополнительная информация: http://joonki -jeong.blogspot.co.uk / 2013/01 / johnsons -gorith.html