Формальное определение

Дан взвешенный ориентированный граф Формальное определение - student2.ru без петель и дуг отрицательного веса. Найти кратчайшие пути от некоторой вершины Формальное определение - student2.ru графа Формальное определение - student2.ru до всех остальных вершин этого графа.

Каждой вершине из V сопоставим метку — минимальное известное расстояние от этой вершины до a. Алгоритм работает пошагово — на каждом шаге он «посещает» одну вершину и пытается уменьшать метки. Работа алгоритма завершается, когда все вершины посещены.

Инициализация. Метка самой вершины a полагается равной 0, метки остальных вершин — бесконечности. Это отражает то, что расстояния от a до других вершин пока неизвестны. Все вершины графа помечаются как непосещённые.

Шаг алгоритма. Если все вершины посещены, алгоритм завершается. В противном случае, из ещё не посещённых вершин выбирается вершина u, имеющая минимальную метку. Мы рассматриваем всевозможные маршруты, в которых u является предпоследним пунктом. Вершины, в которые ведут рёбра из u, назовем соседями этой вершины. Для каждого соседа вершины u, кроме отмеченных как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки u и длины ребра, соединяющего u с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину u как посещенную и повторим шаг алгоритма.

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

Формальное определение - student2.ru

Кружками обозначены вершины, линиями — пути между ними (ребра графа). В кружках обозначены номера вершин, над ребрами обозначена их «цена» — длина пути. Рядом с каждой вершиной красным обозначена метка — длина кратчайшего пути в эту вершину из вершины 1.

Формальное определение - student2.ru

Первый шаг. Рассмотрим шаг алгоритма Дейкстры для нашего примера. Минимальную метку имеет вершина 1. Её соседями являются вершины 2, 3 и 6.

Формальное определение - student2.ru

Первый по очереди сосед вершины 1 — вершина 2, потому что длина пути до неё минимальна. Длина пути в неё через вершину 1 равна сумме кратчайшего расстояния до вершины 1, значению её метки, и длины ребра, идущего из 1-й в 2-ю, то есть 0 + 7 = 7. Это меньше текущей метки вершины 2, бесконечности, поэтому новая метка 2-й вершины равна 7.

Формальное определение - student2.ru

Аналогичную операцию проделываем с двумя другими соседями 1-й вершины — 3-й и 6-й.

Формальное определение - student2.ru

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

Формальное определение - student2.ru

Второй шаг. Шаг алгоритма повторяется. Снова находим «ближайшую» из непосещенных вершин. Это вершина 2 с меткой 7.

Формальное определение - student2.ru

Снова пытаемся уменьшить метки соседей выбранной вершины, пытаясь пройти в них через 2-ю вершину. Соседями вершины 2 являются вершины 1, 3 и 4.

Первый (по порядку) сосед вершины 2 — вершина 1. Но она уже посещена, поэтому с 1-й вершиной ничего не делаем.

Следующий сосед вершины 2 — вершина 3, так как имеет минимальную метку из вершин, отмеченных как не посещённые. Если идти в неё через 2, то длина такого пути будет равна 17 (7 + 10 = 17). Но текущая метка третьей вершины равна 9, а это меньше 17, поэтому метка не меняется.

Формальное определение - student2.ru

Ещё один сосед вершины 2 — вершина 4. Если идти в неё через 2-ю, то длина такого пути будет равна сумме кратчайшего расстояния до 2-й вершины и расстояния между вершинами 2 и 4, то есть 22 (7 + 15 = 22). Поскольку 22< Формальное определение - student2.ru , устанавливаем метку вершины 4 равной 22.

Формальное определение - student2.ru

Все соседи вершины 2 просмотрены, замораживаем расстояние до неё и помечаем её как посещенную.

Формальное определение - student2.ru

Третий шаг. Повторяем шаг алгоритма, выбрав вершину 3. После её «обработки» получим такие результаты:

Формальное определение - student2.ru

Дальнейшие шаги. Повторяем шаг алгоритма для оставшихся вершин. Это будут вершины 6, 4 и 5, соответственно порядку.

Реализация

vara : array[1..20,1..20] ofword;
c, pred : array[1..20] ofword;
i, j, k, n, first, last, jn, kn : byte;
f, g : text;
min : word;
begin
assign(f,'in.txt');
reset(f);
readln(f, n);
fori := 1 ton do
begin
forj := 1 ton do
read(f, a[i,j]);
readln(f);
end;
readln(f, first, last);
close(f);
 
min := 32767;
forj := 1 ton do
ifa[first,j] < min then beginmin := a[first,j];jn := j;end;
c[jn] := min;pred[jn] := first;
j := jn;
fori := 2 ton do
begin
min := 32767;
forj := 1 ton do
ifc[j] <> 0 then
begin
fork := 1 ton do
if(c[j] + a[j,k] < min)and(c[k] = 0) then begin min := c[j] + a[j,k];jn := j;kn := k; end;
end;
c[kn] := min;pred[kn] := jn;
end;
 
 
assign(g,'out.txt');
rewrite(g);
ifc[last] = 32767 thenwriteln(g,'N') else
begin
writeln(g,'Y');
write(g,first,' ');
i := last;k := 1;
whilei <> first do
begin
a[1,k] := i;
k := k + 1;
i := pred[i];
end;
fori := k - 1 downto1 do
write(g,a[1,i],' ');
writeln(g);
writeln(g,c[last]);
end;
close(g);
end.

Наши рекомендации