Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

628 Глава 13. Алгоритмы графа

13.4.1 Пересечение диграфа

Как с ненаправленными графами, мы можем исследовать диграф систематическим способом с денатуратом - передозировки, сродни алгоритмам глубины сначала ищет (DFS) и поиска типа «сначала вширь» (BFS), определенным ранее для ненаправленных графов (Разделы 13.3.1 и 13.3.5). Такие порции explo-могут использоваться, например, чтобы ответить на вопросы достижимости. Направленная глубина сначала ищет, и методы поиска типа «сначала вширь», которые мы развиваем в этой секции для выполнения таких исследований, очень подобны их ненаправленным коллегам. Фактически, единственная реальная разница - то, что направленная глубина сначала ищет, и методы поиска типа «сначала вширь» только пересекают края согласно своим соответствующим направлениям.

Направленная версия DFS, начинающегося в вершине v, может быть описана пере - рукописный алгоритм в Кодовом Фрагменте 13.21. (См. рисунок 13.9.)

Алгоритм DirectedDFS (v):

Вершина Марка v, как посещается. для каждого коммуникабельного края (v, w) v делают

если вершину w не посетили тогда

Рекурсивно назовите DirectedDFS (w).

Кодовый Фрагмент 13.21: алгоритм DirectedDFS.

(a) (b)

Рисунок 13.9: DFS в диграфе, начинающемся в вершине BOS: (a) промежуточный шаг, где, впервые, уже посещенная вершина (DFW) достигнута; (b) законченный DFS. Края дерева показывают с чисто синими линиями, спинку показывают с расплющенными синими линиями, и передовые и взаимные края показывают с расплющенным черным пятном. Заказ, в котором посещают вершины, обозначен этикеткой рядом с каждой вершиной. Край (ПОРЯДОК, DFW) является спинкой, но (DFW, ПОРЯДОК) передовой край. Край (BOS, SFO) является передовым краем, и (SFO, СЛАБЫЙ) взаимный край.

13.4. Направленные графы 629

DFS на диграфе G делит края G, достижимого от старта

вершина в края дерева или края открытия, которые принуждают нас обнаруживать новую вершину и края недерева, которые берут нас к ранее посещаемой вершине. Края дерева формируют дерево, внедренное в стартовой вершине, названный глубиной сначала ищут дерево. Есть три вида краев недерева:

Спинка, которая соединяет вершину с предком в дереве DFS • Отправьте края, которые соединяют вершину с потомком в дереве DFS • Взаимные края, которые соединяют вершину с вершиной, которая не является ни один ее предком

ни его потомок

Вернитесь к рисунку 13.9 (b), чтобы видеть пример каждого типа края недерева.

Суждение 13.16: Позвольте G быть диграфом. Глубина сначала ищет на G, начинающемся в вершине s, посещает все вершины G, которые достижимы от s. Кроме того, дерево DFS содержит направленные пути от s до каждой вершины, достижимой от s.

Оправдание: Позвольте Против быть подмножеством вершин G, который посещает DFS, начинающийся в вершине s. Мы хотим показать, что Против содержит s, и каждая вершина, достижимая от s, принадлежит Против Предположим теперь ради противоречия, что есть вершина w достижима от s, который не находится в Против, Рассматривают направленный путь от s до w и позволяют (u, v) быть первым краем на таком пути, берущем нас из Против, то есть, u находится в Против, но v не находится в Против того, Когда DFS достигает u, это исследует все коммуникабельные края u, и таким образом должно также достигнуть вершины v через край (u, v). Следовательно, v должен быть в Против, и мы получили противоречие. Поэтому, Против должен содержать каждую вершину, достижимую от s.

Анализ продолжительности направленного метода DFS походит на это

для его ненаправленного коллеги. В частности рекурсивный звонок сделан для каждой вершины точно однажды, и каждый край пересечен точно однажды (от его происхождения). Следовательно, если не уточнено вершины и ms края достижимы от вершины s, направленный DFS, начинающийся при пробегах s в O (не уточнено + ms) время, если диграф представлен со структурой данных, которая поддерживает постоянно-разовую вершину и методы края. Структура списка смежности удовлетворяет это требование, например.

Суждением 13.16, мы можем использовать DFS, чтобы счесть все вершины достижимыми от данной вершины, и следовательно найти переходное закрытие G. Таким образом, мы можем выполнить DFS, начинающийся с каждой вершины v G, чтобы видеть, какие вершины w достижимы от v, добавляя край (v, w) к переходному закрытию для каждого такого w. Аналогично, неоднократно пересекая диграф G с DFS, начиная в свою очередь в каждой вершине, мы можем легко проверить, связан ли G сильно. Таким образом, G сильно связан, если каждый DFS посещает все вершины G.

Таким образом мы можем немедленно получить суждение, которое следует.

630

Глава 13. Суждение Алгоритмов графа 13.17: Позвольте G быть диграфом с n вершинами и m краями. Следование - проблемы луга могут быть решены алгоритмом, который пересекает G n времена, используя DFS, управляет в O (n (n + m)) временем и использует O (n) вспомогательное пространство:

• Вычисление, для каждой вершины v G, подграф, достижимый от v

• Тестирование, связан ли G сильно • Вычисление переходного закрытия G* G

Тестирование на сильную возможность соединения

Фактически, мы можем определить, связан ли направленный граф G сильно намного быстрее

чем это, только при помощи двух глубин сначала ищет. Мы начинаем, выполняя DFS нашего направленного графа G начинающийся в произвольной вершине s. Если есть какая-либо вершина G, который не посещает этот DFS и не достижим от s, то граф сильно не связан. Так, если это сначала DFS посещает каждую вершину G, то мы полностью изменяем все края G (использующий функцию reverseDirection) и выполняем другой DFS, начинающийся в s в этом «обратном» графе. Если каждую вершину G посещает этот второй DFS, то граф сильно связан, потому что каждая из вершин, которые посещают в этом DFS, может достигнуть s. Так как этот алгоритм делает всего два пересечения DFS G, он управляет в O (n + m) временем.

Направленный поиск типа «сначала вширь»

Как с DFS, мы можем расширить поиск типа «сначала вширь» (BFS), чтобы работать на направленные графы.

Алгоритм все еще посещает уровень вершин уровнем и делит набор краев в края дерева (или края открытия). Вместе они формируют направленное дерево поиска типа «сначала вширь», внедренное в вершине начала и краях недерева. В отличие от направленного метода DFS, однако, направленный метод BFS только оставляет два вида краев недерева: спинка, которая соединяет вершину с одним из ее предков и взаимные края, которые подставляют - nect вершина к другой вершине, которая не является ни ее предком, ни ее потомком. Нет никаких передовых краев, который является фактом, который мы исследуем в осуществлении (Упражнение C-13.9).

13.4.2 Переходное закрытие

В этой секции мы исследуем альтернативную технику для вычисления переходного

закрытие диграфа. Позвольте G быть диграфом с n вершинами и m краями. Мы вычисляем переходное закрытие G в серии раундов. Мы инициализируем G0 = G. Мы также произвольно нумеруем вершины G как v1, v2..., vn. Мы тогда начинаем вычисление раундов, начиная с раунда 1. В универсальном раунде k мы строим GK диграфа, начинающийся с GK = Gk 1, и добавляем к GK направленный край (vi, v j), если диграф Gk 1 содержит обоих края (vi, vk) и (vk, v j). Таким образом мы проводим в жизнь простое правило, воплощенное в суждении, которое следует.