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

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

Последовательность класса: общественный Объект

частный:

стоимость последовательности; общественность:

Последовательность (натягивают v =»»): стоимость (v)

натяните getValue () константа

возвращаемое значение;

;

Кодовый Фрагмент 13.17: Конкретные подклассы, Целое число и Последовательность, для хранения единственного целого числа и единственной последовательности, соответственно.

международный Объект:: intValue () бросок константы (BadCast)

//бросок к Целому числу

Целое число константы* p = динамический бросок <Целое число константы*> (это); если (p == ПУСТОЙ УКАЗАТЕЛЬ) бросают BadCast («Незаконная попытка бросить к Целому числу»);

возвратите p-> getValue ();

Кодовый Фрагмент 13.18: членская функция intValue Объекта класса, который пере -

поворачивает основное целочисленное значение.

Чтобы показать, как применить этот полезный полиморфный объект, давайте возвратимся к нашему более раннему примеру. Вспомните, что v - вершина, на которую мы хотим назначить два признака, имя и возраст. Мы создаем новые предприятия, первую из Последовательности типа и второе из Целого числа типа. Мы инициализируем каждого с требуемым значением. Поскольку это подклассы Объекта, мы можем сохранить эти предприятия как декораторы как показано в Кодовом Фрагменте 13.19.

Декоратор v; v.set («имя», новая Последовательность («Боб»)); v.set («возраст», новое Целое число (23));//...

натяните n = v.get («имя»)-> stringValue ();

интервал = v.get («возраст»)-> intValue ();

//decorable объект//название магазина как «Боб»//хранит возраст как 23

//n = «Боб»//= 23

Кодовый Фрагмент 13.19: использование В качестве примера Объекта с полиморфным словарем.

Когда мы извлекаем ценности этих декораторов, мы используем факт, что мы знаем, что имя - последовательность, и возраст - целое число. Таким образом мы можем применить соответствующую функцию, stringValue или intValue, чтобы извлечь желаемое значение атрибута. Этот пример показывает полноценность полиморфного поведения объектов в C ++.

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

13.3.5 Поиск типа «сначала вширь»

В этой секции мы рассматриваем различный пересекающийся алгоритм, названный в ширину

поиск (BFS). Как DFS, BFS пересекает связанный компонент графа, и при этом это определяет полезное дерево охвата. BFS менее «предприимчив», чем DFS, как бы то ни было. Вместо того, чтобы блуждать граф, BFS продолжается в раундах и подразделяет вершины на уровни. BFS может также считаться пересечением, используя последовательность и краску с BFS разворачивающий последовательности более консервативным способом.

BFS начинается в вершине s, который является на уровне 0 и определяет «якорь» для нашей последовательности. В первом раунде мы освобождаем последовательность длина одного края, и мы посещаем все вершины, которых мы можем достигнуть, не разворачивая последовательность немного дальше. В этом случае мы посещаем, и краска, как «посещается», вершины, смежные с вершиной начала s - эти вершины помещены на уровень 1. Во втором раунде мы разворачиваем последовательность длина двух краев, и мы посещаем все новые вершины, которых мы можем достигнуть, не разворачивая нашу последовательность немного дальше. Эти новые вершины, которые смежны с вершинами уровня 1 и не ранее назначенные на уровень, помещены на уровень 2 и так далее. Пересечение BFS заканчивается, когда каждую вершину посетили.

Псевдокодекс для BFS, начинающегося в вершине s, показывают в Кодовом Фрагменте 13.20. Мы используем вспомогательное пространство, чтобы маркировать края, отметка посещаемые вершины и коллекции магазина связанный с уровнями. Таким образом, коллекции, L0, L1, L2, и так далее, хранят вершины, которые находятся на уровне 0, уровне 1, уровне 2, и так далее. Эти коллекции могли, например, быть осуществлены как очереди. Они также позволяют BFS быть нерекурсивным. Алгоритм BFS (s):

инициализируйте коллекцию L0, чтобы содержать вершину s

i¬0

в то время как Ли не пуст, делают

создайте коллекцию, которую делают Li+1, чтобы первоначально быть пустыми для всех вершин v в Ли

для всех краев e в v.incidentEdges () делают

если край e неизведан тогда

w¬ e.opposite (v)

если вершина w неизведанна тогда

маркируйте e как w вставки края открытия в Li+1

еще

маркируйте e как взаимный край

я¬ i+1 Кодовый Фрагмент 13.20: алгоритм BFS.

Мы иллюстрируем пересечение BFS в рисунке 13.7.