Построение компонент вершинной двусвязности — различия между версиями
(→Двупроходный алгоритм) |
(→Доказательство корректности алгоритма) |
||
Строка 42: | Строка 42: | ||
# Все вершины <tex> V' </tex> будут пройдены в течение периода серого состояния <tex> i' </tex>; | # Все вершины <tex> V' </tex> будут пройдены в течение периода серого состояния <tex> i' </tex>; | ||
# В <tex> G </tex> не может быть обратных дуг из <tex> V' </tex> в <tex> V \setminus V' </tex>.<br> | # В <tex> G </tex> не может быть обратных дуг из <tex> V' </tex> в <tex> V \setminus V' </tex>.<br> | ||
− | Значит все дуги <tex> V' </tex> будут будут добавлены в | + | Значит все дуги <tex> V' </tex> будут будут добавлены в стек после дуги ведущей из точки сочленения в блок. В стеке в момент обнаружения точки сочленения будут находиться только дуги блока, связанного с ней, т.к. блоки найденные до него (если таковые имеются) будет уже извлечены из стека и покрашены в свой цвет.<br> |
'''Псевдокод: | '''Псевдокод: | ||
dfs(<tex>v, parent</tex>) | dfs(<tex>v, parent</tex>) | ||
Строка 72: | Строка 72: | ||
dfs(<tex>v</tex>, -1) | dfs(<tex>v</tex>, -1) | ||
<br> | <br> | ||
− | Во время алгоритма совершается один проход <tex>dfs</tex>, который работает за <tex>O(V + E)</tex>. Внутри него совершается еще цикл, который суммарно выполняет <tex>O(E)</tex> операций, т.к. каждое ребро может быть добавлено в стек только один раз. Следовательно | + | Во время алгоритма совершается один проход <tex>dfs</tex>, который работает за <tex>O(V + E)</tex>. Внутри него совершается еще цикл, который суммарно выполняет <tex>O(E)</tex> операций, т.к. каждое ребро может быть добавлено в стек только один раз. Следовательно, общее время работы алгоритма <tex>O(V + E) + O(E) = O(V + E)</tex> |
==Литература== | ==Литература== | ||
* В.А.Кузнецов, А.М.Караваев. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007 | * В.А.Кузнецов, А.М.Караваев. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007 |
Версия 08:53, 11 декабря 2011
Содержание
Двупроходный алгоритм
Найти компоненты вершинной двусвязности неориентированного графа можно с помощью обхода в глубину.
Первый проход
Используем первый проход, чтобы найти точки сочленения.
Второй проход
Точка сочленения принадлежит как минимум двум компонентам вершинной двусвязности.
Вершина является точкой сочленения, если у нее есть сын .
Это также значит, что ребро содержится в другой компоненте вершинной двусвязности, нежели ребро по которому мы пришли в вершину , используя поиск в глубину.
Используем это свойство, чтобы окрасить компоненты вершинной двусвязности в различные цвета.
Псевдокод второго прохода:
dfs() для всех вершин u смежных v: если ( родитель) переходим к следующей итерации если ( не посещена) если ( ) новый цвет dfs( ) иначе dfs( ) иначе: если ( ) start() для всех v вершин графа: если ( не посещена) dfs( )
Ребра каждой из компонент вершинной двусвязности окажутся окрашенными в свой цвет.
В алгоритме выполняется два прохода , каждый из которых работает . Значит время работы алгоритма .
Однопроходный алгоритм
Заведем стек, в который будем записывать все дуги в порядке их обработки. Если обнаружена точка сочленения, дуги очередного блока окажутся в этом стеке, начиная с дуги дерева обхода, которая привела в этот блок, до верхушки стека.
Таким образом, каждый раз находя компоненту вершинной двусвязности мы сможем покрасить все ребра, содержащиеся в ней, в новый цвет.
Доказательство корректности алгоритма
Предположим, что граф содержит точку сочленения
- Все вершины являются потомками в дереве обхода;
- Все вершины будут пройдены в течение периода серого состояния ;
- В
Значит все дуги
Псевдокод:
dfs() ++ для всех вершин смежных : если ( родитель) переходим к следующей итерации если ( не посещена) добавить в стек ребро dfs( ) если ( ) новый цвет пока (ребро не равно вершине стека) [вершина стека] извлечь вершину стека извлечь вершину стека если ( ) иначе если ( ) добавить в стек ребро если ( ) start() для всех вершин графа: если ( не посещена) dfs( , -1)
Во время алгоритма совершается один проход , который работает за . Внутри него совершается еще цикл, который суммарно выполняет операций, т.к. каждое ребро может быть добавлено в стек только один раз. Следовательно, общее время работы алгоритма
Литература
- В.А.Кузнецов, А.М.Караваев. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007