Построение компонент рёберной двусвязности
Основные понятия
Определение: |
Две вершины графа называются реберно двусвязными, если между этими вершинами существуют два реберно непересекающихся пути. | и
Определение: |
Компонентами реберной двусвязности графа называют его подграфы, множества вершин которых - классы эквивалентности реберной двусвязности, а множества ребер - множества ребер из соответствующих классов эквивалентности. |
Построение компонент реберной двусвязности будет осуществляться с помощью обхода в глубину.
Двупроходный алгоритм
Первый способ найти искомые компоненты - сначала определить критерий перехода в новую компоненту реберной двусвязности, а затем покрасить вершины графа в нужные цвета.
Первый проход определяет для каждой вершины дереву и не более, чем одному обратному ребру. находится как для всех - сыновей в дереве , - соседей по обратным ребрам. Важно, что ребро к родителю дерева не является обратным ребром обхода.
две величины: - время входа поиска в глубину в вершину, - минимальное из времен входа вершин, достижимых из поПсевдокод первого прохода:
обнуляем массив enter текущее время := 0 dfs(v, родитель): увеличиваем текущее время enter(v) := текущее время return(v) := enter(v) для всех вершин u, смежных v: если enter(u) равен нулю (вершина не посещена): dfs(u, v) return(v) := min(return(v), return(u)) иначе если u не родитель: return(v) := min(return(v), enter(u)) ... для всех вершин v графа: если enter(v) = 0: dfs(v, null)
Определим критерий перехода к новой компоненте.
Теорема: |
Ребро ведет из одной компоненты реберной двусвязности в другую, если оно является частью дерева , и либо - предок и , либо наоборот. |
Доказательство: |
Если ребро Последнее равенство означает, что из - обратное, образуется цикл, содержащий , поэтому не может являться мостом. и ее потомков нельзя подняться выше по дереву обхода, в том числе, и в . Таким образом, между и существует лишь один путь - ребро , - и они принадлежат разным компонентам реберной двусвязности. |
Основываясь на этом, определим алгоритм окраски вершин графа. Путь по графу будет точно таким же, как и в первом проходе, что гарантирует постоянность дерева
и определенных параметров вершин: и .Псевдокод второго прохода:
обнуляем массив colors максимальный цвет := 0 paint(v, цвет): colors(v) := цвет для всех вершин u, смежных v: если colors(u) равен нулю (вершина не покрашена): если return(u) = enter(u): увеличиваем максимальный цвет paint(u, максимальный цвет) иначе: paint(u, цвет) ... для всех вершин v графа: если colors(v) = 0: увеличиваем максимальный цвет paint(v, максимальный цвет)
Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.