148
правок
Изменения
→Однопроходный алгоритм
==Однопроходный алгоритм==
Заведем стек, в который будем записывать все дуги в порядке их обработки. Если обнаружена точка сочленения, дуги очередного блока окажутся в этом стеке, начиная с дуги дерева обхода, которая привела в этот блок, до верхушки стека. <br>Таким образом, каждый раз находя компоненту вершинной двусвязности мы сможем покрасить все ребра, содержащиеся в ней, в новый цвет.===Доказательство корректности алгоритма===Предположим, что граф содержит точку сочленения <tex> i' \in V </tex> , за которой следует один или несколько блоков, содержащих вершины . Вершины из этих блоков образуют подмножество <tex> V' \subset V </tex>. В таком случае: <br>
# Все вершины <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> V' </tex> будут будут добавлены в который будем записывать все стеке после дуги ведущей из точки сочленения в порядке их обработкиблок. Если обнаружена точка В стеке в момент обнаружения точки сочленения, будут находиться только дуги очередного блока окажутся в этом стеке, начиная связанного с дуги дерева обхода, которая привела в этот блокней, т.к. блоки найденный до верхушки него (если таковые имеется) будет извлечен уже из стекаи помечены в свой цвет. <br>
'''Псевдокод:
void dfs(v, parent) {
dfs(v, -1);
}
== См. также ==