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

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

Создание вершин графа Decorable

Мы можем понять образец декоратора для любого положения, позволив ему быть украшенными.

Это позволяет нам добавлять этикетки к вершинам и краям, не требуя, чтобы мы знали заранее виды этикеток, в которых мы будем нуждаться. Мы говорим, что объект decorable, если он поддерживает следующие функции:

набор (a, x): Установите ценность признака к x.

доберитесь (a): Возвратите ценность признака a.

Мы предполагаем, что Вершина и объекты Края нашего графа, ADT decorable, где ключи признака - последовательности и значения атрибута, являются указателями на универсальную Обь - ject класс, названный Объектом.

Как пример того, как это работает, предположите, что мы хотим отметить вершины, как или посещаемые или не посещаемые процедурой поиска. Чтобы осуществить это, мы могли создать два новых случая класса Объекта, и сохранить указатели на эти объекты в двух переменных, сказать да и нет. Ценности этих объектов неважны нам - все, чего мы требуем, способность различить их. Позвольте v быть объектом Декоратора типа. Чтобы указать, что v посещают, мы призываем v.set («посещаемый», да) и указать, что это не посетили, мы призываем v.set («посещаемый», нет). Чтобы проверить ценность этого декоратора, мы призываем v.get, который («посещают») и тест, чтобы видеть, является ли результат да или нет. Это показывают в следующем кодовом фрагменте.

Объект* да = новый Объект;

Объект* не = новый Объект; Декоратор v;//... v.set («посещаемый», да);//...

//ценности декоратора

//decorable объект

//установите «посещаемый» признак

если (v.get («посещаемый») == да) суд <<«v посетили»; еще суд <<«v не посетили»;

В Кодовом Фрагменте 13.2, мы представляем C ++ внедрение Декоратора класса.

Это работает, создавая карту STL (Раздел 9.1.3), ключи которого - последовательности и чьи ценности имеют тип Object*.

Декоратор класса

частный: //членские данные

станд.:: карта <последовательность, Объект*> карта; //общественность карты:

Объект* добирается (константа string& a) //получают ценность признака

возвращают карту;

недействительный набор (константа string& a, Объект* d) //стоимость набора

наносят на карту = d;

;

Кодовый Фрагмент 13.2: C ++ внедрение Декоратора класса.

13.3. Пересечения графа 613

Пересечение DFS, использующее Положения Decorable

Используя decorable положения, может быть описан полный пересекающийся алгоритм DFS

более подробно, как показано в Кодовом Фрагменте 13.3. Мы создаем признак, названный «статусом», в котором можно сделать запись информации о положении о вершинах и краях. Этот признак может взять одну из четырех возможных ценностей: непосещаемый, посещаемый, открытие, и назад. Первоначально, все значения атрибута, как предполагается, были установлены в непосещаемый. После завершения края будут маркированы как открытие или назад, в зависимости от того, являются ли они краями открытия или спинкой.

Алгоритм DFS (G, v):

Вход: граф G с decorable вершинами и краями, вершина v G, такого, что

все вершины и края были украшены ценностью статуса непосещаемых

Продукция: художественное оформление вершин связанного компонента v с

стоимость, которую посещают и краев в связанном компоненте v с открытием ценностей и назад, согласно глубине сначала, ищет пересечение G

v.set («статус», который посещают) для всех краев e в v.incidentEdges (), делают

если e.get («статус») = непосещаемый тогда

w¬ e.opposite (v)

если w.get («статус») = непосещаемый тогда

e.set («статус», обнаруженный) DFS (G, w)

еще

e.set («статус», назад)

Кодовый Фрагмент 13.3: DFS на графе с decorable краями и вершинами.

13.3.3 Универсальное внедрение DFS в C ++

В этой секции мы представляем C ++, внедрение универсальной глубины сначала ищет

пересечение посредством класса, названного DFS. Этот класс определяет рекурсивную членскую функцию, dfsTraversal (v), который выполняет пересечение DFS графа, начинающегося в вершине v. Поведение пересекающейся функции может быть специализировано для особого применения, пересмотрев много функций, которые призваны в ответ на различные события, которые возникают в пересечении.

Мы предполагаем, что вершины и края - decorable положения и используют decora-tions, чтобы определить, посетили ли вершины и края. Универсальный класс DFS содержит следующие виртуальные функции, которые могут быть отвергнуты конкретными подклассами, чтобы затронуть желаемое поведение:

• startVisit (v): названный в начале посещения v

614