Скажите, пожалуйста, можно ли еще получить документ о прохождении курса ("Графы и алгоритмы", декабрь 2020) после предоставления всех дополнительных необходимых документов? |
Пространство циклов графа
Фундаментальные циклы
Компактное представление пространства дает его базис. Если выписать все простые циклы графа , то это в большинстве случаев не будет его базисом, так как некоторые из этих циклов могут быть суммами других (см. пример на рис. 7.1). Построить базис пространства , состоящий из простых циклов, можно следующим образом. Выберем в графе какой-нибудь каркас . Пусть - все ребра графа , не принадлежащие . Если добавить к ребро , то в полученном графе образуется единственный (простой) цикл . Таким образом, получаем семейство из циклов, они называются фундаментальными циклами относительно каркаса .
Теорема 2. Множество всех фундаментальных циклов относительно любого каркаса графа образует базис пространства циклов этого графа.
Доказательство. Зафиксируем некоторый каркас и рассмотрим фундаментальные циклы относительно этого каркаса. В каждом из этих циклов имеется ребро , принадлежащее данному циклу и не принадлежащее никакому из остальных. Поэтому при сложении этого цикла с другими фундаментальными циклами данное ребро не "уничтожится" - оно будет присутствовать в суммарном графе. Следовательно, сумма различных фундаментальных циклов никогда не будет пустым графом, то есть фундаментальные циклы линейно независимы.
Покажем теперь, что любой квазицикл графа является суммой фундаментальных циклов. Действительно, пусть - такой квазицикл. Пусть - все ребра , не принадлежащие . Рассмотрим граф . Каждое из ребер , , входит ровно в два слагаемых этой суммы - в и в . Следовательно, при сложении все эти ребра уничтожатся. Все остальные ребра, присутствующие в графах-слагаемых, принадлежат . Значит, - подграф графа . Так как все слагаемые являются квазициклами, значит, - тоже квазицикл. Но в нет циклов, поэтому имеется единственная возможность: , откуда получаем .
Из этой теоремы следует, что размерность пространства циклов графа равна числу ребер, не входящих в его каркас. Так как каркас содержит ребер, где - число компонент связности графа, то эта размерность равна . Это число называют цикломатическим числом графа.
Построение базы циклов
Базис пространства циклов графа коротко называют базой циклов. На основании теоремы 2 можно предложить достаточно простой способ построения базы циклов графа. Сначала находится какой-нибудь каркас, затем для каждого ребра, не принадлежащего каркасу, отыскивается тот единственный цикл, который это ребро образует с ребрами каркаса. Таким образом, любой алгоритм построения каркаса может быть использован для нахождения базы циклов.
Поиск в глубину особенно удобен благодаря основному свойству DFS-дерева (теорема 1 из "Поиск в глубину" ) - каждое обратное ребро относительно этого дерева является продольным. Это означает, что из двух вершин такого ребра одна является предком другой в DFS-дереве. Каждое такое ребро в процессе поиска в глубину встретится дважды - один раз, когда активной вершиной будет предок, другой раз, когда ею будет потомок. В этом последнем случае искомый фундаментальный цикл состоит из рассматриваемого обратного ребра и участка пути в DFS-дереве, соединяющего эти две вершины. Но этот путь так или иначе запоминается в процессе обхода в глубину, так как он необходим для последующего возвращения. Если, например, для хранения открытых вершин используется стек, то вершины этого пути находятся в верхней части стека. В любом случае этот путь легко доступен и цикл находится без труда. Запишем процедуру построения фундаментальных циклов на базе алгоритма поиска в глубину с построением DFS-дерева. Переменная - счетчик циклов, - последовательность (список) вершин, составляющих цикл с номером .
Алгоритм 1. Построение базы циклов.
- пометить все вершины как новые
- for do if новая then
Procedure
- открыть вершину
- while открытая do
- if имеется неисследованное ребро
- then пометить ребро как исследованное
- if вершина новая
- then открыть вершину
- else
- else закрыть вершину
Procedure
- Создать список из одного элемента
- repeat
- добавить к списку
- until
Хотя сам поиск в глубину выполняется за линейное от числа вершин и ребер время, решающее влияние на трудоемкость этого алгоритма оказывает необходимость запоминать встречающиеся циклы. Подсчитаем суммарную длину этих циклов для полного графа с вершинами. DFS-дерево в этом случае является простым путем, относительно него будет цикла длины , цикла длины цикл длины . Сумма длин всех фундаментальных циклов будет равна
Таким образом, на некоторых графах число операций этого алгоритма будет величиной порядка .