Изменения

Перейти к: навигация, поиск

Построение компонент вершинной двусвязности

52 байта добавлено, 01:00, 24 декабря 2010
исправлены мелкие ошибки
}
[[Точка сочленения, эквивалентные определения|Точка сочленения]] принадлежит как минимум двум компонентам вершинной двусвязаностидвусвязности.Вершина <tex> u \ne root </tex> является точкой сочленения, если у нее <tex> \exists </tex> непосредственный сын <tex> v : return[v]\ge enter[u] </tex>. <br> Это так же значит, что ребро <tex> uv </tex> содержится в другой компоненте вершинной двусвязности, нежели ребро, по которому мы пришли в вершину <tex> v </tex> , используя поиск в глубину. <br>
Используем это свойство, чтобы окрасить компоненты вершинной двусвязности в различные цвета.<br>
'''Псевдокод второго прохода:
}
void start() {
c = 0;
used для всех вершин заполняем false;
для всех v вершин графа:
если (!used[v]):
dfs(v, max(c)-1, -1);
}
Ребра каждой из компонент вершинной двусвязности окажутся окрашенными в свой цвет.
==Однопроходный алгоритм==
Предположим, что граф содержит точку сочленения <tex> i' \in V </tex> , за которой следует один или несколько блоков, содержащих вершины <tex> V' \subset V </tex>. В таком случае: <br>
1) # Все вершины <tex> V' </tex> являются потомками <tex> i' </tex> в дереве обхода; 2) # Все вершины <tex> V' </tex> будут пройдены в течение периода серого состояния <tex> i' </tex>.
При этом в <tex> G </tex> не может быть обратных дуг из <tex> V' </tex> в <tex> V \setminus V' </tex>. Воспользуемся этим.
Заведем стек, в который будем записывать все дуги в порядке их обработки. Если обнаружена точка сочленения, дуги очередного блока окажутся в этом стеке, начиная с дуги дерева обхода, которая привела в этот блок, до верхушки стека.
переходим к следующей итерации
если (!used[u]):
stack <- .push(vu);
dfs(u, v);
если (return[u] >= enter[v]):
developc = newColor() пока (stack.top() <> (vu)): color[stack.top()] = c; stack.pop(); color[vu] = c; stack.pop(v); // обработка найденной точки сочленения и удаление дуг очередного блока
если (return[u] < return[v]):
return[v] = return[u];
== См. также ==
*[[Использование обхода в глубину для поиска точек сочленения]]*[[Построение компонент реберной двусвязности]]
==Литература==
* В.А.Кузнецов, А.М.Караваев. "Оптимизация на графах" - Петрозаводск, Издательство ПетрГУ 2007
Анонимный участник

Навигация