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