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

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

13.4 Направленные Графы

В этой секции мы рассматриваем проблемы, которые являются определенными для направленных графов. Вспомните, что направленный граф (диграф), граф, края которого все направлены.

Методы, имеющие дело с направленными краями

Чтобы позволить некоторым или всем краям в графе быть направленными, мы добавляем следование -

луг функционирует к графу ADT.

e.isDirected (): Тест, направлен ли край e.

e.origin (): Возвратите вершину происхождения края e.

e.dest (): Возвратите вершину назначения края e. insertDirectedEdge (v, w, x): Вставьте и возвратите новый направленный край с происхождением v и

место назначения w и элемент хранения x.

Кроме того, если край e направлен, функция e.endVertices () должна возвратить список вершины

чей первый элемент - происхождение e, и чей второй элемент - место назначения e. Продолжительность для функций e.isDirected (), e.origin (), и e.dest () должна быть O (1), и продолжительность функции insertDirectedEdge (v, w, x) должна соответствовать продолжительности ненаправленной вставки края.

Достижимость

Одна из наиболее основных проблем с направленными графами - понятие reacha-

bility, который имеет дело с определением, какие вершины могут быть достигнуты путем в направленном графе. Пересечение в направленном графе всегда продвигается направленные пути, то есть, пути, где все края пересечены согласно их соответствующему direc-tions. Данные вершины u и v диграфа G, мы говорим, что u достигает v v достижим от u), если у G есть направленный путь от u до v. Мы также говорим, что вершина v достигает края (w, z), если v достигает вершины происхождения w края.

Диграф G сильно связан, если для каких-либо двух вершин u и v G, u достигает v, и v достигает, США предписали, чтобы цикл G был циклом, где все края пересечены согласно их соответствующим направлениям. (Обратите внимание на то, что у G может быть цикл, состоящий из двух краев с противоположным направлением между той же самой парой вершин.) Диграф G нециклический, если у него нет направленных циклов. (См. рисунок 13.8 для некоторых примеров.)

Переходное закрытие диграфа G - диграф G* таким образом, что вершины G* совпадают с вершинами G, и у G* есть край (u, v), каждый раз, когда у G есть направленный путь от u до v. Таким образом, мы определяем G*, начиная с диграфа G и добавляя на дополнительном краю (u, v) для каждого u и v, таким образом, что v достижим от u (и уже нет края (u, v) в G).

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

(a) (b)

(c) (d)

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

Интересные проблемы, которые имеют дело с достижимостью в диграфе G, включают следующего - мычание:

• Данные вершины u и v, определите, достигает ли u v • Найдите все вершины G, которые достижимы от данной вершины s • Определите, связан ли G сильно • Определите, является ли G нециклическим • Вычислите переходное закрытие G* G

В остатке от этой секции мы исследуем некоторые эффективные алгоритмы для solv-

луг эти проблемы.