1. Алгоритм определения циклов
Пусть на плоскости задано некоторое множество вершин X и множество U соединяющих их дуг. Графом называют бинарное отношение множества X и множеств U: G =(X; U), или, иначе f: X → Y. Здесь f —отображение инциденции.
Рис. 2
Граф называется ориентированным, если указано направление дуг и неориентированным, если такое направление не указано. Примером неориентированного графа является карта дорог.
Ребро иj называется инцидентным вершине хi, если оно выходит или входит в вершину.
Путем в графе G называется такая последовательность дуг, в которой конец каждой последующей дуги совпадает с началом предыдущей.
Ребро — отрезок, соединяющий две вершины, цепь — последовательность ребер.
Цикл — конечная цепь, у которой начальная и конечная вершина совпадают.
Граф называется связанным, если любые его две вершины можно соединить цепью.
Дерево это конечный, связный, не ориентированный граф, не имеющий циклов.
Матрицей смежности S порядка п называется матрица, состоящая из чисел Sij, равных сумме чисел ориентированных ребер, идущих из хi в хj (или чисел неориентированных ребер, соединяющих эти вершины). Если дуга отсутствует, то Sij = 0.
Наличие циклов в графе можно определить с помощью эффективного и простого алгоритма. Алгоритм может быть реализован как для матричного, так и для спискового способа представления графа. В случае неориентированного графа его ребра считаются двунаправленными.
Принцип выделения циклов следующий. Если вершина имеет только входные или только выходные дуги, то она явно не входит ни в один цикл. Можно удалить все такие вершины из графа вместе со связанными с ними дугами. В результате появятся новые вершины, имеющие только входные или только выходные дуги. Они также удаляются. Итерации повторяются до тех пор, пока граф не перестанет изменяться.
Отсутствие изменений свидетельствует об отсутствии циклов, если все вершины были удалены. Все оставшиеся вершины обязательно принадлежат циклам (рис. 1).
Сформулируем алгоритм, используя матрицу смежности:
var
M: TadjacencyMatrix;
repeat
for i := 1 to n begin
if строка M(i ,*) = 0 then обнулить столбец M(*, i);
if столбец M(*, i) = 0 then обнулить строку M(i ,*);
end;
until M не изменилась;
if M нулевая then граф ациклический
else граф содержит циклы;
Достоинством данного алгоритма является то, что происходит одновременное определение цикличности или ацикличности графа и исключение дуг, не входящих в циклы. После завершения алгоритма остается матрица смежности, соответствующая подграфу, содержащему все циклы исходного графа.
В худшем случае этот алгоритм дает временную сложность Tmax(n), пропорциональную O(n3).
Рисунок 1 – Определение циклов