Для ориентированного связного графа только с положительными весами ребер, существуют ли более быстрые алгоритмы для поиска кратчайшего пути между двумя вершинами, чем Дейкстра с использованием кучи Фибоначчи?
Википедия говорит, что Дейкстра находится в O (| E | + | V | * log (| V |)) (используя кучу Фибоначчи).
Я не ищу оптимизацию, которая, например, вдвое меньше времени выполнения, а скорее алгоритмы, которые имеют разную сложность по времени (например, переход от O (n * log n) к O (n)).
Далее, я хотел бы узнать ваше мнение о следующем подходе:
- Определить GCD всех весов ребер.
- Преобразование графа в граф с равномерным весом ребер.
- Используйте BFS, чтобы найти кратчайший путь между двумя заданными вершинами.
Пример для пункта 2:
Вообразите, что GCD равен 1. Тогда я бы преобразовал край
A ---> B (вес ребра 3)
в
A-> A '-> A' '-> B (3-кратный вес ребра 1)
Это преобразование стоит постоянного времени и должно быть сделано один раз для каждого края Поэтому я ожидаю, что этот алгоритм будет в O (| E |) (преобразование) + O (| E | + | V |) (BFS) = O (2 * | E | + | V |) = O (| E | + | V |)
Спасибо, что нашли время, чтобы прочитать мой вопрос, и я надеюсь не тратить ваше время ^^. Хорошего дня.