Алгоритм Флойда
Рассмотрим теперь алгоритм Флойда, позволяющий отыскивать кратчайшие пути сразу между всеми парами вершин графа. Этот алгоритм реализуется последовательностью следующих шагов:
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}.
- Закончить выполнение алгоритма.
Для того чтобы восстановить кратчайшие пути, найденные в ходе выполнения алгоритма, введем в рассмотрение матрицу 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 и так далее.