Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

636 Глава 13. Алгоритмы графа

(a) (b) (c)

(d) (e) (f)

(g) (h) (i)

Рисунок 13.12: пример пробега алгоритма TopologicalSort (Кодекс Frag-

ment 13.23): (a) начальная конфигурация; (b-i) после каждого повторения в-то-время-как-петли. Этикетки вершины показывают число вершины и ток incounter стоимость. Пересеченные края показывают с расплющенными Blue Arrow. Толстые линии обозначают вершину и края, исследованные в текущем повторении.

13.5. Кратчайшие пути 637

13.5 Кратчайшие пути

Как мы видели в Разделе 13.3.5, стратегия поиска типа «сначала вширь» может использоваться, чтобы найти кратчайший путь от некоторой стартовой вершины до любой вершины в связанном графе. Этот подход имеет смысл в случаях, где каждый край так же хорош как любой другой, но есть много ситуаций, где этот подход не соответствующий. Например, мы могли бы использовать граф, чтобы представлять компьютерную сеть (такую как Интернет), и мы могли бы интересоваться нахождением самого быстрого пути к маршруту пакет данных между двумя компьютерами. В этом случае для всех краев, вероятно, не уместно быть равным друг другу, так как некоторые связи в компьютерной сети, как правило, намного быстрее, чем другие (например, некоторые края могли бы представлять медленные связи телефонной линии, в то время как другие могли бы представлять быстродействующий, волоконно-оптические связи). Аналогично, мы могли бы хотеть использовать граф, чтобы представлять дороги между городами, и мы могли бы интересоваться нахождением самого быстрого способа поехать по пересеченной местности. В этом случае для всех краев снова, вероятно, не уместно быть равным друг другу, потому что некоторые междугородние расстояния, вероятно, будут намного больше, чем другие. Таким образом естественно рассмотреть графы, края которых не нагружены одинаково.

13.5.1 Взвешенные графы

Взвешенный граф - граф, у которого есть числовое (например, целое число) маркируют w (e)

связанный с каждым краем e, названный весом края e. Мы показываем пример взвешенного графа в рисунке 13.13.

Рисунок 13.13: взвешенный граф, вершины которого представляют крупнейшие американские аэропорты и чьи веса края представляют расстояния в милях. У этого графа есть путь от JFK к СЛАБОЙ из общей массы 2,777 (прохождение ПОРЯДКА и DFW). Это - минимальный путь веса в графе от JFK к СЛАБОМУ.

638 Глава 13. Алгоритмы графа

Определение кратчайших путей во взвешенном графе

Позвольте G быть взвешенным графом. Длина (или вес) пути является суммой весов краев P. Таким образом, если P = ((v0, v1), (v1, v2)..., (vk-1, vk)), тогда длина P, обозначенный w (P), определена как

w (P) =

i = å0 w ((vi, vi+1)).

k -1

Расстояние от вершины v к вершине u в G, обозначенный d (v, u), длина минимального пути длины (также названный кратчайшим путем) от v до u, если такой путь существует.

Люди часто используют соглашение что d (v, u) = + ¥, если нет никакого пути вообще от

v к u в G. Даже если есть путь от v до u в G, расстояние от v до u может

не быть определенным, однако, если есть цикл в G, общая масса которого отрицательна. Например, предположите, что вершины в G представляют города, и веса краев в G представляют, какого количества денег это стоит, чтобы пойти от одного города до другого. Если кто-то был готов фактически заплатить нам, чтобы пойти от, говорит JFK ПОРЯДКУ, то «стоимость» края (JFK, ПОРЯДОК) была бы отрицательна. Если бы кто-то еще был готов заплатить нам, чтобы пойти от ПОРЯДКА до JFK, то был бы цикл отрицательного веса в G, и расстояния больше не будут определяться. Таким образом, любой мог теперь построить путь (с циклами) в G из любого города в другой город Б, который сначала идет к JFK и затем циклам так много раз, как ему или ей нравится от JFK к ПОРЯДКУ и назад, прежде, чем продолжиться к B. Существование таких путей позволило бы нам строить произвольно низкие пути отрицательной стоимости (и, в этом случае, наживать состояние в процессе). Но расстояния не могут быть произвольно низкими отрицательными числами. Таким образом, любое время, мы используем веса края, чтобы представлять расстояния, мы должны бояться вводить любые циклы отрицательного веса.

Предположим, что нам дают взвешенный граф G, и нас просят найти кратчайший путь от некоторой вершины v друг другу вершина в G, рассматривая веса на краях как расстояния. В этой секции мы исследуем эффективные способы найти все такие кратчайшие пути, если они существуют. Первый алгоритм, который мы обсуждаем, для простого, все же распространенного,

случай, когда все веса края в G неотрицательные (то есть, w (e)³ 0 для каждого края

e G); следовательно, мы знаем заранее, что нет никаких циклов отрицательного веса в G.

Вспомните, что особый случай вычисления кратчайшего пути, когда все веса равны, каждый был решен с пересекающимся алгоритмом BFS, представленным в Разделе 13.3.5.

Есть интересный подход для решения этой проблемы единственного источника, основанной на жадном шаблоне метода (Раздел 12.4.2). Вспомните, что в этом образце мы решаем проблему под рукой, неоднократно выбирая лучший выбор из числа доступных в каждом повторении. Эта парадигма может часто использоваться в ситуациях, где мы пытаемся оптимизировать некоторую функцию стоимости по коллекции объектов. Мы можем добавить объекты к нашей коллекции, по одному, всегда выбирая следующую, которая оптимизирует функцию из числа тех все же, чтобы быть выбранной.