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

Пусть есть ориентированный граф G=(V, E), у которого все дуги имеют неотрицательные метки, а одна вершина определена как источник. Задача состоит в нахождении стоимости кратчайших путей от источника ко всем другим вершинам граф G. Длина пути определяется как сумма стоимостей дуг, составляющих путь. Эта задача часто называется задачей нахождения кратчайшего пути с одним источником. При этом длина пути может измеряться даже в нелинейных единицах, например во временных.

Для решения поставленной задачи будем использовать алгоритм Дейкстры. Алгоритм строит множество S вершин, для которых кратчайшие пути от источника уже известны. На каждом шаге к множеству S добавляется та из оставшихся вершин, расстояние до которой от источника меньше, чем для других оставшихся вершин. Если стоимости всех дуг неотрицательны, то кратчайший путь от источника к конкретной вершине проходит только через вершины множества S. Такой путь называют особым. На каждом шаге алгоритма используется массив D, в который записываются длины кратчайших особых путей для каждой вершины. Когда множество S будет содержать все вершины орграфа, т.е. для всех вершин будут найдены особые пути, тогда массив D будет содержать длины кратчайших путей от источника к каждой вершине. Ниже приведен фрагмент программного кода алгоритма Дейкстры. FL – массив типа Boolean. Если значение его элемента равно false, то соответствующий ему элемент массива D должен проверяться на предмет поиска кратчайшего пути, в противном случае этот элемент больше не участвует в рассмотрении.

For m:=1 to n do

P[m]:=1; {Р – массив, используемый для построение кратчайших путей}

For j:=1 to n do

D[j]:=C[i,j]; {C - матрица цен}

For j:=2 to n do

Begin

m:=2;

While fl[m]= true do m:=m+1;

w:=D[m];

s[j]:=m;

For k:=m+1 to n do

if fl[k]=false then

if D[k]< w then

begin

w:=D[k];

s[j]:=k;

end;

v:=s[j];

fl[v]:=true;

for i:=1 to n do begin

if D[i]> D[v]+C[v,i] then P[i]:=v;

D[i]:=min(D[i], D[v]+C[v,i]);

end;

end;

Здесь предполагается, что в орграфе G вершины поименованы целыми числами, т.е. множество вершин V={1, 2, … n}, причем вершина 1 является источником. Массив С – это двумерный массив стоимостей, где элемент C[i, j] равен стоимости дуги Если дуги не существует, то C[i, j] присваивается значение ∞, т.е. большее любой фактической стоимости дуг. На каждом шаге D[i] содержит длину текущего кратчайшего особого пути к вершине i.

Применим алгоритм Дейкстры для ориентированного графа, показанного на рис. 7.4. Вначале S={1}, D[2]=10, D[3]=∞, D[4]=30, D[5]=100. На первом шаге цикла w =2, т.е. вершина 2 имеет минимальное значение в массиве D. Затем вычисляется D[3]=min(∞, 10+50)=60. D[4] и D[5] не изменяются, т.к. не существует дуг, исходящих из вершины 2 и ведущих к вершинам 4 и 5. Последовательность значений элементов массива D после каждой итерации цикла показаны в таблице ниже.

Рис. 7.4 – Помеченный орграф, к которому применен алгоритм Дейкстры

Вычисления для орграфа, изображенного на рис. 4.

В рассмотренный алгоритм можно внести изменения, которые позволят определить кратчайший путь для любой вершины графа. Для этого нужно ввести еще один массив P, где P[v] содержит вершину, непосредственно предшествующую вершине v в кратчайшем пути. Вначале P[v]= 1 для всех В листинге алгоритма Дейкстры при выполнении условного оператора D[v]+C[v,i]<D[i], элементу P[i] присваивается значение v. После выполнения алгоритма кратчайший путь к каждой вершине можно найти с помощью обратного прохождения по предшествующим вершинам массива Р.

Для рассмотренного орграфа массив Р имеет следующие значения: P[2]=1, P[3]=4, P[4]=1, P[5]=3. Для определения кратчайшего пути, например от вершины 1 к вершине 5, надо отследить в обратном порядке предшествующие вершины, начиная с вершины 5. Таким образом, кратчайший путь из вершины 1 в вершину 5 составляет последовательность вершин: 1, 4, 3, 5.


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



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