Как уже отмечали другие, Флойд-Варшалл запускается во время O (n 3 ) и выполняет поиск Дейкстры от каждого узла к каждому другому узлу, предполагая, что вы используете кучу Фибоначчи для поддержки вашегоРеализация Дейкстры, принимает O (mn + n 2 log n).Однако вы не всегда можете безопасно запустить Дейкстру на произвольном графе, потому что алгоритм Дейкстры не работает с отрицательными весами ребер.
Существует действительно замечательный алгоритм, который называется Алгоритм Джонсона это небольшая модификация запуска алгоритма Дейкстры с каждого узла, которая позволяет этому подходу работать, даже если граф содержит отрицательные ребра (если нет отрицательных циклов).Алгоритм работает, сначала запустив Bellman-Ford на графе, чтобы преобразовать его в граф без отрицательных ребер, затем используя алгоритм Дейкстры, начиная с каждой вершины.Поскольку Беллман-Форд работает за время O (mn), общее асимптотическое время выполнения все еще равно O (mn + n 2 log n), поэтому, если m = o (n 2 ) (обратите внимание, что это little-o из n), этот подход асимптотически быстрее, чем при использовании Floyd-Warshall.
Единственный улов здесь заключается в том, что это предполагает, что у вас есть алгоритм Дейкстры, подкрепленныйКуча Фибоначчи.Если у вас нет доступной кучи Фибоначчи и вы не готовы потратить 72 часа, необходимые для сборки, отладки и тестирования, вы все равно можете использовать двоичную кучу для алгоритма Дейкстры;он просто увеличивает время выполнения до O (m log n), поэтому эта версия алгоритма Джонсона работает в O (mn log n).Это больше не всегда асимптотически быстрее, чем Флойд-Варшалл, потому что если m = Ω (n 2 ), тогда Флойд-Варшалл работает в O (n 3 ), в то время как алгоритм Джонсона работает в O(n 3 log n).Однако для разреженных графов, где m = o (n 2 / log n), эта реализация алгоритма Джонсона все еще асимптотически лучше, чем Флойд-Варшалл
Короче:
- С кучей Фибоначчи алгоритм Джонсона всегда асимптотически, по крайней мере, так же хорош, как Флойд-Варшалл, хотя его сложнее кодировать.
- С двоичной кучей алгоритм Джонсона обычно равен асимптотически, по крайней мере, так же хорошо, как Флойд-Варшалл, но не подходит для работы с большими плотными графами.
Надеюсь, это поможет!