Алгоритм Флойда — Уоршалла — различия между версиями
| Строка 2: | Строка 2: | ||
Пусть дано отношение <tex>R</tex> на множестве <tex>X</tex>. Необходимо построить его [[Транзитивное замыкание|транзитивное замыкание]] <tex>\mathrm{TrCl}(R)</tex>. | Пусть дано отношение <tex>R</tex> на множестве <tex>X</tex>. Необходимо построить его [[Транзитивное замыкание|транзитивное замыкание]] <tex>\mathrm{TrCl}(R)</tex>. | ||
== Алгоритм == | == Алгоритм == | ||
| − | Пусть вершины графа <tex>G=(V,\; E),\; |V| = n</tex> пронумерованы от 1 до <tex>n</tex>. Каждая вершина соответствует элементу множества. А наличие ребра между вершинами означает, что соответствующие элементы множества состоят в отношении. Пусть так же введено | + | Пусть вершины графа <tex>G=(V,\; E),\; |V| = n</tex> пронумерованы от 1 до <tex>n</tex>. Каждая вершина соответствует элементу множества. А наличие ребра между вершинами означает, что соответствующие элементы множества состоят в отношении. Пусть так же введено булева величина <tex>d_{i j}^{k}</tex> для наличия пути (равно true, если есть путь, и false {{---}} в противном случае) от <tex>i</tex> до <tex>j</tex>, который кроме самих вершин <tex>i,\; j</tex> проходит только через вершины <tex>1 \ldots k</tex>(с номерами <tex> \le k </tex>). |
Тогда существующий путь между <tex>i,\;j</tex>, проходящий через <tex>k</tex> (сначала он идет от <tex>i</tex> до <tex>k</tex>, а потом от <tex>k</tex> до <tex>j</tex>), очевидно, выражается, как <tex>d_{i j}^{k}=d_{i k}^{k-1} \cap d_{k j}^{k-1}</tex> | Тогда существующий путь между <tex>i,\;j</tex>, проходящий через <tex>k</tex> (сначала он идет от <tex>i</tex> до <tex>k</tex>, а потом от <tex>k</tex> до <tex>j</tex>), очевидно, выражается, как <tex>d_{i j}^{k}=d_{i k}^{k-1} \cap d_{k j}^{k-1}</tex> | ||
Версия 01:58, 24 ноября 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])
Сложность алгоритма
Три вложенных цикла работают за время , то есть алгоритм имеет кубическую сложность.