Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / 35-66 / 55.Множество фундаментальных циклов графа. Рекурсивный алгоритм нахождения множества фундаментальных циклов

..pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
351.05 Кб
Скачать

55.Множество фундаментальных циклов графа. Рекурсивный алгоритм нахождения множества фундаментальных циклов.

Если к стягивающему дереву <V, T> графа G = <V, E> мы добавим произвольную хорду e E\T, то возникший при этом подграф C = <V, T {e}> содержит в точности один цикл. Обозначим этот цикл через Ce. Множество C = {Ce : e E \ T} называют фундаментальным множеством циклов графа G (относительно стягивающего дерева <V, T>). Название "фундаментальное" связано с тем, что каждый цикл графа G можно достаточно просто получить из циклов множества G.

Алгоритм нахождения множества фундаментальных циклов основан на поиске в глубину и имеет структуру, аналогичную рекурсивному алгоритму нахождения стягивающего дерева.

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

Поэтому, если анализируемое нами ребро {v, и} замыкает цикл, то вершина и находится в стеке и цикл, замыкаемый ребром {v, и}, представлен группой элементов стека, начиная с v и кончая вершиной и.

1PROCEDURE цикл(У);

{переменные d, пит, СТЕК, СПИСОК, WGN - глобальные}

2BEGIN d := d+1; СТЕК[d] := v; пит := num+1; WGN[ ] := пит;

3FOR uеСПИСОК[у] DO

4IF WGN[u] = 0 THEN цикл(г)

5ELSE IF (и Ф СТЕК[d-l]) and (WGN[v] > WGN[u])

 

THEN {ребро {v, и} замыкает новый цикл}

6

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

7

СТЕК[d], СТЕК[d-l], ..., СТЕК[с], где СТЕК[с] = и

8

d := d-1 {использованная вершина v удаляется из стека}

9

END (цикл};

 

Основная

 

программа:

1

BEGIN

2

FOR veV DO WGN[r] := 0; num := 0; {инициализация}

3

d := 0; СТЕК[0] := 0; {d - число элементов в стеке}

4

FOR reV DO

5

IF WGN[r] = 0 THEN цикл(у)

6

END.

Оценим вычислительную сложность алгоритма. Отметим, что общее число шагов, не считая вычисления циклов, как и во всех алгоритмах, основанных на поиске в глубину, имеет порядок 0(n+m). К этому следует добавить суммарную длину всех циклов. Эта длина не превосходит (m-n+1), что дает общую сложность алгоритма O(nm), если отбросить вырожденный случай т=0.