<?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=217.118.78.98&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=217.118.78.98&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/217.118.78.98"/>
		<updated>2026-04-22T11:15:13Z</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%D1%8B_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%D1%85&amp;diff=34335</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%D1%8B_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%D1%85&amp;diff=34335"/>
				<updated>2013-12-17T15:04:56Z</updated>
		
		<summary type="html">&lt;p&gt;217.118.78.98: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Определение ==&lt;br /&gt;
&lt;br /&gt;
'''Диаметр дерева''' - максимальная длина кратчайшего пути между любыми двумя вершинами.&lt;br /&gt;
Алгоритм в этой статье находит диаметр в дереве,причём очень простой реализацией и низким временем работы.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Возьмём любую вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и найдём расстояния до всех других вершин.&lt;br /&gt;
&lt;br /&gt;
d = min{&amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \subset graph, &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; v \ne u &amp;lt;/tex&amp;gt;} dist(&amp;lt;tex&amp;gt; v, u &amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Возьмём вершину &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; такую,что d[u] &amp;gt;= d[t] для любого t.Снова найдём расстояние от &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; до всех остальных вершин.Самое большое расстояние - диаметр дерева.&lt;br /&gt;
Расстояние до остальных вершин удобно искать алгоритмом BFS.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 int diameterTree(graph g)              &lt;br /&gt;
 {&lt;br /&gt;
     v = u = w = 0;&lt;br /&gt;
     bfs(g,v); // заполняет массив d[n] кратчайшими расстояниями до всех вершин.&lt;br /&gt;
     for(i = 0; i &amp;lt; n; i++)&lt;br /&gt;
          if (d[i] &amp;gt; d[u])&lt;br /&gt;
               u = i;&lt;br /&gt;
     bfs(g,u);&lt;br /&gt;
     for(i = 0; i &amp;lt; n; i++)&lt;br /&gt;
           if (d[i] &amp;gt; d[w])&lt;br /&gt;
                w = i;&lt;br /&gt;
     return d[w];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Обоснование корректности ==&lt;br /&gt;
Будем пользоваться свойством,что в любом дереве &amp;gt;= 2 листов(имеют степень один).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Искомое расстояние - есть расстояние между двумя листами.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть нет, пусть искомое расстояние - есть расстояние между вершинами &amp;lt;tex&amp;gt;a,b&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; - не является листом. Т.к. b не является листом, то значит её степень &amp;lt;tex&amp;gt;&amp;gt;&amp;lt;/tex&amp;gt; 1 =&amp;gt; из неё существует ребро в непосещенную вершину (дважды посетить вершину &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; мы не можем). Лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запустив BFS от произвольной вершины. Мы получим дерево BFS. &lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В дереве BFS не существует ребер между вершинами из разных поддеревьев некоторого из общего предка.&lt;br /&gt;
|proof=&lt;br /&gt;
Такое же как у дерева dfs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Мы свели задачу к нахождению вершины &amp;lt;tex&amp;gt;w&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; до глубочайшего листа мы можем улучшить ответ. &lt;br /&gt;
&lt;br /&gt;
Таким образом мы доказали, что нам нужно взять вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; с наибольшей глубиной после первого bfs, очевидно что ей в пару надо сопоставить вершину &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; , что dist(u, w) - &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; . Очевидно, что проблема решается запуском bfs из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Оценка производительности:'''&lt;br /&gt;
&lt;br /&gt;
Все операции кроме bfs - О(1).&lt;br /&gt;
BFS работает линейное время,запускаем мы его 2 раза.Получаем O(V+E).&lt;/div&gt;</summary>
		<author><name>217.118.78.98</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=19814</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=19814"/>
				<updated>2012-03-22T22:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;217.118.78.98: /* Ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' ('''Поиск в ширину''', '''BFS''', '''Breadth-first search''') — один из простейших алгоритмов обхода графа, являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
=== Общая идея ===&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Для алгоритма нам потребуются очередь, которая сначала содержит только &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, и множество посещенных вершин &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, которое изначально тоже содержит только &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шаге алгоритм вынимает из начала очереди вершину, рассматривает все исходящие из нее ребра и добавляет все связанные с ней непосещенные вершины в &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить дерево поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также можно для каждой вершины &amp;lt;tex&amp;gt; t \in V &amp;lt;/tex&amp;gt; считать длину этого пути, равную &amp;lt;tex&amp;gt; d[t] &amp;lt;/tex&amp;gt;. Можно считать, что для непосещенных вершин эта длина бесконечно велика. Тогда на каждом шаге длина пути до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; равна &amp;lt;tex&amp;gt; \rho(s, t) &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; посещена и &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt; в противном случае. Отсюда следует, что если на каждом шаге обновлять длины путей, то информация о множестве &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; является избыточной, и его можно не хранить.&lt;br /&gt;
&lt;br /&gt;
=== Анализ времени работы ===&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; deg\ v &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} deg\ v = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Корректность ===&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В алгоритме поиска в ширину очередь всегда содержит сначала некоторое количество вершин с расстоянием k, а потом некоторое количество вершин с расстоянием k + 1(возможно, нулевое).&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
База: изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; с расстоянием 0, утверждение верно. &lt;br /&gt;
&lt;br /&gt;
Переход: пусть после &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;-ого шага алгоритма очередь содержит &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Тогда на &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;-ом шаге мы извлечем из очереди одну вершину и добавим в нее все непосещенные(&amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; вершин), связанные с ней; расстояние до них, очевидно, будет равно &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. У нас останется &amp;lt;tex&amp;gt; p - 1 &amp;lt;/tex&amp;gt; (возможно, 0) вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q + r &amp;lt;/tex&amp;gt; вершин с расстоянием k + 1, что соответствует нашему инварианту.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Реализация ===&lt;br /&gt;
&lt;br /&gt;
В приведенном ниже псевдокоде &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt; - входной граф, &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; - выделенная вершина, Q - очередь. Множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; не хранится, вместо него использются расстояния в дереве обхода в ширину; расстояние от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, вычисляемое алгоритмом, хранится в поле &amp;lt;tex&amp;gt;d[u]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''BFS'''(&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 1    d[s] &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; 0&lt;br /&gt;
 2    Q &amp;lt;tex&amp;gt; \leftarrow \emptyset &amp;lt;/tex&amp;gt;&lt;br /&gt;
 3    Q.push(s)&lt;br /&gt;
 4    '''while''' Q &amp;lt;tex&amp;gt; \ne \emptyset &amp;lt;/tex&amp;gt; &lt;br /&gt;
 5      '''do''' u &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; Q.pop&lt;br /&gt;
 6        '''for''' v: uv &amp;lt;tex&amp;gt; \in &amp;lt;/tex&amp;gt; E&lt;br /&gt;
 7          '''do''' '''if''' d[v] = &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
 8            '''then''' d[v] &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; d[u] + 1&lt;br /&gt;
 9                 Q.push(v)&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs Поиск в ширину на e-maxx.ru]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Поиск_в_ширину Поиск в ширину в Википедии]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
*Томас Х. Кормен и др. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>217.118.78.98</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=19812</id>
		<title>Использование обхода в глубину для проверки связности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=19812"/>
				<updated>2012-03-22T21:58:41Z</updated>
		
		<summary type="html">&lt;p&gt;217.118.78.98: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Алгоритм проверки наличия пути из s в t ==&lt;br /&gt;
* '''Задача'''&lt;br /&gt;
Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и две вершины &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Необходимо проверить, существует ли путь из вершины &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; по рёбрам графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Алгоритм'''&lt;br /&gt;
Небольшая модификация алгоритма [[Обход в глубину, цвета вершин|обхода в глубину]]. Смысл алгоритма заключается в том, чтобы запустить обход в глубину из вершины &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и проверять при каждом посещении вершины, не является ли она искомой вершиной &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в первый момент времени все пути в графе &amp;quot;белые&amp;quot;, то если вершина &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и была достижима из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, то по [[Лемма о белых путях|лемме о белых путях]] в какой-то момент времени мы зайдём в вершину &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, чтобы её покрасить. Время работы алгоритма &amp;lt;tex&amp;gt;O(M + N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Реализация'''&lt;br /&gt;
 vector&amp;lt;bool&amp;gt; visited;                       //вектор для хранения информации о ''пройденных'' и ''не пройденных'' вершинах&lt;br /&gt;
 &lt;br /&gt;
 bool dfs(int u)              &lt;br /&gt;
 {&lt;br /&gt;
     if(u == t)&lt;br /&gt;
         return true;    &lt;br /&gt;
     visited[u] = true;                      //помечаем вершину как пройденную&lt;br /&gt;
     for (v таких, что (u, v) — ребро в G)   //проходим по смежным с u вершинам&lt;br /&gt;
         if (!visited[v])                    //проверяем, не находились ли мы ранее в выбранной вершине&lt;br /&gt;
             if(dfs(v))&lt;br /&gt;
                 return true;&lt;br /&gt;
     return false;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     ...                                     //задание графа G с количеством вершин n и вершин S и T.&lt;br /&gt;
     visited.assign(n, false);               //в начале все вершины в графе ''не пройденные''&lt;br /&gt;
     if(dfs(s))&lt;br /&gt;
          std::out &amp;lt;&amp;lt; &amp;quot;Путь из S в T существует&amp;quot;;&lt;br /&gt;
        else &lt;br /&gt;
          std::out &amp;lt;&amp;lt; &amp;quot;Пути из S в T нет&amp;quot;;&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Алгоритм проверки связности графа G ==&lt;br /&gt;
* '''Задача'''&lt;br /&gt;
Дан [[Основные определения теории графов|неориентированный граф]] &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Необходимо проверить, является ли он связным.&lt;br /&gt;
* '''Алгоритм'''&lt;br /&gt;
Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу при входе в процедуру. Запустимся от какой-то вершины нашего графа. Если в конце работы процедуры dfs() счётчик равен нулю, то мы побывали во всех вершинах графа, а следовательно он связен. Если счётчик отличен от нуля, то мы не побывали в какой-то вершине графа. Работает алгоритм за &amp;lt;tex&amp;gt;O(M + N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Реализация'''&lt;br /&gt;
 vector&amp;lt;bool&amp;gt; visited;                       //вектор для хранения информации о ''пройденных'' и ''не пройденных'' вершинах&lt;br /&gt;
 int k = 0;&lt;br /&gt;
 &lt;br /&gt;
 void dfs(int u)              &lt;br /&gt;
 {&lt;br /&gt;
     k--;&lt;br /&gt;
     visited[u] = true;                      //помечаем вершину как пройденную&lt;br /&gt;
     for (v таких, что (u, v) — ребро в G)   //проходим по смежным с u вершинам&lt;br /&gt;
         if (!visited[v])                    //проверяем, не находились ли мы ранее в выбранной вершине&lt;br /&gt;
             dfs(v);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     ...                                     //задание графа G с количеством вершин n и вершин S и T.&lt;br /&gt;
     visited.assign(n, false);               //в начале все вершины в графе ''не пройденные''&lt;br /&gt;
     k = n;&lt;br /&gt;
     for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
         dfs(i);&lt;br /&gt;
     if(k == 0)&lt;br /&gt;
         std::out &amp;lt;&amp;lt; &amp;quot;Граф связен&amp;quot;;          //вывести, что граф связен&lt;br /&gt;
       else&lt;br /&gt;
         std::out &amp;lt;&amp;lt; &amp;quot;Граф несвязен&amp;quot;;        //вывести, что граф несвязен&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>217.118.78.98</name></author>	</entry>

	</feed>