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

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

• traverseDiscovery (e, v): названный, когда край открытия e из v пересечен

• traverseBack (e, v): названный, когда спинка e из v пересечена • isDone (): названный, чтобы определить, закончить ли пересечение рано • finishVisit (v): названный, когда мы закончены, исследовав от v

Класс DFS представлен в Кодовом Фрагменте 13.4. Класс - templated

с типом G графа. Это начинается со многих определений типа удобства, чтобы позволить нам элементам доступа основного типа графа более кратко. Мы опустили некоторые определения типа, такие как VertexList, EdgeList, VertexItor и EdgeItor. Это сопровождается членскими данными класса, который состоит из ссылки на граф, вершину, в которой глубина первое пересечение начинается, и два объекта декоратора да и не, который будет использоваться в украшении вершин и краев. Их фактические значения не важны, пока мы можем различить один от другого.

шаблон <typename G>

класс DFS

защищенный:

typedef typename G:: Вершина Вершины; typedef typename G:: Край Края;//.. .insert другие typename короткие пути здесь

// // // //

универсальное местное положение края положения вершины типов DFS

защищенный:

константа G& граф; начало Вершины; Объект *да, *нет;

защищенный:

DFS (константа G& g); пустота инициализирует (); пустота dfsTraversal (константа Vertex& v);

виртуальная пустота startVisit (константа Vertex& v)

//членские данные//граф//вершина начала//ценности декоратора//членские функции//конструктор//инициализирует новый DFS//рекурсивная полезность DFS//, отвергнутые функции//достигли v//край открытия e

виртуальная пустота traverseDiscovery (константа Edge& e, константа Vertex& от)

/ / назад edg e e

виртуальная пустота traverseBack (константа Edge& e, константа Vertex& от)

виртуальная пустота finishVisit (константа Vertex& v) //законченный с v виртуальным bool isDone () константаложное возвращение; //fi ni s hed?

//.. .insert маркировка утилит здесь

;

Кодовый Фрагмент 13.4: универсальное внедрение глубины сначала ищет.

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

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

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

посредством призывов к сервисному посещению функций маркировки, непосещению и isVisited, которые показывают в Кодовом Фрагменте 13.5.

защищенный:

//маркировка утилит

недействительное посещение (константа Vertex& v)

v.set («посещаемый», да);

недействительное посещение (константа Edge& e)

e.set («посещаемый», да);

недействительное непосещение (константа Vertex& v)

v.set («посещаемый», нет);

недействительное непосещение (константа Edge& e)

e.set («посещаемый», нет);

bool isVisited (константа Vertex& v)

возвратите v.get, который («посещают») == да;

bool isVisited (константа Edge& e)

возвратите e.get, который («посещают») == да;

Кодовый Фрагмент 13.5: Вершина и утилиты маркировки края, которые являются частью DFS.

В Кодовом Фрагменте 13.6, мы представляем конструктора класса и функцию, которая выполняет инициализации, прежде чем пересечение DFS будет выполнено. (Мы представляем внешние членские функции, используя сжатое примечание, которое мы ввели в Разделе 9.2.7.) Конструктор инициализирует ссылку графа и ассигнует универсальные объекты да и не, которые используются утилитами маркировки. (В конечном счете они освобождены печью для сжигания отходов производства класса, которую мы опустили.) Начальная буква - ization функция отмечает все вершины и края, как «не посещается».

/* DFS G:: */ //конструктор

DFS (константа G& g)

: граф (g), да (новый Объект), нет (новый Объект)/* DFS G:: */ //инициализируют новый DFS

пустота инициализирует ()

VertexList verts = graph.vertices ();

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

непосещение (*pv); //отмечают вершины непосещаемые края EdgeList = graph.edges ();

для (EdgeItor pe = edges.begin (); pe! = edges.end (); ++ pe)

непосещение (*pe); //отмечают края, которые не посещают

Кодовый Фрагмент 13.6: конструктор класса для DFS и функции инициализации.

Рекурсивная пересекающаяся функция DFS представлена в Кодовом Фрагменте 13.7. Функция следует за той же самой структурой, как представлено в Кодовом Фрагменте 13.3. Отметьте, однако, введение требований к виртуальным функциям startVisit, isDone, tra-verseDiscovery, traverseBack, и finishVisit. Они еще не были определены, но их определения определяют конкретное поведение пересекающегося процесса.

616

/* DFS G:: */

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

startVisit (v); посещение (v);

Инцидент EdgeList = v.incidentEdges (); EdgeItor pe = incident.begin ();

в то время как (! isDone () && pe! = incident.end ())

E dg e e = * p e + +;