Алгоритм Флойда — Воршелла
Алгоритм Флойда-Воршелла — алгоритм динамічного програмування для знаходження найкоротших відстаней між усіма вершинами зваженого орієнтованого графа. Розроблений в 1962 році Робертом Флойдом і Стівеном Воршеллом.
Зміст |
Алгоритм [ред.]
Нехай вершини графа
пронумеровані від 1 до
і введено позначення
для довжини найкоротшого шляху від
до
, який окрім самих вершин
проходить тільки через вершини
. Очевидно, що
— довжина (вага) ребра
, якщо воно існує (в іншому разі його довжина може бути позначена як
)
Існує два варіанти значення
:
- Найкоротший шлях між
не проходить через вершину
, тоді 
- Існує більш короткий шлях між
, що проходить через
, тоді він спочатку йде від
до
, а потім від
до
. У цьому випадку, очевидно, 
Таким чином, для знаходження значення функції досить вибрати мінімум з двох позначених значень.
Тоді рекурентна формула для
має вигляд:
— довжина ребра 

Алгоритм Флойда-Воршелла послідовно обчислює всі значення
,
для
від 1 до
. Отримані значення
є довжинами найкоротших шляхів між вершинами
.
Псевдокод [ред.]
На кожному кроці алгоритм генерує двовимірну матрицю
,
. Матриця
містить довжини найкоротших шляхів між усіма вершинами графа. Перед роботою алгоритму матриця
заповнюється довжинами ребер графа.
for k = 1 to n
for i = 1 to n
for j = 1 to n
W[i][j] = min(W[i][j], W[i][k] + W[k][j])
Складність алгоритму [ред.]
Три вкладені цикли містять операцію, яка виконується сталий час.
тобто алгоритм має кубічну складність, при цьому простим розширенням можна отримати також інформацію про найкоротші шляхи — крім відстані між двома вузлами записувати в матрицю ідентифікатор першого вузла в дорозі.
Варіації алгоритму [ред.]
Побудова матриці досяжності [ред.]
Алгоритм Флойда-Уоршелла може бути використаний для знаходження замикання відносини
по транзитивності. Для цього в якості W[0] використовується бінарна матриця суміжності графа,
; оператор min замінюється диз'юнкцією, додавання замінюється кон'юнкцією:
for k = 1 to n
for i = 1 to n
for j = 1 to n
W[i][j] = W[i][j] or (W[i][k] and W[k][j])
Після виконання алгоритму матриця W є матрицею досяжності.
Використання бітових масок при реалізації алгоритму дозволяє істотно прискорити алгоритм. У цьому складність алгоритму знижується до
, де
— довжина бітової маски (у моделі обчислень RAM). На практиці, ще більшого прискорення можна досягти, використовуючи такі спеціалізовані набори мікропроцесорних команд, як SSE.
Див. також [ред.]
Посилання [ред.]
Література [ред.]
- Ананій В. Левітін Розділ 8. Динамічне програмування: Алгоритм Флойда пошуку найкоротших шляхів між усіма парами вершин
- Томас Х. Кормен, Чарльз І. Лейзерсон, Рональд Л. Ривест, Кліффорд Штайн «Алгоритми: побудова й аналіз»


