
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.