- •Введение
- •1. Начальные сведения из теории графов
- •Определения графа и ориентированного графа
- •Задание графов с помощью матриц
- •Изоморфизм графов
- •Подграф
- •Маршруты, связность
- •Графы специального вида
- •Деревья
- •2.1. Эквивалентные определения понятия дерева. Остовные деревья
- •Построение остовного дерева
- •Построение кратчайших путей на графе
- •3.1. Алгоритм Дейкстры и алгоритм Форда
- •Алгоритм Флойда
- •4. Эйлеровы графы
- •4.1 Понятие об эйлеровом графе. Критерий наличия в графе эйлерова цикла
- •Алгоритм Флери построения эйлерова цикла
- •Эйлеровы ориентированные графы
Алгоритм Флойда
Рассмотрим теперь алгоритм Флойда, позволяющий отыскивать кратчайшие пути сразу между всеми парами вершин графа. Этот алгоритм реализуется последовательностью следующих шагов:
1. Пронумеровать вершины данного графа: v1, …, vm. Составить матрицу L0=[l0ij], (i,j=1, …, m), в которой
2. Выполнить итерации в цикле по индексу k=1, …, m, определяя на каждой итерации матрицу Lk=[lkij], (i,j=1, …, m), в которой
lkij=min{lk-1ik+lk-1kj, lk-1ij}.
Закончить выполнение алгоритма.
Выполняя алгоритм Флойда, мы получаем в качестве элемента lkij в матрице Lk длину кратчайшего пути vi…vj, допускающего в качестве промежуточных первые k вершин. Когда алгоритм завершает работу, матрица Lm=[lmij], содержит в качестве элементов искомые длины кратчайших путей между вершинами графа.
Заметим, что при отсутствии контуров отрицательного веса выполняются равенства lkii=0, lk-1ik=lkik, lk-1ik=lk-1ki. Признаком наличия в графе контура отрицательного веса является выполнение для некоторого номера i неравенства lkii<0.
Для того чтобы восстановить кратчайшие пути, найденные в ходе выполнения алгоритма, введем в рассмотрение матрицу P=[pij], (i,j=1, …, m). Здесь элемент матрицы pij - номер предпоследней вершины в кратчайшем пути, соединяющем вершины vi и vj. Если величины pij будут известны, можно восстановить кратчайший путь vi…vj в обратном порядке по номерам вершин pij=k1, pik1=k2, …, pikn=i.
Рассмотрим сначала так называемый встроенный способ восстановления пути. При этом нужно дополнить алгоритм Флойда следующими действиями:
на шаге 1 положить: если l0ij<∞, то p0ij=i, иначе p0ij=0;
на шаге 2 положить: если lkij=lk-1ik +lk-1kj, то pkij= pk-1kj;
если lkij=lk-1ij, то pkij = pk-1ij .
Внешний способ восстановления пути позволяет решать задачу после того, как работа алгоритма завершена. Располагая матрицами L0 и Ln, определяем pik=k1 так, что lnik1+l0k1j=lnij, pik1=k2 так, что lnik2+l0k2k1=lnik1 и так далее.
Пример 13. Для взвешенного орграфа на рис.17а построить кратчайшие пути между каждой парой вершин.
Следуя алгоритму Флойда, получим следующую последовательность матриц:
|
|
|
0 |
3 |
2 |
|
|
|
|
|
|
1 |
1 |
1 |
|
|
L0 |
= |
|
∞ |
0 |
-2 |
|
, |
|
P0 |
= |
|
0 |
2 |
2 |
|
; |
|
|
|
∞ |
∞ |
0 |
|
|
|
|
|
|
0 |
0 |
3 |
|
|
|
|
|
0 |
3 |
2 |
|
|
|
|
|
|
1 |
1 |
1 |
|
|
L1 |
= |
|
∞ |
0 |
-2 |
|
, |
|
P1 |
= |
|
0 |
2 |
2 |
|
; |
|
|
|
∞ |
∞ |
0 |
|
|
|
|
|
|
0 |
0 |
3 |
|
|
|
|
|
0 |
3 |
1 |
|
|
|
|
|
|
1 |
1 |
2 |
|
|
L2 |
= |
|
∞ |
0 |
-2 |
|
, |
|
P2 |
= |
|
0 |
2 |
2 |
|
; |
|
|
|
∞ |
∞ |
0 |
|
|
|
|
|
|
0 |
0 |
3 |
|
|
|
|
|
0 |
3 |
1 |
|
|
|
|
|
|
1 |
1 |
1 |
|
|
L3 |
= |
|
∞ |
0 |
-2 |
|
, |
|
P3 |
= |
|
0 |
2 |
2 |
|
. |
|
|
|
∞ |
∞ |
0 |
|
|
|
|
|
|
0 |
0 |
3 |
|
|
Восстановим теперь кратчайший путь из v1=s в v3=f. Рассмотрим элементы матрицы P3:
p13=2, p12=1.
Тем самым восстановлен кратчайший путь v1v2v3 весом l313=1. Результат совпадает с полученным ранее по алгоритму Форда (рис.18). ■
