Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3. Теория графов.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
492.03 Кб
Скачать
    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}.

  1. Закончить выполнение алгоритма.

Выполняя алгоритм Флойда, мы получаем в качестве элемента 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). ■

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]