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

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

шаблон <typename G>

класс FindPath: общественность DFS <G> 

частный:

Путь VertexList; цель Вершины; b o o l делают ne;

защищенный:

пустота startVisit (константа Vertex& v); пустота finishVisit (константа Vertex& v); bool isDone () константа;

общественность:

// // // // // // // // //

найдите путь местными данными DFS путем, целевая вершина - найденная цель? отвергнутые функции посещают вершину, законченную с вершиной, сделанной уже?

FindPath (константа G& g): DFS <G> (g) //конструктор

//найдите путь от s до t

Оператор VertexList () (константа Vertex& s, константа Vertex& t);

;

Кодовый Фрагмент 13.10: FindPath класса, который расширяет класс DFS, чтобы вычислить путь из исходной вершины s, чтобы предназначаться для вершины t.

Функция пути представлена в Кодовом Фрагменте 13.11. После инициализации поиска и членских данных, это призывает рекурсивное пересечение DFS. После завершения возвращен список вершины, содержащий путь.

/* FindPath G:: */ //находят путь от s до t

Оператор VertexList () (константа Vertex& s, константа Vertex& t)

инициализируйте (); path.clear (); предназначайтесь = t; сделанный = ложный; dfsTraversal (s); обратный путь;

//инициализируйте DFS//, очищаются, путь//экономят цель

//пересечение, начинающееся в s//, возвращает путь

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

путь от s до t.

Подход должен выступить, глубина сначала ищут пересечение, начинающееся в исходной вершине. Мы поддерживаем путь краев открытия от источника до текущей вершины. Когда мы сталкиваемся с неизведанной вершиной, мы добавляем его до конца пути. Это обработано, отвергнув функцию startVisit. Когда мы заканчиваем обрабатывать вершину, мы удаляем ее из пути. Это сделано, отвергнув функцию finishVisit. Таким образом, в любом пункте, список вершины состоит из вершин вдоль пути дерева DFS от источника до текущей вершины. Пересечение закончено, когда с целевой вершиной сталкиваются. Это сделано, установив булев сделанный flag. Мы отвергаем функцию isDone, чтобы проверить на это событие. Эти отвергнутые функции показывают в Кодовом Фрагменте 13.12.

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

/* FindPath G:: */

пустота startVisit (константа Vertex& v)

path.push назад (v);

если (v == цель) сделанный = верный;

/* FindPath G:: */

пустота finishVisit (константа Vertex& v)

если (! сделанный) path.pop назад ();

/* FindPath G:: */

bool isDone () константа

возвращаются сделанный;

//вершина посещения

//вставка в путь//достигла целевой вершины

//законченный с вершиной

//удалить последнюю вершину//сделанный уже?

619

Кодовый Фрагмент 13.12: отвергнутые функции, используемые классом FindPath.

Наш заключительный пример - класс FindCycle, который находит цикл в связанном компоненте данной вершины начала s. (Цикл не должен содержать s.) Класс дан в Кодовом Фрагменте 13.13. Его членские данные состоят из списка края, содержащего цикл (цикл), первая вершина цикла (cycleStart) и логическая переменная, которая указывает, является ли поиск завершенным (сделанный). Функция цикла дана, перегрузив» ()» оператор и пройдя в вершине начала s. Это возвращает цикл как список краев. Если нет такого цикла, пустой список возвращен.

шаблон <typename G>

класс FindCycle: общественность DFS <G> 

частный: //местные данные

Цикл EdgeList; //Вершина хранения цикла cycleStart; //начало цикла b o o l делают ne; //цикл обнаружен?

защищенный: //отвергнутые функции

пустота traverseDiscovery (константа Edge& e, константа Vertex& от); пустота traverseBack (константа Edge& e, константа Vertex& от);

пустота finishVisit (константа Vertex& v); bool isDone () константа;

общественность:

FindCycle (константа G& g): DFS <G> (g)

Оператор EdgeList () (константа Vertex& s);

;

//законченный с вершиной//сделанный уже?

//конструктор//находит цикл

Кодовый Фрагмент 13.13: FindCycle класса, который расширяет класс DFS в заказе

вычислить цикл в связанном компоненте данной вершины начала s.

Функция нахождения цикла представлена в Кодовом Фрагменте 13.14. После начальной буквы - izing ищут и членские данные, она призывает рекурсивное пересечение DFS. Поскольку мы показываем ниже после завершения, список края состоит из начального префикса краев от s до вершины cycleStart, сопровождаемый краями цикла. Мы пересекаем края цикла и удаляем каждого до достижения первого края, который является инцидентом к cycleStart.