Тот кто придумал летнюю сессию, того нужно сжечь на костре! 

Алгоритм Флойда

Рассмотрим теперь алгоритм Флойда, позволяющий отыскивать кратчайшие пути сразу между всеми парами вершин графа. Этот алгоритм реализуется последовательностью следующих шагов:

 

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. Закончить выполнение алгоритма.

 

Для того чтобы восстановить кратчайшие пути, найденные в ходе выполнения алгоритма, введем в рассмотрение матрицу 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 и так далее.

 

Создать бесплатный сайт с uCoz