Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2260.doc
Скачиваний:
71
Добавлен:
24.09.2019
Размер:
3.71 Mб
Скачать

6. Кратчайшие пути между вершинами графа

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

Пусть – взвешенный граф. Под весом (длиной) маршрута понимается сумма весов (длин) всех его ребер (дуг):

.

Кратчайшим маршрутом из вершины в вершину называется маршрут минимального веса, ведущий из вершины в вершину , а его вес называется расстоянием между вершинами и .

.

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

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

Перед первой итерацией начальная вершина имеет постоянную метку , у остальных вершин метки временные и полагаются равными . Итерация алгоритма состоит в следующем: пусть – последняя вершина, получившая постоянную метку (для первой итерации ). Тогда всем вершинам , смежным с вершиной и имеющим временные метки, присваиваются новые временные метки , где и – вес ребра (дуги) . Пусть – старая временная метка вершины . Если , то вершине приписывается новая временная метка , а если , то остается старая временная метка . Далее среди всех вершин, смежных с вершиной и с обновленными метками, выбираем вершину с минимальным значением и считаем метку этой вершины постоянной, т.е. рядом с меткой ставим знак . Таким образом, в основе алгоритма Дейкстры лежит принцип «жадности», заключающийся в последовательном вычислении расстояний сначала до ближайшей к вершине, затем до следующей ближайшей и т.д.

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

Нахождение кратчайших расстояний между всеми парами вершин графа можно осуществить не более чем n-кратным выполнением алгоритма Дейкстры. Однако существует примерно вдвое менее трудоемкий алгоритм Р. Флойда, который к тому же не требует неотрицательности весов ребер (дуг) (cм., например, [13, 19]).

При формальном описании алгоритма Дейкстры (алгоритм 6.1.1) вводится множество , состоящее из k вершин, ближайших к вершине s, и множество . Первая ближайшая к вершине s – это сама вершина s, находящаяся на нулевом расстоянии от s, т.е. . Пусть ближайшие k вершин к вершине s определены и для них вычислены расстояния , т.е. определено множество S. Следующая ближайшая к s вершина находится так. Для каждого положим:

.

определяет длину минимального -пути среди всех -путей, все вершины в котором, кроме , принадлежат S. Затем выберем такую вершину , что . Оказывается, что вершина является самой близкой к s среди всех вершин, не входящих в S.

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

Алгоритм 6.1.1. (Дейкстра). Нахождение расстояний от фиксированной вершины до всех остальных вершин взвешенного графа с неотрицательными весами.

Вход: граф G = (V, E, c), заданный матрицей весов C порядка n; выделенная вершина s.

Выход: расстояния от s до всех вершин , Previous[ ] – предпоследняя вершина в кратчайшем -пути.

Procedure

1. begin

2. D[s]: ; Previous[s]: ; ;

3. for do

4. begin D[ ]: ; Previous[ ]: end;

5. for k to do

6. begin

7. ;

8. for do

9. if then

10. begin

11. ;

12. Previous[ ]: ;

13. end

14. end

15. end.

Сложность алгоритма Дейкстры составляет .

Пример 6.1.1. Для графа, изображенного на рис. 6.1.1, нужно найти кратчайшее расстояние от вершины 1 до остальных вершин.

Таблица 6.1.1

k

1

3

10

1

2

0

3

10

1+

3

3

0

3+

7

1

8

3

4

0

3

6

1

8

3+

5

0

3

6+

1

8

3

6

0

3

6

1

8+

3

Здесь массив содержит расстояния от вершины до остальных вершин графа. Например, в строке 3 массив – это расстояния от вершины до остальных вершин графа по пути, содержащему вершины {1,4,2}. Знаком + помечено минимальное расстояние на каждом шаге алгоритма. C помощью этих пометок и массива Previous можно восстановить и сам кратчайший путь от вершины до остальных вершин графа. Так, кратчайший путь между вершинами 1 и 6: и его длина ; между вершинами 1 и 3: и его длина .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]