Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Обход ориентированных графов




При решении многих задач, связанных с ориентированными графами, необходим эффективный метод систематического обхода вершин и дуг орграфов. Таким методом является поиск в глубину – обобщение метода обхода дерева в прямом порядке.

Предположим, что есть ориентированный граф G, в котором первоначально все вершины помечены меткой unvisied (не посещались). Поиск в глубину начинается с выбора начальной вершины v графа G, для этой вершины метка unvisited меняется на метку visited (посещалась). Затем для каждой вершины, смежной с вершиной v и которая не посещалась ранее, рекурсивно применяется поиск в глубину. Когда все вершины, которые можно достичь из вершины v, будут посещены, поиск заканчивается. Если некоторые вершины не были посещены, то выбирается одна из них и поиск повторяется. Этот процесс продолжается до тех пор, пока обходом не будут охвачены все вершины орграфа G.

Этот метод обхода вершин орграфа называется поиском в глубину, поскольку поиск непосещенных вершин идет в направлении вперед (вглубь) до тех пор, пока это возможно. Например, пусть х – последняя посещенная вершина. Для продолжения процесса выбирается какая-либо нерассмотренная дуга выходящая из вершины х. Если вершина y ранее посещалась, то она помечается меткой visited и поиск начинается заново от вершины y. После того, как пройдены все пути, начинающиеся в вершине y, происходит возврат в вершину х, т.е. туда, откуда впервые была достигнута вершина y. Затем продолжается выбор нерассмотренных дуг, исходящих из вершины x, пока не будут исчерпаны все такие дуги.

Для представления вершин, смежных с вершиной v, используется список смежности L[v], а для определения вершин, которые ранее посещались, – массив mark, чьи элементы будут принимать только два значения: visited и unvisited. Чтобы применить процедуру поиска в глубину к графу, состоящему из n вершин, надо сначала присвоить всем элементам массива mark значения unvisited, затем начать поиск в глубину для каждой вершины, помеченной как unvisited. Это можно реализовать с помощью следующего кода:

Эскиз рекурсивной процедуры dfs, реализующей метод поиска в глубину, представлен ниже. Здесь изменяются только значения массива mark.

 

 

Рассмотрим метод поиска в глубину для графа, изображенного на рис. 48., начиная с вершины А.

 

Рис. 48 – Ориентированный граф

 

Алгоритм помечает вершину А как visited и выбирает вершину В из списка смежности вершины А. Поскольку вершина В помечена как unvisited, обход графа продолжается вызовом процедуры dfs(B). Затем процедура помечает вершину В как visited и выбирает первую вершину из списка смежности вершины В. В зависимости от порядка представления вершин в списке смежности следующей рассматриваемой вершиной может быть или вершина С, или вершина D. Предположим, что вершина С предшествует вершине D. Тогда происходит вызов dfs(С). В списке смежности вершины С присутствует только вершина А, но она уже посещалась ранее. Поскольку все вершины в списке смежности вершины С исчерпаны, то поиск возвращается в вершину В, откуда процесс поиска продолжается вызовом процедуры dfs(D). Вершины А и С из списка смежности вершины D уже посещались ранее, поэтому поиск возвращается сначала в вершину В, а затем в вершину А. На этом первоначальный вызов dfs(А) завершен, но орграф имеет вершины, которые еще не посещались: E, F, G. Для продолжения обхода вершин графа выполняется вызов dfs(E).






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных