<?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=176.59.14.112&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=176.59.14.112&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/176.59.14.112"/>
		<updated>2026-04-09T09:42:50Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82_%D1%80%D1%91%D0%B1%D0%B5%D1%80%D0%BD%D0%BE%D0%B9_%D0%B4%D0%B2%D1%83%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=71885</id>
		<title>Построение компонент рёберной двусвязности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82_%D1%80%D1%91%D0%B1%D0%B5%D1%80%D0%BD%D0%BE%D0%B9_%D0%B4%D0%B2%D1%83%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=71885"/>
				<updated>2019-10-14T01:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.14.112: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
'''Первый проход:''' запустим [[Использование обхода в глубину для поиска мостов|алгоритм для поиска мостов]], чтобы посчитать две величины: &amp;lt;tex&amp;gt;tin(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;up(v)&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;\mathtt{color}&amp;lt;/tex&amp;gt; хранится цвет текущей компоненты.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{maxColor}&amp;lt;/tex&amp;gt; изначально равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, что эквивалентно тому, что никакая компонента не окрашена.&lt;br /&gt;
&lt;br /&gt;
 '''function''' paint(&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, color):&lt;br /&gt;
   colors[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] = color&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt;(u, v) \in E&amp;lt;/tex&amp;gt;:&lt;br /&gt;
     '''if''' colors[&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;] == 0:&lt;br /&gt;
       '''if''' up[&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;] &amp;gt; tin[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;]:&lt;br /&gt;
         maxColor++&lt;br /&gt;
         paint(&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, maxColor)&lt;br /&gt;
       '''else''':&lt;br /&gt;
         paint(&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, color)&lt;br /&gt;
&lt;br /&gt;
 '''function''' solve():&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt; :&lt;br /&gt;
     colors[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] = 0&lt;br /&gt;
     '''if''' '''not''' visited[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;]&lt;br /&gt;
       dfs(&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
   maxColor = 0&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt; :&lt;br /&gt;
     '''if''' colors[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] == 0:&lt;br /&gt;
       maxColor++&lt;br /&gt;
       paint(&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, maxColor)&lt;br /&gt;
&lt;br /&gt;
Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма будет время работы двух запусков dfs, то есть  &amp;lt;tex&amp;gt;2 \cdot O(|V| + |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;
Однопроходный алгоритм строится на базе алгоритма поиска мостов. Во-первых, создадим глобальный [[Стек|стек]], и при спуске по дереву &amp;lt;tex&amp;gt; dfs &amp;lt;/tex&amp;gt; добавляем в него вершины. Во-вторых, когда возвращаемся назад, проверяем не является ли ребро мостом (при помощи [[Использование обхода в глубину для поиска мостов#Лемма | леммы]]). Если это так, то все вершины, находящиеся до текущего потомка в стеке, принадлежат одной компоненте.Заметим, что эта компонента будет висячей вершиной в дереве блоков и мостов, так как обходили граф поиском в глубину. Значит, ее можно выкинуть и продолжить поиск в оставшемся графе. Действуя по аналогии в получившемся графе, найдем оставшиеся компоненты реберной двусвязности.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
&lt;br /&gt;
 '''function''' paint(&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;):&lt;br /&gt;
   maxColor++&lt;br /&gt;
   last = -1&lt;br /&gt;
   '''while''' last != &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; '''and''' '''not''' stack.empty()&lt;br /&gt;
     colors[stack.top()] = maxColor&lt;br /&gt;
     last = stack.top()&lt;br /&gt;
     stack.pop()&lt;br /&gt;
&lt;br /&gt;
 '''function''' dfs(&amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;)&lt;br /&gt;
   time =  time + 1&lt;br /&gt;
   stack.push(&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
   tin[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] = time&lt;br /&gt;
   up[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] = time&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; (v, u) \in E&amp;lt;/tex&amp;gt;:&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;(v, u)&amp;lt;/tex&amp;gt; — обратное ребро&lt;br /&gt;
       up[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] = min(up[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;], tin[&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;])&lt;br /&gt;
     '''if''' '''not''' visited[&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;]&lt;br /&gt;
       dfs(&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;)&lt;br /&gt;
       up[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] = min(up[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;], up[&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;])&lt;br /&gt;
       '''if''' up[&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;] &amp;gt; tin[&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;] &lt;br /&gt;
         paint(&amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
Так же после вызова dfs нужно не забыть в конце вызвать ещё раз paint.&lt;br /&gt;
&lt;br /&gt;
Теперь две вершины имеют одинаковый цвет тогда и только тогда, когда они принадлежат одной компоненте реберной двусвязности.&lt;br /&gt;
&lt;br /&gt;
Время работы dfs &amp;lt;tex&amp;gt; O(|V| + |E|)&amp;lt;/tex&amp;gt;. Покраска за &amp;lt;tex&amp;gt; O(|V|) &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;
* [[Построение компонент вершинной двусвязности]]&lt;br /&gt;
* [[Использование обхода в глубину для поиска мостов]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* ''Седжвик Р.'' Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах. Пер. с англ. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128&lt;br /&gt;
* ''Кузнецов В.А., Караваев. А.М.'' &amp;quot;Оптимизация на графах&amp;quot; - Петрозаводск, Издательство ПетрГУ 2007&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bridges-2001| Визуализация {{---}} Построение компонент реберной двусзяности]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>176.59.14.112</name></author>	</entry>

	</feed>