Алгоритм Флойда — Уоршелла — различия между версиями
м |
м |
||
Строка 1: | Строка 1: | ||
== Алгоритм == | == Алгоритм == | ||
− | Пусть вершины графа <tex>G=(V,\; E),\; |V| = n</tex> пронумерованы от 1 до <tex>n</tex> и введено обозначение <tex>d_{i j}^{k}</tex> для длины кратчайшего пути от <tex>i</tex> до <tex>j</tex>, который кроме самих вершин <tex>i,\; j</tex> проходит только через вершины <tex>1 \ldots k</tex>. Очевидно, что <tex>d_{i j}^{0}</tex> — длина (вес) ребра <tex>(i,\;j)</tex>, если таковое существует (в противном случае его длина может быть обозначена как <tex>\infty</tex>) | + | Пусть вершины графа <tex>G=(V,\; E),\; |V| = n</tex> пронумерованы от 1 до <tex>n</tex> и введено обозначение <tex>d_{i j}^{k}</tex> для длины кратчайшего пути от <tex>i</tex> до <tex>j</tex>, который кроме самих вершин <tex>i,\; j</tex> проходит только через вершины <tex>1 \ldots k</tex>(с номерами <tex> \le k </tex>). Очевидно, что <tex>d_{i j}^{0}</tex> — длина (вес) ребра <tex>(i,\;j)</tex>, если таковое существует (в противном случае его длина может быть обозначена как <tex>\infty</tex>) |
Существует два варианта значения <tex>d_{i j}^{k},\;k \in \mathbb (1,\;\ldots,\;n)</tex>: | Существует два варианта значения <tex>d_{i j}^{k},\;k \in \mathbb (1,\;\ldots,\;n)</tex>: |
Версия 21:56, 15 января 2011
Содержание
Алгоритм
Пусть вершины графа
пронумерованы от 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).