Построение компонент рёберной двусвязности — различия между версиями
 (→Двупроходный алгоритм)  | 
				Novik (обсуждение | вклад)   (→Двупроходный алгоритм)  | 
				||
| Строка 14: | Строка 14: | ||
Псевдокод второго прохода:  | Псевдокод второго прохода:  | ||
| − |    '''  | + |    '''function''' <tex>paint(v, color)</tex>:  | 
| − |      <tex>colors[v]\leftarrow</tex>   | + |      <tex>colors[v]\leftarrow</tex> color  | 
| − | + |      '''for''' <tex>u \in V :  (u, v) \in E</tex>:  | |
| − | + |        '''if''' <tex>colors[u]</tex> == 0:  | |
| − | + |          '''if''' <tex>ret[u] > enter[v]</tex>:  | |
| − | + |            maxColor++  | |
| − | + |            <tex>paint</tex>(<tex>u</tex>, maxColor)  | |
| − | + |          '''else''':  | |
| − | + |           <tex>paint</tex>(<tex>u</tex>, color)  | |
   ...  |    ...  | ||
| − | + |    '''for''' <tex>v \in V</tex> :  | |
| − | + |     <tex>colors[v] \leftarrow 0 </tex>  | |
| − | + |    maxColor <tex>\leftarrow 0</tex>  | |
| − | + |    '''for''' <tex>v \in V</tex> :  | |
| − | + |      '''if''' <tex>colors[v] == 0</tex>:  | |
| − | + |        maxColor++  | |
| + |        <tex>paint</tex>(<tex>v</tex>, maxColor)  | ||
Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.  | Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.  | ||
Версия 00:11, 9 ноября 2015
Построение компонент реберной двусвязности будет осуществляться с помощью обхода в глубину.
Двупроходный алгоритм
Первый способ найти искомые компоненты — сначала определить критерий перехода в новую компоненту реберной двусвязности, а затем покрасить вершины графа в нужные цвета.
Первым проходом запустим алгоритм для поиска мостов, чтобы посчитать две величины: и .
Определим критерий перехода к новой компоненте. Воспользуемся ранее доказанной леммой.
Основываясь на этом, определим алгоритм окраски вершин графа: перешли по мосту, следовательно началась новая компонента.
Псевдокод второго прохода:
function : color for : if == 0: if : maxColor++ (, maxColor) else: (, color) ... for : maxColor for : if : maxColor++ (, maxColor)
Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.
Время работы алгоритма будет время работы двух запусков dfs, то есть , что есть .
Однопроходный алгоритм
Однопроходный алгоритм строится на базе алгоритма поиска мостов. Во-первых, создадим глобальный стек, и при спуске по дереву добавляем в него вершины. Во-вторых, когда возвращаемся назад, проверяем не является ли ребро мостом (при помощи леммы). Если это так, то то все вершины, находящиеся до текущего потомка в стеке, принадлежат одной компоненте.Заметим, что эта компонента будет висячей вершиной в дереве блоков и мостов, так как обходили граф поиском в глубину. Значит, ее можно выкинуть и продолжить поиск в оставшемся графе. Действуя по аналогии в получившемся графе, найдем оставшиеся компоненты реберной двусвязности.
Псевдокод:
paint(): ++ while (пока вершина стека не вершина и стек не пустой) извлекаем вершину стека и красим её
  
dfs() for всех смежных с if — обратное ребро if вершина — белая dfs() if paint()
Теперь две вершины имеют одинаковый цвет тогда и только тогда, когда они принадлежат одной компоненте реберной двусвязности.
Время работы dfs . Покраска за . Итоговое время работы алгоритма .
Визуализатор
Литература
Седжвик Р. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах. Пер. с англ. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128
Кузнецов В.А., Караваев. А.М. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007