Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая.DOC
Скачиваний:
31
Добавлен:
01.05.2014
Размер:
317.44 Кб
Скачать

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

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

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

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

пометить все вершины как новые

for do if новая then

Procedure

открыть вершину

while открытая do

if имеется неисследованное ребро

then пометить ребро как исследованное

if вершина новая

then открыть вершину

else

else закрыть вершину

Procedure

Создать список из одного элемента

repeat

добавить к списку

until

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

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

Рационализация

Приведенный алгоритм нетрудно модифицировать так, что он будет строить базу циклов с суммарной длиной, ограниченной сверху величиной порядка (и такой же будет оценка трудоемкости алгоритма). Рассмотрим в графе произвольную вершину и пусть - все ее предки в DFS-дереве, соединенные с обратными ребрами. Положим также . Обозначим через для путь в DFS-дереве, соединяющий и . Описанный выше алгоритм выдает циклы вида , . Рассмотрим циклы , . Так как , то совокупность всех таких циклов также образует базу циклов графа. Назовем эту систему циклов сокращенной. Алгоритм легко модифицировать так, чтобы вместо циклов выдавались циклы - нужно только после обнаружения обратного ребра, ведущего от предка к потомку (строка 11), выписать вершины, содержащиеся в стеке, начиная с и заканчивая следующей вершиной, смежной с . Для эффективной проверки этой смежности удобно использовать матрицу смежности.

Оценим суммарную длину циклов сокращенной системы. Предположим, что граф имеет вершин и ребер. Каждое обратное ребро принадлежит не более чем двум циклам сокращенной системы. Значит, суммарный вклад обратных ребер в не превосходит .

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

Блок-схема алгоритма

Процедура Tsikl

d:= d+1

stek[d]:= v

WGN[v] := num

num := num + 1

Соседние файлы в предмете Дискретная математика