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

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

//рекурсивное пересечение

//посетите v и отметьте посещаемый

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

если (! isVisited (e))

посещение (e);

Вершина w = e.opposite (v);

// // //

край открытия? отметьте, который посещают, получают противостоящую вершину

если (! isVisited (w))

traverseDiscovery (e, v);

если (! isDone ()) dfsTraversal (w);

// // //

неизведанный? давайте узнаем, что это продолжает пересечение

еще traverseBack (e, v);

//спинка процесса

если (! isDone ()) finishVisit (v);

//законченный с v

Кодовый Фрагмент 13.7: функция dfsTraversal, который осуществляет универсальный DFS

пересечение.

Используя образец метода шаблона для DFS

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

наше универсальное пересечение DFS. Чтобы сделать что-либо интересное, мы должны расширить DFS и пересмотреть некоторые его вспомогательные функции. Это - пример образца метода шаблона (см. Раздел 7.3.7), на котором универсальный механизм вычисления специализирован, обеспечив конкретные внедрения определенных универсальных шагов.

Наш первый пример - Компоненты класса, который считает число довода «против» - nected компоненты графа. Класс представлен в Кодовом Фрагменте 13.8. Заметьте, что этот класс получен из DFS, и так наследует своих участников. Класс Компонентов содержит единственного участника данных, который является прилавком nComponents числа связанных компонентов, с которыми это столкнулось.

шаблон <typename G>

Компоненты класса: общественность DFS <G> 

частный:

интервал nComponents; общественность:

Компоненты (константа G& g): DFS <G> (g)

международный оператор () ();

;

//компоненты количества

//цифра компонентов

//конструктор//считает компоненты

Кодовый Фрагмент 13.8: Компоненты класса, который расширяет класс DFS, чтобы посчитать число компонентов графа, перегрузив» ()» оператор.

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

Класс предоставляет простому конструктору, который просто призывает конструктора

для базового класса, передавая его граф. Чтобы определить составляющую функцию подсчета, мы перегрузили» ()» оператор. Эта перегруженная функция возвращает число компонентов. Это означает, что, учитывая граф G, мы можем объявить объекты Компонентов и призвать его следующим образом:

Компоненты компонентов (G); //объявляют объект Компонентов

интервал nc = компоненты (); //вычисляют число компонентов

Функцию, которая вычисляет число связанных компонентов, показывают в Кодовом Фрагменте 13.9. После инициализации (призывая участника DFS функционируют ini-tialize и устанавливая компонент в противоречии с нолем), это повторяет через вершины графа. Каждый раз, когда это находит непосещаемую вершину, это призывает пересечение DFS на эту вершину и увеличивает составляющий прилавок. Пересечение DFS возвращает только AF - трижды, каждую вершину этого связанного компонента посетили (Суждение 13.12). Поэтому, любая непосещаемая вершина должна лечь в различном компоненте. Повторяя это на каждой непосещаемой вершине, в конечном счете каждый связанный компонент будет найден и посчитан.

/* Компоненты G:: */

международный оператор () ()

инициализируйте ();

nComponents = 0; VertexList verts = graph.vertices ();

//компоненты количества

//инициализируйте DFS//init количество вершины

для (объем плазмы VertexItor = verts.begin (); объем плазмы! = verts.end (); ++ объем плазмы)

если (! isVisited (*pv)) //еще посещаемый?

dfsTraversal (*pv); //посещение

nComponents ++; //еще один компонент

возвратите nComponents;

Кодовый Фрагмент 13.9: перегруженное () оператор для Компонентов класса, который

вычисляет число связанных компонентов графа.

Наш следующий пример - класс FindPath, который находит путь между данной исходной вершиной и целевой вершиной. Класс представлен в Кодовом Фрагменте 13.10. Членские данные класса состоят из списка вершины, формирующего путь (путь), целевая вершина (цель) и логическая переменная, указывающая, является ли поиск завершенным (сделанный). Как прежде, основная функция нахождения пути была определена, перегрузив» ()» оператор. Этой функции дают исходную вершину s и целевую вершину t, и возвращает путь как список вершин от s до t. Если нет такого пути, пустой список возвращен. Также как прежде, чтобы использовать этот класс, мы сначала создаем новый объект FindPath, говорим findPath, и затем мы призываем findPath (s, t), для желаемой исходной вершины s и предназначаемся для вершины t.