logo
РГР_ПО_ДИСКРЕТКЕ

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

Алгоритмы Дийкстры и Форда предназначены для поиска длин кратчайших путей из данной вершины sв остальные вершины графа. При решении прикладных задач часто бывает необходимо найти длины кратчайших путей из каждой вершины графа в каждую из остальных. Задача может быть решенаN-кратным применением алгоритма Форда, однако более прост и эффективен алгоритм Флойда, специально предназначенный для этой цели. ОбозначимD0={dij0} матрицу длин ребер данного графа, причемdii0=0,dij0=, если ребра(i,j)в графе нет,dij0=aijв остальных случаях. МатрицуD0 можно считать матрицей длин кратчайших путей, проходящих через 0 промежуточных вершин. Далее в алгоритме Флойда последовательно вычисляются матрицы D1,…, DN, где матрицаDk является матрицей длин кратчайших путей, проходящих через вершины1,…,k. Пусть матрицаDk-1={dijk-1} известна. Кратчайший путь изiвj, проходящий через вершины1,…,k, либо проходит через вершинуk, либо нет. Во втором случае его длинаdijk равнаdijk-1, а в первом он является объединением кратчайших путей через1…k-1изiвkи изkвj, поэтому

dijk=min{ dijk-1, dikk-1+dkjk-1}.

Теперь можно описать алгоритм Флойда

Шаг 1. Построить матрицу D0,

Шаг 2. Для k=1,…,Nвычислить матрицыD1,…, DNпо правилуdijk=min{ dijk-1, dikk-1+dkjk-1}.

Рис 2.10

Пример 4. Для графа на рис. 2.10 вычисление длин кратчайших путей по алгоритму Флойда приводит к следующим результатам:

Матрица D6является матрицей длин кратчайших путей данного графа. Наличие в ней элементов, равных бесконечности, означает, что для данных пар узлов ни одного пути в графе не имеется. Сами пути могут быть найдены по матрицамD0иD6с помощью «обратного просмотра». Например, для пути из 1 в 6 последней вершиной является 6, а предпоследней должна быть вершинаkтакая, чтоd1,66=d1,k6+dk,60. Легко видеть, что это вершина 4. Далее аналогично можно найти вершину, предшествующую 4, и так далее, до вершины 1. В итоге получается путь {1,3,5,4,6}.