<?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.70.142.20&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.70.142.20&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.70.142.20"/>
		<updated>2026-04-29T23:44:29Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<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%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=20449</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%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=20449"/>
				<updated>2012-04-09T21:57:02Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.142.20: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Постановка задачи =&lt;br /&gt;
Пусть дан [[ориентированный граф|ориентированный граф]] без петель и кратных рёбер. Требуется проверить наличие [[Основные определения теории графов|цикла]] в этом графе.&lt;br /&gt;
&lt;br /&gt;
Решим эту задачу с помощью [[Обход в глубину, цвета вершин|поиска в глубину]] за &amp;lt;tex&amp;gt;O(M)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Алгоритм =&lt;br /&gt;
&lt;br /&gt;
Произведём серию поисков в глубину в графе. Т.е. из каждой вершины, в которую мы ещё ни разу не приходили, запустим поиск в глубину, который при входе в вершину будет красить её в серый цвет, а при выходе - в чёрный. И если поиск в глубину пытается пойти в серую вершину, то это означает, что мы нашли цикл.&lt;br /&gt;
&lt;br /&gt;
Сам цикл можно восстановить проходом по массиву предков.&lt;br /&gt;
[[Файл: Dfs_cycle.png|thumb|300px|right| Момент нахождения цикла]]&lt;br /&gt;
&lt;br /&gt;
= Доказательство =&lt;br /&gt;
&lt;br /&gt;
Пусть дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Запустим &amp;lt;tex&amp;gt;dfs(G)&amp;lt;/tex&amp;gt;. Рассмотрим выполнение процедуры поиска в глубину от некоторой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Так как все серые вершины лежат в стеке рекурсии, то для них вершина &amp;lt;tex&amp;gt; v &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; u &amp;lt;/tex&amp;gt; существует путь в &amp;lt;tex&amp;gt; v &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;
Докажем, что если в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; существует цикл, то &amp;lt;tex&amp;gt;dfs(G)&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; v &amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt; u &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; v &amp;lt;/tex&amp;gt;, то это ребро в серую вершину. Следовательно &amp;lt;tex&amp;gt;dfs(G)&amp;lt;/tex&amp;gt; нашел цикл.&lt;br /&gt;
&lt;br /&gt;
= Реализация =&lt;br /&gt;
&lt;br /&gt;
Здесь приведена реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
&lt;br /&gt;
 int graph[][];&lt;br /&gt;
 int color[];&lt;br /&gt;
 dfs(int index) &lt;br /&gt;
     color[index] = grey;            // красит вершину в серый цвет&lt;br /&gt;
     for (v : uv - ребро)&lt;br /&gt;
         if ( color[v] == white )&lt;br /&gt;
             dfs(v);&lt;br /&gt;
         if ( color[v] == grey )&lt;br /&gt;
             print();             // вывод ответа   &lt;br /&gt;
     color[index] = black;        // красит вершину в черный цвет&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен Т., Лейзерсон Ч., Ривест Р.'' Алгоритмы: построение и анализ.[http://wmate.ru/ebooks/?dl=380&amp;amp;mirror=1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>178.70.142.20</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%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=20448</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%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=20448"/>
				<updated>2012-04-09T21:56:00Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.142.20: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Постановка задачи =&lt;br /&gt;
Пусть дан [[ориентированный граф|ориентированный граф]] без петель и кратных рёбер. Требуется проверить наличие [[Основные определения теории графов|цикла]] в этом графе.&lt;br /&gt;
&lt;br /&gt;
Решим эту задачу с помощью [[Обход в глубину, цвета вершин|поиска в глубину]] за &amp;lt;tex&amp;gt;O(M)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Алгоритм =&lt;br /&gt;
&lt;br /&gt;
Произведём серию поисков в глубину в графе. Т.е. из каждой вершины, в которую мы ещё ни разу не приходили, запустим поиск в глубину, который при входе в вершину будет красить её в серый цвет, а при выходе - в чёрный. И если поиск в глубину пытается пойти в серую вершину, то это означает, что мы нашли цикл.&lt;br /&gt;
&lt;br /&gt;
Сам цикл можно восстановить проходом по массиву предков.&lt;br /&gt;
[[Файл: Dfs_cycle.png|right|300px| Момент нахождения цикла]]&lt;br /&gt;
&lt;br /&gt;
= Доказательство =&lt;br /&gt;
&lt;br /&gt;
Пусть дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Запустим &amp;lt;tex&amp;gt;dfs(G)&amp;lt;/tex&amp;gt;. Рассмотрим выполнение процедуры поиска в глубину от некоторой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Так как все серые вершины лежат в стеке рекурсии, то для них вершина &amp;lt;tex&amp;gt; v &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; u &amp;lt;/tex&amp;gt; существует путь в &amp;lt;tex&amp;gt; v &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;
Докажем, что если в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; существует цикл, то &amp;lt;tex&amp;gt;dfs(G)&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; v &amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt; u &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; v &amp;lt;/tex&amp;gt;, то это ребро в серую вершину. Следовательно &amp;lt;tex&amp;gt;dfs(G)&amp;lt;/tex&amp;gt; нашел цикл.&lt;br /&gt;
&lt;br /&gt;
= Реализация =&lt;br /&gt;
&lt;br /&gt;
Здесь приведена реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
&lt;br /&gt;
 int graph[][];&lt;br /&gt;
 int color[];&lt;br /&gt;
 dfs(int index) &lt;br /&gt;
     color[index] = grey;            // красит вершину в серый цвет&lt;br /&gt;
     for (v : uv - ребро)&lt;br /&gt;
         if ( color[v] == white )&lt;br /&gt;
             dfs(v);&lt;br /&gt;
         if ( color[v] == grey )&lt;br /&gt;
             print();             // вывод ответа   &lt;br /&gt;
     color[index] = black;        // красит вершину в черный цвет&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен Т., Лейзерсон Ч., Ривест Р.'' Алгоритмы: построение и анализ.[http://wmate.ru/ebooks/?dl=380&amp;amp;mirror=1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>178.70.142.20</name></author>	</entry>

	</feed>