Алгоритм Флойда — Уоршалла — различия между версиями
(→Псевдокод) |
|||
Строка 15: | Строка 15: | ||
for i = 1 to n | for i = 1 to n | ||
for j = 1 to n | for j = 1 to n | ||
− | W[i][j] = W[i][k] and W[k][j] | + | W[i][j] = W[i][j] or (W[i][k] and W[k][j]) |
=== Сложность алгоритма === | === Сложность алгоритма === |
Версия 02:18, 15 ноября 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])
Сложность алгоритма
Три вложенных цикла содержат операцию, исполняемую за константное время.
то есть алгоритм имеет кубическую сложность, при этом простым расширением можно получить также информацию о кратчайших путях — помимо расстояния между двумя узлами записывать матрицу идентификатор первого узла в пути.