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

 

 

Формулировка задачи. Имеется граф. Некоторая его вершина обозначена как вершина 1. Необходимо найти минимальные  пути от вершины 1 до каждой из вершин графа. Минимальным путём будем называть путь с минимальной суммой цен вдоль пути. Ценой назовем неотрицательное число являющееся весом ребра.

 

Идея алгоритма. Идея основывается на следующем очевидном утверждении: Пусть построен минимальный путь из вершины A в вершину B. И пусть вершина B связана с некоторым количеством вершин i.. Обозначим через Ci – цену пути из вершины B в вершину i. Выберем из Ci минимальную величину. Тогда минимальное продолжение пути из точки B пойдёт через выбранную величину.

Это утверждение действительно не требует доказательства. И из него вытекает очень  серьёзное следствие. Пусть есть множество вершин через которые уже проходят минимальные пути. Такое множество гарантированно есть, это вершина 1. Утверждение сформулированное выше даёт возможность добавлять к уже существующему множеству вершин (будем далее называть их выделенными) еще одну вершину, а так как в графе количество вершин конечно, то за конечное количество  шагов все вершины графа окажутся выделенными, а это и будет решением.

Сущность алгоритма Дейкстры и заключается в процедуре добавления еще одной вершины к множеству выделенных. Эта процедура состоит из двух шагов:

 

1.    Строим множество вершин инцидентных выделенным и находим среди их вершину с наименьшей ценой. Найденная вершина добавляется в множество выделенных.

2.    Строим множество вершин инцидентных выделенным и определяем для них новые цены. Новая цена вершины это минимальная цена пути от множества выделенных вершин до данной вершины. Строится новая цена так:

a.    Для невыделенной вершины во множестве выделенных определяется подмножество вершин инцидентных данной.

b.    Для каждой вершины выделенной подмножества определяется цена пути до данной.

c.    Определяется минимальная цена. Эта цена и становится ценой вершины.

 

Обратите внимание, что алгоритм работает с двумя типами цен: ценой ребра и ценой вершины. Цены ребер являются постоянной величиной. Цены же вершин постоянно пересчитываются. Смысл этих цен различен. Цена ребра это цена перехода из вершины в вершину соединённую этим ребром. А цена вершины это цена минимального пути.

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

 

 

 

Алгоритм

 

§      Множество выделенных вершин = исходная вершина

§      Пока есть невыделенные вершины выполнять

o     Для каждой вершины инцидентной ПОСЛЕДНЕЙ ВЫДЕЛЕННОЙ рассчитать предварительную цену как минимальную из уже имеющейся и цены полученной с учетом пути от ПОСЛЕДНЕЙ ВЫДЕЛЕННОЙ до данной.

o     Среди множества вершин для которых определена предварительная цена найти вершину с минимальным значением предварительной цены.

o     Найденную вершину занести в множество выделенных вершин.

 

 

Hosted by uCoz