<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.178.18.81&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.178.18.81&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.178.18.81"/>
		<updated>2026-08-04T17:53:04Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0_%E2%80%94_%D0%A3%D0%BE%D1%80%D1%88%D0%B0%D0%BB%D0%BB%D0%B0&amp;diff=18357</id>
		<title>Алгоритм Флойда — Уоршалла</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0_%E2%80%94_%D0%A3%D0%BE%D1%80%D1%88%D0%B0%D0%BB%D0%BB%D0%B0&amp;diff=18357"/>
				<updated>2012-02-26T19:28:17Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.18.81: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Задача==&lt;br /&gt;
Пусть дано [[Определение отношения|отношение]] &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; на множестве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;. Необходимо построить его [[Транзитивное замыкание|транзитивное замыкание]] &amp;lt;tex&amp;gt;T = \mathrm{TrCl}(R)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Сформулируем нашу задачу в терминах графов: рассмотрим граф &amp;lt;tex&amp;gt;G=(V,\; E),\; |V| = n&amp;lt;/tex&amp;gt;, соответствующий отношению &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;. Тогда необходимо найти все пары вершин &amp;lt;tex&amp;gt;(x, y) &amp;lt;/tex&amp;gt;, соединенных некоторым путем.&lt;br /&gt;
Иными словами, требуется построить новое отношение &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которое будет состоять из всех пар &amp;lt;tex&amp;gt;(x, y) &amp;lt;/tex&amp;gt; таких, что найдется последовательность &amp;lt;tex&amp;gt;x = x_0, x_1, \dots, x_k = y &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; (x_{i-1}, x_i) \in R, i = 1, 2, \dots, k &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
Изначально матрица &amp;lt;tex&amp;gt;W&amp;lt;/tex&amp;gt; заполняется соответственно отношению &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;W[i][j] = [(i, j) \in R] &amp;lt;/tex&amp;gt;. Затем внешним циклом перебираются все элементы &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и для каждого из них, если он может использоваться, как промежуточный для соединения двух элементов &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, отношение &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; расширяется добавлением в него пары &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 for k = 1 to n&lt;br /&gt;
   for i = 1 to n&lt;br /&gt;
     for j = 1 to n&lt;br /&gt;
       W[i][j] = W[i][j] or (W[i][k] and W[k][j])&lt;br /&gt;
=== Доказательство ===  &lt;br /&gt;
&amp;lt;wikitex&amp;gt;Назовем ''промежуточной'' вершину некоторого пути $p = \left \langle v_0, v_1, \dots, v_k \right \rangle$, принадлежащую множеству вершин этого пути и отличающуюся от начальной и конечной вершин, то есть принадлежащую $\left \{ v_1, v_2, \dots, v_{k-1} \right \}$. Рассмотрим произвольную пару вершин $i, j \in V$ и все пути между ними, промежуточные вершины которых принадлежат множеству вершин с номерами $\left \{ 1, 2, \dots, k \right \}$. Пусть $p$ - некоторый из них. Докажем по индукции (по числу промежуточных вершин в пути), что после $i$-ой итерации внешнего цикла будет верно утверждение - если в построенном графе между выбранной парой вершин есть путь, содержащий в качестве промежуточных только вершины из множества вершин с номерами $\left \{ v_1, v_2, \dots, v_{i} \right \}$, то между ними будет ребро.&lt;br /&gt;
&lt;br /&gt;
* База индукции. Если у нас нет промежуточных вершин, что соответствует начальной матрице смежности, то утверждение выполнено: либо есть ребро (путь не содержит промежуточных вершин), либо его нет.&lt;br /&gt;
* Индуктивный переход. Пусть предположение выполнено для $i = k - 1$. Докажем, что оно верно и для $i = k$ Рассмотрим случаи (далее под вершиной будем понимать ее номер для простоты изложения):&lt;br /&gt;
** $k$ не является промежуточной вершиной пути $p$. Тогда все его промежуточные пути принадлежат множеству вершин с номерами $\left \{ 1, 2, \dots, k-1 \right \} \subset \left \{ 1, 2, \dots, k \right \}$, то есть существует путь с промежуточными вершинами в исходном множестве. Это значит $W[i][j]$ будет истиной. В противном случае $W[i][j]$ будет ложью и на k-ом шаге ею и останется.&lt;br /&gt;
** $k$ является промежуточной вершиной предполагаемого пути $p$. Тогда этот путь можно разбить на два пути: $i \xrightarrow{p_1} k \xrightarrow{p_2} j$. Пусть как $p_1$, так и $p_2$ существуют. Тогда они содержат в качестве промежуточных вершины из множества $\left \{ 1, 2, \dots, k-1 \right \} \subset \left \{ 1, 2, \dots, k \right \}$ (так как вершина $k$ - либо конечная, либо начальная, то она не может быть в множестве по нашему определению). Тогда $W[i][k]$ и $W[k][j]$ истинны и по индуктивному предположению посчитаны верно. Тогда и $W[i][j]$ тоже истина. Пусть какого-то пути не существует. Тогда пути $p$ тоже не может существовать, так как добраться, например, от вершины $i$ до $k$ по вершинам из множества $\left \{ 1, 2, \dots, k \right \}$ невозможно по индуктивному предположению. Тогда вся конъюнкция будет ложной, то есть такого пути нет, откуда $W[i][j]$ после итерации будет ложью.&lt;br /&gt;
&lt;br /&gt;
Таким образом, после завершения внешнего цикла у нас будет $W[i][j] = true$, если среди между этими вершинами есть путь, содержащий в качестве промежуточных вершины из множества всех остальные вершин графа, что и есть транзитивное замыкание.&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Сложность алгоритма ===&lt;br /&gt;
Три вложенных цикла работают за время &amp;lt;tex&amp;gt;\sum\limits_{n}\sum\limits_{n}\sum\limits_{n}O(1) = O(n^3)&amp;lt;/tex&amp;gt;, &lt;br /&gt;
то есть алгоритм имеет кубическую сложность.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Романовский И. В. Дискретный анализ: Учебное пособие для студентов, специализирующихся по прикладной математике и информатике. Изд. 3-е. — СПб.: Невский диалект, 2003. — 320 с. — ISBN 5-7940-0114-3.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Отношения ]]&lt;/div&gt;</summary>
		<author><name>178.178.18.81</name></author>	</entry>

	</feed>