Построение компонент рёберной двусвязности — различия между версиями
Novik (обсуждение | вклад) м |
Novik (обсуждение | вклад) м (→Псевдокод второго прохода) |
||
Строка 15: | Строка 15: | ||
'''function''' <tex>paint</tex>(<tex>v</tex>, color): | '''function''' <tex>paint</tex>(<tex>v</tex>, color): | ||
− | colors[<tex>v</tex>]<tex>\leftarrow</tex> color | + | colors[<tex>v</tex>] <tex>\leftarrow</tex> color |
'''for''' <tex>u \in V : (u, v) \in E</tex>: | '''for''' <tex>u \in V : (u, v) \in E</tex>: | ||
'''if''' colors[<tex>u</tex>] == 0: | '''if''' colors[<tex>u</tex>] == 0: | ||
Строка 25: | Строка 25: | ||
... | ... | ||
'''for''' <tex>v \in V</tex> : | '''for''' <tex>v \in V</tex> : | ||
− | colors[<tex>v</tex>]<tex>\leftarrow | + | colors[<tex>v</tex>] <tex>\leftarrow</tex> 0 |
− | maxColor <tex>\leftarrow | + | maxColor <tex>\leftarrow</tex> 0 |
'''for''' <tex>v \in V</tex> : | '''for''' <tex>v \in V</tex> : | ||
'''if''' colors[<tex>v</tex>] == 0: | '''if''' colors[<tex>v</tex>] == 0: |
Версия 22:08, 9 ноября 2015
Построение компонент реберной двусвязности будет осуществляться с помощью обхода в глубину.
Содержание
Двупроходный алгоритм
Первый способ найти искомые компоненты — сначала определить критерий перехода в новую компоненту реберной двусвязности, а затем покрасить вершины графа в нужные цвета.
Первым проходом запустим алгоритм для поиска мостов, чтобы посчитать две величины: и .
Определим критерий перехода к новой компоненте. Воспользуемся ранее доказанной леммой.
Основываясь на этом, определим алгоритм окраски вершин графа: перешли по мосту, следовательно началась новая компонента.
Псевдокод второго прохода
function( , color): colors[ ] color for : if colors[ ] == 0: if ret[ ] > enter[ ]: maxColor++ ( , maxColor) else: ( , color) ... for : colors[ ] 0 maxColor 0 for : if colors[ ] == 0: maxColor++ ( , maxColor)
Вершины каждой из компонент реберной двусвязности окажутся окрашенными в свой цвет.
Время работы алгоритма будет время работы двух запусков dfs, то есть
, что есть .Однопроходный алгоритм
Однопроходный алгоритм строится на базе алгоритма поиска мостов. Во-первых, создадим глобальный стек, и при спуске по дереву леммы). Если это так, то то все вершины, находящиеся до текущего потомка в стеке, принадлежат одной компоненте.Заметим, что эта компонента будет висячей вершиной в дереве блоков и мостов, так как обходили граф поиском в глубину. Значит, ее можно выкинуть и продолжить поиск в оставшемся графе. Действуя по аналогии в получившемся графе, найдем оставшиеся компоненты реберной двусвязности.
добавляем в него вершины. Во-вторых, когда возвращаемся назад, проверяем не является ли ребро мостом (при помощиПсевдокод
function( ): maxColor++ while stack.top() != and not stack.empty() colors[stack.top()] maxColor stack.pop()
function( ) time time + stack.push( ) enter[ ] time ret[ ] time for : if — обратное ребро ret[ ] min(ret[ ], enter[ ]) if not visited[ ] ( ) ret[ ] min(ret[ ], ret[ ]) if ret[ ] > enter[ ] ( )
Теперь две вершины имеют одинаковый цвет тогда и только тогда, когда они принадлежат одной компоненте реберной двусвязности.
Время работы dfs
. Покраска за . Итоговое время работы алгоритма .Источники информации
- Седжвик Р. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах. Пер. с англ. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128
- Кузнецов В.А., Караваев. А.М. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007
- Визуализация построение компонент реберной двусзяности