
Алгоритм Флойда
.doc
4.3. Нахождение кратчайшего пути в орграфе
Рассмотрим ориентированный взвешенный граф D(V, A). Задача о кратчайшем пути состоит в отыскании пути минимального веса, соединяющего указанную начальную вершину графа D и все остальные вершины при условии, что хотя бы один такой путь существует.
4.3.1. Алгоритм Дейкстры
Данный алгоритм можно использовать в тех случаях, когда веса всех дуг неотрицательны.
Определим весовую матрицу W, чьи элементы задаются формулой
Обозначим через s начальную вершину орграфа, от которой нужно найти кратчайшие пути до всех остальных вершин.
В течение работы алгоритма каждой вершине v орграфа присваивается число d[v], равное расстоянию от s до v.
4.3.2. Алгоритм Флойда
Рассмотрим более общую ситуацию. Будем считать, что в графе D допускаются дуги отрицательного веса. Опишем алгоритм кратчайших путей между всеми парами вершин графа при условии, что в графе нет отрицательных контуров, т.е. замкнутых путей отрицательного веса. Если в графе D есть цикл с отрицательным весом, то решения поставленной задачи не существует, т.к. можно «накручивать» на этом цикле сколь угодно короткий путь.
Определим весовую матрицу W, чьи элементы wij задаются формулой
В алгоритме используются матрицы W0,…,Wn
и Р0,…,Рп. Матрица
Wk
содержит веса кратчайших путей, проходящих
только через вершины 1,2,…,k.
В матрице Pk
элемент
- номер вершины, предшествующий вершине
j в текущем (i,
j)-пути.
Рассмотрим алгоритм.
1. W0=W;
k:=1; Р0=[],
где
2.
выполнить: если
,
то
;
.
Иначе
;
.
3. Если для некоторого
,
(по диагонали матрицы Wk
появляются отрицательные значения), то
конец (в графе имеется отрицательный
контур). Иначе перейти к пункту 4.
4).
.
Если
,
то конец.
– матрица весов кратчайших путей. С
помощью матрицы
кратчайший
-путь
определяется следующим образом:
,
Иначе перейти к пункту 2.
Пример.
Рассмотрим
нагруженный граф D(V,
А).
Рис. Орграф D с отрицательными весами.
Составим матрицу весов W0 и матрицу путей между парами вершин P0
,
k=1. Если
,
то
;
.
Иначе
;
.
- неравенство выполняется, - неравенство не выполняется.
i=1 |
j=1 |
0 ≤ 0+0 |
|
i=2 |
j=1 |
2 ≤ 2+0 |
|
|
j=2 |
–1 ≤ 0+(–1) |
|
|
j=2 |
0 ≤ 2+(–1) |
|
|
j=3 |
≤ 0+ |
|
|
j=3 |
5 ≤ 2+ |
|
|
j=4 |
2 ≤ 0+2 |
|
|
j=4 |
1 ≤ 2+2 |
|
i=3 |
j=1 |
≤ +0 |
|
i=4 |
j=1 |
3 ≤ 3+0 |
|
|
j=2 |
≤ +(–1) |
|
|
j=2 |
≤ 3+(–1) |
|
|
j=3 |
0 ≤ + |
|
|
j=3 |
–2 ≤ 3+ |
|
|
j=4 |
≤ +2 |
|
|
j=4 |
0 ≤ 3+2 |
|
;
;
,
.
k=2. Если
,
то
;
.
Иначе
;
.
i=1 |
j=1 |
0 ≤ –1+2 |
|
i=2 |
j=1 |
2 ≤ 0+2 |
|
|
j=2 |
–1 ≤ –1+0 |
|
|
j=2 |
0 ≤ 0+0 |
|
|
j=3 |
≤ –1+5 |
|
|
j=3 |
5 ≤ 0+5 |
|
|
j=4 |
2 ≤ –1+1 |
|
|
j=4 |
1 ≤ 0+1 |
|
i=3 |
j=1 |
≤ +2 |
|
i=4 |
j=1 |
3 ≤ 2+2 |
|
|
j=2 |
≤ +0 |
|
|
j=2 |
2 ≤ 2+0 |
|
|
j=3 |
0 ≤ +5 |
|
|
j=3 |
–2 ≤ 2+5 |
|
|
j=4 |
≤ +1 |
|
|
j=4 |
0 ≤ 2+1 |
|
;
;
;
;
,
.
k=3. Если
,
то
;
.
Иначе
;
.
i=1 |
j=1 |
0 ≤ 4+ |
|
i=2 |
j=1 |
2 ≤ 5+ |
|
|
j=2 |
–1 ≤ 4+ |
|
|
j=2 |
0 ≤ 5+ |
|
|
j=3 |
4 ≤ 4+0 |
|
|
j=3 |
5 ≤ 5+0 |
|
|
j=4 |
0 ≤ 4+ |
|
|
j=4 |
1 ≤ 5+ |
|
i=3 |
j=1 |
≤ 0+ |
|
i=4 |
j=1 |
3 ≤ –2+ |
|
|
j=2 |
≤ 0+ |
|
|
j=2 |
2 ≤ –2+ |
|
|
j=3 |
0 ≤ 0+0 |
|
|
j=3 |
–2 ≤ –2+0 |
|
|
j=4 |
≤ 0+ |
|
|
j=4 |
0 ≤ –2+ |
|
Весовая матрица и матрица путей остаются без изменений.
,
.
k=4. Если
,
то
;
.
Иначе
;
.
i=1 |
j=1 |
0 ≤ 0+3 |
|
i=2 |
j=1 |
2 ≤ 1+3 |
|
|
j=2 |
–1 ≤ 0+2 |
|
|
j=2 |
0 ≤ 1+2 |
|
|
j=3 |
4 ≤ 0+(–2) |
|
|
j=3 |
5 ≤ 1+(–2) |
|
|
j=4 |
0 ≤ 0+0 |
|
|
j=4 |
1 ≤ 1+0 |
|
i=3 |
j=1 |
≤ +3 |
|
i=4 |
j=1 |
3 ≤ 0+3 |
|
|
j=2 |
≤ +2 |
|
|
j=2 |
2 ≤ 0+2 |
|
|
j=3 |
0 ≤ +(–2) |
|
|
j=3 |
–2 ≤ 0+(–2) |
|
|
j=4 |
≤ +0 |
|
|
j=4 |
0 ≤ 0+0 |
|
;
;
;
;
,
.
Итак, найдена матрица весов кратчайших путей и матрица кратчайших путей между парами вершин.
Определим маршрут и вес пути Р(1, 4). Вершины v1=1 и v2=4 соединены дугой веса d=2. Однако
,
где
.
И в этом случае вес пути
.
Определим маршрут и вес пути Р(1, 3). Дуга (1, 3) в данном графе отсутствует.
,
где
.
Вес пути
.
Пример.
Рассмотрим нагруженный граф D(V, А).
Рис. Орграф D с отрицательными весами.
Матрица весов W0 и матрица путей между парами вершин P0
,
k=1 |
i=1 |
j=1 |
0 ≤ 0+0 |
|
i=2 |
j=1 |
6 ≤ 6+0 |
|
|
j=2 |
≤ 0+ |
|
|
j=2 |
0 ≤ 6+ |
|
|
|
j=3 |
3 ≤ 0+3 |
|
|
j=3 |
–5 ≤ 6+3 |
|
|
|
j=4 |
≤ 0+ |
|
|
j=4 |
–2 ≤ 6+ |
|
|
i=3 |
j=1 |
≤ +0 |
|
i=4 |
j=1 |
2 ≤ 2+0 |
|
|
|
j=2 |
2 ≤ + |
|
|
j=2 |
≤ 2+ |
|
|
|
j=3 |
0 ≤ +3 |
|
|
j=3 |
≤ 2+3 |
|
|
|
j=4 |
–1 ≤ + |
|
|
j=4 |
0 ≤ 2+ |
|
;
;
,
k=2 |
i=1 |
j=1 |
0 ≤ +6 |
|
i=2 |
j=1 |
6 ≤ 0+6 |
|
|
j=2 |
≤ +0 |
|
|
j=2 |
0 ≤ 0+0 |
|
|
|
j=3 |
3 ≤ +(–5) |
|
|
j=3 |
–5 ≤ 0+(–5) |
|
|
|
j=4 |
≤ +(–2) |
|
|
j=4 |
–2 ≤ 0+(–2) |
|
|
i=3 |
j=1 |
≤ 2+6 |
|
i=4 |
j=1 |
2 ≤ +6 |
|
|
|
j=2 |
2 ≤ 2+0 |
|
|
j=2 |
≤ +0 |
|
|
|
j=3 |
0 ≤ 2+(–5) |
|
|
j=3 |
5 ≤ +(–5) |
|
|
|
j=4 |
–1 ≤ 2+(–2) |
|
|
j=4 |
0 ≤ +(–2) |
|
;
;
.
Таким образом, в графе существует контур
(замкнутый путь) отрицательного веса.
Следовательно, на этом работа алгоритма
закончена.