![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Вариации, расширения и затраты
В этом разделе мы опишем несколько способов совершенствования представлений графов, которые мы исследовали в разделах 17.3 и 17.4. Рассматриваемые вопросы можно разделить на три категории. Во-первых, базовые механизмы матрицы смежности и списков смежных вершин графа допускают расширения, которые позволяют получать представления других типов графов. В соответствующих главах мы проведем более подробные исследование расширений подобного рода и рассмотрим соответствующие примеры; в данном разделе мы дадим их краткий обзор. Во-вторых, мы рассмотрим структуры АТД графа, обладающие большим набором свойств, чем структура, выбранная нами в качестве базовой, и реализации, которые используют более развитые структуры данных с целью построения более совершенных реализаций этих структур. В третьих, мы обсудим принимаемый нами общий подход к решению задач обработки графов, который предусматривает построение классов, инкапсулирующих специфику задач и использующих АТД базовых графов. Реализации, которые были построены в разделах 17.7 и 17.9, выполняют построение орграфов, если вызов конструктора содержит второй аргумент, значением которого является true. Как показано на рис. 17.11, каждое ребро входит в представление графа только один раз. Ребро v-w в орграфе представлено единицей в элементе матрицы смежности, расположенном на пересечении строки v и столбца w или вершиной w в списке смежных вершин вершины v в представлении графа в виде множества списков смежных вершин. Эти представления проще, чем соответствующие представления, которые были выбраны для неориентированных графов, однако асимметрия, характерная для графов этого типа, делает их более сложными комбинаторными объектами, чем неориентированные графы, в чем мы убедимся, ознакомившись с содержимым главы 19. Например, стандартное представление графа в виде списка его смежных вершин не обеспечивает возможности применять прямые методы выявления всех ребер, входящих в заданную вершину орграфа, и упомянутое обстоятельство вынуждает нас искать другие представления графа в случаях, когда требуется поддержка этой операции. Часть 5. Алгоритмы на графах
Что касается взвешенных графов (weighed graphs) и сетей (networks), то мы наполняем матрицу смежности структурами, содержащими информацию о ребрах (включая данные об их наличии или отсутствии), заменяя ими соответствующие булевские значения; в представлении графа в виде списков смежных вершин мы включаем эту информацию в элементы списков смежных вершин.
Часто возникает необходимость привязывать к вершинам или ребрам графа еще больше информации, чтобы графы могли моделировать более сложные объекты. В качестве одного из возможных вариантов мы можем ассоциировать дополнительную информацию с каждым ребром путем расширения типа Edge, употребляемого в программе 17.1, с последующим использованием примеров этого типа в матрицах смежности или в узлах списков в списках смежных вершин. Или, поскольку имена вершин суть целые числа в диапазоне от 0 до V— 1, мы можем воспользоваться векторами, индексированными именами вершин, чтобы привязать к вершинам дополнительную информацию, возможно, с использованием соответствующих АТД. Мы будем рассматривать абстрактные типы данных (АТД) этого вида в главах 20-22. С другой стороны, мы можем воспользоваться отдельными АТД символьных таблиц для привязки дополнительной информации к каждой вершине и к каждому ребру (см. упражнение 17.48 и программу 17.15). Чтобы успешно решать различные проблемы обработки графов, мы часто определяем классы, которые содержат дополнительные специализированные структуры данных, связанные с графами. К числу наиболее распространенных структур данных такого рода относятся векторы, индексированные именами вершин, как мы уже могли убедиться в главе 1, в которой мы воспользовались векторами, индексированными именами вершин, для ответа на запросы о связности графов. На протяжении данной книги мы используем векторы, индексированные именами вершин, во многих реализациях. В качестве примера предположим, что мы хотим знать, является ли вершина v графа изолированной. Равна ли степень вершины v нулю? Что касается представления графа в виде списка смежных вершин, то мы находим эту информацию немедленно, просто проверив, не равно ли значение adj[v] нулю. Однако для случая представления графа в виде матрицы смежности мы должны проверить все V элементов, соответствующих строке или
|