Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3534 / 125 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 5:

Поиск в глубину

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Шарниры

В качестве примера задачи, для эффективного решения которой можно использовать основное свойство DFS-дерева, выражаемое теоремой 1, рассмотрим задачу выявления шарниров в графе. Напомним, что шарниром называется вершина, при удалении которой увеличивается число компонент связности. Отсутствие поперечных ребер относительно DFS-дерева позволяет очень просто узнать, является ли стартовая вершина a (корень этого дерева) шарниром.

Лемма 1. Стартовая вершина а является шарниром графа тогда и только тогда, когда ее степень в DFS-дереве больше 1.

Доказательство. Если вершину a удалить из дерева, то оно распадется на поддеревья, называемые ветвями. Число ветвей равно степени вершины a в дереве. Так как поперечных ребер нет, то вершины из разных ветвей не могут быть смежными в графе и каждый путь из одной ветви в другую обязательно проходит через вершину a. Следовательно, если степень вершины a в DFS-дереве больше 1, то эта вершина - шарнир. Если же степень вершины a в DFS-дереве равна 1, то в дереве имеется единственная вершина b, смежная с a, и каждая из остальных вершин графа соединена с вершиной b путем, не проходящим через a. Поэтому в данном случае удаление вершины a не нарушает связности графа и эта вершина не является шарниром.

Это свойство корня DFS-дерева можно было бы использовать для выявления всех шарниров, просто выполнив n раз поиск в глубину, стартуя поочередно в каждой вершине. Оказывается, все шарниры можно выявить однократным поиском в глубину. Следующая теорема характеризует все шарниры, отличные от корня DFS-дерева. Напомним, что каждая вершина дерева является и предком, и потомком самой себя. Предок (потомок) вершины, отличный от самой этой вершины, называется собственным предком (потомком).

Теорема 2. Пусть T - DFS-дерево графа G с корнем a. Вершина x\ne a является шарниром графа тогда и только тогда, когда у нее в дереве T имеется такой сын y, что ни один потомок вершины y не соединен ребром ни с одним собственным предком вершины x.

Доказательство. Если y - сын вершины x и ни один потомок вершины y не соединен ребром ни с одним собственным предком вершины x, то, ввиду отсутствия поперечных ребер, любой путь, соединяющий вершину y с корнем, проходит через x. Следовательно, в этом случае вершина x - шарнир. Если же для каждого сына y вершины x имеется ребро, соединяющее вершину y с каким-либо собственным предком вершины x, то каждый сын вершины x соединен с корнем дерева путем, не проходящим через x. Поэтому при удалении вершины x граф останется связным и x в этом случае не является шарниром.

Для применения этого критерия к поиску шарниров введем на множестве вершин функцию \Low, связанную с DFS-деревом: значением \Low(x) является наименьший из глубинных номеров вершин, смежных с потомками вершины x. Если вершина y является сыном вершины x, то \Low(y)\le Dnum(x) (так как вершина y является потомком самой себя и смежна с вершиной x ). Из теоремы 2 следует, что вершина x, отличная от a, является шарниром тогда и только тогда, когда у нее имеется сын y такой, что \Low(y)=Dnum(x).

Функцию \Low можно определить рекурсивно - если мы знаем ее значения для всех сыновей вершины x и глубинные номера всех вершин, смежных с x и не являющихся ее сыновьями, то \Low(x) есть минимум из всех этих величин, то есть

\Low(x)=\min \left(\min_{y \in A} \Low(y),\quad \min_{y\in B}
Dnum(y)\right)\!,

где A обозначает множество всех сыновей вершины x, а B - множество всех остальных вершин, смежных с x. Нетрудно видеть, что это определение эквивалентно первоначальному. Исходя из него, можно вычислять значения функции \Low в процессе поиска в глубину с помощью следующей рекурсивной процедуры. Предполагается, что вначале всем элементам массива Dnum присвоены нулевые значения.

Procedure ComputeLow(x)

  1. c:=c+1
  2. Dnum(x):=c
  3. \Low(x):=c
  4. for y\in V(x) do
  5. if Dnum(y)=0
  6. then ComputeLow( y )
  7. \Low(x):=\min (\Low(x),\Low(y))
  8. else \Low(x):=\min
(\Low(x),Dnum(y))
< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?

Александр Лаврентьев
Александр Лаврентьев

много инструкций вида if - then - else

Например Procedure DFS(a) опишите каким образом следует понимать вложенность инструкций. Как в языке С ? 

т.е. следующее 

if (...) then (...)

if (...) then (...)

else(...)

 

раскрывается как 

if (...) then (...)

if (...) then (...)

         else(...)

или так :

if (...) then

 {  (...)

     if (...) then (...)

              else(...)

}

обьясните пожалуйста.

 

 

Дмитрий Крюков
Дмитрий Крюков
Россия, Москва
Андрей Посохов
Андрей Посохов
Россия, Санкт-Петербург