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