Опубликован: 26.09.2006 | Уровень: специалист | Доступ: платный
Лекция 4:

Приоритетные очереди

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >

Нахождение кратчайших путей в графе

Входные данные:

  • Граф G со взвешенными ребрами (под весами можно понимать длины ребер, если речь идет о геометрическом графе, или любые другие числовые характеристики ребер). Пусть L(i, j) — вес ребра ( i,j ).
  • Стартовая вершина s (вершина, от которой вычисляются расстояния до всех остальных вершин).

Выходные данные:

  • Массив {\rm dist}[1\ldots {n}], ({\rm
dist}[i] — кратчайшее расстояние от вершины s до вершины i ).
  • Массив {\rm up}[1\ldots n], ({\rm up}[i] — предпоследняя вершина в кратчайшем пути из вершины s в вершину i ).

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

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

  1. Заполнить массив {\rm up} [1\ldots
n] нулями.
  2. Каждой вершине i приписать в качестве ключа {\rm dist} [i] — максимально возможное число (оно должно быть больше, чем длина наибольшего из кратчайших путей в графе; в процессе вычислений это число будет уменьшаться и в итоге заменится на длину кратчайшего пути из вершины s в вершину i ).
  3. Организовать приоритетную очередь из вершин графа, взяв в качестве ключей величины {\rm dist}[i], i= 1, 2 \dts n.
  4. Заменить ключ вершины s на 0.
  5. Пока очередь не пуста, выполнять операции 6,7.
  6. Выбрать (с удалением) из приоритетной очереди элемент r_0 с минимальным ключом.
  7. Для каждой вершины r, смежной с r_0, выполнить операции 8, 9.
  8. Вычислить величину {\rm delta} = {\rm dist}[r] -
({\rm dist}[r_0] + L (r_0,
r)).
  9. Если {\rm delta} > 0, то уменьшить ключ {\rm dist}[r] элемента r на величину {\rm delta} и заменить старое значение величины {\rm up}[r] на r_0.

Упражнение

Напишите на каком-либо алгоритмическом языке реализацию алгоритма Дейкстры с использованием d -кучи и испытайте ее на тестовых примерах при различных значениях d.

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...
 

Дмитрий Степаненко
Дмитрий Степаненко
Россия
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ