|
|||||
Математика : Графы.Алгоритм ФлойдаДано: непyстой взвешенный гpаф G=(V, E) с пpоизвольными весами ребер (дуг). Требуется найти длины кpатчайших пyтей между всеми парами вершин графа, если в графе нет циклов (контуров) отрицательной суммарной длины, либо обнаружить наличие таких контуров. Инициализация: 1. Построим матрицу D0 размерности |V| x |V|, элементы которой определяются по правилу:
Основная часть: 1. Построим матрицу Dm+1 по Dm,
вычисляя ее элементы следующим образом:
2. m:=m+1; если m<|V|, то повторяем шаг (1), иначе элементы последней построенной матрицы D|V| равны длинам кратчайших путей между соответствующими вершинами; ВЫХОД. КОНЕЦ Если требует найти сами пути, то перед началом работы алгоритма построим матрицу P с начальными значениями элементов pij=i. Каждый раз, когда на шаге (1) значение dijm+1 будет уменьшаться в соответствии с (*) (т.е. когда di(m+1)m + d(m+1)jm<dijm), выполним присваивание pij:=p(m+1)j. В конце работы алгоритма матрица P будет определять кратчайшие пути между всеми парами вершин: значение pij будет равно номеру предпоследней вершины в пути между i и j (либо pij=i, если путь не существует). Примечаниe: если граф - неориентированный, то все матрицы Dm
являются симметричными, поэтому достаточно вычислять элементы, находящиеся
только выше (либо только ниже) главной диагонали.
|