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

Шаг 1. Полагаем S=V\{ v0 }, d(vi)=a(v0,vi) для всех i=1,…,k.

Шаг 2. Если S=1, то выполнить шаг 4, иначе выбрать в S элемент v’, для которого величина d(v’) является наименьшей (среди всех элементов из S).

Шаг 3. Положить S=S\{ v’ }, d(v)=min{d(v), d(v ’)+a(v’,v)} для всех v S и перейти к шагу 2.

Шаг 4. Выдать d(v1),…,d(vk). Конец работы алгоритма.

Алгоритм осуществляет «итеративный» процесс нахождения расстояния d(vi) для i=1,…,k. Проследим, как это делается для сети N, изображенной на рис.1. Работа алгоритма будет иллюстрироваться заполнением таблицы 1.

При выполнении первого шага алгоритма величины d(vi) примут значения, которые указаны в нулевой строке таблицы. Из них точным является только d(v2), значения остальных величин завышены. На шаге 2 в качестве v’ выбирается вершина v2 (в таблице соответствующее значение набрано жирным шрифтом) и удаляется из S на шаге 3. На том же шаге уточняются предыдущие значения d(v) для vS (см. первую строку таблицы 1). На этом первый проход алгоритма заканчивается. На втором проходе в качестве v’ берется v5, удаляется из S и значения d(v) для v S снова уточняются. Результат уточнения отражен во второй строке таблицы. Когда множество S будет содержать только вершину

Рис. 1

Таблица 1

Номер строки d(v1) d(v2) d(v3) d(v4) d(v5)
     
    -    
    -   -
  - -     -
  - -   - -

V3 алгоритм заканчивает работу. Результат: d(v1)=3, d(v2)=1, d(v3)=4, d(v4)=4, d(v5)=3.

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

Случай бесконтурной сети (2)

В этом случае, так же как и в случае сетей с неотрицательными весами дуг, известен более эффективный алгоритм вычисления расстояний от фиксированной вершины до всех остальных, чем алгоритм Форда-Беллмана. В основе этого алгоритма лежат две леммы.

Лемма 1. В каждом бесконтурном орграфе имеется хотя бы одна вершина, полустепень исхода которой равна нулю.

Лемма 2. Вершины бесконтурного ориентированного графа можно перенумеровать так, что каждая дуга идет из вершины с меньшим номером в вершину с большим номером.

Орграфы с так пронумерованными вершинами иногда называют топологически отсортированными, а алгоритм, осуществляющий такую нумерацию вершин – алгоритмом топологической сортировки вершин.

При описании алгоритма вычисления расстояний в бесконтурной сети будем считать, что все вершины заданной сети топологически отсортированы. Расстояние будем вычислять от вершины v0.

Пусть vk – произвольная вершина заданной бесконтурной сети. Тогда любой (v0,vk)-путь проходит через вершины с меньшими чем k номерами. Из этого замечания следует, что для вычисления расстояний от v0 до всех остальных вершин сети достаточно последовательно вычислить расстояния от v0 до v1, затем от v0 до v2 и так далее. Пусть, как и раньше, d(v) обозначает расстояние от v0 до v. Тогда d(v0) = 0, и если d(vr) для всех r < k вычислено, то

d(vk) = min{d(vr) + d(vr,vk)| r = 1,2,…, k }.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: