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

Пространство циклов графа

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Фундаментальные циклы

Компактное представление пространства дает его базис. Если выписать все простые циклы графа G, то это в большинстве случаев не будет его базисом, так как некоторые из этих циклов могут быть суммами других (см. пример на рис. 7.1). Построить базис пространства C[G], состоящий из простых циклов, можно следующим образом. Выберем в графе G какой-нибудь каркас T. Пусть e_{1},\ldots e_{s} - все ребра графа G, не принадлежащие T. Если добавить к T ребро e_{i}, то в полученном графе образуется единственный (простой) цикл Z_{i}. Таким образом, получаем семейство из s циклов, они называются фундаментальными циклами относительно каркаса T.

Теорема 2. Множество всех фундаментальных циклов относительно любого каркаса T графа G образует базис пространства циклов этого графа.

Доказательство. Зафиксируем некоторый каркас T и рассмотрим фундаментальные циклы Z_{1},Z_{2},\ldots ,Z_{s} относительно этого каркаса. В каждом из этих циклов имеется ребро e_{i}, принадлежащее данному циклу и не принадлежащее никакому из остальных. Поэтому при сложении этого цикла с другими фундаментальными циклами данное ребро не "уничтожится" - оно будет присутствовать в суммарном графе. Следовательно, сумма различных фундаментальных циклов никогда не будет пустым графом, то есть фундаментальные циклы линейно независимы.

Покажем теперь, что любой квазицикл графа G является суммой фундаментальных циклов. Действительно, пусть H - такой квазицикл. Пусть e_{i_{1}},e_{i_{2}},\ldots e_{i_{t} } - все ребра H, не принадлежащие T. Рассмотрим граф F=H\oplus Z_{i_{1}}
\oplus Z_{i_{2}} \oplus \ldots \oplus Z_{i_{t} }. Каждое из ребер e_{i_{j} }, j=1,\ldots t, входит ровно в два слагаемых этой суммы - в H и в Z_{i_{j} }. Следовательно, при сложении все эти ребра уничтожатся. Все остальные ребра, присутствующие в графах-слагаемых, принадлежат T. Значит, F - подграф графа T. Так как все слагаемые являются квазициклами, значит, F - тоже квазицикл. Но в T нет циклов, поэтому имеется единственная возможность: F=O, откуда получаем H=Z_{i_{1}} \oplus Z_{i_{2}} \oplus \ldots \oplus Z_{i_{t}}.

Из этой теоремы следует, что размерность пространства циклов графа равна числу ребер, не входящих в его каркас. Так как каркас содержит n-k ребер, где k - число компонент связности графа, то эта размерность равна \nu (G)=m-n+k. Это число называют цикломатическим числом графа.

Построение базы циклов

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

Поиск в глубину особенно удобен благодаря основному свойству DFS-дерева (теорема 1 из "Поиск в глубину" ) - каждое обратное ребро относительно этого дерева является продольным. Это означает, что из двух вершин такого ребра одна является предком другой в DFS-дереве. Каждое такое ребро в процессе поиска в глубину встретится дважды - один раз, когда активной вершиной будет предок, другой раз, когда ею будет потомок. В этом последнем случае искомый фундаментальный цикл состоит из рассматриваемого обратного ребра и участка пути в DFS-дереве, соединяющего эти две вершины. Но этот путь так или иначе запоминается в процессе обхода в глубину, так как он необходим для последующего возвращения. Если, например, для хранения открытых вершин используется стек, то вершины этого пути находятся в верхней части стека. В любом случае этот путь легко доступен и цикл находится без труда. Запишем процедуру построения фундаментальных циклов на базе алгоритма поиска в глубину с построением DFS-дерева. Переменная k - счетчик циклов, C(k) - последовательность (список) вершин, составляющих цикл с номером k.

Алгоритм 1. Построение базы циклов.

  1. пометить все вершины как новые
  2. k:=1
  3. for x\in V do if x новая then CycleBase(x)

Procedure CycleBase(a)

  1. открыть вершину a
  2. F(a)\, :=a
  3. x\, :=a
  4. while x открытая do
  5. if имеется неисследованное ребро (x,y)
  6. then пометить ребро (x,y) как исследованное
  7. if вершина y новая
  8. then открыть вершину y
  9. F(y):=x
  10. x:=y
  11. else NewCycle
  12. else закрыть вершину x
  13. x:=F(x)

Procedure NewCycle

  1. k:=k+1
  2. Создать список C(k) из одного элемента x
  3. z:=x
  4. repeat z:=F(z)
  5. добавить z к списку C(k)
  6. until z=y

Хотя сам поиск в глубину выполняется за линейное от числа вершин и ребер время, решающее влияние на трудоемкость этого алгоритма оказывает необходимость запоминать встречающиеся циклы. Подсчитаем суммарную длину этих циклов для полного графа с n вершинами. DFS-дерево в этом случае является простым путем, относительно него будет n-2 цикла длины 3, n-3 цикла длины 4\ldots 1 цикл длины n. Сумма длин всех фундаментальных циклов будет равна

\sum_{i=1}^{n-2}i(n+1-i)=\frac{n^{3} + 3n^{2} -16n+12}{6}.

Таким образом, на некоторых графах число операций этого алгоритма будет величиной порядка n^{3}.

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Петр Петров
Петр Петров

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

}

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

 

 

Константин Дементьев
Константин Дементьев
Россия, г. Мичуринск