Дано: непyстой взвешенный гpаф G=(V, E) с
пpоизвольными весами ребер (дуг). Требуется найти длины кpатчайших
пyтей между всеми парами вершин графа, если в графе нет циклов
(контуров) отрицательной суммарной длины, либо обнаружить наличие
таких контуров.
Инициализация:
1. Построим матрицу D0 размерности |V| x
|V|, элементы которой определяются по правилу:
- dii0= 0;
- dij0= Weight(vi,
vj), где i<>j, если в графе
существует ребро (дуга) (vi, vj);
- dij0= бесконечность , где
i<>j, если нет ребра (дуги) (vi,
vj).
2. m:=0.
Основная часть:
1. Построим матрицу Dm+1 по
Dm, вычисляя ее элементы следующим образом:
dijm+1=min{dijm,
di(m+1)m +
d(m+1)jm}, где i<>j;
diim+1=0 (*).
Если
dimm + dmim <
0 для какого-то i, то в графе существует цикл (контур)
отрицательной длины, проходящий через вершину vi;
ВЫХОД.
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 являются симметричными, поэтому достаточно
вычислять элементы, находящиеся только выше (либо только ниже)
главной диагонали.