Использование обхода в глубину для поиска точек сочленения — различия между версиями
Dimitrova (обсуждение | вклад) |
Dimitrova (обсуждение | вклад) |
||
Строка 23: | Строка 23: | ||
Таким образом, если для текущей вершины <tex>v \ne root \, \exists</tex> непосредственный сын <tex>v</tex>: <tex>up[v] \ge tin[u]</tex>, то вершина <tex>u</tex> является точкой сочленения; в противном случае она точкой сочленения не является. | Таким образом, если для текущей вершины <tex>v \ne root \, \exists</tex> непосредственный сын <tex>v</tex>: <tex>up[v] \ge tin[u]</tex>, то вершина <tex>u</tex> является точкой сочленения; в противном случае она точкой сочленения не является. | ||
− | |||
− | |||
− | |||
= Реализация = | = Реализация = | ||
Строка 53: | Строка 50: | ||
<tex>time \leftarrow 0</tex> | <tex>time \leftarrow 0</tex> | ||
dfs(<tex>root</tex>, -1); | dfs(<tex>root</tex>, -1); | ||
− | + | <br> | |
+ | Время работы алгоритма совпадает с временем работы <tex> dfs </tex>. Он равен <tex> O(V + E) </tex> | ||
= Источники = | = Источники = | ||
Асанов М., Баранский В., Расин В. - Дискретная математика: Графы, матроиды, алгоритмы — Ижевск: ННЦ "Регулярная и хаотическая динамика", 2001, 288 стр. | Асанов М., Баранский В., Расин В. - Дискретная математика: Графы, матроиды, алгоритмы — Ижевск: ННЦ "Регулярная и хаотическая динамика", 2001, 288 стр. |
Версия 08:35, 1 декабря 2011
Алгоритм
Дан связный неориентированный граф. Требуется найти все точки сочленения в нем.
Теорема: |
Пусть обхода в глубину, - корень . Вершина - точка сочленения - сын : из или любого потомка вершины нет обратного ребра в предка вершины . - точка сочленения имеет хотя бы двух сыновей в дереве поиска в глубину. - дерево |
Доказательство: |
|
Пусть
- время входа поиска в глубину в вершину . Через обозначим минимум из времени захода в саму вершину , времен захода в каждую из вершин , являющуюся концом некоторого обратного ребра , а также из всех значений для каждой вершины , являющейся непосредственным сыном в дереве поиска.Тогда, из вершины
или её потомка есть обратное ребро в её предка такой сын , что .Таким образом, если для текущей вершины
непосредственный сын : , то вершина является точкой сочленения; в противном случае она точкой сочленения не является.Реализация
dfs(, ) Помечаем вершину , как посещенную ++ 0 for ( : из ) if ( родитель ) Переходим к следующей итерации цикла if ( посещено) //v - предок вершины u, uv - обратное ребро else //v - ребенок вершины u ++ dfs( ) if ( >= ) if ( корень) main() ... for ( из ) if ( не посещен) dfs( , -1);
Время работы алгоритма совпадает с временем работы . Он равен
Источники
Асанов М., Баранский В., Расин В. - Дискретная математика: Графы, матроиды, алгоритмы — Ижевск: ННЦ "Регулярная и хаотическая динамика", 2001, 288 стр.