Неориентированный граф -- набор точек (вершин), некоторые из которых соединены линиями (ребрами). Неориентированный граф можно считать частным случаем ориентированного графа, в котором для каждой стрелки есть обратная.
Связной компонентой вершины i называется множество всех тех вершин, в которые можно попасть из i, идя по ребрам графа. (Поскольку граф неориентированный, отношение << j принадлежит связной компоненте i>> является отношением эквивалентности.)
7.4.5. Дан неориентированный граф (для каждой вершины указано
число соседей и массив номеров соседей, как в
задаче о топологической сортировке).
Составить алгоритм, который по заданному i печатает
все вершины связной компоненты i по одному разу (и только
их). Число действий не должно превосходить
(общее
число вершин и ребер в связной компоненте).
procedure add (i:1..n); begin | if вершина i закрашена then begin | | ничего делать не надо | end else begin | | закрасить i (напечатать и пометить как закрашенную) | | для всех j, соседних с i | | | add(j); | | end; | end; end;Докажем, что эта процедура действует правильно (в предположении, что рекурсивные вызовы работают правильно). В самом деле, ничего, кроме связной компоненты незакрашенного графа, она закрасить не может. Проверим, что вся она будет закрашена. Пусть k -- вершина, доступная из вершины i по пути
Чтобы установить конечность глубины рекурсии, заметим, что на каждом уровне рекурсии число незакрашенных вершин уменьшается хотя бы на 1.
Оценим число действий. Каждая вершина закрашивается не
более одного раза -- при первым вызове add(i) с данным
i. Все последующие вызовы происходят при закрашивании
соседей -- количество таких вызовов не больше числа соседей
-- и сводятся к проверке того, что вершина i уже закрашена.
Первый же вызов состоит в просмотре всех соседей и рекурсивных
вызовах add(j) для всех них. Таким образом, общее число
действий, связанных с вершиной i, не превосходит константы,
умноженной на число ее соседей. Отсюда и вытекает требуемая
оценка.
7.4.6. Решить ту же задачу для ориентированного графа (напечатать
все вершины, доступные из данной по стрелкам; граф может
содержать циклы).