Лучшим подходом было бы использовать алгоритм Dijkstra’s shortest path
, мы можем получить кратчайший путь за O(E + VLogV)
время.
Воспользуйтесь этим базовым c подходом, который поможет вам найти кратчайший путь:
Посмотрите на все узлы, непосредственно смежные с начальным узлом. Значения, передаваемые ребрами, соединяющими начало и эти соседние узлы, являются кратчайшими расстояниями до каждого соответствующего узла.
Запишите эти расстояния на узле - перезапись бесконечности - а также вычеркните узлы, означая, что их кратчайший путь был найден.
Выберите один из узлов, для которого вычислен кратчайший путь, мы назовем его нашей точкой поворота. Посмотрите на соседние с ним узлы (мы назовем их нашими конечными узлами) и расстояния, разделяющие их.
Для каждого конца (конечный узел): если значение в точке поворота плюс значение края, соединяющего его, составляет меньше значения целевого узла, затем обновите его значение, поскольку был найден новый более короткий путь. Если все маршруты к этому узлу назначения были исследованы, его можно вычеркнуть.
Повторяйте шаг 2, пока все узлы не будут вычеркнуты. Теперь у нас есть график, в котором значения, хранящиеся в любом узле, будут кратчайшим расстоянием до него от начального узла.