Алгоритм Флойда — Уоршалла — различия между версиями
(Новая страница: «== Алгоритм == Пусть вершины графа <tex>G=(V,\; E),\; |V| = n</tex> пронумерованы от 1 до <tex>n</tex> и введено ...») |
|||
Строка 1: | Строка 1: | ||
+ | ==Задача== | ||
+ | Пусть дано отношение <tex>R</tex> на множестве <tex>X</tex>. Необходимо построить его [[Транзитивное замыкание|транзитивное замыкание]] <tex>\mathrm{TrCl}(R)</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>d_{i j}^{k}</tex>, <tex>\forall i,\; j</tex> для <tex>k</tex> от 1 до <tex>n</tex>. Полученные значения <tex>d_{i j}^{n}</tex> являются транзитивным замыканием графа. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Алгоритм Флойда — Уоршелла последовательно вычисляет все значения <tex>d_{i j}^{k}</tex>, <tex>\forall i,\; j</tex> для <tex>k</tex> от 1 до <tex>n</tex>. Полученные значения <tex>d_{i j}^{n}</tex> являются | ||
=== Псевдокод === | === Псевдокод === | ||
− | На каждом шаге алгоритм генерирует двумерную матрицу <tex>W</tex>, <tex>w_{ij}=d_{i j}^n</tex>. Матрица <tex>W</tex> содержит | + | На каждом шаге алгоритм генерирует двумерную матрицу <tex>W</tex>, <tex>w_{ij}=d_{i j}^n</tex>. Матрица <tex>W</tex> содержит транзитивное замыкание графа. Перед работой алгоритма матрица <tex>W</tex> заполняется true или false в зависимости от наличия ребра в графе. |
for k = 1 to n | for k = 1 to n | ||
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][j] = W[i][k] and W[k][j] |
=== Сложность алгоритма === | === Сложность алгоритма === | ||
Строка 31: | Строка 21: | ||
<tex>\sum_{n,\;n,\;n}O(1) = O(n^3),</tex> | <tex>\sum_{n,\;n,\;n}O(1) = O(n^3),</tex> | ||
то есть алгоритм имеет кубическую сложность, при этом простым расширением можно получить также информацию о кратчайших путях — помимо расстояния между двумя узлами записывать матрицу идентификатор первого узла в пути. | то есть алгоритм имеет кубическую сложность, при этом простым расширением можно получить также информацию о кратчайших путях — помимо расстояния между двумя узлами записывать матрицу идентификатор первого узла в пути. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Ссылки == | == Ссылки == |
Версия 02:16, 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][k] and W[k][j]
Сложность алгоритма
Три вложенных цикла содержат операцию, исполняемую за константное время.
то есть алгоритм имеет кубическую сложность, при этом простым расширением можно получить также информацию о кратчайших путях — помимо расстояния между двумя узлами записывать матрицу идентификатор первого узла в пути.