(s..., Qn(t)..., Q(Q(t)), Q(t),t),
Qn(t)= Q(Q(...Q(t)) (n раз).
Перед началом работы алгоритма начальная вершина s имеет постоянную метку l(s)=0, а метки всех остальных вершин равны бесконечности (∞) и являются временными. Обозначим через p последнюю из вершин, получивших постоянную метку.
Алгоритм Дейкстры включает следующие шаги:
1. Положить l(s)=0 и считать эту метку постоянной. Положить l(xi)= ∞ для всех xi s, и считать эти метки временными. p = s.
2. Обновление пометок. Для всех вершин xi Г(p), пометки которых временные, изменить пометки в соответствии с правилом:
l(xi)=min { l(xi), l(p) +w(p, xi) }.
Если l(xi)> l(p) +w(p, xi), то Q(xi) = p.
3. Если l(xi)= ∞ для всех вершин xi, пометки которых временные, то в исходном графе отсутствуют пути из вершины s в вершины с временными метками. Останов алгоритма. В противном случае переход к шагу 4.
4. Превращение пометок в постоянные. Среди всех вершин с временными метками найти такую вершину xi* , для которой l(xi*) = minl(xi) (метка минимальная) и считать эту пометку постоянной. Положить p=xi*. Пометку Q(xi*) также считать постоянной.
5. Если p t, перейти к шагу 2, а если p = t, то l(p) - длина кратчайшего пути из s в t.
После определения длины кратчайшего пути сам кратчайший путь восстанавливается по постоянным меткам Q(xi).
Для взвешенного орграфа найти кратчайший путь из вершины s в вершину t.
Рис. 17
1. Помечаем в соответствии с алгоритмом вершины графа:
l(s) = 0 ,
l(a) = ∞ ,
l(b) = ∞ ,
l(c) = ∞ ,
l(d) = ∞ ,
l(t) = ∞ .
Вершине s приписываем постоянную пометку, т.е. p = s.
2. Из вершины s помечаем остальные вершины:
l(a) = min {∞, 0 + 4} = 4,
l(b) = min {∞, 0 + 7} = 7,
l(c) = min {∞, 0 + 3} = 3,
l(d) = ∞ ,
l(t) = ∞ .
У вершин a, b, и с уменьшились пометки, следовательно
Q(a) = s, Q(b) = s, Q(c) = s.
Вершине c приписываем постоянную пометку, т.е. p = c. Пометка Q(с)=s также становится постоянной.
3. Из вершины c помечаем остальные вершины:
l(a) = min {4, 3 + ∞} = 4,
l(b) = min {7, 3 + ∞} = 7,
l(d) = min {∞, 3 + 3} = 6,
l(t) = ∞ .
У вершины d уменьшилась пометка, следовательно Q(d) = c.
Вершине a приписываем постоянную пометку, т.е. p = a. Пометка Q(a)=s становится постоянной.
4. Из вершины а помечаем остальные вершины:
l(b) = min {7, 4 + 4} = 7,
l(d) = min {6, 4 + 3} = 6,
l(t) = ∞ .
Вершине d приписываем постоянную пометку, т.е. p = d.. Пометка Q(d)=c становится постоянной.
5. Из вершины d помечаем остальные вершины:
l(b) = min {7, 6 + ∞} = 7,
l(t) = min {∞, 6 + 2} = 8,
У вершины t уменьшилась пометка, следовательно Q(t) = d.
Вершине b приписываем постоянную пометку, т.е. p=b. Пометка Q(b)=s становится постоянной.
6. Из вершины b помечаем вершину t:
l(t) = min {8, 7 + 2} = 8.
Метки l(t) и Q(t)=d становятся постоянными.
7. Восстанавливаем по меткам Q кратчайший путь из s в t:
Путь scdt длиной 8.
Работу алгоритма можно проиллюстрировать таблицей:
Вершина |
1 |
2 |
3 |
4 |
5 |
6 |
s |
0 |
- |
- |
- |
- |
- |
a |
∞ |
4 |
4 |
- |
- |
- |
b |
∞ |
7 |
7 |
7 |
7 |
- |
c |
∞ |
3 |
- |
- |
- |
- |
d |
∞ |
∞ |
6 |
6 |
- |
- |
t |
∞ |
∞ |
∞ |
∞ |
8 |
8 |
Определить кратчайший путь от вершины s до вершины t с использованием алгоритма Дейкстры.
а б
в г
д е
ж з
Рис. 18
Алгоритм Флойда это алгоритм поиска кратчайших путей между всеми вершинами парами вершин графа .
Пусть дан взвешенный орграф с n вершинами и матрицей весов W. Каждый элемент матрицы весов wij равен весу дуги < xi, xj > (если такой дуги нет, то wij=∞ ), а wii = 0 i =1...n.
Предположим, что граф не содержит контуров отрицательной длины. Пронумеруем вершины графа от 1 до n. Обозначим Wk матрицу с элементами wijk, каждый из которых равен длине кратчайшего пути из вершины i в вершину j, который может содержать в качестве промежуточных вершин только первые k вершин графа. Если такого пути не существует, то wij = ∞. W0=W. По матрице W0 вычисляется матрица W1 и т.д. до тех пор, пока не будет определена матрица Wn , cодержащая кратчайшие пути между всеми вершинами графа. Элементы матрицы Wk на k-й итерации вычисляются следующим образом:
wk ij = min{wikk-1 + wkjk-1, wijk-1} ,
где wikk-1 - длина кратчайшего пути из вершины i в вершину k, в которой в качестве промежуточных используются первые k-1 вершины графа.
Для того, чтобы по окончании работы алгоритма можно было быстро построить кратчайший путь, на каждой итерации вместе с матрицей Wk строится матрица Pk, каждый элемент которой pkij равен номеру вершины, предшествующей вершине j в текущем ij пути.
На первой итерации
p0ij=i , i,j = 1...n и i j,
p0ii=0 , i = 1...n.
Номера вершин, включаемых в кратчайший путь, определяются следующим образом:
(i ,..., j3, j2, j1, j),
j1=pij n
j2=pij1 n и т.д.
Основные шаги алгоритма:
1. Пронумеровать вершины графа целыми числами. k=0. Определить матрицу W0. Определить матрицу P0, p0ij=i, i j, i,j=1...n и p0i,i=0, i = j =1...n.
2. Если k = n, работа алгоритма закончена (Wn - эта матрица весов кратчайших путей между всеми парами вершин графа, определяемых с помощью матрицы Pn). Если k n, то k = k+1, переход к шагу 3.
3. Вычислить для всех i,j = 1...n элементы
wk ij =min{wikk-1 + wkjk-1, wijk-1}.
Если wijk-1 < wikk-1 + wkjk-1 , то pkij = pk-1ij . Иначе pkij = pk-1kj.
4. Если для некоторого 1≤ q ≤ n элемент с wqqk < 0, то в графе имеется контур отрицательной длины и работа алгоритма завершается. Иначе перейти к шагу 2.
Дан взвешенный орграф G, который содержит положительные и отрицательные веса. Найти кратчайшие пути между всеми вершинами графа.
Рис. 19
Решение
Пронумеруем вершины графа целыми числами (1, 2, 3, и 4) и определим матрицы W0 и P0:
Согласно алгоритму определяем матрицы W1 и P1.
W2 и P2 :
W3 и P3 :
W4 и P4 :
Таким образом, мы получили матрицу весов кратчайших путей W4 между всеми вершинами графа. Определяем их с помощью матрицы P4.
Кратчайшие пути между вершинами:
1 и 2: L(1, 2) = -2, путь : 1-2;
1 и 3: L(1, 3) = 0, путь : 1-2-3;
1 и 4: L(1, 4) = -3, путь : 1-4;
2 и 1: L(2, 1) = 3, путь : 2-3-4-1;
2 и 3: L(2, 3) = 2, путь : 2-3;
2 и 4: L(2, 4) = -1, путь : 2-3-4;
3 и 1: L(3, 1) = 1, путь : 3-4-1;
3 и 2: L(3, 2) = -1, путь : 3-4-1-2
3 и 4: L(3, 4) = -3, путь : 3-4;
4 и 1: L(4, 1) = 4, путь : 4-1;
4 и 2: L(4, 2) = 2, путь : 4-1-2;
4 и 3: L(4, 3) = 4, путь : 4-1-2-3;