Скажите, пожалуйста, можно ли еще получить документ о прохождении курса ("Графы и алгоритмы", декабрь 2020) после предоставления всех дополнительных необходимых документов? |
Поиск в глубину
Шарниры
В качестве примера задачи, для эффективного решения которой можно использовать основное свойство DFS-дерева, выражаемое теоремой 1, рассмотрим задачу выявления шарниров в графе. Напомним, что шарниром называется вершина, при удалении которой увеличивается число компонент связности. Отсутствие поперечных ребер относительно DFS-дерева позволяет очень просто узнать, является ли стартовая вершина (корень этого дерева) шарниром.
Лемма 1. Стартовая вершина а является шарниром графа тогда и только тогда, когда ее степень в DFS-дереве больше .
Доказательство. Если вершину удалить из дерева, то оно распадется на поддеревья, называемые ветвями. Число ветвей равно степени вершины в дереве. Так как поперечных ребер нет, то вершины из разных ветвей не могут быть смежными в графе и каждый путь из одной ветви в другую обязательно проходит через вершину . Следовательно, если степень вершины в DFS-дереве больше 1, то эта вершина - шарнир. Если же степень вершины в DFS-дереве равна 1, то в дереве имеется единственная вершина , смежная с , и каждая из остальных вершин графа соединена с вершиной путем, не проходящим через . Поэтому в данном случае удаление вершины не нарушает связности графа и эта вершина не является шарниром.
Это свойство корня DFS-дерева можно было бы использовать для выявления всех шарниров, просто выполнив раз поиск в глубину, стартуя поочередно в каждой вершине. Оказывается, все шарниры можно выявить однократным поиском в глубину. Следующая теорема характеризует все шарниры, отличные от корня DFS-дерева. Напомним, что каждая вершина дерева является и предком, и потомком самой себя. Предок (потомок) вершины, отличный от самой этой вершины, называется собственным предком (потомком).
Теорема 2. Пусть - DFS-дерево графа с корнем . Вершина является шарниром графа тогда и только тогда, когда у нее в дереве имеется такой сын , что ни один потомок вершины не соединен ребром ни с одним собственным предком вершины .
Доказательство. Если - сын вершины и ни один потомок вершины не соединен ребром ни с одним собственным предком вершины , то, ввиду отсутствия поперечных ребер, любой путь, соединяющий вершину с корнем, проходит через . Следовательно, в этом случае вершина - шарнир. Если же для каждого сына вершины имеется ребро, соединяющее вершину с каким-либо собственным предком вершины , то каждый сын вершины соединен с корнем дерева путем, не проходящим через . Поэтому при удалении вершины граф останется связным и в этом случае не является шарниром.
Для применения этого критерия к поиску шарниров введем на множестве вершин функцию , связанную с DFS-деревом: значением является наименьший из глубинных номеров вершин, смежных с потомками вершины . Если вершина является сыном вершины , то (так как вершина является потомком самой себя и смежна с вершиной ). Из теоремы 2 следует, что вершина , отличная от , является шарниром тогда и только тогда, когда у нее имеется сын такой, что
Функцию можно определить рекурсивно - если мы знаем ее значения для всех сыновей вершины и глубинные номера всех вершин, смежных с и не являющихся ее сыновьями, то есть минимум из всех этих величин, то есть
где обозначает множество всех сыновей вершины , а - множество всех остальных вершин, смежных с . Нетрудно видеть, что это определение эквивалентно первоначальному. Исходя из него, можно вычислять значения функции в процессе поиска в глубину с помощью следующей рекурсивной процедуры. Предполагается, что вначале всем элементам массива присвоены нулевые значения.
Procedure
- for do
- if
- then ComputeLow( )
- else