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