Изменения

Перейти к: навигация, поиск
Реализация
== Реализация ==
dfs'''function''' findCutPoints(G[n]: '''Graph'''):<texfont color=darkgreen>u</tex>, <tex>prev/ функция принимает граф G с количеством вершин n и выполняет поиск точек сочленения во всем графе </texfont>) Помечаем вершину <tex>u</tex>visited = array[n, ''false''] '''function''' dfs(v: '''int''', как посещеннуюp: '''int'''): time = time + 1 <tex>tin up[uv] \leftarrow up= tin[uv] \leftarrow = time</tex>++ <tex>count \leftarrow</tex> 0 visited[v] = ''true'' '''for ''' u: (<tex>v</tex> : <tex>uv</tex> из <tex>E</tex>, u)'''in''' G '''if (<tex>v</tex> родитель <tex>''' u</tex>)== p Переходим к следующей итерации циклаcontinue '''if (<tex>v</tex> посещено) //<tex>v</tex> — предок вершины <tex>''' visited[u</tex>, <tex>uv</tex> — обратное ребро] == ''true'' <tex>up[uv] \leftarrow = min(up[uv], tin[vu])</tex> '''else //<tex>v</tex> — ребенок вершины <tex>u</tex> <tex>count</tex>++''' dfs(<tex>u, v, u</tex>) <tex>up[uv] \leftarrow = min(up[uv], uptin[vu])</tex> '''if (<tex>''' up[vto]</tex> >= <tex>tin[uv]&& p != -1 </texfont color=darkgreen>) <tex>answer[u] \leftarrow true</tex> if (<tex>u</tex> корень) <tex>answer[u] \leftarrow (count > если граф состоит из 2 вершин и одного ребра, то p != -1 спасёт, иначе выведет 1)точку сочленения </texfont> v — cutpoint '''if''' v — root main() v — cutpoint ... '''for (<tex>root</tex> из <tex>V</tex>)''' i = 1 '''to''' n '''if (<tex>root</tex> не посещен)''' visited[i] == ''false'' <tex>time \leftarrow 0</tex> dfs(<tex>root</tex>i, -1);<br>Время работы алгоритма совпадает с [[Обход в глубину, цвета вершин#Время работы|временем работы]] <tex> dfs </tex>.
== См. также ==
47
правок

Навигация