Построение компонент рёберной двусвязности — различия между версиями
Niko (обсуждение | вклад) |
Niko (обсуждение | вклад) |
||
Строка 42: | Строка 42: | ||
== Однопроходный алгоритм == | == Однопроходный алгоритм == | ||
− | + | ||
− | + | Однопроходный алгоритм строится на базе алгоритма поиска мостов. Во-первых, создадим глобальный стек, и при спуске по дереву dfs добавляем в него вершины. Во-вторых, когда возвращаемся назад, проверяем не является ли ребро мостом (при помощи [[Использование обхода в глубину для поиска мостов#Лемма | леммы]]). Если это так, то то все вершины, находящиеся до текущего сына в стеке, принадлежат одной компоненте, эта компонента будет висячей вершиной в дереве блоков и мостов, так как обходили граф поиском в глубину. Значит, ее можно выкинуть и продолжить поиск в оставшемся графе. Действуя по аналогии в оставшемся графе, найдем оставшиеся компоненты реберной двусвязности. | |
− | + | ||
− | |||
− | |||
Псевдокод: | Псевдокод: | ||
Строка 56: | Строка 54: | ||
− | ''' | + | '''dfs'''(<tex> v </tex>) |
− | + | <tex> time \leftarrow time + 1</tex> | |
− | + | <tex> stack.push(v) </tex> | |
− | + | <tex>enter[v] \leftarrow time</tex> | |
− | + | <tex>ret[v] \leftarrow time </tex> | |
− | + | '''for''' всех <tex>u</tex> смежных с <tex>v</tex> | |
− | + | ''if'' <tex>(v, u)</tex> - обратное ребро | |
− | + | <tex>ret[v] \leftarrow min(ret[v], enter[u])</tex> | |
− | + | '''if''' вершина <tex>u</tex> - белая | |
− | + | '''dfs'''(u) | |
− | + | <tex> ret[v] \leftarrow min(ret[v], ret[u]) </tex> | |
− | + | '''if''' <tex>ret[u] > enter[v]</tex> | |
− | + | <tex>paint(u)</tex> | |
− | |||
− | |||
− | |||
Версия 07:51, 23 ноября 2011
Содержание
Основные понятия
Построение компонент реберной двусвязности будет осуществляться с помощью обхода в глубину.
Двупроходный алгоритм
Первый способ найти искомые компоненты - сначала определить критерий перехода в новую компоненту реберной двусвязности, а затем покрасить вершины графа в нужные цвета.
Первый проход определяет для каждой вершины ret(v)
две величины: - время входа поиска в глубину в вершину иОпределим критерий перехода к новой компоненте. Воспользуемся ранее доказанной леммой.
Основываясь на этом, определим алгоритм окраски вершин графа. Перешли по мосту, следовательно началась новая компонента.
Псевдокод второго прохода:
void paint(v, цвет): colors(v) := цвет для всех вершин u, смежных v: если colors(u) равен нулю (вершина не покрашена): если ret(u) = enter(u): увеличиваем максимальный цвет paint(u, максимальный цвет) иначе: paint(u, цвет) ... обнуляем массив colors максимальный цвет := 0 для всех вершин v графа: если colors(v) = 0: увеличиваем максимальный цвет paint(v, максимальный цвет)
Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.
Время работы алгоритма будет время работы двух запусков dfs, то есть 2 *
, что есть .Однопроходный алгоритм
Однопроходный алгоритм строится на базе алгоритма поиска мостов. Во-первых, создадим глобальный стек, и при спуске по дереву dfs добавляем в него вершины. Во-вторых, когда возвращаемся назад, проверяем не является ли ребро мостом (при помощи леммы). Если это так, то то все вершины, находящиеся до текущего сына в стеке, принадлежат одной компоненте, эта компонента будет висячей вершиной в дереве блоков и мостов, так как обходили граф поиском в глубину. Значит, ее можно выкинуть и продолжить поиск в оставшемся графе. Действуя по аналогии в оставшемся графе, найдем оставшиеся компоненты реберной двусвязности.
Псевдокод:
void paint(int v):
maxcolor++
while (пока вершина стека не вершина
и стек не пустой)
извлекаем вершину стека и красим её
dfs() for всех смежных с if - обратное ребро if вершина - белая dfs(u) if
Теперь две вершины имеют одинаковый цвет тогда и только тогда, когда они принадлежат одной компоненте реберной двусвязности.
Время работы dfs
. Покраска за . Итоговое время работы алгоритма .Визуализатор
Литература
Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128
В.А.Кузнецов, А.М.Караваев. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007