<?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=213.24.126.177&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=213.24.126.177&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/213.24.126.177"/>
		<updated>2026-08-11T16:11:58Z</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_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82_%D1%81%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=50722</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_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82_%D1%81%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=50722"/>
				<updated>2016-01-04T15:29:34Z</updated>
		
		<summary type="html">&lt;p&gt;213.24.126.177: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Алгоритм==&lt;br /&gt;
[[Файл:Dfs_strong.png|290px|thumb|Вершины 2, 4, 5 сильносвязаны.&amp;lt;br&amp;gt;Синим цветом обозначен обод DFS по инвертированным ребрам]]&lt;br /&gt;
[[Отношение_связности,_компоненты_связности#Сильная связность|Компоненты сильной связности]]  в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; можно найти с помощью [[Обход_в_глубину,_цвета_вершин | поиска в глубину]] в 3 этапа:&lt;br /&gt;
#Построить граф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; с обратными (инвертированными) рёбрами &lt;br /&gt;
#Выполнить в &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; поиск в глубину и найти &amp;lt;tex&amp;gt;f[u]&amp;lt;/tex&amp;gt; — время окончания обработки вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Выполнить поиск в глубину в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, перебирая вершины  во внешнем цикле в порядке убывания &amp;lt;tex&amp;gt;f[u]&amp;lt;/tex&amp;gt;&lt;br /&gt;
Полученные на 3-ем этапе деревья поиска в глубину будут являться компонентами сильной связности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Так как компоненты сильной связности &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; графа совпадают, то первый поиск в глубину для нахождения &amp;lt;tex&amp;gt;f[u]&amp;lt;/tex&amp;gt; можно выполнить на графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, а второй — на &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br clear = &amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&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; взаимно достижимы &amp;lt;tex&amp;gt;\Leftrightarrow&amp;lt;/tex&amp;gt; после выполнения алгоритма они принадлежат одному дереву обхода в глубину.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&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;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;\Leftarrow&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;t&amp;lt;/tex&amp;gt; лежат в одном и том же дереве поиска в глубину на третьем этапе алгоритма. Значит, что они обе достижимы из корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; этого дерева. &lt;br /&gt;
# Вершина &amp;lt;tex&amp;gt;r&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;. Из этого мы получаем 2 случая:&lt;br /&gt;
##Обе эти вершины были достижимы из &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; в инвертированном графе. А это означает взаимную  достижимость вершин &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; и взаимную достижимость вершин &amp;lt;tex&amp;gt;r&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;.&lt;br /&gt;
##Хотя бы одна не достижима из &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; в инвертированном графе, например &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Значит и &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; была не достижима из &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в инвертированном графе, так как время выхода &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; - больше . Значит между этими вершинами нет пути, но последнего быть не может, потому что &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; была достижима из &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; по пункту 1). &lt;br /&gt;
&lt;br /&gt;
Значит, из случая 2.1 и не существования случая 2.2 получаем, что вершины &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;
}}&lt;br /&gt;
&lt;br /&gt;
==Время работы алгоритма==&lt;br /&gt;
#Для того, чтобы инвертировать все ребра в графе, представленном в виде списка потребуется &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;gt; действий. Для матричного представления графа не нужно выполнять никакие действия для его инвертирования.&lt;br /&gt;
#Количество ребер в инвертированном равно количеству ребер в изначальном графе, поэтому поиск в глубину будет работать за &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;gt; &lt;br /&gt;
#Поиск в глубину в исходном графе выполняется за &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
В итоге получаем, что время работы алгоритма &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;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;H&amp;lt;/tex&amp;gt; —инвертированный граф. В массиве &amp;lt;tex&amp;gt;ord&amp;lt;/tex&amp;gt; будем хранить номера вершин в порядке окончания обработки поиском в глубину в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. В результате получаем массив &amp;lt;tex&amp;gt;component&amp;lt;/tex&amp;gt;, который каждой вершине сопоставляет номер её компоненты.&lt;br /&gt;
    &lt;br /&gt;
    '''function''' dfs1(v):                                          &lt;br /&gt;
        color[v] = 1&lt;br /&gt;
        '''for''' (v, u) '''in''' E&lt;br /&gt;
            '''if''' '''not''' visited[u]&lt;br /&gt;
                dfs1(G[v][u])&lt;br /&gt;
        Добавляем вершину v в конец списка ord&lt;br /&gt;
    &lt;br /&gt;
    '''function''' dfs2(v):                                          &lt;br /&gt;
        component[v] = col&lt;br /&gt;
        '''for''' (v, u) '''in''' E&lt;br /&gt;
            '''if''' (вершина u еще не находится ни в какой компоненте)                       &lt;br /&gt;
                dfs2(H[v][u])&lt;br /&gt;
    &lt;br /&gt;
    '''function''' main():&lt;br /&gt;
        считываем исходные данные, формируем массивы G и H&lt;br /&gt;
        '''for''' u '''in''' V                           &lt;br /&gt;
            '''if''' '''not''' visited[u]&lt;br /&gt;
                dfs1(u)&lt;br /&gt;
        col = 1&lt;br /&gt;
        '''for''' (по всем вершинам u списка ord[] в обратном порядке)                                                        &lt;br /&gt;
            '''if''' (вершина u не находится ни в какой компоненте)&lt;br /&gt;
                dfs2(u)&lt;br /&gt;
                col++&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Р.Седжвик. &amp;quot;Фундаментальные алгоритмы на С++. Алгоритмы на графах&amp;quot; - СПб, ДиаСофтЮП, 2002&lt;br /&gt;
* [http://e-maxx.ru/algo/strong_connected_components  MAXimal :: algo :: Поиск компонент сильной связности, построение конденсации графа]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/scc-2008/| Визуализация поиска компонент сильной связности]&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>213.24.126.177</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_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82_%D1%81%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=50709</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_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82_%D1%81%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=50709"/>
				<updated>2016-01-04T14:42:27Z</updated>
		
		<summary type="html">&lt;p&gt;213.24.126.177: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Алгоритм==&lt;br /&gt;
[[Файл:Dfs_strong.png|290px|thumb|Вершины 2, 4, 5 сильносвязаны.&amp;lt;br&amp;gt;Синим цветом обозначен обод DFS по инвертированным ребрам]]&lt;br /&gt;
[[Отношение_связности,_компоненты_связности#Сильная связность|Компоненты сильной связности]]  в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; можно найти с помощью [[Обход_в_глубину,_цвета_вершин | поиска в глубину]] в 3 этапа:&lt;br /&gt;
#Построить граф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; с обратными (инвертированными) рёбрами &lt;br /&gt;
#Выполнить в &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; поиск в глубину и найти &amp;lt;tex&amp;gt;f[u]&amp;lt;/tex&amp;gt; — время окончания обработки вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Выполнить поиск в глубину в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, перебирая вершины  во внешнем цикле в порядке убывания &amp;lt;tex&amp;gt;f[u]&amp;lt;/tex&amp;gt;&lt;br /&gt;
Полученные на 3-ем этапе деревья поиска в глубину будут являться компонентами сильной связности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Так как компоненты сильной связности &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; графа совпадают, то первый поиск в глубину для нахождения &amp;lt;tex&amp;gt;f[u]&amp;lt;/tex&amp;gt; можно выполнить на графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, а второй — на &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br clear = &amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&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; взаимно достижимы &amp;lt;tex&amp;gt;\Leftrightarrow&amp;lt;/tex&amp;gt; после выполнения алгоритма они принадлежат одному дереву обхода в глубину.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&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;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;\Leftarrow&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;t&amp;lt;/tex&amp;gt; лежат в одном и том же дереве поиска в глубину на третьем этапе алгоритма. Значит, что они обе достижимы из корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; этого дерева. &lt;br /&gt;
# Вершина &amp;lt;tex&amp;gt;r&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;. Из этого мы получаем 2 случая:&lt;br /&gt;
##Обе эти вершины были достижимы из &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; в инвертированном графе. А это означает взаимную  достижимость вершин &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; и взаимную достижимость вершин &amp;lt;tex&amp;gt;r&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;.&lt;br /&gt;
##Хотя бы одна не достижима из &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; в инвертированном графе, например &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Значит и &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; была не достижима из &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в инвертированном графе, так как время выхода &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; - больше . Значит между этими вершинами нет пути, но последнего быть не может, потому что &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; была достижима из &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; по пункту 1). &lt;br /&gt;
&lt;br /&gt;
Значит, из случая 2.1 и не существования случая 2.2 получаем, что вершины &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;
}}&lt;br /&gt;
&lt;br /&gt;
==Время работы алгоритма==&lt;br /&gt;
#Для того, чтобы инвертировать все ребра в графе, представленном в виде списка потребуется &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;gt; действий. Для матричного представления графа не нужно выполнять никакие действия для его инвертирования.&lt;br /&gt;
#Количество ребер в инвертированном равно количеству ребер в изначальном графе, поэтому поиск в глубину будет работать за &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;gt; &lt;br /&gt;
#Поиск в глубину в исходном графе выполняется за &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
В итоге получаем, что время работы алгоритма &amp;lt;tex&amp;gt;O(V + E)&amp;lt;/tex&amp;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;H&amp;lt;/tex&amp;gt; —инвертированный граф. В массиве &amp;lt;tex&amp;gt;ord&amp;lt;/tex&amp;gt; будем хранить номера вершин в порядке окончания обработки поиском в глубину в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. В результате получаем массив &amp;lt;tex&amp;gt;component&amp;lt;/tex&amp;gt;, который каждой вершине сопоставляет номер её компоненты.&lt;br /&gt;
    &lt;br /&gt;
    '''function''' dfs1(v):                                          &lt;br /&gt;
        color[v] = 1&lt;br /&gt;
        '''for''' (v, u) in E&lt;br /&gt;
            '''if''' not visited[u]&lt;br /&gt;
                dfs1(G[v][u])&lt;br /&gt;
        Добавляем вершину v в конец списка ord&lt;br /&gt;
    &lt;br /&gt;
    '''function''' dfs2(v):                                          &lt;br /&gt;
        component[v] = col&lt;br /&gt;
        '''for''' (v, u) in E&lt;br /&gt;
            '''if''' (вершина u еще не находится ни в какой компоненте)                       &lt;br /&gt;
                dfs2(H[v][u])&lt;br /&gt;
    &lt;br /&gt;
    '''function''' main():&lt;br /&gt;
        считываем исходные данные, формируем массивы G и H&lt;br /&gt;
        '''for''' u in V                           &lt;br /&gt;
            '''if''' not visited[u]&lt;br /&gt;
                dfs1(u)&lt;br /&gt;
        col = 1&lt;br /&gt;
        '''for''' (по всем вершинам u списка ord[] в обратном порядке)                                                        &lt;br /&gt;
            '''if''' (вершина u не находится ни в какой компоненте)&lt;br /&gt;
                dfs2(u)&lt;br /&gt;
                col++&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Р.Седжвик. &amp;quot;Фундаментальные алгоритмы на С++. Алгоритмы на графах&amp;quot; - СПб, ДиаСофтЮП, 2002&lt;br /&gt;
* [http://e-maxx.ru/algo/strong_connected_components  MAXimal :: algo :: Поиск компонент сильной связности, построение конденсации графа]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/scc-2008/| Визуализация поиска компонент сильной связности]&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>213.24.126.177</name></author>	</entry>

	</feed>