212
правок
Изменения
→Двупроходный алгоритм
'''Второй проход
[[Точка сочленения, эквивалентные определения|Точка сочленения]] принадлежит как минимум двум компонентам вершинной двусвязности.
Вершина <tex> v \ne root </tex> является точкой сочленения, если у нее есть сын <tex> u : return[u] \ge geqslant enter[v] </tex>. <br> Это также значит, что ребро <tex> vu </tex> содержится в другой компоненте вершинной двусвязности, нежели ребро по которому мы пришли в вершину <tex> v </tex> , используя поиск в глубину. <br>
Используем это свойство, чтобы окрасить компоненты вершинной двусвязности в различные цвета.<br>
{| width = 100%
|-
|
<tex>dfs</tex>(<tex>v, c, parent</tex>, color, parent): для всех вершин '''for''' <tex> u смежных \in V : (v, u) \in E</tex>: если ('''if''' <tex>u</tex> родитель) == parent переходим к следующей итерацииcontinue если ('''if''' '''not''' visited[<tex>u</tex> не посещена)] если ('''if''' return[<tex>return[u</tex>] <tex>\geqslant</tex>= enter[<tex>v]</tex>)] newColor <tex>c2 \leftarrow</tex> новый цветmaxColor++ col[<tex>col[vu</tex>] <tex>\leftarrow c2</tex>newColor <tex>dfs</tex>(<tex>u</tex>, c2newColor, <tex>v</tex>) иначе'''else''' col[<tex>col[vu</tex>] <tex>\leftarrow c</tex>color <tex>dfs</tex>(<tex>u</tex>, ccolor, <tex>v</tex>) иначе:'''else''' если ('''if''' enter[<tex>enter[u</tex>] <= tex>\leqslant</tex> enter[<tex>v]</tex>)] col[<tex>col[vu</tex>] <tex>\leftarrow c</tex> color start()... для всех '''for''' <tex> v вершин графа\in V</tex>: если ( '''if''' '''not''' visited[<tex>v</tex> не посещена)] <tex>dfs</tex>(<tex>v</tex>, -1, -1</tex>)
|width = "310px" |[[Файл:Vertex_doubleconnection_1.png|thumb|center|400px|Компоненты обозначены разным цветом]]
|}