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

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

(a) (b)

(c) (d)

(e) (f)

Рисунок 13.14: выполнение алгоритма Дейкстры на взвешенном графе. Вершина начала - BWI. Коробка рядом с каждой вершиной v хранит этикетку D [v]. Символ•

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

стрелы и, для каждой вершины u вне «облака», мы показываем текущий лучший край

для натяжения в u с чисто синей линией. (Продолжается в рисунке 13.15.)

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

(g) (h)

(i) (j)

Рисунок 13.15: выполнение в качестве примера алгоритма Дейкстры. (Продолженный от Фиги - ure 13.14.)

Почему это работает

Интересное, и возможно даже немного удивления, аспекта Дейкстры algo-

rithm - то, что, в данный момент вершина u потянулась в C, его этикетка D [u] хранит правильную длину кратчайшего пути от v до u. Таким образом, когда алгоритм заканчивается, он вычислит расстояние кратчайшего пути от v до каждой вершины G. Таким образом, это решит единственный источник, проблему кратчайшего пути.

Вероятно, не немедленно ясно, почему алгоритм Дейкстры правильно находит кратчайший путь от вершины начала v друг другу вершина u в графе. То, почему случается так, что расстояние от v до u равно ценности этикетки D [u] в то время, когда вершина u потянулась в облако C (который является также временем u, удалено из приоритетной очереди Q)? Ответ на этот вопрос зависит от того, чтобы там быть никаким отрицанием - края веса в графе, так как это позволяет жадному методу работать правильно, поскольку мы показываем в суждении, которое следует.

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

Суждение 13.23: В алгоритме Дейкстры, каждый раз, когда в вершину u тянут

облако, этикетка D [u] равна d (v, u), длина кратчайшего пути от v до u. Оправдание: Предположим, что D [t]> d (v, t) для некоторой вершины t в V, и позволяют u быть первой вершиной алгоритм, потянувший в облако C (то есть, удаленный из Q) таким образом что D [u]> d (v, u). Есть кратчайший путь P от v до u (так как иначе

d (v, u) = + ¥ = D [u]). Давайте поэтому рассмотрим момент, когда в u потянут

C, и позволяют z быть первой вершиной P (идя от v до u), который не находится в C в этом

момент. Позвольте y быть предшественником z в пути P (обратите внимание на то, что у нас мог быть y = v). (См. рисунок 13.16.) Мы знаем нашим выбором z, что y уже находится в C в этом пункте. Кроме того, D [y] = d (v, y), так как u - первая неправильная вершина. Когда y потянулся в C, мы проверили (и возможно обновил), D [z] так, чтобы мы имели в том пункте

D [z]£ D [y] + w ((y, z)) = d (v, y) + w ((y, z)).

Но так как z - следующая вершина на кратчайшем пути от v до u, это подразумевает это

D [z] = d (v, z).

Но мы теперь в тот момент времени, когда мы выбираем u, не z, чтобы присоединиться к C; следовательно

D [u]£ D [z].

Должно быть ясно, что подпуть кратчайшего пути - самостоятельно кратчайший путь. Следовательно, так как z находится на кратчайшем пути от v до u

d (v, z) + d (z, u) = d (v, u).

Кроме того, d (z, u)³ 0, потому что нет никаких краев отрицательного веса. Поэтому

D [u]£ D [z] = d (v, z)£ d (v, z) + d (z, u) = d (v, u).

Но это противоречит определению u; следовательно, не может быть такой вершины u.

Рисунок 13.16: схематическое для оправдания Суждения 13.23.