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

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

/* FindCycle G:: */ //находят цикл

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

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

цикл = EdgeList (); сделанный = ложный; dfsTraversal (s);

// // //

инициализируйте DFS, инициализируют участников, делают поиск

если (! cycle.empty () && s! = cycleStart)

EdgeItor pe = cycle.begin ();

//

найденный циклом?

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

если ((pe ++)-> isIncidentOn (cycleStart)) разрыв;

cycle.erase (cycle.begin (), pe);

//поиск префикса//длится край префикса?

//удалите префикс

возвратите цикл;

//возвратите цикл

Кодовый Фрагмент 13.14: функция класса FindCycle, который вычисляет цикл.

Наш подход основан на выполнении пересечения DFS и хранении краев открытия в списке края. Как показано в Кодовом Фрагменте 13.15, в traverseDiscovery, мы выдвигаем текущий край на список края. В функции traverseBack, когда мы сталкиваемся со спинкой, мы заканчиваем цикл и устанавливаем булев flag, сделанный в истинный указывать, что цикл был обнаружен. Мы также устанавливаем переменную cycleStart в вершину на противоположной стороне спинки. Отступая из вершины, как показано в функции finishVisit, мы суем новый край от списка края, если цикл не был найден.

/* FindCycle G:: */ //край открытия e

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

если (! сделанный) cycle.push назад (e); //добавляют край, чтобы перечислить

/* FindCycle G:: */ //назад edg e e

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

если (! сделанный)

сделанный = верный;

cycle.push назад (e); cycleStart = e.opposite (от);

//никакой цикл уже?//цикл, теперь обнаруженный//, вставляет заключительный край//, экономят стартовую вершину

/* FindCycle G:: */ //законченный с вершиной

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

если (! cycle.empty () &&! сделанный)

cycle.pop назад ();

/* FindCycle G:: */

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

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

//не создание цикла?//удаляют этот край

//сделанный уже?

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

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

13.3.4 Полиморфные объекты и декоратор оценивают

Программирование художественных оформлений, которые поддерживают многократные типы стоимости, излагает интересное

проблема в C ++. Чтобы иллюстрировать проблему, давайте предположим, что мы хотим осуществить алгоритм, который связывает последовательность с именем людей и целым числом, содержащим текущий возраст людей с каждой вершиной социальной сети. Учитывая вершину v, мы хотели бы связать его с двумя декораторами, один для имени и один для возраста.

v.set («имя», «Боб»); v.set («возраст», 23);

C ++ сильная проверка типа не позволяет это, однако, так как мы должны определить тип значения атрибута, или последовательность или интервал, но не оба.

Чтобы решить эту проблему, мы создаем полиморфный тип стоимости (Раздел 2.2.2). Мы определяем универсальный класс, названный Объектом, и мы получаем подклассы из этого. Каждый подкласс специализирован, чтобы сохранить единственную ценность особого типа, например, bool, случайной работы, интервала или последовательности. Чтобы сделать это более конкретным, давайте рассмотрим простой пример всего для двух типов, интервала и последовательности. Это прямо, чтобы обобщить это к другим типам, даже определенным пользователями типам.

Наш универсальный класс Объекта показывают в Кодовом Фрагменте 13.16. У этого нет участников данных, но это поддерживает две членских функции, intValue и stringValue. Первая прибыль стоимость от подкласса целого числа и второй прибыли стоимость от подкласса последовательности. Попытка извлечь стоимость последовательности из объекта целого числа или целочисленное значение от аргумента последовательности приводит к бросаемому исключению.

Объект класса

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

интервал intValue ()

бросок константы (BadCast);

//универсальный объект

натяните stringValue () бросок константы (BadCast);

;

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

Затем, мы получаем два конкретных подкласса из Объекта. Первое, названное Целое число, хранит единственное целое число и вторую, названную Последовательность, хранит единственную последовательность STL. Их показывают в Кодовом Фрагменте 13.17. В дополнение к простому конструктору каждый из них обеспечивает членскую функцию getValue, который возвращает хранимую сумму.

Наконец, мы определяем членские функции intValue и stringValue класса Обь - ject. Мы показываем только intValue в Кодовом Фрагменте 13.18 (stringValue, аналогично). Эта функция предполагает, что основной объект - указатель на Целое число. Это в - заставляет динамично выступать к указателю Целого числа. Если успешный, это возвращает получающееся целочисленное значение. В противном случае исключение брошено.

622

Целое число класса: общественный Объект

частный:

международная стоимость; общественность:

Целое число (интервал v = 0): стоимость (v)

интервал getValue () константа

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

;