Кратчайший путь из одного источника с использованием BFS для неориентированного взвешенного графа

Я пытался найти решение для поиска алгоритма кратчайшего пути с одним источником для неориентированного взвешенного графа с использованием BFS.

Я придумал решение для преобразования каждого веса ребра, скажем x, в x ребер между вершинами каждого нового ребра с весом 1, а затем запустить BFS. Я бы получил новое дерево BFS, и, поскольку это дерево, существует только 1 путь от корневого узла до каждой другой вершины.

Проблема, с которой я столкнулся, заключается в том, чтобы попытаться проанализировать следующий алгоритм. Каждое ребро нужно посетить один раз, а затем разбить на соответствующее количество ребер в соответствии с его весом. Затем нам нужно найти BFS нового графа.

Стоимость посещения каждого ребра составляет O (m), где m - количество ребер, поскольку каждое ребро посещается один раз для его разделения. Предположим, что новый граф имеет km ребер (скажем, m '). Временная сложность BFS составляет O (n + m ') = O (n + km) = O (n + m), т.е. временная сложность остается неизменной. Правильно ли данное доказательство?

Я знаю, что могу использовать здесь алгоритм Дейкстры, но меня особенно интересует анализ этого алгоритма на основе BFS.


person Prateek Agrawal    schedule 18.03.2020    source источник


Ответы (1)


Приведенный вами анализ близок, но неверен. Если вы предположите, что стоимость каждого ребра не превосходит k, тогда ваш новый граф будет иметь O (kn) узлов (на каждое ребро добавлены дополнительные узлы) и O (km) ребер, поэтому время выполнения будет O (kn + km) . Однако вы не можете предполагать, что k здесь постоянная. В конце концов, если я увеличу вес по краям, я действительно увеличу время, необходимое для выполнения вашего кода. Таким образом, в целом вы можете дать время работы O (узлов + км).

Обратите внимание, что k здесь является отдельным параметром для среды выполнения, так же, как m и n. И в этом есть смысл - больший вес увеличивает время автономной работы.

(Следует отметить, что это не считается алгоритмом с полиномиальным временем. Скорее, это алгоритм с псевдополиномиальным временем, поскольку число битов, необходимых для записи веса k, равно O (log k).)

person templatetypedef    schedule 18.03.2020