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

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

13.5.2 Алгоритм Дейкстры

Главная идея позади применения жадного образца метода к единственному источнику,

проблема кратчайшего пути состоит в том, чтобы выполнить «взвешенный» поиск типа «сначала вширь», начинающийся в v. В частности мы можем использовать жадный метод, чтобы развить алгоритм, который многократно выращивает «облако» вершин из v с вершинами, входящими в облако в порядке их расстояний от v. Таким образом, в каждом повторении, следующая выбранная вершина является вершиной вне облака, которое является самым близким к v. Алгоритм заканчивается, когда больше вершин не вне облака, в котором пункте у нас есть кратчайший путь от v до любой вершины G. Этот подход - простое, но тем не менее сильный, пример жадного шаблона метода.

Жадный метод для нахождения кратчайших путей

Применение жадного метода к единственному источнику, проблеме кратчайшего пути, приводит к

алгоритм, известный как алгоритм Дейкстры. Когда относится другой граф prob-lems, однако, жадный метод может не обязательно найти лучшее решение (такой как в так называемой проблеме продавца путешествия, в которой мы хотим найти короткое - установленный путь, который посещает все вершины в графе точно однажды). Тем не менее, есть много ситуаций, в которых жадный метод позволяет нам вычислять лучшее решение. В этой главе мы обсуждаем две таких ситуации: вычисление кратчайших путей и строительство минимального дерева охвата.

Чтобы упростить описание алгоритма Дейкстры, мы принимаем, в

следующий, что входной граф G не направлен (то есть, все его края не направлены), и простой (то есть, у него нет самопетель и никаких параллельных краев). Следовательно, мы обозначаем края G как неприказанные пары вершины (u, z).

В алгоритме Дейкстры для нахождения кратчайших путей функция стоимости мы пробуем

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

Релаксация края

Давайте определим этикетку D [u] для каждой вершины u в V, который мы используем, чтобы приблизиться

расстояние в G от v до u. Значение этих этикеток - то, что D [u] всегда хранит длину лучшего пути, который мы нашли до сих пор от v до u. Первоначально, D [v] = 0

и D [u] = + ¥ для каждого u = v, и мы определяем набор C (который является нашим «облаком»

вершины), чтобы первоначально быть пустым набором∅. При каждом повторении алгоритма мы выбираем

вершина u не в C с самым маленьким D [u] этикетка, и мы тянем u в C. В самом первом

640

Глава 13. Повторение Алгоритмов графа мы, конечно, потянем v в C. Однажды новая вершина u потянулся в C, мы тогда обновляем этикетку D [z] каждой вершины z, который смежен с u и является за пределами C к reflect факт, что может быть новый и лучший способ добраться до z через u.

Эта операция по обновлению известна как процедура релаксации, потому что она берет старую оценку и проверяет, может ли она быть улучшена, чтобы стать ближе к его истинному значению. (Метафора для того, почему мы называем это релаксацией, прибывает с весны, которая протянута и затем «расслабилась» назад к ее истинной форме отдыха.) В случае al Дейкстры - gorithm, релаксация выполнена для края (u, z) таким образом, что мы вычислили новую ценность D [u] и хотим видеть, есть ли лучшая стоимость для D [z] использование края (u, z). Определенная операция по релаксации края следующие:

Релаксация края:

если D [u] + w ((u, z)) <D [z] тогда

D [z]¬ D [u] + w ((u, z))

Мы даем псевдокодекс для алгоритма Дейкстры в Кодовом Фрагменте 13.24.

Обратите внимание на то, что мы используем приоритетную очередь Q, чтобы сохранить вершины за пределами облака C.

Алгоритм ShortestPath (G, v):

Вход: простой ненаправленный нагруженный граф G с неотрицательными весами края

и выдающаяся вершина v G

Продукция: этикетка D [u], для каждой вершины u G, такого, что D [u] является длиной a

кратчайший путь от v до u в G

Инициализируйте D [v]¬ 0 и D [u]¬ + ¥ для каждой вершины u = v.

Позвольте приоритетной очереди Q, содержат все вершины G использование этикеток D как ключи.

в то время как Q не пуст, делают

тянут новую вершину u в облако

u ¬ Q.removeMin()

для каждой вершины z смежный с u, таким образом, что z находится в Q, делают

выполняют процедуру релаксации по краю (u, z)

если D [u] + w ((u, z)) <D [z] тогда

D [z]¬ D [u] + w ((u, z))

Измените на D [z] ключ вершины z в Q.

возвратите этикетку D [u] каждой вершины u

Кодовый Фрагмент 13.24: алгоритм Дейкстры для единственного источника, проблемы кратчайшего пути.

Мы иллюстрируем несколько повторений алгоритма Дейкстры 13.14 в цифрах и 13.15.