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

Блоки

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

Выявление блоков

Рассмотрим связный граф G и в нем DFS-дерево T, построенное поиском в глубину из стартовой вершины a. Через F(x) будем обозначать отца вершины x в этом дереве, при этом считаем, что F(a)=a. Будем также считать, что в процессе обхода графа вычисляются значения функций Dnum и Low, определенных в предыдущем разделе.

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

Теорема 4. Пусть x=F(y) в DFS-дереве T. Ребро (x,y) является начальным ребром некоторого блока тогда и только тогда, когда \Low(y)=\Dnum(x).

Доказательство. Если x=a, то для каждого сына y вершины x имеет место равенство \Low(y)=\Dnum(x) и ребро (x,y) является начальным ребром некоторого блока.

Пусть x\ne a и (x,y) - начальное ребро блока B. Предположим, что \Low(y)\ne \Dnum(x). Это означает, что имеется ребро, соединяющее некоторого потомка вершины y с собственным предком вершины x. Но тогда ребра (x,y) и (x,F(x)) оказываются циклически связанными, а отсюда следует, что вершина F(x) принадлежит блоку B. Но это противоречит тому, что x - начальная вершина блока, так как \Dnum(F(x)) \lt \Dnum(x).

Обратно, пусть \Low(y)=\Dnum(x). Тогда вершина x является шарниром графа. Рассмотрим поддерево, состоящее из всех потомков вершины y. Ни одна из вершин этого поддерева не смежна ни с одной отличной от x вершиной вне поддерева. Значит, все вершины блока, содержащего ребро (x,y), принадлежат этому поддереву, и (x,y) - начальное ребро этого блока.

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

Множества вершин блоков строит процедура NewBlock. Она вызывается всякий раз, когда обнаруживается начальное ребро (x,\,y) некоторого блока (выполняется равенство \Low(y)=\Dnum(x) ). Эта процедура включает в новое множество B(k) вершины x, y и все вершины, находящиеся в стеке выше вершины y. Эти вершины удаляются из стека (кроме вершины x, которая является начальной вершиной блока и может принадлежать еще и другим блокам). Для обоснования алгоритма остается убедиться в том, что блок состоит именно из этих вершин. Доказательство можно провести индукцией по номеру блока k. Вершина y помещается в стек S, когда она становится открытой, а условие \Low(y)=\Dnum(x) проверяется для вершины y тогда, когда она превращается в закрытую. Все вершины, помещаемые в стек между этими двумя событиями, будут потомками вершины y в DFS-дереве, каждый потомок вершины y будет помещен в стек после y, и когда y становится закрытой, все эти вершины уже закрыты. Если k=1, то среди потомков вершины y нет начальных вершин блоков (иначе номер этого блока был бы больше 1), следовательно, блок c начальным ребром (x,y) состоит из всех этих вершин и вершины x. Если же k \gt 1, то, по предположению индукции, все вершины других блоков, состоящих из потомков вершины y, не принадлежащие блоку B(k), к моменту обнаружения начального ребра (x,y) уже удалены из стека, следовательно, B(k) состоит в точности из x, y и вершин, находящихся в стеке выше вершины y.

Алгоритм 1. Выявление блоков

  1. for x\in V do \Dnum(x)=0
  2. c:=0
  3. k:=0
  4. for x\in V do if \Dnum(x):=0 then Blocks x

Procedure Blocks(x)

  1. c:=c+1
  2. \Dnum(x):=c
  3. \Low(x):=c
  4. x\Rightarrow S
  5. for y\in V(x) do
  6. if \Dnum(y)=0
  7. then Blocks( y )
  8. \Low(x):=\min (\Low(x),\Low(y))
  9. if \Low(y)=\Dnum(x) then NewBlock
  10. else \Low(x):=\min (\Low(x),\Dnum(y))

Procedure NewBlock

  1. k:=k+1
  2. B(k):=x
  3. repeat
  4. z\Leftarrow S
  5. B(k):=B(k)\cup \{z\}
  6. until z=y
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Петр Петров
Петр Петров

произведение графов К(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(...)

}

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

 

 

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