Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и алгоритмы / графы_задачи1.doc
Скачиваний:
98
Добавлен:
23.02.2015
Размер:
1.58 Mб
Скачать
      1. Алгоритм поиска в глубину на неориентированном графе

Вход. Граф G = (V, E), представленный списками смежности узлов: L(v) v V.

Выход. Разбиение множества E на два подмножества: древесных ребер T и обратных ребер B.

Метод. Рекурсивная процедура Поиск(v) добавляет к T ребро (v, w), если узел w был впервые достигнут во время прохождения по ребру из v. Все узлы вначале помечены как «новые».

  1. T = .

  2. Выбираем произвольный узел v V. Помечаем его как “новый”.

  3. Пока существует v V, помеченный как “новый”, выполняем процедуру Поиск(v).

Процедура Поиск(v):

  1. Пометить узел v как «старый».

  2. Для любого узла w L(v) делать:

  3. Если узел w – «новый», то

  4. Добавить ребро (v, w) к T

  5. Поиск(w)

Все ребра множества E, не попавшие в T, относятся к множеству B.

Пример работы алгоритма поиска в глубину на неориентированном графе представлен на рис. 17.

Обычно ребра, входящие в T, изображают сплошными линиями, а ребра из B – пунктирными. Корень (то есть вершину, выбранную за начало поиска) рисуют сверху, а сыновей располагают слева направо в порядке их прохождения (рис. 17).

а) б)

Рис. 17. Неориентированный граф (а) и глубинный остовный лес для него (б)

      1. Поиск в глубину в ориентированном графе

Рассмотренный алгоритм поиска можно использовать, чтобы находить ориентированный остовный лес для ориентированного графа G = (V, E), если определить список L(v) узлов, «смежных» с узлом v как список узлов, которые являются концами ребер с началом в узле v. То есть, L(v) = {w: (v, w) E}. Пример представлен на рис. 18.

В процессе поиска в глубину на ориентированном графе в дополнение к древесным ребрам возникает еще три типа ребер. Это обратные ребра (например, (v3, v1)), поперечные справа налево (например, (v4, v3)) и прямые ребра (например, (v1, v4)).

Но никакое ребро не идет из узла с меньшим номером, присвоенным в процессе поиска в глубину, в узел с большим номером, если только последнее не является потомком первого. Это не случайно.

Пусть (v, w) – ребро, и узел v был впервые посещен до w (то есть v < w). Каждый узел, которому присваивается номер в период между началом и концом процедуры Поиск(v), становятся потомком узла v. Но узел w должен получить свой номер, когда рассматривается ребро (v, w), если только он уже не получил номер раньше. Если w получает номер, когда рассматривается ребро (v, w), то (v, w) становится древесным ребром, иначе – прямым. Таким образом, не может быть такого поперечного ребра (v, w), что v < w.

а) б)

Рис. 18. Ориентированный граф (а) и ориентированный глубинный остовный лес для него (б)

Поиск в глубину в ориентированном графе G = (V, E) разбивает множество его ребер на 4 класса:

  1. Древесные ребра, идущие к новым узлам в процессе поиска.

  2. Прямые ребра, идущие от предков к подлинным потомкам, но не являющиеся древесными ребрами.

  3. Обратные ребра, идущие от потомков к предкам (возможно из узла в себя).

  4. Поперечные ребра, соединяющие узлы, которые не являются ни предками, ни потомками друг друга.