Графы и алгоритмы

Блоки

Показывать лекцию целиком

Блоки

Если граф состоит из нескольких компонент связности, то его можно изучать "по частям", и это может упростить описание графа и облегчить решение многих задач. Однако и связный граф иногда можно представить как состоящий из частей, и такое представление также может быть полезным. После компонент связности простейшими частями такого рода являются блоки (называемые также компонентами двусвязности). Блок - это максимальный подграф графа, не имеющий собственных шарниров (т.е. некоторые шарниры графа могут принадлежать блоку, но своих шарниров у блока нет). На рис. 6.1 изображены граф $$G$$ и его блоки $$B_{1} -B_{5}$$. Ниже будет дано другое определение блока, из которого ясно, почему блоки называют компонентами двусвязности. Затем будут рассмотрены некоторые свойства блоков и описан алгоритм выявления блоков, основанный на поиске в глубину.

(рис 6.1)

Двусвязность

Связный граф с не менее чем тремя вершинами, в котором нет шарниров, называется двусвязным. Примеры двусвязных графов - цикл $$C_n$$ и полный граф $$K_n$$, $$n \ge 3$$ цепь же $$P_n$$ не является двусвязным графом ни при каком $$n$$.

Будем говорить, что два элемента графа (напомним, что элементы графа - это вершины и ребра) циклически связаны, если в графе имеется простой цикл, содержащий оба эти элемента.

Теорема 1. В двусвязном графе любые два различных элемента циклически связаны. Если в графе любые два ребра циклически связаны, то он двусвязен.

Доказательство. Докажем сначала, что в двусвязном графе $$G$$ для любых двух различных вершин $$a$$ и $$b$$ имеется простой цикл, проходящий через обе эти вершины. Доказательство проводим индукцией по расстоянию между $$a$$ и $$b$$. Если $$d(a,b)=1$$, то $$a$$ и $$b$$ смежны. Ребро $$(a,b)$$ не является перешейком (иначе хотя бы одна из вершин $$a$$, $$b$$ была бы шарниром). Но тогда в графе имеется простой цикл, проходящий через это ребро. Пусть $$d(a,b)>1$$. Рассмотрим кратчайший путь из $$a$$ в $$b$$, и пусть $$x$$ - предпоследняя вершина этого пути. Тогда $$d(a,x) = d(a,b)-1$$ и, по предположению индукции, существует простой цикл $$C$$, содержащий вершины $$a$$ и $$x$$. Так как вершина $$x$$ - не шарнир, то существует простой путь $$P$$ из $$b$$ в $$a$$, не проходящий через $$x$$. Пусть $$y$$ - первая вершина этого пути, принадлежащая $$C$$ (такая существует, так как $$a \in C$$. Тогда отрезок пути $$P$$ от $$b$$ до $$y$$ вместе с отрезком цикла от $$y$$ до $$x$$, содержащим вершину $$a$$, и с ребром $$(x,b)$$ образует простой цикл, содержащий обе вершины $$a$$ и $$b$$ (показан стрелками на рис. 6.2).

(рис 6.2)

Теперь покажем, что для любой вершины $$a$$ и любого ребра $$(x,y)$$ двусвязного графа $$G$$ в нем имеется цикл, содержащий эту вершину и это ребро. Как доказано выше, существует простой цикл $$C_1$$, содержащий вершины $$a$$ и $$x$$. Если этот цикл проходит и через $$y$$, то, заменив в нем отрезок от $$x$$ до $$y$$, не содержащий $$a$$, ребром $$(x,y)$$, получим простой цикл, проходящий через вершину $$a$$ и ребро $$(x,y)$$. В противном случае возьмем цикл $$C_2$$, содержащий вершины $$a$$ и $$y$$. Кратчайший отрезок этого цикла, соединяющий $$y$$ с какой-либо вершиной $$z$$ на $$C_1$$, вместе с отрезком цикла $$C_1$$ от $$z$$ до $$x$$, содержащим вершину $$a$$, и с ребром $$(x,y)$$ образует простой цикл, содержащий это ребро и вершину $$a$$.

Доказательство того, что в двусвязном графе через любые два ребра проходит простой цикл, почти в точности повторяет предыдущее, только вместо вершины $$a$$ нужно рассматривать ребро $$(a,b)$$.

Остается доказать, что если в графе $$G$$ через любые два различных элемента проходит простой цикл, то этот граф - двусвязный. Действительно, допустим, что вершина $$a$$ - шарнир графа $$G$$. Возьмем вершины $$x$$ и $$y$$, смежные с $$a$$ и принадлежащие разным компонентам связности графа, получающегося при удалении вершины $$a$$. Тогда в $$G$$ не существует цикла, содержащего оба ребра $$(a,x)$$ и $$(a,y)$$.

Из этой теоремы следует, что свойство двусвязности можно охарактеризовать следующим образом:

Следствие. Граф с не менее чем двумя ребрами двусвязен тогда и только тогда, когда в нем любые два различных ребра циклически связаны.

Рассмотрим подробнее отношение циклической связанности ребер. Оно, очевидно, симметрично. Будем считать, что каждое ребро циклически связано с самим собой, тогда это отношение будет и рефлексивным. Докажем, что оно на самом деле является отношением эквивалентности.

Теорема 2. Для любого графа отношение циклической связанности ребер является отношением эквивалентности.

Доказательство. Остается доказать транзитивность этого отношения. Пусть $$C_{1}$$ - простой цикл, содержащий ребра $$e_{1}$$ и $$e_{2}$$, а $$C_{2}$$ - простой цикл, содержащий ребра $$e_{2}$$ и $$e_{3}$$ ; покажем, что существует простой цикл, содержащий ребра $$e_{1}$$ и $$e_{3}$$. Если $$e_{1}$$ принадлежит $$C_{2}$$, то последний и является этим циклом. Если же $$e_{1}$$ не принадлежит $$C_{2}$$, то в $$C_{1}$$ есть отрезок $$P_{1}$$, включающий $$e_{1}$$, у которого концевые вершины $$a$$ и $$b$$ принадлежат $$C_{2}$$, а все внутренние вершины не принадлежат $$C_{2}$$. Пусть $$P_{2}$$ - отрезок цикла $$C_{2}$$, концами которого являются $$a$$ и $$b$$ и который включает ребро $$e_{3}$$. Соединение $$P_{1}$$ и $$P_{2}$$ дает простой цикл, содержащий $$e_{1}$$ и $$e_{3}$$.

Итак, множество ребер любого графа разбивается на классы эквивалентности по отношению циклической связанности. Каждый перешеек образует отдельный класс эквивалентности. Если граф двусвязен, то имеется единственный класс циклической связанности.

Блоки и BC-дерево

Блоком графа $$G$$ называется подграф $$B$$, удовлетворяющий одному из трех условий:

а) $$B$$ состоит из одной изолированной вершины графа $$G$$ (такой блок называется тривиальным);

б) $$B$$ порождается единственным ребром, которое является перешейком в $$G$$ ;

в) $$B$$ является максимальным двусвязным подграфом графа $$G$$.

Из последних двух теорем следует, что ребра нетривиального блока образуют класс циклической связанности. Следовательно, различные блоки не имеют общих ребер. Однако, в отличие от компонент связности, блоки могут иметь общие вершины. Такими общими вершинами, как показывает следующая теорема, могут быть только шарниры графа.

Теорема 3. Два различных блока одного графа могут иметь не более одной общей вершины. Вершина принадлежит более чем одному блоку тогда и только тогда, когда она является шарниром графа.

Доказательство. Пусть $$B_1$$ и $$B_2$$ - различные блоки графа $$G$$. Рассмотрим подграф $$B = B_1 \cup B_2$$. Он не является блоком, следовательно, или несвязен, или имеет шарнир. Если $$B$$ несвязен, то $$B_1$$ и $$B_2$$ - его компоненты связности и, следовательно, не имеют общих вершин. Если же $$B$$ связен и $$a$$ - шарнир в $$B$$, то после удаления вершины $$a$$ граф $$B$$ распадается на компоненты связности. При этом все вершины подграфа $$B_1$$, отличные от $$a$$, принадлежат одной компоненте, иначе $$a$$ была бы шарниром в $$B_1$$. То же верно для вершин подграфа $$B_2$$. Значит, имеется всего две компоненты, одна из которых состоит полностью из вершин графа $$B_1$$, другая - из вершин графа $$B_2$$. Следовательно, $$a$$ - единственная общая вершина $$B_1$$ и $$B_2$$.

Если вершина $$x$$ принадлежит более чем одному блоку, то она инцидентна двум ребрам, $$(x,y_1)$$ и $$(x,y_2)$$, принадлежащим разным блокам, то есть не являющимся циклически связанными. Но тогда всякий путь, соединяющий $$y_1$$ и $$y_2$$, проходит через $$x$$, следовательно, $$x$$ - шарнир. Обратно, если $$x$$ - шарнир, то найдутся две смежные с $$x$$ вершины $$y_1$$ и $$y_2$$, принадлежащие разным компонентам связности графа, получаемого удалением вершины $$x$$. Но тогда ребра $$(x,y_1)$$ и $$(x,y_2)$$ не являются циклически связанными, следовательно, принадлежат разным блокам.

Строение связного графа, состоящего из нескольких блоков, может быть схематически описано с помощью так называемого дерева блоков и шарниров, кратко именуемого ВС-деревом. В этом дереве имеются две категории вершин - одни поставлены в соответствие блокам графа, другие - его шарнирам. Вершина-блок в дереве соединяется ребром с вершиной-шарниром, если в графе соответствующий шарнир принадлежит соответствующему блоку. На рис. 6.3 изображено ВС-дерево для графа с рис. 6.1. Блоки изображены белыми, а шарниры - черными кружками.

(рис 6.3)

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

Рассмотрим связный граф $$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. Выявление блоков

  • for $$x\in V$$ do $$\Dnum(x)=0$$
  • $$c:=0$$
  • $$k:=0$$
  • for $$x\in V$$ do if $$\Dnum(x):=0$$ then Blocks $$x$$
  • Procedure $$Blocks(x)$$

  • $$c:=c+1$$
  • $$\Dnum(x):=c$$
  • $$\Low(x):=c$$
  • $$x\Rightarrow S$$
  • for $$y\in V(x)$$ do
  • if $$\Dnum(y)=0$$
  • then Blocks( $$y$$ )
  • $$\Low(x):=\min (\Low(x),\Low(y))$$
  • if $$\Low(y)=\Dnum(x)$$ then NewBlock
  • else $$\Low(x):=\min (\Low(x),\Dnum(y))$$
  • Procedure NewBlock

  • $$k:=k+1$$
  • $$B(k):=x$$
  • repeat
  • $$z\Leftarrow S$$
  • $$B(k):=B(k)\cup \{z\}$$
  • until $$z=y$$
  • Вернуться к учебному плану