Алгоритм Флойда — Уоршалла — различия между версиями
| Строка 18: | Строка 18: | ||
=== Сложность алгоритма === | === Сложность алгоритма === | ||
| − | Три вложенных цикла | + | Три вложенных цикла работают за время <tex>\sum\limits_{n}\sum\limits_{n}\sum\limits_{n}O(1) = O(n^3)</tex>, |
| − | <tex>\ | ||
то есть алгоритм имеет кубическую сложность. | то есть алгоритм имеет кубическую сложность. | ||
Версия 06:39, 16 ноября 2011
Задача
Пусть дано отношение на множестве . Необходимо построить его транзитивное замыкание .
Алгоритм
Пусть вершины графа пронумерованы от 1 до . Каждая вершина соответствует элементу множества. А наличие ребра между вершинами означает, что соответствующие элементы множества состоят в отношении. Пусть так же введено булево обозначение для наличия пути (равно true, если есть путь, и false — в противном случае) от до , который кроме самих вершин проходит только через вершины (с номерами ).
Тогда существующий путь между , проходящий через (сначала он идет от до , а потом от до ), очевидно, выражается, как
Алгоритм Флойда — Уоршелла последовательно вычисляет все значения , для от 1 до . Полученные значения являются транзитивным замыканием графа.
Псевдокод
На каждом шаге алгоритм генерирует двумерную матрицу , . Матрица содержит транзитивное замыкание графа. Перед работой алгоритма матрица заполняется true или false в зависимости от наличия ребра в графе.
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])
Сложность алгоритма
Три вложенных цикла работают за время , то есть алгоритм имеет кубическую сложность.