/
Text
БИБЛИОТЕЧКА
ПРОГРАММИСТА
В. А. ЕВСТИГНЕЕВ
ПРИМЕНЕНИЕ
ТЕОРИИ ГРАФОВ
В ПРОГРАММИРОВАНИИ
Под редакцией А, П, ЕРШОВА
щ
\^2J
МОСКВА «НАУКА»
ГЛАВНАЯ РЕДАКЦИЯ
ФИЗИКО-МАТЕМАТИЧЕСКОЙ ЛИТЕРАТУРЫ
1985
22. la
E 26
УДК 519.6
Евстигнеев В. А. Применение теории графов в пр«-
граммироваиии./Под ред. А. П. Ершова.— М.: Наука. Главная
редакция физико-математической литературы, 1985—352 с.
Книга посвящена вопросам использования методов теории
графов для'исследования структуры сложных программ,
определения их параметров, верификации, организации хранения и
поиска информации, распределения памяти и для решения
других вопросов, возникающих в спсте.мном программировании и
смежных областях.
Владимир Анатольевич Евстигнеев
ПРИМЕНЕНИЕ ТЕОРИИ ГРАФОВ В ПРОГРАММИРОВАНИИ
Серия «Библиотечка программиста»
Редактор Н. В. Полякова
Техн. редактор В. Н. Кондакова
Корректоры Г. С. Плетнева, М. Л. Медведская
ИБ М 12380
Сдано в набор 16.05.84. Подписано к печати 15.01.85. Т-01212. Формат
84Х108'/з2. Бумага тип. М 3. Обыкновенная новая гарнитура. Высокая
печать. Усл. печ. л. 18,48- Усл. кр.-отт. 18,69. Уч.-изд. л, 18,96, Тираш
20 000 экз. Заказ М 223. Цена 1 р. 20 к,
Издательство «Наука»
Главная редакция физико-математической литературы
117071 Москва В-71, Ленинский проспект, 15
4-я. типография издательства «Наука»
630077 г, Новосибирск, 77, ул, Станиславского, 25
р 1702070000—02Я .„ й, (£) Издательство «Наука».
Ь —-—: т=^"'—°'± ^Главная редакция
053(02) —8о физико-математической
литературы, 1985
ОГЛАВЛЕНИЕ
От редактора ...... . -, • ■ ■ - • ■ ■ ' 6
Предисловие ...... . . 7
Глава 1. Основные понятия ........ 9
§ 1. Основные определения теорпи графов ... 9
§ 2. Графы как модели программ, данных и процессов 19
§ 3. Графы как объекты обработки информации . . 26
Библиографический комментарий ,.,.,, 32
Г л а в а 2. Глобальный анализ графов . , . , . > 33
§ 1. Нумерации, выявляющие логическую структуру
графа 33
§ 2. Логический анализ управляющих графов.
Линейные компоненты и компоненты сильной связности 52
§ 3. Гамаки, полугамаки и шлейфы ..... 76
§ 4. Интервалы и сводимые графы . , , . . 83
§ 5. Контуры в орграфах 105
Библиографический комментарий 118
Глава 3. Итеративные алгоритмы глобального анализа
графов. Пути и покрытия 121
§ 1. Итеративный алгоритм Килдала 121
§ 2. Пути в орграфах 130
§ 3. Пути, удовлетворяющие дополнительным
ограничениям. Покрытия 138
§ 4. Отыскание доммнаторов в орграфе , . . • 150
Библиографические комментарий .165
Глава 4. Оптимизационные задачи на графах , . . 166
§ 1. Построение оптимальных нумераций , , . 166
§ 2. Конструирование оптимальных деревьев ■ , . 192
§ 3. Балансированные деревья . 214
Библиографический комментарий ... . . . 239
3
Глава 5. Разрезания и раскраска графов , , ^ , 2И
§ 1. Разрезания графов 241
§ 2. Раскраска графов 278
Библиографический комментарий 292
Глава 6. Применение теории графов в
программирования t 294
§ 1, Анализ и тестирование программ. Вычисление
характеристик программ ....... 294
§ 2. Применение методов теории графов к
организации вычислительного процесса 309
§ 3. Применение деревьев для организации больших
массивов информации ..,.,,.. 325
Библиографический комментарий . , , . , . 340
Список литературы 342
Предметный указатель 350
ОТ РЕДАКТОРА
Программирование — это новый вид универсальной
деятельности. Человек должен вложить в ЭВМ все, что
видит, слышит, знает, и научить ее всему, что делает
сам. Об этом приходится время от времени вспоминать,
для того чтобы не суживать чрезмерно кругозор при
занятии программированием. М. Нива в своей научной
переписке как-то указал, что над многими информати-
ками довлеет наивное заблуждение, связанное с
кажущейся простотой основных структур
программирования: им кажется, что сравнительно небольшое
количество универсальных методов позволяет им найти ключ
к решению практически любой «реальной» задачи
программирования. Сходную мысль высказывал Э. Дейк-
стра: воюя с теми, кто оценивает продуктивность
программиста по числу написанных команд, он отмечал,
что при грамотном программировании на тысячу строк
программного текста надо написать в десять раз
больше рассуждений и доказательств, гарантирующих
всеобщую применимость программы.
Все три высказанных тезиса некоторым образом
фокусируются на материале этой книги. Важнейшим
свойством информационной модели или управляющей
системы является ее структура, или, говоря
математическим языком, совокупность бинарных отношений на
наборах элементарных единиц данных и, действий.
Эти структуры данных и структуры действий
являются по выражению А. А. Берса единственными
ипостасями программ и обрабатываемой ими информации,
в которых они мо5ут существовать в воображении
программиста и во чреве компьютера.
Вот почему графы являются основной конструкцией
для программиста. Графы обладают огромной,
неисчерпаемой изобразительной силой, соразмерной масштабу
задачи программирования.
К
Поток литературы по теории графов сейчас
нарастает с экспоненциальной скоростью. Как и всегда в
истории науки, этот поток двоякий: с одной
стороны, в нем наблюдается тенденция к выделению струй
с помощью формулирования фундаментальных свойств,
выражающих общую природу графов или их крупных
классов; с другой стороны, эти струи дробятся и
образуют сплетения, отражающие информационное
богатство объекта и его теории.
Из всего сказанного вытекает простое следствие:
программисту -о графах нужно много знать, при этом
с большим запасом по отношению к любой конкретной
задаче.
Предлагаемая вниманию читателя книга является
одной из первых попыток очертить некоторый запас
знания по теории графов, необходимый для
программиста. Хотелось бы подчеркнуть, что книга- призвана
не столько завершить, сколько открыть период
интеграции знания по теории графов и её приложений к
программированию в виде книг и руководств.
Наиболее серьезное ограничение книги — это, по существу,
охват лишь тех программных структур, которые
сложились в модели последовательных вычислений.
Другое обстоятельство, которое характеризует текущий
момент скорее как период становления, нежели как
период завершения,— это концентрация собственно
программистской проблематики в последней главе.
Главный объем книги посвящен обзору алгоритмов и
свойств, взятых из журнальной литературы.
Технологическое погружение в программные процессоры,
принципы отбора и ряд других моментов, придающих
знанию рецептурный характер, еще ждут своего
исследования. Эти ограничительные оговорки, однако, лишь
подчеркивают важпость и актуальность материала,
представленного в книге.
Новосибирск, А. П. Ершов
Академгородок,
1983
ПРЕДИСЛОВИЕ
В этой книге сделана попытка собрать и
систематизировать разнообразные алгоритмы решения теоретико-
графовых задач, возникающих в системном
программировании. Большинство из них разбросано по
многочисленным журнальным статьям, многие из которых не
переводились на русский язык. Книга написана на
основе курса лекций, который автор читал в течение
ряда лет в Новосибирском государственном
университете. Инициатива в разработке такого курса
принадлежит академику А. П. Ершову.
Вышедшее в 1978 г. учебное пособие по этому
курсу «Теория графов и программирование» привлекло
внимание специалистов и выявило имеющийся
интерес к данной тематике.
По мере работы над книгой выявлялись все новые
И новые задачи и алгоритмы, но ограниченный объем
книги заставил многое оставить за бортом. Так, в
книгу не вошли такие вопросы, как вложения графов,
теоретико-графовые методы конструирования баз данных
и организации информационного поиска, графы
адресуемых данных, алгоритмы анализа программ,
основанные на итеративном алгоритме Килдала, графы в Р-тех-
нологии и т. д.
Книга написана как книга по теории графов,
поэтому в главах 2—5 ничего не говорится о сферах
применения того или иного алгоритма; этому посвящена
глава 6. Все алгоритмы излагаются в некотором едином
виде, часто называемом алголоподобным, с разной
степенью детализации и без обсуждения реализации их
на ЭВМ. Достаточно кратко даются обоснования
алгоритмов, часто это просто формулировки необходимых
утверждений.
Книга предназначается в первую очередь для
специалистов в области системного программирования, но
Z
может быть использована в качестве учебного пособия
при организации соответствующего курса лекций для
студентов специальности* «Прикладная математика».
При этом следует принять во внимание, что материал
рассчитан на изучение в течение года при условии
разбора если не всех, то большинства доказательств. Для
ее чтения требуется подготовка в объеме первых двух
курсов университета. Главы книги, за исключением
первой, в достаточной мере независимы друг от друга
в описании алгоритмов, но в остальном желательна
последовательная проработка. Все отсылки к литературе
делаются только в отношении доступных источников,
в основном же все необходимые сведения приводятся.
В заключение хочу выразить благодарность
С. С. Лаврову, А. П. Ершову, И. В. Поттосину и
В. Н. Касьянову за постоянную поддержку и помощь
в организации курса лекций и в написании книги.
Особую благодарность я выражаю своей жене Людмиле
Анатольевне Евстигнеевой, взявшей на себя тяжелый
труд оформления всех вариантов рукописи книги.
В, А, Евстигнеев
а
ГЛАВА 1
ОСНОВНЫЕ ПОНЯТИЯ
§ 1. Основные определения теории графов
1.1. Ориентированным графом -или, короче,
орграфом G = (X, Г) называется упорядоченная пара (X, Г),
где X есть непустое множество объектов некоторой
природы — вершин графа, а Г — многозначное
отображение множества X на себя.
Поскольку многозначное отображение Г: Х-*- X
полностью определяется перечислением пар вида (х, у),
у е Гх, то орграф можно определить и так.
Ориентированным графом G = {X, U) называется
упорядоченная пара (X, U), где X есть непустое
множество вершин орграфа, a U есть множество
упорядоченных пар элементов из X, U = {{x! у)} s XXX,
называемых дугами орграфа.
Пусть и — дуга орграфа вида {х, у), и — (х, у).
Вершина х называется началом дуги и, а вершина у —
концом дуги и. Прп этом говорят, что дуга и выходит
или исходит из вершины х и входит пли заходит в
вершину у. И в том, и в другом случае говорят, что дуга
инцидентна соответствующей вершине. Дуга вида
(х, х) называется петлей; вершины х и у, соединенные
дугой, называются смежными. ^
Второе определение орграфа допускает обобщение
на случай, когда пара вершин х и у может быть
соединена несколькими параллельными дугами вида (х, y)i
Полученная конструкция носит название ориентиров
ванного мулътиграфа. От этого случая нужно отличать
случай симметричного графа, у которого существова-*
ние любой дуги вида (х, у) влечет существование ду->
ги вида (у, х). Ориентированный граф называется
д
полным, если каждая пара вершин в нем соединена
дугой. Очевидно, что полный орграф симметричен.
Число дуг, заходящих в вершину х, называется
полустепенью захода вершины х и обозначается deg+ ix).
Число дуг, исходящих из вершины х, называется по-
лустепенъю исхода вершины х и обозначается deg- (x).
Общее число дуг, инцидентных" вершине х, называется
степенью вершины и обозначается deg x. Имеем:
deg х =- deg+ (x) + deg" (x).
Множество дуг, заходящих в вершину х,
обозначается через Б(х)\ таким образом, \Б(х)\ =deg+ (x).
Аналогично, через Л(х) обозначается множество дуг,
исходящих из х\ таким о.бразом, 1ДЫ1 = deg" Ы.
Множество вершин, являющихся началами дуг из Bix),
обозначается через Т~1х, а множество вершин, являющихся
концами дуг из Л(х), обозначается через Тх. Вершины
из множества Г-1а; называются предшественниками
вершины х, а вершины из множества Тх — потомками
вершины х. Если вершина х имеет только одного
предшественника, то говорят о предке вершины х.
Вершина х, инцидентная только дугам вида (х, х),
называется голой. Вершина, не инцидентная ни одной
дуге, называется изолированной. Степень
изолированной вершины равна нулю. Входом или началом
{начальной вершиной) орграфа называется вершина s,
у которой deg+ (s) =■ 0. Выходом или конечной
вершиной графа называется вершина t, у которой deg" Ш—0.
Иногда мы будем брать в качестве входа или
выхода орграфа некоторые выделенные вершины. Это не
ограничивает общности определения, так как всегда
можно предполагать, что такое соглашение есть
указание на появление фиктивного входа, из которого идет
дуга в выделенную вершину, или на появление
фиктивного выхода, в который заходит дуга из вершины,
объявленной выходом. Введение фиктивного выхода
позволяет нам не разделять случаи одного или
нескольких выходов в орграфе. __
Путем \х[а, Ъ] из вершины а в вершину Ъ
называется последовательность вершин и дуг вида а(а, xj X
Xx^Xi, x2)x1...xn-i(xn-l, b)b. Путь называется
простым, если ни одна вершина в нем не встречается
Дважды. (В 8аписи аути нет необходимости указывать
и входящие в него дуги, и вершины.) Путь из входа
s орграфа в выход t называется s — t-путем. Будем
считать, что хотя бы один такой путь в орграфе суще-
10
ствует. Если в орграфе вершины а п Ь связаны путем
ц[а, Ь], то говорят, что вершина Ь достижима из
вершины а или что вершина а достигает вершину Ъ.
Орграф называется односторонне связным, если для
любой пары вершин одна достижима из другой. Орграф
называется сильно связным, если для любой пары
вершин каждая из них достижима из другой. Путь
называется эйлеровым, если он содержит все дуги графа
ровно по одному разу, и гамильтоновым, если он
содержит все вершины ровно по одному разу.
Путь, начало и конец которого совпадают, т. е. путь
вида ц[а, а], называется контуром (с начальной
вершиной а). Контур называется простым, если ни одна
вершийа в нем не повторяется дважды, эйлеровым,
если он содержит все дуги графа в точности по одному
разу, и гамильтоновым, если он содержит все вершины
графа в точности по одному разу. Длиной пути или
контура называется число дуг, входящих в него.
Контур длины 1 есть петля. Путь длины 0 есть
тривиальный или вырожденный путь. Длина эйлерова пути или
контура равна числу дуг в орграфе; длина гамильто-
нова контура равна числу вершин в орграфе, длина
гамильтонова пути на единицу меньше числа вершин.
Орграф // = (X, V) называется частичным графом
графа G = (X, U), если Х^Х и V s U, и суграфбм,
если Х = Х и V s [/. Орграф H = {Y, V.) называется
подграфом графа G = {X, U), если Y^X п из того,
что ((/„ г/2)е£/ и УиУг^У, следует, что (г/i,. г/а) е V.
Другими словами, частичный граф есть орграф,
порождаемый некоторым подмножеством дуг исходного
орграфа вместе с их концами. Суграф обязательно имеет
то же множество вершин, что и исходный (т. е. если
порождающее множество дуг инцидентно не всем
вершинам исходного графа, то частичный граф
дополняется до суграфа за счет изолированных вершин).
Подграф порождается некоторым подмножеством вершин
исходного графа и теми дугами, оба конца которых
принадлежат указанному подмножеству.
Сильно связный подграф орграфа называется зо-
"ой. Зона, максимальная относительно включения
Берлин, называется компонентой сильной связности или
бикомпонентой.
Вершина рц есть начальная вершина подграфа Н
орграфа G с входом s, если либо р9 совпадает с 8, либо
м
вершина ра имеет предшественника в G, не
принадлежащего Н. Вершина qa называется входной вершиной
подграфа Н, если существует путь из s в q0, не
содержащий вершин подграфа, отличных от q0. Внешний
потомок вершины подграфа Н называется его
выходной вершиной.
Подграф Н графа G, имеющий одну начальную и
одну выходную вершины, называется гамаком, если
выходная вершина не является предшественником
начальной. На рис. 1.1 показаны гамаки орграфа G.
Гамаки G2, G3 и. G4 .одновременно являются бикомпонен-
тами, а подграфу порожденный вершинами vt и v3,
является зоной.
Линейной компонентой орграфа G называется
гамак, удовлетворяющий условиям:
а) начальная и выходная вершины гамака лежат
на каждом s — f-пути орграфа G;
б) начальная вершина гамака не достижима из
выходной;
в) не существует другого гамака, который
удовлетворял бы первым двум условиям и содержался бы в
данном гамаке.
Гамаки Gt и G2 на рис. 1.1 являются линейными
компонентами орграфа G.
1.2. Неориентированным графом или просто графом
G = (X, U) называется упорядоченная пара (X, U), где
X есть множество вершин графа, a U есть множество
неупорядоченных пар элементов из Аг, называемых
ребрами графа. Из контекста всегда ясно, о каком типе
13
графа — ориентированном или неориентированном —
идет речь.
В общем случае у ребер не различают начало и
конец, и запись (х, у) обозначает то же ребро, что и
(у, х). Иногда при обходах графа или при движении
по ребрам из одной вершины в другую мы будем
говорить о начале ребра и его конце, подразумевая при
этом, что направление движения создает ориентацию
ребра. В графе каждая пара вершин соединена не
более чем одним ребром; допущение параллельных ребер
приводит к новой конструкции, именуемой мулъти-
графом.
На случай неориентированных графов переносятся
почти все введенные выше понятия. Так, две вершины
смежны, если они соединены ребром; ребро инцидентно
своим концам, степень вершины есть число
инцидентных ей ребер (полустепени захода и исхода теряют
свой смысл). Говоря о входе или выходе в
неориентированном графе, будем иметь в виду некоторые
выделенные вершины; например, откуда начинается и где
заканчивается обход.
Для пути и коатура в неориентированном графе
имеются аналоги: цепь и цикл. Цепью \iia, b],
соединяющей вершины а и Ъ, называется последовательность
вершин и ребер вида а(а, х^х^х^ х2)хг.. .xn-i(xn-i, Ь)Ь.
Цепь, начало и конец которой совпадают, называется
■циклом. Термин «цепь» иногда заменяется термином
«путь». Употребление термина «цикл» в тех случаях,
здгда речь идет об ориентированных графах, не ведет
< путанице, так как оно ограничено узкими областями
[например, потоки по сетям). Для цепей и циклов
неориентированного графа аналогично тому, как это
делалось для орграфов, определяются понятия простоты,
эйлеровости, гамнльтоновостп, а также длины,
Понятия односторонней и сильной связности теряют смысл,
их аналогом служит понятие связности: граф
называется связным, если каждая пара вершин связана цепью.
Сохраняются понятия частичного графа, суграфа и
подграфа с естественной заменой множества дуг на
множество ребер.
1.3. Деревом называется связный
неориентированный граф .без циклов. Это не единственное возможное
определение. Теорема 1 устанавливает эквивалентность
различных свойств дерева, каждое из которых может
служить определением.
13
Teop0Ma *• Для гРаФа G == (X, U) следующие
утверждения эквивалентны:
1) G -"""' дерево;
2) любые °^ве вершины в графе G соединены един-
ственной достой цепью;
3) epflr k связен и имеет |л| — 1 ребер;
4) гр^ ^ не содержит циклов и имеет \Х\ — 1
ребер; „ _, _ _, ,.
5) ер^ " ке содержит циклов, но добавление ребра
между лР^ыми двумя несмежными вершинами приво-
'дит к поА0лению одного цикла;
6) грО-Ф G с8Язен, но утрачивает это свойство после
удаления любого ребра.
Мы оРУскаем Доказательство этой теоремы. Пример
дерева пр0веДен На РИС- 12> а-
Ряс. 1.2,
Вершина степени один называется висячей. Из оп-
предетениЯ ДеРева и теоремы 1 вытекает, что всякое
дерево цМеет п0 крайней мере две висячие вершины.
ОпреДеЛИМ расстояние dix, у) между вершинами
х и у в йбРеве как ДЛИНУ пути из х в у. Расстояние от
вершины х Д° наиболее удаленной от нее вершины
называется эксцентриситетом е{х) вершины х, т. е.
eix\ = ща^ d[x1 у). Наибольший из эксцентриситетов
называется радиусом г (Г) дерева Т. Центральной
вершиной дерева Т называется вершина, у которой экс-
центрисйтет равен радиусу. Центром дерева
называется множество его центральных вершин. Для Дерева на
рис. 1.2 а возле каждой вершины указан ее
эксцентриситет. Центр этого дерева состоит из двух вершин о
вксцентриситетом 4. Можно показать, что каждое дере*
во имеет йентр, состоящий или — одной вершины, или
из двух смежных вершин.
14
Назовем ветвью к вершине х дерева Т
максимальное поддерево, содержащее х в качестве висячей
вершины. Таким образом, число ветвей к вершине х
равно ее степени. Вес вершины х есть наибольшее число
ребер в ветви к вершине х. Вес каждой висячей
вершины в дереве равен числу ребер в этом дереве. Вершина
х называется центроидной, если вершина х имеет
наименьший вес. Центроидом дерева называется
множество его центроидных вершин. Можно показать также,
что каждое дерево имеет центроид, состоящий из одной
вершины или из двух смежных вершин.
1.4. Ориентированным корневым деревом Т(г) или
ордеревом с корнем г называется орграф с выделенной
вершиной г, который удовлетворяет следующим
условиям:
а) Т(г) — дерево, если не принимать во внимание
ориентацию дуг;
б) из корня г достижима любая вершина (или
корень г достижим из любой вершины);
в) в корень г не заходит ни одна дуга (или из нор*
ня не выходит ни одна дуга).
Ясно, что любое дерево можно превратить, в орде-
рево, если выбрать некоторую вершину в качестве кор->
ня и задать ориентацию дуг. Для определенности
будем считать, что все дуги ориентированы от корня.
Пример ордерева показан на рис. 1.2, б.
Плоским топологическим графом называется изобра1»
жение графа* на плоскости, при котором разным
вершинам графа отвечают разные точки плоскости,
ребрам — дуги кривых (без самопересечений) и никакие
два ребра не имеют общих точек, отличных от их кон«>
цов. Плоские топологические графы, которые можно
преобразовать друг в друга непрерывной деформацией
плоскости, не считаются различными.
Плоский топологический граф G называется
упорядоченным деревом, если:
а) G — ордерево с корнем;
б) для каждой вершины (включая корень) задан
относительный порядок максимальных поддеревьев,
имеющих данную вершину своим корнем.
Легко видеть, что если два дерева, отличающихся
друг от друга только относительным порядком
поддеревьев вершин, не считать различными, то мы
приходим к понятию ордерева, поскольку в нем имеет
вначение только относительная ориентация вершин,
15
а не их порядок. На рис. 1.3 изображены два
различных упорядоченных дерева.
Важным типом упорядоченных деревьев являются
так называемые бинарные деревья, определяемые
рекурсивно следующим образом:
а) одновершинное дерево есть бинарное дерево;
Рпс. 1.3.
б) тройка (Г,, v0, Tr) есть бинарное дерево с
корнем v0, левым поддеревом Ti и правым поддеревом
Тт, причем Ti и Т, — бинарные деревья (возможно,
пустые); см. рис. 1.4, а.
Бинарное дерево не является частным случаем
упорядоченного, но эти понятия тесно связаны. Например,
бинарные деревья на рис. 1.4, б и 1.4, в различны
между собой (в первом корень имеет пустое левое
поддерево, во втором — пустое правое), но как
упорядоченные деревья они идентичны (изоморфны).
S)
V
Рис. 1.4.
Обобщением бинарных деревьев являются пг-арные
деревья, в которых каждая вершина является корнем
не более чем тп поддеревьев, каждое из которых в свою
очередь есть тя-арное дерево (возможно, пустое).
-Каркасом или остовом неориентированного графа
называется его суграф в виде дерева. Граф G имеет каркас
16
тогда и только тогда, когда оп связен. В самом деле,
если граф связен, то выясним, имеется ля в нем ребро,
удаление которого не нарушает связности. В случае,
когда таких ребер нет, граф G сам является деревом
в силу свойства 6) теоремы 1; если же такое ребро
есть, то удалим его и выясним, имеется ли в
полученном графе ребро, удаление которого не нарушает
связности, и т. д. Когда удаление ребер без нарушения
связности станет невозможным, получим дерево,
множество вершин которого совпадает с множеством
вершин G. Проведенное рассуждение дает алгоритм для
отыскания некоторого каркаса графа.
Для орграфа можно определить понятие оркаркаса,
т. е. суграфа в виде корневого ордерева. В орграфе G
существует оркаркас с корнем в вершине г, если все
вершины графа достижимы из г.
1.5. Другие типы графов. Граф G называется несе-
парабелъным или двусвязным, если удаление любой его
вершины не нарушает связности. Максимальная
относительно включения вершин компонента
сепарабельности (компонента двусвязности) называется блоком.
В любом блоке существует простой цикл,
проходящий через два произвольным образом выбранных
ребра.
Вершина, общая двум или более блокам,
называется точкой сочленения пли разделяющей вершиной. Так
как удаление точки сочленения нарушает связность
графа, то наличие в графе таких вершин наводит на
него некоторую деревообразиую структуру. В самом
деле, замена каждого блока ребром с концами в
разделяющих вершинах плп просто висячим ребром, если
соответствующий блок имеет только одну точку
сочленения, превращает граф в дерево. Для описания такой
деревообразной структуры используется понятие графа
блоков F(G) графа G: это граф, вершины которого
соответствуют блокам В и разделяющим вершинам z
графа G (рис. 1.5), причем вершины Buz соединены
ребром при гей, а вершины В между собой не смежны.
Аналогом блока в ориентированных графах служит
линейная компонента.
Полным 11-вершинным графом Кп называется
неориентированный граф, все вершины которого смежны
между собой. Для многих приложений важным
является выявление наличия в графе полных подграфов,
или клик, достаточно большого размера, ибо к этой
В, А. Евстигнеев
17
вадаче сводится задача об отыскании максимального
множества попарно несмежных вершин.
Двудольным графом G = (Xi, Х2, U) называется
граф, вершины которого разбиты на два
непересекающихся подмножества Xi и Х2 так, что концы ребер
Рис. 1.5.
(х, у) е U принадлежат разным подмножествам, т. е.
isl, и j/elj, Важное свойство двудольных графов:
все циклы имеют четную длину. Заметим, что здесь
нуль считается четным числом, так что к двудольным
графам относятся и деревья.
Важной особенностью графов, позволяющей
использовать их для моделирования систем и процессов,
является возможность приписывать ребрам (дугам) и
вершинам веса, в качестве которых чаще всего выступают
числа или наборы чисел. Без ограничения общности
можно считать, что во взвешенном графе веса
приписаны только ребрам (дугам). Исключения будут
оговариваться особо. Во взвешенном графе длина пути
(контура, цепи, цикла) определяется к-ак сумма или
произведение весов входящих в него дуг. Существуют более
сложные способы определения длины пути (во'всех
таких случаях это оговаривается особо). Веса дуг часто
называют длинами, стоимостью, временем и т. д. в
зависимости от конкретной ситуации.
1.6. Матрицей смежности A{G) графа Gen верши*
нами называется квадратная'матрица порядка п с
элементами ау: Яц=1, если существует дуга (ребро)
ixt, Xj); ац = 0 в противном случае. Для
неориентированного графа матрица смежности симметрична
относительно главной диагонали. "В случае
ориентированного графа входу соответствует столбец из пулей,
выходу — строка из нулей, число единиц в £-й строке
равно полустепени исхода вершины xt, число единиц
в /-м столбце равно полустепени захода вершины х$.
18
Матрица смежности полностью определяет структуру
графа (с точностью до изображения на плоскости и
нумераций вершин), в том числе и взвешенного (в
матрице смежности которого элемент ац полагаем равным
весу дуги (хи х,)). Пусть Gt = (X, £/,), G2 = (X, U2) —
два графа с одним и тем же множеством вершин, At и
Аг — их матрицы смежности. Тогда матрица At®At,
где символом © обозначено логическое сложение,
определяет объединение графов, т. е. граф Gt U G2 =
«= (X, Ui U U2). Предположение о равенстве множеств
вершин в графах — не ограничение, так как множество
вершин графа всегда можно пополнить
изолированными вершинами, соответствующими отсутствующим в
графе Gi вершинам из графа G2, и наоборот. При этом
матрицы смежности будут иметь один и тот же
размер и i-й вершине одного графа будет соответствовать
i-я вершина другого.
Матрицей инцидентности B(G) графа Gere
вершинами и иг дугами называется прямоугольная матрица
размера п X m с элементами Ъц\ Ьц—l, если вершина
Xi есть начало дуги и/, Ъц = — 1, если вершина xt есть
конец дуги щ\ btj = 0 в противном случае. Заметим, что
в определении отсутствует случай, когда в вершине Xt
имеется петля. Большинство авторов использует
дополнительное значение для bit (например, какой-нибудь
символ или выражение «1 и —1»).
Матрицей достижимости R(G) графа G с и
вершинами называется квадратная матрица порядка п с
элементами Гц: Гц = 1, еслп вершина х, достижима из хг;
Ftj = 0 в противном случае.
§ 2. Графы как модели программ, данных
и процессов
2.1, Управляющие графы. Многие задачи анализа
программ, возникающие при оптимизации, трансляции,
проверке правильности, тестировании и т. д.,
значительно упрощаются, если их рассматривать на
теоретико-графовых моделях. В основе моделей лежит управ-
яяющий граф программы. Орграф G = (X, U)
называется управляющим графом (р-графом, графом перехо*
Вов), если выполнены следующие условия:
а) граф G не содержит параллельных дуг;
б) в множестве вершин графа выделена одна
вершина s — вход графа;
13
в) в множестве вершин графа выделена хотя бы
эдна вершина t — выход графа;
г) каждая вершина леХ достижима из входа $',
д) каждая вершина iel достигает выхода I.
Замечание. Можно считать, что в управляющем
графе имеется более чем один выход, поскольку этот
случай легко сводится к случаю одного выхода
введением фиктивного выхода, соединенного дугами с
каждым фактическим выходом. В большинстве случаев
можно считать, что полустепепь исхода каждой
вершины, отличной от входа и выхода, равна 1 или 2,
а полустепень исхода входа равна 1.
Построение управляющего графа для конкретной
программы проводится по простым правилам с
требуемой степенью детальности (и, как правило,
автоматически). Тривиальное решение задачи состоит в
изображении каждого оператора языка (машинной команды,
строки или любого фрагмента, признаваемого единицей
языка) отдельной вершиной. При этом две вершины
смежны, если между ' соответствующими операторами
есть передача управления. Точнее, оператор, после
исполнения которого производится передача управления,
представляется началом дуги; оператор, на который
передается управление,— концом дуги, а каждая
передача управления — дугой. При таком подходе размер
графа сильно растет за счет появления длинных
цепочек вершип, соответствующих линейным участкам
программ. Они могут быть представлены одной вершиной.
Более сложные подходы к построению управляющих
графов состоят в выделении различного рода
квазилинейных участков, как это было сделано, например, при
разработке транслятора с языка альфа. Это возможно,
если нет необходимости тщательно учитывать
внутреннюю структуру отдельных частей программы.
Для примера рассмотрим построение управляющего
графа для программы BUBBLE, написанной на алголо-
подобном языке. Текст программы приведен на рис. 1.6,
соответствующий управляющий граф — па рис. 1.7.
В этом графе каждая вершина соответствует одному
оператору, для сравнения на рис. 1.8 приведен
редуцированный управляющий граф, в котором каждый
линейный участок представлен одной вершиной. В
качестве еще одного примера приведен управляющий
граф на рис. 1.10 для фрагмента программы,
написанной на языке Эльбрус эль-76 (рис. 1.9).
20
SUBROUTINE BUBBLE(A, N)
BEGIN
FOR 1-2 STEP SI UNTIL N DO
BEGIN
IF A(I) GE .4(1 — 1) THEN GOTO NEXT
J= 1
LOOP: IF J LE 1 THEN GOTO NEXT
IF .4 (J) GE A(J — 1) THEN GOTO NEXT
TEMP=A(J)
A(J)=A(J — 1)
A{J — 1)=TEMP
J = J—1
GOTO LOOP
NEXT: NULL
END
END
Рис. 1.6.
©
Рис. 1.7.
1—*ф
Рис. 1,8.
1
2.
3.
4.
5.
6.
7.
8.
9.
10.
если
ДЛЯ i
цикл
мае'!
Mac[i
siacli
ft = .\
от 1
1]: =
2]: =
3] =
повторить;
h: =ЛН 1
иначе
все;
А: =
то
ДО .V
= с[;
= elxcl;
cl x.\iac[i, 3j:
0
Рис. 1.9,
£1
2.2. Марковская граф-моделъ программы
представляет собой взвешенный управляющий граф программы,
причем веса дуг (а также вершин) являются
фиксированными значениями некоторых параметров. Так,
вершинам обычно сопоставляется объем и/или время
вычислений (время передачи управления полагают
равным нулю). Каждой дуге, соответствующей передаче
управления от i-ro к у-му оператору, приписывается
постоянное значение дц вероятности осуществления
передачи (события выбора переходов независимы). Для
правильно • построенной программы и ее граф-модели
можно из входа попасть последовательно по дугам в
любую вершину, а из любой вершины — в выход.
Какая-либо реализация счета задается указанием s — t-
пути (не обязательно простого). Вероятность
реализации определяется как произведение соответствующих
вероятностей q^. Ограничений на конфигурацию
программы и множество реализаций счета граф-модель не
накладывает. Множество реализаций счета есть
подмножество всех s — £-путей. Для завершения
построения модели нужно соединить дугой конечную (выход)
и начальную (вход) вершины граф-модели, так что
вход становится концом этой дуги.
2.3. Полумарковская модель. Иногда целесообразно
представлять время исполнения операторов случайной
величиной (например, если соответствующая вершина-
есть объединение нескольких операторов, прерываемых
условными переходами). Граф-модель в этом случае
будет полумарковскон, причем время исполнения
операторов будет характеризоваться средним значением и.
п дисперсией 0. Случайные величины, определяющие
время исполнения, считаются взаимно независимыми.
Если все дисперсии 0 равны нулю, то модель
превращается в марковскую.
Основная трудность состоит в определении
вероятностей передачи управления. Последние могут быть
определены либо заранее, если ветвление происходит
после операций с индексами, либо по известным
распределениям входных данных, если ветвление
происходит после анализа входных данных, либо путем
аппроксимации или моделирования, если распределение
вероятностей для входных данных неизвестно. Расчет
вероятностей осуществим, когда они являются
функциями параметров решаемой задачи. Иногда
обнаруживается связь между количеством выполнений операто-
82
ров, числом циклов в программе и вероятностями
переходов.
2.4. Пусть А — множество операторов некоторой
программы, В+ — множество входов, В~ — множество
выходов всех операторов, причем В+ (\ В~ = 0 и В —
*=х B^ii В~. Информационным графом I — {В, U)
называется орграф без петель, вершинами которого
являются входы и выходы операторов, а дуга (х, у)
принадлежит множеству дуг и тогда и только тогда, когда
X &В~ и у е В+. Дуги информационного графа
называют информационными парами, сохраняя
традиционное название «дуга» для дуг управляющего графа.
Операторной схемой над общей памятью или О-схе-
мой называется упорядоченная четверка (A, G, X, R),
где А — непустое множество операторов, X—конечное
множество неопределяемых объектов, называемых
величинами, G — управляющий граф, R: В -*■ X —
отображение множества входов и выходов операторов на
множество величин.
Операторной схемой над распределенной памятью
или Р-схемой называется упорядоченная тройка (A, G,
I), где A, G определяются, как и выше, а
/-—информационный граф.
Пример информационного графа и операторных
схем показан на рис. 1.11 ( а) управляющий граф G;
б) информационный граф /; в) Р-схема).
Рис. 1.11.
2.5. Информационные связи в операторной схеме
группируются в связки. В* одну связку входят все
информационные связи, выходящие из некоторого
оператора (результата). Для правильного распределения
памяти нужно, чтобы всем аргументам (величинам,
сопоставленным входам операторов) и результату
(величине, сопоставленной выходу оператора), входящим
£3
в одну и ту же связку, была сопоставлена одпа и та
же величина. Экономия памяти достигается тогда, когда
нескольким связкам удается сопоставить одну и ту же
величину без нарушения информационных связей. Для
этого систему связок информационного графа
изображают в виде неориентированного графа — графа несов-
местимостей, у которого вершины соответствуют
информационным связкам, а две вершины смежны тогда
и только тогда, когда связки несовместимы.
2.6. Ордерево как форма организации динамических
словарей. Пусть на вход некоторой программы
подается некоторый текст и требуется составить список
всех слов (различных), встречающихся в тексте. Эта
задача может быть усложнена требованием
предоставления возможности пользоваться списком до включения
в него всех слов. Кроме того, неизвестно общее число
слов в тексте. Для решения задачи с достаточной
эффективностью требуется структура, которую можно
было бы просмотреть за время, меньшее, чем
потребовалось бы для неупорядоченного списка слов, и
которая обладала бы еще одним свойством: вписывание
новых слов не должно вызывать затруднений. Такой
структурой служит корневое упорядоченное дерево в
виде бинарного (или m-арного) дерева сортировки —
бинарного дерева, снабженного метками, взятыми из
множества меток с введенным на нем отношением
полной упорядоченности, и такого, что все метки из
левого поддерева любой вершины меньше метки в этой
вершине, а метки в правом поддереве —
соответственно больше.
Включение нового слова соответствует
подвешиванию к дереву новой вершины, меткой которой было бы
новое слово, без нарушения свойства дерева быть
бинарным. Для отыскания места подвешивания новой
вершины будем двигаться, начиная с корня и
сравнивая включаемое слово с метками проходимых вершин:
если метка совпадает с включаемым словом, то ничего
делать не надо, так как слово уже в словаре; если
метка больше нового слова, то движемся к потомку
вершины по левой дуге, в противном случае— по правой.
Если слова в словаре нет, то мы попадаем в вершину,
у которой отсутствует одни или оба потомка; к ней мы
и подвешиваем новую вершину. Можно представить
себе ситуацию, когда дерево сортировки вырождается в
линейный список; тогда для сохранения структуры де-«
24
рева с нужными свойствами применяются специальные
приемы, рассматриваемые в главе 4.
2.7, Граф-модель вычислительного процесса. Пусть
дана некоторая формула, или задача, состоящая из
ряда подзадач, или совокупность задач, использующих
одни и те же ресурсы, и т. п. Для простоты будем
говорить о вычислении некоторой формулы. Порядок
вычислений может существенно влиять на объем
требуемой для хранения исходных и промежуточных данных
оперативной памяти. Изобразим формулу в виде
каскадного информационного графа. В нем каждая
внутренняя верйшна соответствует оператору; это означает,
что в эту вершину входит столько дуг, сколько
аргументов у оператора, а выходит одна дуга,
представляющая результат вычислений. Вводимым данным будут
соответствовать вершины, из которых исходит только
одна дуга и ни одна дуга не входит,— входы графа.
Отсюда следует, что каскадный информационный граф
представляет' собой корневое ордерево, в котором
корень соответствует вычисляемому результату. В
качестве веса вершины в такой модели вычислительного
процесса выступает требуемый объем памяти.
2.8. Граф-модель информационно-логической
системы. Среди исходных данных, необходимых для выбора
структуры комплекса вычислительных средств (КВС),
важнейшую роль играют сведения о множестве задач,
решаемых системой. Простейшей формой задания
такого множества является перечень задач; следующей
по сложности формой является комплект алгоритмов
решения задач системы. Наиболее развитой и
совершенной формой задания вычислительной работы
системы является информационно-логическая структура
(ИЛС) системы. Под ИЛС некоторой системы
управления понимается совокупность алгоритмов, увязанных
в единое целое по перерабатываемой информации, для
решения общей главной задачи системы.
Описание ИЛС системы должно включать в себя
не только перечень алгоритмов, но и указания о
последовательности их реализации, об их
характеристиках и об исходной информации. Наиболее удобная,
наглядная и многосторонняя форма описания ИЛС —
представление ее> в виде орграфа алгоритмов.
Такие графы позволяют не только выявлять свойства
ИЛС, но и решать следующие важпые практические
задачи:
£5
— установление рационального порядка разработки
алгоритмов;
— перечисление возможных вариантов привязки
алгоритмов к пунктам обработки информации;
— составление исходных матриц, необходимых для
оптимизации KBG по показателям качества КВС;
— упрощение ИЛС системы;
— составление управляющих (диспетчерских)
алгоритмов.
Графом алгоритмов системы называется орграф
G = (X, U), вершины Xt которого изображают частные
реализации i-x алгоритмов системы. Две вершины х{
и Xj соединяются дугой (xt, Xj), если алгоритм А}
может реализоваться только вслед за алгоритмом At.
Вершинам графа алгоритмов приписывается вес в форме
некоторых физических величин, связанных с
реализацией этих алгоритмов, например числа операций Nt,
требуемых Для реализации i-тр алгоритма, времени it
реализации алгоритма па ЭВМ, ошибок определения
тех или иных величин в результате реализации £-го
алгоритма и т. д.
В ИЛС системы управления соотношения
следования между алгоритмами обычно соответствуют
направлениям потоков информации, которые циркулируют в
системе при реализации алгоритмов. В самом деле,
соотношение XiKxj (алгоритм As следует за Ад однознач- /
но утверждает, что для реализации At необходима
некоторая входная информация, которая получается в
результате реализации алгоритма At. Вследствие этого
в графах алгоритмов не только вершинам, но и дугам
могут быть приписаны вполне определенные веса. Это
не что иное, как направленные потоки информации
между последовательными алгоритмами, описываемые
ее составом, объемом и точностными
характеристиками. В некоторых случаях дугам графа может быть
приписано другое физическое содержание, например
вероятность рц перехода от вершины xt к вершине х}.
§ 3. Графы как объекты обработки информации
3.1. Представление графов в памяти ЭВМ.
Представление графов в памяти ЭВМ существенно зависит
от типов структур данных, допускаемых используемым
алгоритмическим языком и типом ЭВМ.
23
Представление с помощью матрицы смежности —
одно из самых распространенных, ведущих свое начало
от удобства ручной работы с матрицей смежности и
удобства описания алгоритмов на графах, заданных в
таком виде. Для графов с большим числом дуг это
достаточно компактйое представление, особенно если
есть возможность работать с двоичными битами в
машинном слове, как это допускает, например, язык
ПЛ/1. К недостаткам следует отнести большой расход
памяти при работе с графами, имеющими небольшое
число дуг (матрица смежности при этом получается
весьма разреженной), а также невозможность
уменьшения трудоемкости алгоритмов в том случае, когда
она пропорциональна числу дуг, а не числу вершин.
Матрица смежности неориентированного графа
симметрична относительно главной диагонали, поэтому
достаточно хранить в памяти только половину ее.
Задание графа с помощью матрицы смежности удобно еще
и тогда, когда граф взвешенный и элементами
матрицы являются не нули и единицы, а веса дуг. Пример
задания ориентированного и неориентированного
графов матрицами смежности приведен на рис. 1.12.
0
0
0
0
0
0
1 1
0 0
1 0
0 0
0 0
0 0
0 0 0
0 0 0
1 1 0
0 1 0
0 0 i
i 0 0
Рис. 1.12.
Представление с помощью матрицы инциденций
определяет граф однозначно (с точностью до
изоморфизма), но применяется крайне редко в силу большой
разреженности матрицы и практического отсутствия
алгоритмов, работающих на такой структуре данных.
Представление с помощью списков смежности
является главной альтернативой представлению с помощью
матрицы смежности. Список смежности для вершины v
0 10 10 0
10 110 0
0 10 10 0
1110 11
0 0 0 10 1
0 0 0 110
27
есть просто список вершин из множества Tv, т. е. это
список концов дуг, исходящих из вершины v в случае
орграфа, или список смежных с v вершин в случае
графа. Граф представляется с помощью |Х| списков
смежности, по одному для каждой вершины. Если
число дуг в орграфе существенно мало по сравнению с
полным графом, то этот способ представления весьма
эффективен. Списки смежности занимают объем
памяти 1X1 + \Е\ и легко реализуются с помощью
списочных структур. Часто используются различные варианты
списков смежности, например, задаются списки
вершин из T~lv, совместные списки вершин из Tv н Гт'у
и т. д. Менее удобен этот способ представления для
задания взвешенных графов, ибо тогда возникает
дополнительная задача хранить где-то веса дуг и
устанавливать соответствующие связи между дугами и их весами.
Пример задания графов, показанных на рис. 1.12, с
помощью списков смежности приведен на рис. 1.13.
Представление с помощью списка дуг применяется
в тех случаях, когда необходимо иметь отдельную,
независимую нумерацию дуг. При этом способе каждой
дуге сопоставляется тройка".'<», х, г/>, где и —дуга,
х — ее начало, у — ее конец. Этот способ
представления легко обобщается на случай взвешенных графов.
Более того, он наиболее приспособлен для хранения
различной информации о дугах.
Пусть G — неориентированный граф, A{G) — его
матрица смежности. Так как A{G) симметрична отно--
сительно главной диагонали, будем рассматривать
только ее верхнюю треугольную часть А'. Запишем строки
А' последовательно одну за другой и рассмотрим
полученную последовательность из нулей и единиц как
двоичное число. Меняя нумерацию вершин, будем для
одного и того же графа получать разные числа.
Наибольшее из них определяется для графа однозначно и
носит название кода Харари. Код Харарн определяет
граф однозначно, поэтому, например, задачу
определения изоморфизма двух графов можно свести к
сравнению соответствующих кодов Харари. Правда, этот
метод столь же неэффективен, как и другие методы
установления изоморфизма двух произвольных графов.
Нумерация вершин (и матрица смежности),
соответствующая коду Харарн, носит название канонической
п используется при перечислении (генерировании)
графов с заданными свойствами.
28
Код Прюфера может быть использовал для задания
деревьев, поскольку допускает реализацию
ограниченного числа алгоритмов, работающих с такой
структурой данных. Пусть Т — дерево с множеством вершин
Хг < 0;
«^j I Хг, X^j X5\
Х< : Xs!
X, : Х$\
Т. • i" *
4'
i 21 4'
^i '■ •z'o ^j' ,z*i'
tZ"^ i X^}
X|, JT2, Xj,
•2?!
JT.,.
JZT,
•^
•2-5
-zv
X. :
X2 :
•z-j ;
1Z4 ;
г, •
г-8>
kH-W 1
nil
N4H*<I—N 1
Ш
W 1
Ш
|^2 »-H-A | |
ынч^н-ы i
1-^21 44-^ 1
Ы 4~Ы 44^! 4
W+W |
Kl 44^1 I
A-
f
0
0
0
0 .
0
0
2
■Zz
0
0
0
0
3
z-j
0
0'
0
0
0
4
0
0
0
0
.TH
5
0
0
xs
x$
0
0
e
0
0
0
0
xc
0
Pn
, cz=»
с 1.13.
1
г
. 3
4
5
6
1
D
*l
0
0
0
г
xz
0
^2
0
0
3
0
^
0
*3
0
0
4
X,
x*
0
■Zf
■a"
5
0
0
0
0
•Zi
6
0
0
0
•2-е
•Z»
0
{^i, ..., vj. Будем считать, что номер вершины vt
равен i. Сопоставим дереву Т последовательность [аи ...
..., йп-г] по следующему правилу:
1. Полагаем г равным 1.
2. В последовательности
1, 2,..., п (*)
путем просмотра слева направо ищем номер первой
висячей вершины. Пусть это будет Ь(.
29
3. Ищем, с какой вершиной смежна вершина Ьи
Пусть это будет вершина а,-. .Запоминаем а(.
4. В последовательности (*) вычеркиваем Ъи
5. Из дерева Т удаляем вершину Ь{.
6. Полагаем t :=£+!.
7. Если i < п — 1, то переходим к шагу 2. Если
£ = и—1, то выдаем последовательность [а5, ,.., ап_21.
Это и есть код Прюфера.
Рис. 1.14. Рис. 1.15.
Например, для дерева на рис. 1.14 код Прюфера
равен [8, 4, 4, 4, 2, 2]. Код Прюфера взаимно однозначно
кодирует деревья. В случае корневого ордерева
процедура получения кода Прюфера аналогична.
Необходимо только на последнем месте указывать корне.вую
вершину и при распаковке кода исключать эту
вершину из просмотра последовательности (*). Так, для
дерева на рис. 1.15 код Прюфера равен [7, 4, 4, 4, 2,2,71.
Код Прюфера дает возможность доказать теорему
Кэли о числе помеченных деревьев.
Теорема 2 (Кэли). Число помеченных п-вершин-
ных деревьев равно пп~г.
Код Прюфера является оптимальным по памяти ко-
оо
дпрованием деревьев. В самом деле, пусть Я = (J Я„,:
где Я„ — конечное множество. Предположим, что при
каком-то способе кодирования элементов из Я для
запоминания одного элемента из Я„ используется самое
большее /(и) битов памяти. Кодирование ;'(«) назовем
оптимальным, если lim^—-=1, где*//(«)= log |SI„1,
1$U — мощность множества Я„. Для оценки энтропии
Н(п) для множества деревьев с п вершинами по
теореме 2 имеем Hin) = (п — 2) log п. Отсюда следует, что
кодирование деревьев кодом Прюфера является
оптимальным, так как для хранения кода необходимо /(и) =
30
'= (n — 2) log n битов памяти, и поэтому Hm „ . \ — 1.
П-»<х> " \п)
При задании дерева списками смежности имеем
1 • / (П) О Y
lim ■ . = о для неориентированных графов и
т / (") о
Лт , , = I для ориентированных.
»-»<» я I'V
3.2. Для решения одной и той же задачи могут
существовать различные по эффективности алгоритмы.
Понятие эффективности алгоритма расплывчато, но
чаще под этим понимается эффективность в смысле
затрат времени и памяти ЭВМ. При этом с задачей
связывается некоторое число (или совокупность чисел),
называемое размерностью задачи, которое выражает
меру количества входных данных. В задачах на графах
таким параметром может служить число вершин (чаще
всего), число дуг, пара чисел вида число вершин —
число дуг и др.
Время, затрачиваемое алгоритмом, как
функция размерности задачи называется временной
сложностью или трудоемкостью алгоритма. Предельное
значение сложности при неограниченном увеличении
размерности называется асимптотической временной
сложностью (трудоемкостью). Размер памяти,
минимально необходимый для решения задачи алгоритмом,
называется емкостной сложностью или сложностью по
объему памяти. Аналогично асимптотической
временной сложности можно определить асимптотическую
емкостную сложность.
Если алгоритм обрабатывает входы размерности
п, т. е. может решать задачи размерности п, за
время спг, где , с — некоторая постоянная,
определяемая реализацией алгоритма, то говорят, что
временная сложность этого алгоритма есть ОЫг). Несмотря на
то, что при таком определении сложности алгоритма
основное внимание уделяется порядку роста величин,
нужно понимать, что алгоритм с большим порядком
роста сложности может иметь меньшую постоянную,
нежели алгоритм с меньшим порядком роста
сложности. Поэтому его преимущества могут сказываться лишь
на задачах гораздо большей размерности. Что
касается конкретпых единиц измерения временной
сложности алгоритма, то чаще говорят о количестве
необходимых элементарных операций- типа сложения,
умножения, сравнения.
81
Библиографический комментарии
К настоящему моменту на русском языке имеется
достаточно много книг по теории графов, из которых наиболее
подходящими для знакомства с общими вопросами этой области
математики являются книги Ф. Харари [80], О. Оре [63] и Р. Уил-
сона [75]. Книга А. А. Зыкова [33] более фундаментальна, но
и более трудна для прикладников. Прикладным и
алгоритмическим аспектам теории графов, но безотносительно к
реализации на ЭВМ посвящены книги [1, 10, 27, 53, 78]. Реализации
теоретико-графовых алгоритмов и оценкам трудоемкости
уделено достаточно много внимания в книгах [7, 61, 72].
Марковская модель для последовательных программ была
предложена Р. Карпом в 1960 г.; см. [40]. Различные
граф-модели подробно рассмотрены в обзоре Б. А. Головкина [19],
широкий спектр графовых моделей представлен в работе В. Бовье
[103], а также в книге А. П. Ершова [30]. Описание
граф-модели информационно-логической системы взято из книги [20],
пример построения управляющего графа для программы
BUBBLE взят из статьи [143].
Различные представления графов оппсаны в препринте
В. К. Попкова [66], различные представления деревьев — в
препринте [67], однако большая их часть имеет лишь
теоретический интерес. Заслуживает упоминания представление графов
в виде А!-формул. Это малораспространенное представление
описано в книге [10]. Доказательство оптимальности кода Прюфе-
ра взято из-работы [4].
ГЛАВА 2
ГЛОБАЛЬНЫЙ АНАЛИЗ ГРАФОВ
Под глобальным анализом графа мы понимаем
выявление структуры графа и определение характеристик,
необходимых для решения задач. Глобальный анализ
состоит в сборе и организации информации о строении
графа и в выявлении требуемых подструктур с
уточнением инфраструктуры графа относительно выделенных
подструктур. Наиболее распространенным методом
сбора информации является специальным образом
организованный обход вершин и дуг (ребер) графа.
Информация, получаемая таким способом, оформляется в виде
подходящей нумерации вершин.
§ 1. Нумерации, выявляющие логическую
структуру графа
1.1. Нумерацией F вершин графа G называется
инъективное отображение множества вершин V(G)
графа в множество N натуральных чисел, F: ViG) -*■
-*■ N. Иногда нумерация понимается в более широком
смысле. Это либо отображение вида Fk : V (G) —*-
->NxNx ... XN (векторная нумерация), либо
X
отображение множества вершин в некоторое множество
объектов нечисловой природы, например в множество
символов некоторого алфавита, множество слов и т. д.
Пусть F — некоторая нумерация. Номер вершины р
в нумерации F обозначается Fip), а множество
последовательно занумерованных в нумерации F вершин или
последовательно ^-занумерованных вершин {glgeV,
F{q)e={i, ..., /}} —через FU,.j] или через Fiu:v], где
F(u) = i и F(v) =j. Дугу (и, v) назовем обратной дугой
относительно нумерации F, если F(u) > Fiv). О верши-
v В. А. Евстигнеев ^3
нах р, для которых F(u) ^F(p) <F(v), будем говорить,
что они находятся под обратной дугой.
Путь [I = (g = Xi , xi , ..., xin = р) называется
F-путем, если для каждого i s [ 1 : п] выполняется
условие Fixi-J < F(xi). Вершина р называется F-достижи-
мой из вершины q, если существует F-путь из q в р.
Из обширного класса нумераций наиболее важными
для логического анализа графа являются нумерации,
основанные на поиске в глубину (базисные нумерации),
прямая нумерация и аранжировка. Эту группу
нумераций иногда объединяют под названием линейные
нумерации.
1.2. Поиск в глубину есть регулярный обход
графа, называемый иногда стандартным обходом, по
правилам:
1) Находясь в вершине х, нужно двигаться в
любую другую,.ранее не пройденную вершину (если
таковая найдется), одновременно запоминая дугу, по
которой мы впервые попали в нее.
2) Если из вершины х мы не можем попасть в
ранее не пройденную вершину или таковой вообще нет,
то мы возвращаемся в вершину z, из которой впервые
попали в х, и продолжаем поиск в глубину из
вершины Z.
При выполнении обхода графа по этим правилам
мы стремимся проникнуть в глубь графа так далеко,
как это возможно, затем отступаем на шаг назад и
снова стремимся пройти вперед и так далее. При поиске
в глубину в орграфе мы можем попасть в вершину у
из вершины х только в том случае, если в орграфе
есть дуга, (х, у), т. е. мы должны двигаться вперед в
направлении ориентации дуг, а возвращаться против
ориентации. В неориентированном графе таких
ограничений нет.
Отметим несколько свойств поиска в глубину, введя
предварительно два простых вспомогательных
определения. Будем называть дуги, пройденные при поиске
в глубину дважды (в прямом и обратном
направлениях), отмеченными, а путь ц[а, х\ из начала обхода а
в текущую вершину х, не содержащий отмеченных
дуг,— текущим путем.
Свойство 1. После завершения обхода орграфа
при поиске в глубину частичный граф, образованный
отмеченными дугами, есть корневое ордерево с корнем
в начале обхода.
§4
Свойство 2. Для того чтобы после завершения
обхода орграфа при поиске в глубину все вершины
оказались пройденными, необходимо и достаточно, чтобы
обход начинался во входе и этот вход был
единственным. При этом корневое ордерево, образованное
отмеченными дугами, имеет множество вершин,
совпадающее со всем множеством вершин графа, и тем самым
является каркасом графа, называемым деревом поиска
в глубину.
Свойство 3. Текущий путь есть простой путь в
орграфе. Его можно продолжить либо до тупикового,
т. е. заканчивающегося висячей вершиной, либо до
циклического, т. е. до встречи с уже пройденной
вершиной.
М-нумерацией вершин графа называется нумерация
вершин, соответствующая порядку их обхода при
поиске в глубину.
Лемма 1. Для любого простого пути ц =■» ixit ...
..., х,], такого, что Mix{) =min {Mixj)\ 1 </ =S s), вор-
графе найдется М-путъ из Xi в xs для всех /e[l;sj.
Доказательство проведем индукцией по s. Для s = 1
утверждение тривиально. Пусть лемма верна для всех
путей, состоящих менее чем из s вершин. Рассмотрим
путь, состоящий из s вершин. Возможны два случая:
Mix,) > Mix,-J или Mix.) <M(x.-l). В первом случае
справедливость леммы вытекает из определения F-ny-
ти и индуктивного предположения. Во втором случае
имеем Mix,) <Mixt-J и, следовательно, существует
такое /, K/^s-1, что Mix}XMix,)<Mixi+l). Из
определения Ж-нумерации следует, что для любых
трех вершин qu q%, q3, таких, что iqu q2)sEiG) и
Miqi) <Miq,) <Miqz), существует предшественник?
вершины qs, для которого MiqCl ^Miq) < Miq3).
Например, это может быть вершина, из которой мы
впервые попали в q, (рис. 2.1). Применяя это замечание
вначале к вершинам х^, xi+u xs, убеждаемся в
существовании вершины у, из которой х, Ж-достижима я
для которой выполнено соотношение Mix,) < Miy) <
<Mix,). Повторное применение этого же замечания,
но уже к вершинам xit xj+i, у и т. д. в силу конечности
графа приводит к нахождению Л/-пути из Xj в х,.
Следствие. Всякая вершина орграфа с одним
входом М-достижима из него.
После завершения поиска в глубину все дуги
орграфа разбиваются на четыре класса.
3* 35
1. Класс Т древесных дуг, порождающих дерево
поиска в глубину; для каждой дуги ix, у) е Т имеем
Mix) <Miy).
2. Класс F прямых дуг, к которому относятся дуги
ix, у) такие, что Mix) < Miy) и вершина х соединена
с у путем, состоящим из древесных дуг.
Л(6Г-
3. Класс В обратных дуг, представляющих собой
дуги вида ix, у) такие, что Mix) > Miy) и вершина у
соединена с х путем, состоящим из древесных дуг.
4". Класс С поперечных дуг, представляющих собой
дуги вида ix, у).такие, что Mix) > Miy) и вершины х
и у не соединены путем,
состоящим из древесных дуг.
Основное свойство
поперечных дуг — неравенство
Mix) > Miy) — доказывается
просто. В самом деле,
если ix, у) — поперечная дуга,
то это означает, что
вершина у — конец дуги — была
пройдена при поиске в
глубину раньше и существует
вершина г, в которую мы
вернулись, прежде чем
пошли в вершину х.
Пример Л/-нумерац:ип,
построенной поиском в
глубину, показан на рис. 2.2. Жирными линиями
выделены древесные дуги, тонкими линиями — прямые,
штриховыми — обратные и пунктиром — поперечные.
1.3. Алгоритм поиска в глубину и построегаия М-
нумерации в ориентированном графе.
Вход: Граф G = iV, E), заданный списками
смежности Aiv) для сеУ, с множеством входныж
вершин V„.
36
Выход: Af-нумерация вершин и разбиение
множества Е на четыре класса: древесных дуг Т, прямых
дуг F, обратных дуг В и поперечных дуг С.
начало
процедура ПОИСК (у, N);
начало
1. присвоить вершине у номер M{v)—N;
2. yV:=Ar+l;
3. для w^Aiv) цикл
4. если вершина w не имеет ^/-номера то
5. начало
6. добавить (у, w) к Т;
7. ПОИСК (w, N);
8. конец
9. иначе начало
10. если Л/-номер вершины w больше М-номера
вершины у то
11. добавить (у, w) к F;
12. иначе если существует М-путь из w в у то
13. добавить (у, w) к В;
14. иначе добавить (у, w) к С;
15. конец
16. конец
17. Г-0; ^*-0; Я-0; С+-0; #:=1:
18. для у е У0 цикл
19. пометить вершину у как не имеющую номера;
20. пока существует вершина deF, без Ж-номера
цикл
21. ПОИСК (у, Ю;
22. конец
1.4. Стеком называется список, у которого элементы
добавляются или удаляются только на одном конце
списка — вершине стека. В другую 'сторону список
имеет неограниченную длину. Другими словами, в стеке
элементы вставляются или удаляются по принципу
«последний вошел — первый вышел». Часто стек
реализуется в виде одного массива, как показано на
рис. 2.3. Новый элемент помещается в вершину стека,
а все хранящиеся там элементы сдвигаются в глубь
стека. Удалить можно только элемент, находящийся
в вершине стека, при этом остальные элементы
поднимаются на один шаг вверх. Иногда стек обозначает
стековую память, когда разрешается считывать
содержимое стека без изменения элементов ниже вершины.
37
Использование стека упрощает реализацию алгоритма
поиска в глубину. Присвоение Л/-номера происходит и
тот момент, когда вершина включается в стек;
удаление вершины происходит в момент, когда оказываются
пройденными все дуги, исходящие из данной вершины.
вершина ->
•
*э
х,
*|
•
=ф
*1
Ха
х,
Xi
*
Рис. 2.3.
N-нумерацией вершин называется нумерация, при
которой номер п, где п — число вершин в графе,
присваивается первой выброшенной из стека вершине,
номер (и —1) — второй вершине и т. д. Л/-нумерация,
а следовательно и соответствующая N-нумерация,
определяется для данного графа с одной входной
вершиной произвольно, но N-нумерация для построенной
Л/-нумерации определяется.однозначно. Это
иллюстрирует рис. 2.4,
т>Ш
«(и;
ЫЦ5)
в? №4)
Из леммы 1 следует, что если s — единственный
вход графа, то N{s) = 1 и для любой вершины v
существует iV-путь из s.
38
1.5. Поиск в глубину в неориентированном графе
отличается от поиска в глубину в орграфе тем, что все
ребра разбиваются только на три класса: класс
древесных ребер, класс ребер касания и класс прямых ребер.
Класс ребер касания соответствует классам обратных
и поперечных дуг в орграфе. Изменения, которые
нужно внести в алгоритм поиска в глубину, очевидны.
Поиск в глубину в неориентированном графе превращает
■—>
исходный граф G в орграф G, индуцируя на каждом
ребре ориентацию, совпадающую с направлением
прямого прохождения.
Трудоемкость поиска в глубину определяется, во-
первых, тем, что каждая вершина должна быть
рассмотрена и ей должен быть приписан номер (это
требует О(п) операций для /г-вершинного графа), и, во-
вторых, тем, что должна быть рассмотрена каждая
цуга или каждое ребро (это требует О(т) операций
для графа с тп дугами). Так как обычно тп>п, то
отсюда следует, что общая трудоемкость поиска в
глубину и в орграфах, и в графах равна О(гп).
1.6. Нумерация F называется аранжировкой или
А-нумерацией, если каждый простой путь из входа s
одновходового графа является F-путем. Граф
называется аранжируемым, если он допускает аранжировку.
Пример аранжируемого графа приведен на рис. 2.5, а,
пример неаранжируемого — на рис. 2.5, б. На факт не-
аранжируемости указывает
наличие в графе двух путей
из входа s в вершину v2,
один из которых содержит
вершину vs, а второй — нет.
Любое отношение порядка
между v2 и Vi нарушает
условие существования
аранжировки. Построение
аранжировки для ациклического
графа проводится по
следующему алгоритму.
Вход: Граф G = (V, Е),
заданный списками
смежности A(v) для v<sV, с множеством входных
вершин V0.
Выход: Аранжировка (Л-нумерацпя) вершия
графа.
Рис. 2.5.
39
1. начало
2. процедура АРАНЖИРОВКА (и, Ю;
3. начало
4. присвоить вершине v номер A{v) — N;
5. N:=N+\;
6. для »ei(i;) цикл
7. если все предшественники вершины w имеют А-
номера то
8. АРАНЖИРОВКА (w, N);
9. конец
10. N:=U
И. для »sF, цикл
12. пометить вершину v как не имеющую Л-номера;
13. пока существует вершина реУ, без Л-номера
цикл
14. АРАНЖИРОВКА (у, ЛО;
15. конец
Из ^-достижимости любой вершины в графе с
одним входом вытекает, что для ациклического
(бесконтурного) орграфа аранжировка совпадает с iV-нуме-
рацией. •
Лемма 2. Пусть G(p) — сильно связный граф,
каждый контур которого проходит через выделенную
вершину р; тогда граф G(p) аранжируем с А(р) = 1 и
аранжировка совпадает с N -нумерацией при поиске в
глубину с началом в вершине р.
Для доказательства достаточно заметить, что после
удаления дуг, заходящих в вершину р, граф G{p)
превращается в бескоитурпый.
Следствие. Если граф содержит сильно связный
подграф, в который заходят по крайней мере две дуги,
то такой орграф неаранжируем.
Теорема 1. Граф аранжируем, если в каждый
сильно связный подграф заходит точно одна дуга.
Доказательство. Построим для
рассматриваемого графа граф конденсации, или граф Герца, стянуз
все его бикомпопеиты в вершины. Полученный граф
является ациклическим и потому аранжируемым. Из
леммы 2 следует, что любая система вложенных зон,
в каждую из которых заходит только одна дуга,
представляет собой аранжируемый граф, аранжировка
которого совпадает с /V-нумерацией. Комбинируя
исходную Л-нумерацию графа конденсации и Л-нумерации
бикомпонент, построим Л-нумерацию исходного графа.
40
1.7. Прямая нумерация. Формальный цикл
относительно нумерации F есть подграф, порожденный:
а) вершинами F.[i:k] в том и только том случае,
если существует обратная дуга (vk, vf) и не существует
дуги (vm, Vj) такой, что К / =S/с < m (такой
формальный цикл носит название примитивного);
б) вершинами Fhh : kl, если он либо примитивный
формальный цикл, либо если найдутся формальный
цикл Fli:k] и некоторая дуга (у„ 1?Л) такая, что h <
<i^j <k.
Более интуитивное, но менее точное определение
формального цикла состоит в следующем. _Для каждой
обратной дуги (vh, vt) существует формальный цикл R
с головной вершиной vf, который строится в
соответствии с правилом:
Вначале R есть Fli: к]. Если найдется обратная
дуга из вершины цикла R в вершину вне R, отличную
от vt, т. е. (.Vj, Vh), h<i^j<k, то R расширяется за
счет включения в него вершины vh и всех вершин
между ними, т. е. полагаем R = F[h:k]. Эта. процедура
повторяется так долго, как это возможно;
результирующее множество вершин порождает формальный цикл.
Примеры формальных циклов приведены на рис. 2.6.
Заметим, что множество под
обратной дугой не обязательно
формальный цикл или зона
(рис. 2.6, б).
Нумерация F называется
прямой, если она
удовлетворяет условиям: а) каждый
формальный цикл есть зона; б) для
любой вершины графа
существует F-путь из начальной
вершины графа в нее; в) для
любой обратной дуги (vk, vt) су- Рис 26
ществует F-путь из ее начала
в каждую вершину vu je=[i:k] (вершину под
обратной дугой). Эти условия независимы (рис. 2.7).
Построение прямой нумерации производится на
основе М-нумерации.
Вход: Граф G = (V, E), заданный списками
смежности A(v) и обратными списками смежности B(v),
с построенной Ж-нумерацией.
Выход: Прямая нумерация (/'-нумерация) вершин
графа.
41
начало
1. процедура ПЕРЕНУМЕРАЦИЯ (vu Lt);
2. начало
3. пока Ь{ Ф 0 цикл
4. выбрать вершину у, с наименьшим Ж-номером
из L{;
а) И 5) <5) и 6) •* Щ
Рис. 2.7.
5. если у( не помечена то
6. пометить Vi\
7. иначе переход к шагу 23;
8. для всех помеченных вершин w цикл
9. если t < к < п Л vh& В (w) то
10. пометить vk;
11. продолжать цикл, пока это возможно;
12. £: = наибольший Л/-номер помеченной вершпны;
13. для и = i + 1 пока и < t цикл
14. если у„ не помечена то
15. включить vu в U;
16. /:=i+l;
17. для каждой помеченной вершпны w в порядке
возрастания их Ж-номеров цикл
18. M{w):=j;
19./: = /+1;
20. для каждой вершпны v из V в порядке
возрастания их М-номеров цикл
21. ЖЫ:=/;
22./: = /+!;
23. L,:=L,-{»,};
24. конец
25. i:=rc; примечание (и = [VI);
26. для VjeB(Vt) цикл
42
27. если i<j<n то
28. v, e Li\
29. пока i > О цикл
30. стереть все метки;
31. ПЕРЕНУМЕРАЦИЯ (v,, U;
32. i:=i-l;
33. для neF цикл
34. Hi;):=Mi;);
35. конец
Для данной Ж-нумерации прямая нумерация
определяется однозначно, но обратное неверно. Для
доказательства того, что приведенный, алгоритм
действительно порождает прямую нумерацию, рассмотрим ряд
вспомогательных, утверждений.
Л е м м а 3. Если для исходной М-нумерации в графе
существовал М-путь из а в Ь, то тот же самый путь
будет и Р-путем для прямой нумерации,
индуцированной исходной М-нумерацией.
Доказательство. Если в исходном графе
выполнялось соотношение Mia) < Mib), то это
соотношение выполняется и для индуцированных Р-номеров,
если только вершина а на шаге 14—15 не попадет
в множество U, в то время как вершина Ь будет
помеченной. Но в таком случае не может существовать Ж-
путь из а в Ь, так как иначе а должна быть
помеченной по определению процесса расстановки меток и
находиться среди помеченных вершин, а не в U.
Следствие. Для каждой дуги (а, Ь) разность
Р(Ь) — Р{а) имеет тот же знак, что и знак
соответствующей разности для исходной М-нумерации.
Лемма 4. Алгоритм построения прямой нумерации
проверяет каждую вершину в точности один раз на
возможность использования ее в качестве начальной
вершины контура в порядке, обратном порядку,
устанавливаемому М-нумерацией.
Доказательство. В каждый момент работы
алгоритма все множество вершин делится на два
непересекающихся подмножества А = {v\ Miv)<i) и В =
= {v\ Miv)>i}. Изменение нумерации вершин на
шагах 17—22 при рассмотрении вершины не изменяет ни
упорядочения вершин в А, ни состава множества А;
уменьшение индекса i на шаге 32 просто удаляет
вершину с наибольшим Ж-номером из А и переводит ее
в множество В для проверки на возможное начало
43
контура. Значение i никогда не увеличивается, так что
ни одна вершина из Б не удаляется.
Для конечного графа алгоритм построения прямой
нумерации завершается за конечное число шагов. Это
вытекает из того, что при проверке каждой вершины
на возможность использования ее в качестве
начальной вершины контура проверяется конечное число
вершин для каждой обратной дуги, число которых также
конечно, и новых обратных дуг при работе алгоритма
не появляется.
Использованный термин — начальная вершина
контура — отражает семантику алгоритма построения
прямой нумерации в том смысле, что изменение нумерации
на шагах 17—22 может пониматься как отыскание
возможного контура, проходящего через
рассматриваемую вершину — начальную вершину потенциального
контура,— в виде множества вершин Mli:t\, а затем
удаление вершин, не входящих фактически в контур,
путем простей перенумерации (чистка потенциального
цикла).
Лемма 5. Алгоритм построения прямой
нумерации включает новую вершину vk в множество [va:vc]
под обратной дугой (ус, va), Miva) ^ M(vc), только во
время чистки некоторого потенциального цикла ,с
начальной вершиной vb, причем до чистки выполняется
соотношение M(va) < M{,vb) < M{vc) < M(vh).
Доказательство. Если вершина vh не
содержалась до чистки цикла в [va:vj, то либо Mivk) <
<Л/(у„), либо M(vc) <Mivk). Рассмотрим случай, когда
(до чистки) M(vk) < M(va). Алгоритм может изменить
порядок vha_ va только в том случае, если vk<^ U и va e
еМ (у0е.м означает, что va помечена) для некоторой
чистки. Заметим, что если va s M во время чистки, то
и vc будет помечена, так как существует дуга (vc, vj.
и Miva) «£ M(vc). Таким образом, даже если vk^U во
время чистки, то результирующий порядок будет тот
же: M{vJ «£ M(vJ <M(vh) и vk не будет включена в
множество [va: vc].
Рассмотрим второй случай: MivJ <M(vh), vc^U и
vh помечена. Этот случай может дать в результате
порядок Mlva) <M(vh) < M(vc). Рис. 2.8 иллюстрирует
эту ситуацию. Но если это — окончательный порядок,
то va^ U во время чистки (иначе чистка поменяла бы
порядок вершин va и vb); va также не помечена, а
вершины va и vb не совпадают, тогда vc должна быть по-
44
Рис. 2.8.
мечена. Поатому va&[vb: va]. Так как vc e V <=■ lvb: va]
и M(va) ^ M{vc), то имеет место окончательно
соотношение M(va) < M(vb) < M(vc).
Теорема 2. В графе с прямой нумерацией,
построенной описанным выше алгоритмом, для каждой
обратной дуги (vc, va) с P(va) =б Pivc) существует Р-
путъ из начальной вершины цикла va в множество
вершин {vj таких, что P(va)<
<P(vkXP(vc).
Доказательство.
Утверждение теоремы
справедливо для М-нумерации.
Лемма 3 показывает, что эти
пути одновременно являются
и Р-путями. Поэтому
достаточно показать, что алгоритм
не добавляет новых вершин
в lva:vc], к которым не
существует М-путей из va.
Доказательство проводится
следующим образом: пусть
в начале ~ любой чистки теорема верна; покажем,
что чистка не влияет на справедливость теоремы. Пд
лемме 5 любое включение вершины vh в множество
[va:vc] может произойти только тогда, когда
происходит чистка цикла с начальной вершиной vb, такой, что
M(va) < M{vb) < M(vc) < Mivh); поэтому по
предположению у нас есть М-путь из va в vb (так как
существует дуга {vc, va) и M(va) <Mivb) <Mivc)). Для чистки
потенциального цикла с начальной вершиной -vb и
конечной vt (ее индекс определяется на шаге t)
процедура расстановки меток гарантирует существование пути
внутри множества М* = М U {v„} (M — множество
помеченных вершин) из каждой помеченной вершины vm
в vb. Каждый такой путь должен включать обратную
дугу (vy, vx), такую, что M(vb) ^M(vx) ^M(vm) ^M(vy).
По предположению либо vm = vx, либо существует М-
путь из vx в vm. Но заметим, что vx сама в М*, так
что либо vx = vb, либо существует М-путь из некоторой
начальной вершины цикла v2, M(vb) < M(vz) <M(vx),
в vx, по тем же соображениям. Ясно, 'что эта
последовательность начальных вершин циклов с
уменьшающимися номерами, превышающими (или равными) М-но-
45
мер вершины vb, ведет в vt, откуда следует
существование Р-пути из vb к каждой помеченной вершине,
включая vh. Соединяя эти два пути вместе, получаем
Р-ПутЬ ИЗ'Ув В Vb И В Ь\.
Следствие I. В процессе - работы алгоритма ни
одна вершина не включается в ранее вычищенный
потенциальный цикл, т. е. в множество lva'.vb], где
va — начальная, vb — конечная вершины для некоторой
предыдущей чистки.
Следствие 2. Для ранее вычищенного цикла.
[Va'.Vbl существует Р-путъ из va к каждой вершине vh,
для которой выполнены неравенства M{va)<M(vk)^
<M(vb).
Лемма 6. В процессе работы алгоритма не
удаляются вершины us ранее вычищенных потенциальных
циклов. Другими словами, для данного вычищенного
цикла [va: vc] и любой вершины vb, такой, что M{va) <
<M{vb) <M{ve), алгоритм не меняет взаимного поряд'
ка вершин va, vb или vb, vc.
Теорема 3. Порождаемая алгоритмом нумерация
есть прямая нумерация.
Доказательство. Из леммы 3, следствия
леммы 1 и- теоремы 2 следует, что нумерация,
порождаемая алгоритмом, обладает свойствами б) и в)
определения прямой нумерации. Остается показать, что
каждый формальный цикл lvh:vt] есть сильно связный
подграф. Как было отмечено ранее, процедура
расстановки меток гарантирует существование внутри
множества М* = М U {vj Ж-пути из любой вершины vh е
е М к начальной вершине vh вычищенного
потенциального цикла. По следствию 2 теоремы_2
существует М-путь из vh в любую вершину Vj из М. Поэтому
М* есть сильно связный подграф, и, таким образом,
М* = lvh: vj есть вновь вычищенный цикл.
Было уже показано (следствие 1 теоремы 2 и
лемма 6), что в процессе работы алгоритма вершины
не добавляются и не удаляются из уже вычищенного
цикла. Поэтому по окончании работы алгоритма все
формальные циклы суть сильно связные подграфы.
Остается показать, что каждый формальный цикл был
либо вычищенный потенциальный цикл, либо сильно
связный подграф. Пусть [va:vb] есть формальный цикл
после завершения работы алгоритма. По определению
формального цикла существует обратная дуга {vc, va)
с M(vt) ^ Mivt) ^M{vb), которая в силу следствия
46
леммы 3 и леммы 4 инициирует чистку, если только
не выполнены условия; 1) vc = va или 2) vc
помечается, когда проверяется дуга (ve, i>„). Случай 1)
соответствует наличию петли, которая не оказывает влияния
на построение Ж-нумерации, • ни на построение Р-ну-
мерации. В случае 2) vc может быть помечена только
тод'да, когда она была в [va\ vd], т. е. в~ранее
вычищенном цикле с той же самой начальной вершиной.
Чистка цикла [va:vd] могла быть инициирована только при
рассмотрении обратной дуги (vh, i>„), для которой
M(va) < M{vh) <M{vc) в силу порядка, в котором
обрабатываются вершины. Из теоремы 2 и следствия 2 из
нее, очевидно, вытекает наличие М-пути из vh в 1>с.
Таким образом, если даже все метки будут стерты и
процедура расстановки меток начнется снова, но уже
с вершины ve, то vh будет снова помечена, а также
будут помечены вершины из [va: VjWivJ; другими
словами, тот факт, что обратная дуга (ис, i>„) при ее
рассмотрении -не инициирует чистку, не может привести
к результату, отличному от того, который был бы
получен, если бы такая инициализация имела место.
Таким образом, мы можем предположить, что по крайней
мере [va: vc] было вычищено.
П,о определению формального цикла либо [va:vc]^
^Iva'.Vbl, либо найдется некоторая дуга (i>„ vs), для
которой M{va) < M(vf) «s M(vc) < Mivg). Если такая
дуга существует после завершения работы алгоритма,
она должна была буществовать и тогда, когда чистился
iva'. ve], так как по лемме 6 vt не могла бы быть
удалена после этой чистки, а по следствию 1 теоремы 2
V) не может быть включена; по следствию леммы 3
обратная дуга порождает неравенство M(vf) < M(vs) во
время работы алгоритма. Но тогда множество вершин,
подвергающихся чистке, должно быть по крайней
мере Iva'.Vg]. Продолжая те же рассуждения (конечное
число шагов), покажем, что подвергнувшийся чистке
потенциальный цикл был по крайней мере lva:Vb).
Так как нет дуги- (vk, vs) с M{va) < M{vs) «S M{vb) <
<M(vh), то по определению формального цикла не
возникает ситуации, при которой бы чистился цикл
[va'.Vt]. Таким образом, вычищенный цикл был в
точности lva: и*]. Теорема доказана.
1.8. F-областъю Fip] вершины р для некоторой
нумерации F, такой, что Fip) = i, называется множество
47
тех.вершин графа G, из которых достижима вершина
р в подграфе, пороя;денном верцшнами из Fli:n].
Пусть фиксирована некоторая М-нумерацпя и
связанная с ней Л7-нумерация. Вершина v называется
бивершиной, если для любого индекса i<N(v) имеем
>eMi].
При м е р. Для графа с iV-нумерацией па рис. 2.4
имеем NivJ = {vA, 'NlvJ ={vj, NlvJ = {vj, N[vJ =
= {Vi, vA, N[vA = {vA, N[vJ={ve, vu vA, .NivA =
= {v7, va}, NivA = bj, NivJ={va}, N[vi0]=>{vi0).
В этом графе бивершинами являются вершины vu v2,
vs, Vi, v6, va, vi0.
T-нумерацией называется нумерация, обладающая
следующими свойствами:
а) для любых двух бпвершин р и q соотношение
Tip) < Tiq) выполняется тогда и только тогда, когда
N(p)<N(q);
б) для любой бивершины р имеем
N[p]=T[T(p): Пр) + \№р]\-И.
Так как'для построения Г-нумерацин необходимо
уметь строить множество F-областеп, опишем алгоритм
построения F-областей в виде процедуры-функции
ОБЛАСТЬ (F, р).
функция ОБЛАСТЬ (F, р);
начало
1. включить р в пустое множество А;
2. включить р в пустое множество4В;
3. пока А ФО цикл
4. выбрать и удалить любую вершину q из А;
5. для всех w из Г_1(<?) цикл
6. если F{w) > F{p) Д w Ф В то
7. добавить w в В;
8. добавить w в А;
9. конец цикла;
10. конец цикла;
конец
Область (F, р) определяется множеством вершин В.
Алгоритм, построения Г-нумерации:
Вход: Граф G = (V, E) с iV-нумерацией вершин.
Выход: Г-нумерация вершин и множество BV би-
вершин.
начало
1. ВУ:=0, Г1:=1;
2. для к от 1 до п шаг 1 цикл
43
3. выбрать вершину г, у которой N(z) =- к;
4. если z не имеет У'-номера то
5. положить T(z) равпым Т\;
6. Г1:=Г1 + 1;
7. добавить г к множеству BV;
8. положить А равным ОБЛАСТЬ {N, z)\{z);
9. пока А Ф 0 цикл
10. выбрать и удалить некоторую вершину v из А;
11. положить T(v) равпым Т\\
12. Г1:=Г1 + 1;
13. конец цикла;
14. конец цикла;
конец
Пример графа с N- и Г-нумерацией приведен на
рис. 2.9.
Поскольку каждая вершина графа принадлежит в
точности одной выделенной Л'-областн, то трудоемкость
построения Г-нумерацин равна 0{т), где т —
число дуг.
1.9. К-нумерация определяется как последний член
последовательности К, — N, К2, ..., Кп — К, в которой
для любого i е [1 ; п— 1] имеем следующее:
1) Ks+i(p) — КАр) для каждой вершины ре
2) для любых двух
вершин р, q s Kt[i: п]
справедливо неравенство
Ki+,(p) < Ki+I(q) тогда и
только тогда, когда
выполнено одно из свойств:
а) p^Ktii] и q&Kili];
б) Ki(p) < KAq) и либо
{р, q}^Ki[i], либо рФ
&Ki[i] и q&K,[il.
Алгоритм построения /sT-нумерации:
Вход: Граф G = {V, E) с ЙГГнумерацией вершин.
Выход: ^,+1-нумерацня.
начало
1. выбрать вершину z такую, что Kt(z) = i;
2. положить Множество А равным ОБЛАСТЬ {Ki, z);
3. ilfl:=i; M2:=i+\A\;
4. для k от 1 до п шаг 1 цикл
5. выбрать вершину и такую, что КАи) = к;
4 В. А. Евстигнеев
49
6. если к < i то
7. положить Fl(u) равным к;
8. ггначе если и е Л то
9. положить Fi(u) равным Л/1;
10. Л/1::= Л/1 + 1;
11. иначе положить FKh) ранным Л/2;
12-. Л/2 := Л/2+1;
13. конец цикла;
конец
В качестве /£<+1-нумеращга берется нумерация F1.
1.10. Назовем F-линией в некотором множестве
вершин [i:j] множество тех вершин подграфа FU:j], из
которых F-достижимы его выходные вершины. F-ран-
гом Rip) вершины р в [i:j] назовем величину
max (ij {F(p)\ р^А}), где А — множество тех вершин
F-линии в [i'.j], из которых F-достнжима вершина q.
L-нумерация есть последний член
последовательности Ln — K, Ln-i, . •., L0 = L, в которой для каждого
£е [1 : п] имеем следующее:
1) Lt-,(p) = Lj(p) для любой вершины р, не
входящей в Lt[i: i+ \Ltli] 1 — 1];
2) для любых двух вершин р и q из 'Lt[i:i +
+ IZJill — 1] неравенство Li-i(p) < L^^q) будет иметь
место тогда и только тогда, когда выполнено одно из
свойств:
а) р и q имеют один и тот же £гранг в [i:i +
+ |£,Ш| — 1J, и имеет место неравенство Lt(p) <L,(gO;
б) L(-panr вершины q в [г: £+ \Lt[i] | — 1]
превышает соответствующий Lj-ранг вершины р.
Алгоритм построения L,-i -нумерации
по данной Lj-нумерации:
Вход: Граф G = (F, E) с. построенной
/^-нумерацией.
Выход: /.(-^-нумерация для каждого is [1;«].
начало
1. .процедура РАНГ (F, i,/);
2. пусть LI есть /'-линия для Fli:j];
3. для всякой вершины v из Fii-.j] положить R(v)
равным i;
4. для s от / до i через — 1 цикл
5. выбрать вершину v, для которой F(v) равен s;
6. если v e Li то
7. для всех w из Б(у) цикл
8. если i s£ F(u>) < F(y) то
50
9. добавить w в множество Li;
10. конец цикла;
11. конец цикла;
12. для s от Гдо / через 1 цикл
13. выбрать вершину v, для которой F(v) равен s;
14. если v e Li то
15. положить R(v) равным F(v);
16. для всех w из A(v) цикл
17. если F(u) < F(u>) </ то
18. положить R(w) равным максимуму из R(v)
и RM;
19. конец цикла;
20. конец цикла;
21. возврат R;
22. выбрать вершину и, у которой L((«) равен i;
23. ; :=» i+ I ОБЛАСТЬЮ, и) I - 1; .
24. положить R равным РАНГЧЬ,, i, /):
25. для каждого s из [i: / + 1] положить ЧИСЛО (s)
равным нулю;
26. для всех v пз £,•[£: /] цикл
27. положить ЧИСЛСКДЫ + 1) равным ЧИСЛСХДЫ.
+ D + 1;
28. конец цикла;
29. для 5 от г до / шаг \ цикл
30. установить ЧИСЛОМ + 1) равным ЧИСЛОМ + 1)
+ ЧИСЛОМ);
31. конец цикла;
32. для s от 1 до п шаг 1 цикл
33. выбрать вершину v, у которой Liiv) равен s;
34. если se[i;j] то
примечание в данный момент для любого fs
&li:j] ЧИСЛОМ) обозначает количество тех вершин
v из L,[i:j], у которых либо R(v)<t, либо R{v)~t и
L^v) < s конец примечания
35. установить L)(v) равным i +ЧИСЛО(/?Ы);
36. положить ЧИСЛб(ДЫ) равным ЧИСЛОСДМ)
+ 1;
37. иначе установить L-X{v) равным L^v);
38. конец цикла;
39. в качестве Li-i взять L{;
конец
Трудоемкость алгоритма складывается из
трудоемкости вычисления i и R, что составляет 0{т), и трудо-.
емкости переписывания /^-номеров, что составляет
51
0(п). В итоге трудоемкость алгоритма есть 0{т), а
построение £-нуи!ерации в целом имеет трудоемкость
0{пт).
W-нумерация
К-нумерация
Рис. 2.10.
L- нумерация
На рис. 2.10 изображен граф, у которого L, = L6 =
= L5 = Li = L3 = L2 = K, Lt = L0 = L, L2[L2(v2)l = iv2,
V3,Vi,v5,v6}; следовательно, L2l2 : 6] = {v2, v3, vk, .vb, ve).
Здесь £2-лпния в [2:6]
образована вершинами v2, vk
и vt. Вершины v2 и v3
имеют один п тот же £2-ранг
в [2 : 6], так же как и
вершины иъ и ve.
Другой пример графа и
возможной L-нумерацни
его вершин приведен на
рис. 2.11. Вершины графа
помечены М-номерами, N-
номера и L-номера
указаны в скобках (первым N-номер, вторым L-номер)
рядом с соответствующими вершинами.
Рис. 2.11.
§ 2. Логический анализ управляющих графов.
Линейные компоненты и компоненты
сильной связности
2.1. Матрица достижимости и транзитивное
замыкание. В том случае, когда необходимо установить
лишь факт наличия путей между вершинами,
возникает задача о построении транзитивного замыкания
орграфа.
52
Транзитивным замыканием G* графа G называется
орграф с тем же множеством вершин, что и G, но в
котором дуга из Xi в Xj идет тогда и только тогда, когда
вершина Xj достижима в G из хи
Матрицей смежности транзитивного замыкания G*
орграфа G служит матрица достижимости ДСО графа
G. Простейший, но не самый эффективный из
известных алгоритмов построения матрицы достижимости
состоит в последовательном изменении строк матрицы
смежности до получения строки матрицы
достижимости.
Вход: Матрица A(G) смежности орграфа G,
состоящая из строк Аи Аг, ..., Ап.
Выход: Матрица достижимости R(G), состоящая
из строк Ri, R2, ..., Rn-
начало
1. для i от 1 до re шаг 1 цикл
2. сформировать множество / индексов / таких, что
3. Д,:=Л; Я:=0;
4. пока J =£ 0 цикл
5. выбрать / е /;
6. Д,:=Д,елЛ;
7. /:=/\{/};
8. K:=KU{j);
9. сформировать множество h индексов к таких, что
ял= 1;
10. /:=»ДШ,\Ю;
11. конец цикла;
12. возврат #,;
13. конец цикла;
конец
Пример. Для графа G на рис. 2.12 матрица
достижимости R имеет вид
1
1
0
0
1
1
0
0
1
1
1
1
1
'1
1
1
а его транзитивное замыкание G* показано на рис. 2.13.
Более эффективным является алгоритм Уоршалла
(Warshall). Этот алгоритм находит матрицу R путем
вычисления последовательности квадратных матриц
53
В", В\ ..., Бп порядка п в соответствии со следующими
правилами:
начало
1. Я°: = ЖС);
2. для I от 1 до п шаг 1 цикл
3. Bllj = Blifl®[Blul&B\j1];
4. конец цикла;
5. Д:=5П;
конец
Если придать значениям 5jj надлежащий смысл,
то легко убедиться, что алгоритм работает правильно.
Действительно, мы хотим, чтобы 5у было равно 1
A(G)
Рис. 2.12.
0 i i 0
1 0 0 1
0 0 0 1
0 0 10
Рис. 2.13.
тогда и только тогда, когда вершины xt и х3 связаны
путем через промежуточные вершины только пз
множества {х{, хг, ...,,£,}. Заметим, что начальный
шаг В0 := A(G) (путь без промежуточных вершин) п
конечный шаг R := Вп (путь через любые
промежуточные вершины) согласуются с таким пониманием
смысла В\у Формула же итеративного шага выражает
только тот факт, что для х{ и xi: связанных путем,
промежуточные вершины которого принадлежат
множеству U',, ..., з-;}, необходимо и достаточно выполнение
одного или обоих условии:
1. Существует путь от х,- до х,-, все промежуточные
вершины которого принадлежат множеству {хи ...
. . ., Xi-if.
2. Существуют пути от х{ до xt а от xt до Xj, все
промежуточные вершины которых принадлежат
множеству {.?!, . . ., Xl-i).
2.2. Матричный алгоритм отыскания бикомпонент
орграфа. Знание матрицы, достижимости позволяет
выявить все компоненты сильной связности в орграфе.
Определим поэлементное, цли адамарово, произведение
54
матриц S = li6ytl и C=flc«H по правилу: ВХС =1\ЬцХ
X c,jll. Тогда вершины бикомпоненты орграфа,
содержащей вершину Хх, определяются единичными
элементами t-ii строки матрицы R X Дт, где RT —
транспонированная матрица достижимости. Отсюда следует, что,
вычислив поэлементное произведение матриц R и RT
и разбив все ненулевые строки этого произведения на
группы одинаковых строк, мы можем определить
множества вершин каждой бикомпоненты, поскольку
номера строк однозначно определяют номера вершин,
входящих в бикомпоненту.
2.3. Более эффективные алгоритмы отыскания би-
компонент основаны на обходе графа, реализующего
поиск в глубину. В основе их лежат утверждения, в
формулировке которых будем предполагать, что биком-
понента может состоять из одной вершины.
Лемма 7. Если u= \v± , .,., vih\ — тупиковый путь
в графе G, то:
а) Ik'ihl— бикомпонента графа G;
б) множество бикомпонент орграфа G' = (-^\ {vik\t
U'), получаемого из G удалением вершины [vik] и
смежных с нею дуг, отличается от множества
бикомпонент графа G в точности на бикомпоненту [fiji
в) ц «= 1у4 , .. ., ^ih]— простой путь в G.
Лемма 8. Если и = [%> • • • г vik\ — простой путь
в G и vik*= v\t для s < к — 1, то
а) контур C=[yjs, vu+v .. ., uifc «= vu]
принадлежит какой-нибудь бикомпоненте;
б) отождествление всех вершин контура С не
меняет множества бикомпонент;
в) путь ц = [i>i , . . ., via], где Vit— вершина,
получившаяся в результате отождествления вершин
контура С, есть простой путь.
Вход: Граф G = (V, E), заданный списками
смежности А (у).
Выход: Список В бикомпонент.
начало
1. процедура БИКОМШЕш! (7Т));
2. начало
3. y:=End(7T);
4. для w e A(v) цикл
5. если А Ы ¥= 0 то
55
6. если S(w) = 0 то
7. ТТ <= w;
8. 5(u?):=l;
9. БИКОМПЫ;
10. иначе примечание вершина w находится в
стеке ТТ конец примечания
11. стянуть хвост стека ТТ, начиная с вершины w,
в вершину w, т. е. удалить, начиная с вершины w,
хвост стека ТТ, запомнить удаленные вершины и
вместо вершимы w занести в стек вершину w\
12. взять в качестве новых списков смежности
объединение списков смежности стянутых вершин;
13. БИКОМШйО;
14. иначе удалить v из стека ТТ и занести v в
список В бикомпоиент;
15. БИКОМШЕпсНГЛ);
16. конец цикла;
17. возврат В;
18. конец процедуры БИКОМП;
19. ТТ : = пустой стек;
20. для каждой реУ цикл положить S(v) равным
нулю;
21. выбрать вершину v0 с S(v0) — Q;
22. ТТ о iv,
23. 5(у0):=1;
24. БИКОМПЫ;
конец
Трудоемкость алгоритма равна 0(\Е\ + I V| log IVI),
так как он представляет собой уточнение поиска в
глубину, в ходе реализации которого требуются некоторые
дополнительные операции при прохождении каждой
дуги. Кроме того, каждая вершина один раз
включается в стек и в точности один раз исключается из него.
Пример. Для графа G на рис. 2.14 матрицы
смежности и достижимости показаны на рис. 2.15. Матрица
M = RXRT и список В бикомпоиент приведены на
рис. 2.16. Последовательные фазы отыскания
бикомпоиент с помощью описанного алгоритма показаны на
рис. 2.17.
2.4. Введенные в § 1 различные типы нумерации
вершин орграфа, в частности ^-нумерация, позволяют
выделить подграфы различного вида, в том числе
и бикомпоненты.
Лемма 9. Для любого i^[i:n] подграф N[i]
является сильно связным.
56
Доказательство. Пусть Mil отличен от
тривиального подграфа и'р— его вершина, N-номер которой
равен i. Рассмотрим вершину q из Nip], отличную от
р, и предположим, что M(q) > М(р). Тогда из
определения f-области и определения Л/-нумерации вытекает
Рис. 2.14.
А(С) =
0 10 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
01011000 0 000
000 0 01 1 000 0 0
00000001000 0
00000 0 1000 0 0
0 0000001 0100
000000001010
О00010000010
000 0 01000001
0000000000 0 1
000000000000
, Л(С) =
0 1111111
0 1111111
0 1111111
0 0 0 0 1111
0 0 0 0 1 0 0 1
0 0 0 0 1 1 1 1
0 0 0 0 1111
0 0 0 0 10 0 1
0 0 0 0 10 0 1
0 0 0 0 1111
00000000
00000 0 00
1111
1111
1111
1111
10 11
1111
1111
10 11
10 11
1111
0 0 0 1
0 0 0 0
Рпс. 2.15.
м=
0000000000 0 0
0 110 0 0 0 0 0 0 0 0
0 110 0 0 0 0 0 0 0 0
0 0000 0 000000
0000100110 0 0
000001100100
000001 100100
00001001 1000
0 0 0 0 10 0 110 0 0
000001 100100
0 00000000000
0000000000 00.
В,= {
В: = {с
В„ = {1
"1, "j>>
!, О,, V,),
е, »7, "10 >.
Рпс. 2.16.
существование Af-путп из р в q. По определению N-
нумерации это свидетельствует о существовании N-ny-
ти из р в q, который принадлежит Мг]. Вместе с тем
57
из определения F-области следует также
существование пути из q в р в подграфе Mz]. Таким образом,
для доказательства леммы достаточно показать, что
Mip) < M(q). Предположим, что это не так, п
рассмотрим путь P = lpi = q, р2, ..., р,=>р] в N[i:n].
г г= и, (г)1.т52)й1. f. (u,„D,j,j C)i
T7=q, (a, o2)... vt (vs,va)vs (us,i)s) t5 (vb, v,)
Рис. 2.17.
По нашему предположению .Mip) > M(q) > M{p,) —
•= min {Miph)\ к е [1: s]}, и, следовательно, в силу
леммы 1 существует М-путь из р,- в р, где р,- е Мр] и pj Ф
Ф р. По определению УУ-нумерации это означает, что
N(pi) < Nip), что противоречит сделанному
предположению.
Следствие 1. Для любой вершины p<=V имеем
Mip) = min {Niq)\ q s Nip]}, и каждая вершина из
Nip] является М-достижимой из вершины р.
Следствие 2. Для любых двух различных
вершин р и q реализуется одна и только одна из трех
возможностей: Mlp]<=Nlq], Nlq] <= Мр] или Nip] П
ЛМд] =0.
Теорема 4. Подграф S является бикомпонентой
орграфа G тогда и только тогда, когда существует би-
веришна р, для которой S — N[p].
Доказательство. Пусть S — бикомпонента ор-
храфа G, и пусть р — такая вершина из S, что Nip) —
— mmWiq)\ q^S). По определению F-области имеем
S s Nip]. Однако по лемме 9 и следствию 2 из нее
Nip] s S, откуда следует, что р — бнверпшна.
Пусть р — бпкерппша. По лемме 9 некоторая
бикомпонента графа (скажем, S) содержит все вершины из
Nip]. Пусть S\Nlp] не пусто. Тогда должна, существо-
58
вать такая вершина q, что N(q) <N(p) и q достижима
из вершины р B-NlN(q) :п\. Это значит, что p^N[q],
и, таким образом, имеет место противоречие.
2.5. Графом Герца (конденсацией, фактор-графом)
G* графа G' называется орграф, вершинами которого
служат бикомпоненты Ви ..., В, орграфа G и те
вершины v, которые не принадлежат ни одной бикомпо-
ненте, а дуга идет из В{ в Д,, если в орграфе G имеется
хотя бы одна дуга, ведущая из некоторой вершины
бикомпоненты Bi в вершину бикомпоненты Bh и т. п.
Пример орграфа G и его графа Герца приведен на
рис. 2.18.
\>{v-a,v7,ve,vs,vmy
Рис. 2.18.
Из максимальности бикомпонент следует, что в
графе Герца нет контуров. В противном случае
объединение множеств вершин тех бикомпонент графа G,
которые представляют собой вершины контура в его графе
Герца, порождало бы в G сильно связный подграф,
содержащий вершины из разных бикомпонент, что
невозможно.
Будем называть орграф бесконтурным, если он не
содержит контуров. В литературе для обозначения
таких орграфов употребляется также термин
«ациклический граф». В последнее время в англоязычной
литературе все чаще стал попадаться термин «dag» —
аббревиатура словосочетания «directed acyclic graph».
Рассмотрим последнюю вершину некоторого
максимального пути бесконтурного орграфа G. Так как для
этой вершины нет вершин, достижимых из нее,
поскольку либо нашелся бы контур, либо путь не был бы
максимальным, то заключаем, что бесконтурный
орграф содержит по крайней мере одну вершину с
нулевой полустепенью исхода. Рассуждая аналогично,
59
убеждаемся, что бесконтурный орграф содержит по
крайней мере одну вершину с нулевой полустепеныо
захода.
Теорема 5. Следующие свойства орграфа G
эквивалентны:
1) G—бесконтурный орграф;
2) G* изоморфен G;
3) каждый путь в G простой;
4) вершины орграфа G можно упорядочить таким
образом, что матрица смежности A{G) будет верхней
треугольной матрицей.
Доказательство теоремы предоставляется читателю.
Указанное в теореме упорядочение вершин носит
название топологической сортировки вершин и может
рассматриваться как процесс отыскания» линейного
порядка, в который может быть вложен данный
частичный порядок. Топологическая сортировка полезна при
анализе схем действия, где большой и сложный план
представляется как орграф, вершины которого
соответствуют целям плана, а дуги — действиям.
Топологическая сортировка дает порядок, в котором могут быть
достигнуты цели. Топологическая сортировка
начинается с отыскания вершины графа G, из которой не
выходят дуги, п присвоения этой вершине наибольшего
номера, а именно n=\V\. Эта вершина удаляется из
графа G вместе с входящими в нее дугами. Поскольку
оставшийся орграф также бесконтурпый, мы можем
повторить процесс и присвоить следующий номер п — 1
вершине, из которой не выходят дуги, и т. д. Этот
процесс полностью совпадает с процедурой построения
yV-нумерацин. Другими словами, топологическая
сортировка есть Л^-нумерацпя бесконтурпых графов.
2.6. Эффективные алгоритмы построения
транзитивного замыкания. Построение алгоритмов основано
на переходе от орграфа к его графу Герца. В качестве
начального шага отыскивается множество бпкомпонент
и строится граф Герца. Затем строится транзитивное
замыкание графа Герца, которое дополняется до
транзитивного замыкания исходного графа дугами,
инцидентными каждой вершине внутри бикомпоненты.
Для иллюстрации работы такого алгоритма возьмем
орграф, показанный на рис. 2.19, а (его граф Герца
показан на рис. 2.19, б).
В графе Герца варщины vt, v3 и vk соответствуют
вершинам а, е и / исходного графа, а вершина i>2 соот-
60
ветствует бикомпопенте {b, с, d). Вначале граф Герца
топологически сортируется, т. е. для его вершин
определяются Л'-номера. Транзитивное замыкание G*
отыскивается, начиная с
вершины с наибольшим
^-номером. Оно
формируется в виде
перечня составных вершин
следующим образом:
берется некоторая верши- © ^ ~XL> 5)
на vt, еще не
включенная в состав состав- Рис. 2.19.
ных вершин, и
включается в ту из них, которая содержит все концы дуг,
исходящих из Vi, т. е. все множество Гр;; если таковой нет,
то образуется новая составная вершина по этому же
принципу. Для графа на рис. 2.19, б замыкание
строится последовательно так: (4), ((3, 4), (2, 4)), ((1, 2, 4),
(1, 3, 4)), что дает в результате матрицу
0
0
0
0
1
0
0
0
1
0
0
0
1
1
1
0
Транзитивное замыкание исходного графа получается
добавлением дуг между всеми вершинами,
включенными в составную. В худшем случае алгоритм требует
ОЫ3) операций.
Более эффективный и наиболее распространенный
алгоритм Мунро строит вначале транзитивное
замыкание графа Герца, но существенно использует метод
Штрассена быстрого перемножения матриц. Его
трудоемкость равна О {nc,logo,nG), где reG — число вершин
в графе Герца, а к берется из интервала [2, log27].
Пусть G есть граф Герца графа G, и пусть G
топологически отсортирован, так что его матрица
смежности есть верхняя треугольная матрица, у которой на
главной диагонали стоят единицы. Если в G найдется
путь из вершины Xi в xi+i, то он может проходить
только через вершины х,, xi+i, ..., Xi+i. Другими словами,
для любых к последовательно взятых вершин любой
путь между ними лежит внутри порожденного ими
подграфа. Основная идея алгоритма Мунро состоит
в следующем. Если известны транзитивные замыкания
61
«ZJ4
двух «смежных» подграфов с 2' вершинами каждый,
то может быть построено транзитивное замыкание
подграфа с 2,+1 вершинами, получающегося объединением
исходных 2'-верш1ганых подграфов. На рис. 2.20
показана матрица, на которой производятся все описанные
вычисления. Если вершина в- подграфе 2 достижима
из некоторой вершины подграфа 1, то она может быть
достигнута по указанной матрице самое большее в три
приема. Вначале мы должны попасть в некоторую
вершину в подграфе 1, затем в некоторую вершину в
подграфе 2 и только потом в нужную вершину из
подграфа 2. Иногда первый или третий шаги или оба могут
отсутствовать. Построение транзитивного замыкания
производится путем последовательного вычисления
степеней матрицы, показанной на рис. 2.20, с заменой
на каждом шаге ненулевых элементов единицами. При
этом все используемые нами матрицы треугольные и
все вычисляемые элементы лежат в правом верхнем
квадранте.
Транзитивное замыканиа
первого подграфа
Часть матрицы смежности,
указывающей связи из
первого подграфа во второй
Транзитивное замыкание
второго подграфа.
Рпс. 2.20.
Алгоритм My про:
Шар- 1. Объединяем вершины графа в пары (21 — 1,
21) для всех l<s[i: т/2].
Шаг 2. Строим транзитивные замыкания
подграфов.
Шаг 3. Объединяем полученные подграфы
попарно, сохраняя монотонность нумерации вершин.
Ш а г 4. Выполняя подходящим образом умножение
матриц, строим, транзитивные замыкания
объединенных подграфов.
62
Повторяем шаги 3 и 4, пока не получим решения
задачи для графа Герца.
2.7. Пусть Y, Z — некоторые подмножества вершин
орграфа G с входом s.
Замыканием Y относительно Z называется такое
множество вершин Л/(У, Z) графа G, что xt^M(.Y, Z),
ie[l:ttl, если в G найдется путь от некоторой
вершины jjSf к вершине Xi, в котором нет вершин из Z.
Если Y или Z состоит из одной вершины, то говорят
о замыкании вершины или о замыкании относительно
вершины.
Обратным замыканием Y относительно Z
называется такое множество вершин N{Y, Z) графа G, что х{е=
<^N(Y, Z), £е[1;и], если в G найдется путь от вер-
шипы Xi к некоторой вершине ж,- eF, в котором нет
вершин из Z.
Алгоритм построения замыкания
относительно множества вершин:
Вход: Граф G{V, Е), заданный матрицей
смежности A(G), состоящей из строк АН), А(2), ..., А(п)\
Y, Z, М—строки из нулей и единиц, соответствующие
множествам F, Z, M(Y, Z) (равенство £-го разряда
единице означает, что вершина xt принадлежит данному
множеству); булевские операции над строками
выполняются поразрядно; строка, соответствующая пустому
множеству, обозначается 0.
Выход: Множество M{Y, Z).
начало
1. Л/о:=0;
2. Р„:=Г;
3. для к от 1 до п шаг 1 цикл
4. начало
5. Eh: = Th & Л/А_х;
6. Mk:=Mh^®Jk;_
7. Ph: = Eh&Z&Y;
8. конец цикла;
примечание здесь Th есть дизъюнкция строк
A(j) для всех значений /, совпадающих с номерами
единичных разрядов строки /Vi конец примечания
конец
Замечание 1. Фактически алгоритм
заканчивается, когда для некоторого г < а строка Рг не станет
нулевой; тогда М = Л/г.
Замечание 2. Из описания алгоритма следует,
что при построении М(х{, 0) каждое множество Ек
состоит из таких вершин xt, что кратчайший путь из xt
в xt содержит к дуг.
Замечание 3. Построение множества N(Y, Z)
производится с помощью того же алгоритма, но в
качестве А берется Ат.
Замечание 4. Для построения транзитивного
замыкания графа G достаточно вычислить Mis, 0), где
s — вход G.
Трудоемкость алгоритма равна O(ns), где s — число
ячеек памяти, необходимых для запоминания п
двоичных разрядов.
2.8. Нахождение последовательности вложенных
зон. Множество зон D называется иерархией зон
орграфа, если:
1) для любых двух различных зон 5, и 52 из D
имеет место либо 5, <= 52, либо 52сг5„ либо SinS2 = 0;
2) для любой зоны 5 графа G существует такая
зона 5j s D, что 5sS, и зоны S и S, имеют общую
входную вершину.
Опишем матричный алгоритм выявления иерархии
зон. Иерархию зон будем изображать матрицей Р —
= \\рц\\ размера к X га, где к — глубина иерархии, т. е.
число вложенных зон, а га — число вершин в орграфе.
Элемент рц равен 1, если вершина v} входит в £-ю зону
(для простоты рассматривается случай, когда орграф
содержит лишь одну бикомпонепту, изменения для
общего случая тривиальны), и равен 0 в противном
случае. Матрица Р строится построчно.
Вход: Граф G, заданный матрицей
смежности A(G).
Выход: Матрица Р.
начало
1. для ; от 1 до га шаг 1 цикл
2. если а» — 1 то
3. £U:=1;
4. иначе ри = 0;
примечание если ау = 1, то в вершине vt имеется
петля, поэтому вершина vt составляет множество
вершин ыаименьшей зоны конец примечания
5. Di:=A;
6. /:=2;
7. 2:= Л;
Ь. пока Pt¥" Pi-i цикл
64
9. A := A X A;
10. для i от I до n шаг 1 цикл
11. для / от 1 до п шаг 1 цикл
если #« < 0 то
<!>._. 1;
(i-i)
*•«}
а
если
иначе
иначе
d^> = 0
,(')
12
13.
14.
15.
16.
17.
18.
19.
20.
21.
22. конец цикла;
конец
Последовательное
то
d\
(').
= 0;
= 0;
«#= 1 A'd\?> 0 Л ^?> 0Л4?+ dj?<* т°
если
'Ри.: —1; рч: = 1;
иначе р^: = 0;
конец цикла;
•Z:=Z+i;
графа, показанного на рис. 2.21:
вычисление иерархии зон для
А 1 2 3
10 10
2 0 0 1
3 0 0 0
4 0 0 0
5 0 0 1
6 0 10
7 0 0 0
Л2 1 2 3
10 0 1
2 0.00
3 0 0 0
4 0 0 1
5 0 10
6 0 0 1
7 0 0 0
4
0
0
1
1
0
0
0
4
0
1
1
1
1
0
0
5
0
0
0
1
0
0
0
5
0
0
1
1
0
0
0
6
0
0
0
0
1
0
0
6
0
0
0
1
0
0
0
7
0
0
0
0
0
1
0
7
0
0
0
0
1
0
0
Рис. 2.21.
D 12 3 4 5 6 7
10 10 0 0 0 0
2 0 0 10 0 0 0
3 0 0 0 10 0 0
4 0 0 0 110 0
5 0 0 10 0 10
6 0 10 0 0 0 1
70000000
D2 1 2 3 4 5 6 7
10 12 0 0 0 0
2 0 0 12 0 0 0
3 0 0 0 12 0 0
4 0 0 2 112 0
5 0 2 12 0 12
6 0 12 0 0 0 1
70000000
Р 12 3 4 5 6 7
0 0 0 10 0 0
Р 12 3 4 5 6 7
0 0 0 10 0 0
5 В- А Евстигнеев
65
ЛМ 234 567 Z>3 1 2 3 4 5 6 7 Р 1234567
1 0
2 0
3 0
4 0
5 0
6 0
7 0
И4 1
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Аъ 1
1 0
2 0
3 0
4 0
5 0
6 0
7 0
А* 1
1 0
2 0
3 0
4 0
5 0
Р 0
7 0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
2
0
111
1
1
1
0
Q
2
1
i
1
1
1
1
0
0
0
1
1
1
0
0
з
d
1
[Г
1
1
0
0
3
1
1
1"П
1
1
1
0
3
1
1
1
1
1
1
0
1
1
1
1
1
1
п
1
!
1 1
1
1
1
0
4
1
1
1
|Т|
1
1
0
4
1
1
1
1
1
1
0
0
1
1
1
1
0
0
,")
1
1
1
1
QI
1
0
5
1
1
1
1 ]
|Т|
1
0
5
1
1
1
1
1
1
0
0
0
1
1
0
0
0
1\
0
!
1
1
1
0
0
6
1
t
1
1
1
|Т
0
6
1
1
1
1
1
1
0
0
0
0
1
0
0
0
7
0
0
1
1
0
0
0
7
0
•1
1
1
1
1°
0
7
1
1
1
1
1
1
0
1 0 1
2 0 0
2 3 0 0 0
12 3 0 0
3 0 0 3 12 3 0
4 0 3
5 0 2
6 0 1
2 112 3
12 3 12
2 3 0 0 1
70000000
°4 1 2
1 0 1
2 0 0
3 0 4
4 0 3
5 0 2
6 0 1
3 4 5 6 7
2 3 4 0 0
12 3 4 0
3 12 3 4
2 1 12 3
112 3 12
2 3 4 0 1
70000000
Ds 1 2
1 0 1
2 0 5
3 0 4
4 0 3
5 0 2
6 0 1
7 0 0
Z>„1 2
1 0 1
2 0 5
3 0 4
4 0 3
5 0 2
6 0 1
3 4 5 6 7
2 3 4 5 0
12 3 4 5
3 12 3 4
2 112 3
12 3 12
2 3 4 5 1
0 0 0 0 0
3 4 5 6 7
2 3 4 5 6
12 3 4 5
3 12 3 4
2 112 3
12 3 12
2 3 4 5 1
70000000
0 0 0 10 0 0
0 0 1 1 1 0 0
Р 12 3 4 5 6 7
0 0 0 10 0 0
0 0 1110 0
Р 12 3 4 5 6 7
0 0 0 10 0 0
0 0 1 1 1 .0 0
0 111110
Р 12 3 4 5 6 7
0 0 0 10 0 0
0 0 111)0
0 111110
Окончательно имеем иерархию вложенных зон:
В-: {»■.}-. Вг\ {у,, у4, t>5}; B3: {v2, v3, vu vb, vj.
2.9. Иерархия зон и прямая нумерация. Для графа
с прямой нумерацией вершин легко найти множество
вложенных зон, которые в данном случае являются
формальными циклами. Самый внутренний
формальный цикл — это такой формальный цикл Ri — F[va:vb],
что не существует формального цикла R, = Flvc: vd],
для которого F[vc: vd] с Flva: vb]. Самый внутренний
формальный цикл есть примитивный формальный
цикл, но обратное неверно.
Теорема 6. Для самого внутреннего формального
цикла R — Fiva: vb] единственной обратной дугой к
вершинам в R служит дуга (vb, va).
Доказательство. Так как самый внутренний
формальный цикл есть примитивный формальный
цикл, то имеем дугу (vb, va). He может быть обратной
включающей дуги (vd, vc), где либо а^ с^ d^b, либо
а<с^ d< b, так как в противном случае F\vc:vi\,
а не F[va: vb\ был бы самым внутренним формальным
циклом. Также не может быть обратной дуги (vd, vc),
где а < с < b < d, потому что тогда R не был бы
формальным циклом.
Определим теперь редуцированный граф как граф,
получаемый путем применения к графу -с прямым
порядком вершин, содержащему формальный цикл,
преобразований:
1. Выбрать самый внутренний формальный цикл
R = F[va:vb].
2. Удалить все вершины R из графа и заменить их
одной вершиной vR, такой, что:
а) F(vR) = a;
б) дуга (у„ vR) существует тогда и только тогда,
когда v, Ф R и была некоторая вершина vk e /?, для
которой существовала дуга (и3-, vk) (заметим, что / < а,
так как /? —формальный цикл);
в) дуга (ул, vm) существует тогда и только тогда,
когда vm& R и была некоторая вершина vn <s Д, для
которой существовала дуга (у„, vm).
Пример редукции графа показан на рис. 2.22.
Теорема 7. Редукция графа сохраняет его
прямой порядок.
Доказательство. Ясно, что все пути вне Я,
которые существовали до редукции, продолжают
существовать и после нее. Исключением являются те, в
которые не была включена последовательность вершин из
R. Вместо нее после редукции будет единственная
вершина vR. Более того, все новые дуги будут прямыми
пли обратными в соответствии с тем, были замененные
ими дуги прямыми или обратными. Таким образом,
5* 67
редукция сохраняет все три свойства,
характеризующие прямой порядок.
Теорема 8. Для графа с любой прямой нумера-
F всякая зона есть подмножество
формального цикла и
включает его начальную
вершину.
Доказательство.
Предположим, что R =
циеи вершин
i
45 lyV
Vak\ есть мно-
Исходный граф
жество вершин некоторой
зоны, причем F (va )<.
<F(vJ< ...<F(kk).
Редуцированный По определению зоны
гРаФ внутри R существует путь
Рис. 2.22. пз Vak в Vav Дакой путь
включает обратную дугу в
v (прямая дуга в va будет обязательно из
вершины вне зоны). Из определения формального цикла
ясно, что va есть начальная вершина одного или более
формальных циклов. Выберем из них один, имеющий
наибольшее число вершин. Пусть это будет С.
Предположим, что найдется "вершина v, в R, не
принадлежащая С. Так как вершины в С занумерованы
последовательно и y0l e С, а также F {vT)> F (va ), то F(vr) >
>F(vf) для любой вершины vf^C. По определению
зоны существует путь из v, в v0l, содержащий
обратную дугу из вершины вне С в вершину С. Но тогда
существует формальный цикл с начальной вершиной
va , который содержит больше вершин, чем С, что
противоречит предположению. Итак, каждая
вершина из R одновременно принадлежит и С.
Из теоремы 8 следует, что для каждой обратной
дуги, найдется последовательно занумерованное
множество вершин, порождающее зону. Первая вершина этой
зоны есть начальная вершина обратной дуги;
последняя вершина есть конец самой последней обратной
дуги, которая сцеплена с первой (см. п. 1.7).
Множество определенных таким образом рангов есть множество
вложенных зон.
Самый внутренний формальный цикл есть
множество вершин под одной обратной дугой. Если его
заменить отдельной вершиной, полученный редуцированный
68
граф будет снова иметь прямой порядок. Повторяя
процедуру, получаем последовательность вложенных зон.
2.10. Иерархия зон и К-нумерация. Пусть
построены /^-нумерации для i^ll:n]. Обозначим через D
множество всех нетривиальных подграфов,
принадлежащих множеству {КАП I is [1 ; п\).
Теорема 9. D — иерархия зон графа G.
Докажем несколько вспомогательных утверждений.
Непосредственно из леммы 1 следует
Лемма 10. Для любой вершины v e V и любой
вершины q из Nlv] следующие свойства эквивалентны:
1) q— входная вершина подграфа Nlv];
2) q — начальная вершина подграфа Nlv];
3) существует предшественник w вершины q, для
которого Nlw) <N(v).
Лемма 11. Для любого l&lliri] и любой
вершины р имеет место равенство Ktlp] —Nip].
Доказательство проведем индукцией * по I. При i—1
утверждедие очевидно. Предположим, что лемма верна
для всех i<s, и рассмотрим случай i — s. Если р —
некоторая вершина графа, то либо К.-^р) <s — 1, либо
K.-l(p)>s-l.
Пусть Ks-i(p) < s — 1. Из определения ^-нумерации
получаем K,-ilK,-i(p) : п] = К,1К,(р) : п]. Это значит,
что K.ls] —K,-ilp] в силу определения F-области и по
предположению индукции Kalp] —Nip].
Пусть теперь #„_,(/>) >s —1. Нетрудно увидеть, что
либо p&K.-tls^- 1], либо ps Ka-ils— I]. Рассмотрим
первый случай. Здесь пересечение K,-ils —1] П K,-ilp]
пусто в силу индуктивного предположения и следствия
2 из леммы 9. Таким образом, по определению К-яу-
мёрации Ks-ilp] s K.[K,(p): п] s K,-ilK.-iip) •"■], и,
следовательно, К,[р] — K.-Sp] =N[p]. Рассмотрим
теперь случай p^K.-ils — {]. Из определения Я-нумера-
ции получаем, что K,~ilK,-i(p) : п] ^К3[К,(р) : п], и
если вершина р достижима из некоторой вершины q в
K.lK.tp) :п], то q^K.-tlK.-tip) :п]. Таким образом,
Ktlp]=K..ilp]^Nlp].
Следствие. Множество {K{li]\ je[l:n]}
совпадает с множеством Ш1р]] р^Х).
Доказательство теоремы 9. Если вершина
р такова, что N(p) = min {N(q)\ g e £}, .где S —
произвольная зона, то S^Nlp]. Отсюда по лемме 9, по
следствию 2 из нее, следствию из леммы, 11 и по лемме 10
получаем, что D — иерархия зон графа G.
69
2.11. Отыскание линейных компонент. Бивершину
v назовем точкой сочленения графа G, если ее Г-номер
T(v) совпадает с наибольшим Г-номером преемников
вершин из Tll:T(v)-l].
Теорема 10. Пусть {v,, ..., vh+l] — множество
всех точек сочленения графа G, упорядоченных в
порядке возрастания Т-номеров. Подграф И графа G есть
линейная компонента с начальной вершиной р и
конечной вершиной q тогда и только тогда, когда
И — TiTivj) : T(vj+i) — 1], p = vh q = Vj+1, для,
некоторого /е[1:Й.
Доказательство. Очевидно, что теорема верна,
если граф является бескоитурным, поскольку в этом
случае согласно теореме 4 и определению Г-пумера-
ции для любой дуги (р, q) графа имеем неравенство
T(p)<T(q).
Рассмотрим общий случай. Заметим, что если
линейной компоненте // принадлежит некоторая вершина
бикомпоненты графа, то Я содержит все вершины этой
бикомпоненты. Если р — либо начальная, либо конеч:
пая вершина линейной компоненты и принадлежит
некоторой бикомпонепте графа, то р — единственная
входная вершина этой бикомпоненты.
Пусть G* есть граф Герца графа G. Подграф //
графа G является его линейной компонентой с
начальной вершиной р и конечной q тогда и только тогда,
когда существует последовательность Я,, Н2, ..., Я,
линейных компонент графа G*, для которой
выполнены условия: а) подграф U {Я,| ie[l:s]} графа G*
соответствует подграфу Я графа G; б) для каждого i из
[l:s—1] начальная вершина у #i+J — это конечная
вершина у Я,, соответствующая бикомпонепте G,
которая имеет более одной входной вершины; в)
начальная вершина у Н, и конечная у Hs соответствуют
одновходовым бикомпонентам St и Sz графа G, а р и
q — входные вершины соответственно у Sx и S2. Таким
образом, по определению линейной компоненты,
согласно лемме 10 и теореме 4 общий случай
сводится к случаю, когда G бесконтурный. Теорема
доказана.
Итак, для нахождения линейных компонент
необходимо найти /V-пумерацию, затем Г-нумерацию вершин
графа и множество BV его бпвершин. Выделение
линейных компонент происходит при обработке вершин
графа в порядке возрастания Г-номеров.
70
Алгоритм:
Вход: Граф G — (V, E), заданный списками
смежности A(v), Г-нумерация вершин, множество BV би-
вершии.
В ы х о д: Множество линейных компонент.
начало
1. взятьв качестве и вход s графа G;
2. /Vl:=l;
3. для к от 1 до п — 1 шаг 1 цикл
4. начало
5. выбрать вершину V, у которой T(v) равен к;
6. для всех w из Aiv) цикл
7. если N1 < T(w) то /VI : = Г(ш);
8. конец цикла;
9. выбрать вершину z, у которой T(z) равен к+\;
10. если N1 = А; + 1 Д геВУю
И. занести ТЧТЧи) : ГЫ — 1] в список линейных
компонент как линейную компоненту с начальной
вершиной и и конечной z;
12. взять в качестве и вершину z;
13. конец цикла;
конец
Алгоритм вычисляет наибольший Г-номер
преемников вершин из Г[1 : Т(р) — 1] для каждой
вершины р при обработке вершин в порядке возрастания
Г-номеров и правильно выделяет линейные
компоненты графа согласно теореме 10. Трудоемкость равна
0(тп), так как каждая дуга обрабатывается в точности
один раз.
2.12. Для неориентированных графов задачей,
эквивалентной задаче о нахождении линейных компонент,
является задача о нахождении блоков (задача об
отыскании двусвязных компонент). Разделению графа на
блоки соответствует разбиение множества его ребер на
непересекающиеся классы по отношению
эквивалентности R: Riui, иг) <=>■ существует простой цикл, содер,
жащий ребра иу и иг-
Ветвью блоков, висящей на разделяющей верши,
не z, называется подграф С = <У U (z)), V э z,
такой, что вершины из V' не соединены ребрами с
вершинами из V\(V U Ы) и подграф <У> связен.
Очевидно, что вершина z принадлежит только одному
блоку в графе G', который называется корневым для вет-
71
ви G'. Пусть фиксирована вершина а. Каждый блок В
(кроме В за, если а — не разделяющая в G)
выступает как корневой для единственной ветви блоков из
класса {G \аФ V).
Нахождение блоков в графе осуществляется
алгоритмом, основанным на поиске в глубину, с трудоемкостью
О(т), где т — число ребер, если граф задай списками
смежности.
Назовем обход графа, соответствующий поиску в
глубину, стандартным обходом; траекторию обхода
графа будем обозначать Q, начало обхода — буквой а.
Начальная вершина выбирается произвольно. Будем
считать, что М-номера вершин соответствуют
последовательным моментам обхода, а ребра маршрута ^~
<2-ходам обхода. Первый ход по ребру, во время
которого его конец получает М-иомер, назовем прямым
ходом, второй — в противоположном направлении —
обратным. Условимся, 4tq прямой ход задает
ориентацию ребер, связанную с данным обходом. Запись
и >= (у, z) будет означать, что ребро ориентировано от
у к z. Ребро, по которому мы впервые-попадаем в
вершину v, обозначим через uv. Основное свойство
стандартного обхода в данном случае состоит в том, что,
войдя в ветвь блоков G' по ребру и, мы находимся
внутри G' до тех пор, пока не обойдем ее полностью,
заканчивая движение по G' обратным ходом по и. Для
удобства изложения будем называть момент обхода,
при котором мы прямым ходом попадаем в вершину,
уже фигурировавшую в обходе (т. е. следующий ход
должен быть обратным по тому же ребру),
касательным моментом. Соответствующее ребро пазовем
касательным.
Рассмотрим часть Q обхода Q, получаемую при
выбрасывании из Q всех касательных ребер. Q может
рассматриваться как обход части G графа G,
образованной некасательными ребрами, т. е. ребрами типа
н„, где v пробегает множество V\ia). Легко проверить,
что G — дерево, ориентированное от корня а. Для
каждой вершпны существует единственный путь Lx <=
<= G из а в х.
Будем называть ребро, не фигурировавшее в
обходе, непройденным, пройденное один раз —
полупройденным, пройденное два раза — пройденным. По
индукции можно доказать, что множество
полупройденных ребер в любой некасательный момент а' обхода Q
72
совпадает с множеством ребер «текущего» пути Ьа =
Назовем вершину свободной, если все инцидентные
ей ребра непройденные, замкнутой, если все они
пройденные, и открытой — в остальных случаях.
Рассмотрим вершину v Ф а. Очевидно, что она перестает
быть свободной в тот момент, когда включается в
текущий путь вместе с входящим в него ребром uv.
Докажем, что вершина v становится замкнутой в тот
момент, когда текущий путь перестает включать v
и uv в результате обратного хода по ребру и„.
Действительно, в этом случае вершине v не инцидентны
непройденные ребра, так же как и полупройденные, что
и требовалось доказать. Аналогично доказывается, что
в момент а окончания обхода вершина а замкнута.
Тем самым доказано, что множество открытых вершин
совпадает с множеством вершин текущего пути, не
считая начального и конечного моментов, когда оно
пусто. Итак, в момент окончания обхода все ребра
пройдены и все вершины замкнуты.
_ Из свойств поиска в глубину известно, что дерево
G представляет собой каркас графа G.
_ Л е м м^_12. Пусть и = (у, z)s(/ — хорда каркаса
G, т. е. и.Ф G. Тогда z^-Lv. _
Доказательство. По определению G ребро
и — касательное. Пусть прямой ход по нему бьш
совершен в момент а, т. е. va = у и-va+1 = z. Вершина z
не свободна по определению касательности й не
замкнута по определению за.мкнутости. Значит, z
-открыта и ъ е La = Ly.
По структуре, задаваемой на графе G каркасом G,
однозначно определяется любая ветвь блоков G, V Ф а,
•а именно_ множество вершин ветви блоков образует в
каркасе G отделимую ветвь. Для уточнения этого
понятия рассмотрим часть_каркаса G, отделяемую
ребром и от корпя дерева G — вершины а. Присоединим
к ней само ребро и = (z, у). Полученную часть G„
каркаса (J будем называть ветвью, висящей на ребре и п
на вершине z. Множество вершин ветви Gu, кроме г,
обозначим Vu- Ветвь Gu будем называть отделимой,
если из вершин множества Vu не исходит ребер в
вершины из F\(FuU{z}), точнее, в вершины пути Lt
(кроме z). Очевидно, что отделимая ветвь G"u, и =
= (z, у), задает ветвь блоков с множеством
внутренних вершин Vu Ф с, висящую на вершине z.
73
Рассмотрим ветвь блоков Gu, и = (z, у), висящую
на вершине z. Так как G <= G, вершина z в каркасе G
отделяет V от остальных вершин. Значит, V
образует в G одну или несколько ветвей, висящих на z.
Однако в силу леммы 12 внутренние вершины из
различных ветвей, висящих на одной вершине, не могут
соединяться ребрами. Поэтому связность подграфа <F'>
влечет за собой единственность такой ветви.
Обратимся к задаче нахождения отделимых ветвей
в процессе обхода. Очевидно, обход ветви Gu есть часть
обхода Q, начинающаяся прямым и кончающаяся
обратным ходом по и. Часть Q, заключенную в этом
промежутке, назовем ветвью обхода и обозначим Qu.
Определение отделимости распространим на ветви обхода:
Qu отделима ■*=*■ Gu отделима. Из свойств обхода
вытекает, что ветвь обхода Qu при ц = (z, у) представляет
собой обход подграфа Gu = <VU U {z}> плюс касания
с вершинами пути Ьг (кроме z). Тем самым можно
считать обоснованным критерий отделимости:
Ветвь QU; где и = (z, у), отделима в том и только
том случае, когда на протяжении Qu не было касаний
с вершинами текущего пути, расположенными на нем
ближе к началу (вершине а), чем вершина z.
Покажем, как можно использовать этот критерий в
процессе обхода. Каждое некасательное ребро с
момента его появления в текущем пути, т. е. после прямого
хода по нему, будем считать «подозрительным»; метка
подозрительности снимается позже. Пусть в момент а
был совершен прямой ход по касательному ребру
(у, z), va — У, i'ct+i = 2 е t0. Тогда все ребра контура
■^a+i) кроме ребра, исходящего из z, не могут
порождать отделимую ветвь обхода. Поэтому все такие
ребра, имеющие в рассматриваемый момент метку
подозрительности, освобождаются от нее. Очевидно, что
отделимость ветви обхода Qn эквивалентна тому, что
к моменту обратного хода по ребру и оно еще
считается подозрительным.
Таким образом, получен алгоритм нахождения
отделимых ветвей обхода. Необходимо только указать
способ стирания меток подозрительности, не
требующий в каждый момент касания просмотра всех ребер
образующегося контура. Для этого нужно иметь список
«подозрительных» ребер (с. п. р.) в том порядке, в
каком они расположены в текущем пути, и аккуратно
организовать вычеркивание элементов Из с. п. р. Дело
'74
в том, что в-момент касания из с. п. р. выбрасывается
«хвост», и задача состоит в отыскании элемента, который
становится последним. Этот элемент -можпо было бы
найти просмотром с. п. р. с конца, если бы вершины
обладали признаком, позволяющим определить
порядок их расположения в текущем пути. Для этого
вершины графа нужно нумеровать в процессе обхода
(Ж-нумерация). Текущий путь изменяется только
с «хвоста», причем при наращивании к нему
присоединяется вершина с номером большим, чем любой ранее
присвоенный. Поэтому для любого а на пути La
номера вершин возрастают от а к va.
Покажем теперь, как нахождение отделимых ветвей
обхода влечет за собой выделение блоков графа G.
Пусть в момент обратного хода по ребру и = (г, у)
обнаружилось, что ветвь Qu отделима. Тогда множество
внутренних вершин соответствующей ветви блоков есть
Vu, и оно может быть найдено как множество вершин,
встретившихся в обходе не ранее, чем вершина у.
Для того чтобы в момент нахождения ветви блоков
выделить множество вершин корневого блока, достаточно
при нахождении каждой ветви блоков множество ее
внутренних вершин исключать из дальнейшего
рассмотрения. Тогда к завершению обхода любой ветви
блоков G' все подветви, висящие на корневом блоке В,
будут обойдены, а их внутренние вершины
исключены. -Останутся лишь вершины из В. Для экономного,
выполнения операций предлагается вести текущий
список вершин (т. с. в.) в порядке возрастания
номеров. Исключение вершин из т. с. в. будет сводиться
к отбрасыванию его «хвоста».
Алгоритм выделения блоков:
Шаг 1. Пусть в момент а мы попадаем впервые
в вершину v. Присваиваем ей очередной Л/-номер M(v)
н заносим в конец массива т. с. в. Ребро w„ заносим
в конец массива с. п. р.
Шаг 2. Пусть был сделан прямой ход по
касательному ребру (va, va+i). Просматриваем с. п. р.
с конца до первого его элемента — ребра {х, у), для
которого Mix) s£ M(va+i). Это ребро считаем далее
последним в с. и. р.
Шаг 3. Пусть обратным ходом по ребру иу =
= (z, у) «возвращаемся» в вершину z. Если ребро щ
стоит последним в с. п. р., то переносим конец с. п. р. на
ячейку назад, помечаем вершину z как разделяющую
75
Сесли этого признака у нее еще нет) и заносим z в
список нового блока В. Просматриваем т. с. в. с конца,
занося просмотренные вершины в список вершип
блока В. Процесс продолжаем до тех пор, пока не дойдем
до вершины у и не занесем ее. Далее, последней
в т. с. в. будем считать предыдущую для у вершину.
Шаг 4, В конце обхода все вершины из т. с. в.
заносим в список очередного блока А (а&А), если
в т. с. в. кроме а содержится хотя бы одна вершина.
§ 3. Гамаки, полугамаки и шлейфы
3.1. СвойстваМ- и L-нумерацнй.
Лемма 13. Для любого i е [0 : п] и любой
вершины р е X из условия L,(p) s£ i следует
Up] =N[p] = ДШр) : ВД+ \Up)\ - 1].
Доказательство проведем индукцией по i. Для i = п
утверждение леммы непосредственно следует из
определений К- и L-нумераций, леммы 11 и следствия 2 из
леммы 9. Предположим, что лемма справедлива для
всех i > к, и рассмотрим случай, когда i — к. Пусть
р — такая вершина графа, что LK(p) = / < к. Тогда по
определению L-нумерации получаем, что Lk+i{p) = j и
Lh[j : п] = Lh+i[j : п]. Это означает, что LJ/] — Lk+llj].
Однако так как Lh(p)=j^k, то по индуктивному
предположению и следствию 2 из леммы 9 получаем
Lh+i[j] = Lh+i[j : j +\Lk+i[p] | - 1] = Nip]
и либо Lft+1[& + 1] £ Lh+ilj], либо Lk+l[k+ 1] П Lh+i[j] =
= 0.
Следовательно, по определению L-нумерации
Lh+i[j] = Lh[] • / + \Lh+i[p] | - 11 = N[p].
Это завершает доказательство, поскольку Lk[j] = Lh+i[j].
Будем обозначать через Н гамак с начальной
вершиной р и конечной q, а через Н — множество Я U {g).
Лемма 14. Для любого i s [1_^ п\ имеет место
одна из трех альтернатив: Mil s Я; Н <= Mil; Я П Mi] =
= 0.
Доказательство. Нетрудно проверить, что
если S — некоторая зона графа G, то либо S s Я, либо
Н <= S, либо £ПЯ = 0. Отсюда по лемме 9 получаем
76
нужное утверждение, поскольку согласно определению
гамака Nip) = min {N(pk)\ph е= Н).
Лемма 15. Пусть ц, «= [ри ..., pj и цг = [р, ...
..., а,] — такие М-пути, что Mip^ s£ Miqx) < Mipk) ^
< Miq,). Тогда существует М-путъ из qt в рх.
Доказательство. Предположим, что не
существует Л/-пути из вершины д, в вершину pk. Тогда
справедливы неравенства M(pt) < M(qi) < М(рк). Из Д/-до-
стижимости вершин в орграфе с одним входом
получаем, что -Miqi) < Miv) и v принадлежит Д/-путям из
входа s до вершин из цх. Пусть миг — такие вершины
графа, что МЫ) = min {M{v)\v е А) и M(z) =
•=maxWiv)\Miv)<Miu), v&Biu)). Тогда 'M(z) <
< M{qx) < МЫ), leB(u) и множество В — MlMiz) +
+. 1 : МЫ) — 1] не содержит предшественников
вершины к. Отсюда по определению Л/-нумерации получаем,
что все преемники вершин из В имеют Л/-номера
меньшие, чем Д/-номер вершины и. Но вместе с тем qx e В,
МЫ) < Miq,) и цг есть Д/-путь из qt в д„
Следовательно, некоторый преемник вершин из В имеет М-но-
мер не меньший, чем МЫ). Таким образом, имеет
место противоречие.
Лемма 16. Если М{р) < M{q), то
N[N(p):N(q)]$=n^N[N(p):n].
Доказательство. Из определения гамака и
следствия из леммы 1 получаем,что Mip)= min ШЫ)\
кеЮ. Согласно лемме_1 и определению iV-нумерации
отсюда следует, что Н s NlNip) : it]. Осталось
показать, что NlNip) : Niq)] si, В силу определения
^-нумерации получаем, что pi <= NlNip) 4- 1 : Niq) — 1] ж
Mip) < Miq) тогда и только тогда, когда выполняется
одно из следующих условий:
1) Mip) < Mipi) < Miq) и имеются Д/-пути из р
в pi и из Pi в q;
2) Mipi) < Mip) < Miq), имеется Л/-путь из /?, в q
и нет М-пути из pt в р;
3) Mip) < Miq) < Mip^, имеется Л/-путь из р в Pi
и нет Л/-пути из q в рх.
При выполнении условий 1) или 3) в силу
определения гамака имеет место включение /?, е Й. Свойство
2) не может иметь места согласно лемме 15 и
следствию из леммы 1.
Лемма 17. Если Mip)>Miq), то H = N[Nip)i
iN(p) + |Я| - 1].
77
Так же как и в доказательстве предыдущей леммы,
имеем Mip) = min ШЫ)\ и е Н). Рассмотрим две
такие вершины v и w, что v принадлежит гамаку //,
а Mip) < M(.w) < M(v). Применяя леммы 1 и 15,
получаем существование М-путп из р в w. Ясно, что
вершина q не может принадлежать этому пути, поскольку
Miq) < Mip), и, следовательно, по определению гамака
юбД, Таким образом, Н = MiMip) : Mip) + \H\ - 1]
и к любой вершине из Н существует Л/-путь из
вершины р. Теперь утверждение леммы вытекает из
определения гамака и ^-нумерации.
Лемма 18. Если Miq) < Mip), то для любого
l^W-.n] имеем Н = Ь,Шр) : Lt(p) + \Н\ - 1L
Доказательство проведем индукцией по L Пусть
i = п. Если для некоторого /е[1:га— 1] выполняется
равенство Н = KjlKjip) : Kjip) + \H\ — 1], то в силу
лемм 11, 14 и определения /if-нумерации выполняется
равенство Н = Kj+i[Kj+lip) : K1+i(p) + \H\ — 11.
Отсюда следует справедливость леммы для случая i = п,
поскольку согласно лемме 17 имеет место равенство
H^NiNip) :Nip) + \H\ - 1].
Предположим, что лемма верна для всех i^[s:n],
и рассмотрим случай,_когда i = s — 1. Из лемм 13 и 14
следует, что либо Я <= Lsis\, либо Lsis\ s И, либо
Н П Lsis) = 0. Таким образом, достаточпо рассмотреть
случай, когда Я с Lsisi. В этом случае либо все
вершины из // имеют один и тот же Ls-panr, либо Ls-
ранг любой вершины из Н отличается от £5-ранга
любой вершины из Ls[s]\H и равен Ls(w) для некоторой
вершины w^H. Это означает, что И — Ls-ilLa~i(p) :
:L.-t(p) + \H\-i].
Лемма. 19. Если Mip) < Miq), то H = L[p:q].
Доказательство. Индукцией по i покажем,
что справедливо более общее утверждение для случая,
когда Mip) < Miq): для любого i е [0 : п\, если i<
< Ltip), то Н = Lip : q]; в противном случае Ltip : q] s
£-Hs=L,[L,(p) :ni.
Пусть Mip) < Miq). Рассмотрим_случай, когда i = п.
По лемме 16 имеем Nip : q) s Я = NlNip) : я]. Из
лемм. 11, 14 и определения /^-нумерации следует, что
если Kjip : q\ s Я s KjiKjip)_\ n] для некоторого / e
e[l:n—1], то Ki+1[/J: д]^Я ^/fi+1[Zj+1(/j) : пУ. Таким'
образом, лемма справедлива при i = п. Пусть
утверждение верно для всех i S* s и пусть i = s — 1.
Рассмотрим два случая: Ls~iip)>s — 1 и Ls-Sp) *£ s — lr.
78
Пусть Ls-i(p) > s — 1. Тогда по определению
/^-нумерации Ls{p) > s. Предположим, что La(p) > s. Тогда
по индуктивному предположению Н = L\p : g].
Отсюда и из лемм 13 и 14_получаем, что достаточно
рассмотреть случай, когда Н s Ls[s]. Но в этом случае либо
все вершины из Н имеют один_и тот же £,-ранг, либо
£/5-ранг каждой _вершины v^H совпадает с i,(») для
некоторой w e Д_ и отличается от £„-ранга любой _вер-
иишы из Ls[s]\#, если v^=q. Таким образом, Н =
= £s_,[p : q]. Пусть Ls(p) == s. Тогда по
предположению индукции _Ls[p : g] — Н ^ Ls[L,ip) : п] и согласно
леммам 13 и 14 #^£Др]. Отсюда и из определений
гамака и F-ранга получаем, что £8-ранг любой вершины
cefl меньше £3-ранга q и, если />3-ранг некоторой
вершины v e Ls[p] меньше £,8-ранга вершины у, то d s Я.
Таким образом, в силу определения /^-нумерации
получаем Н = Ls-t[p : q].
Пусть L,-i(p) < s — 1. Тогда по определению L-ну-
мерации и предположению индукции Ls{p) < s и Ls[p :
: ф ^ Н s LslLs{p) : n). Из неравенства L„{p) < s
согласно леммам 13 и 14, а также по определению L-ну-
мерации получ_аем, что лпбо Ls(v) = £,_((у) для любой
вершины »еЯ, либо для любой вершины v е Я вы-
полпено следующее свойство: если Ls(y) ^ L.-jCy), то
v ^ Н \{р) и существует такая вершина и> из Я,
отличная от 2i чт0 La(v) — La-i(w). Таким образом,
Ls-ilp : q] s H ^ L.-JLj-^p) : и]/Лемма доказана.
Пусть S — некоторый подграф графа G и р —
некоторая вершина из S. Определим множества и величины:
9&1 (5, р) =. {и е= 4 И | и> е= ,5 & Л/ (у) < М (р)};
Wa{S,p) = {ve=B(w)\we=S &и;фр&Ь (v) <L(p)};
= {v <=A (w) \we=S&M(v)>M(p)&L (v) < L (p)};
m* (S, p) = max (£(/>), {L(v)\w= A (w) &W(=S&
&M(v)>M(p)});
m* (S, P) = max (L (p), {L(v)\v<=:B {w) & w <=
<=S&u>¥-p}).
Теорема И. Подграф Я графа G является гама-
ком тогда и только тогда, когда выполнены следующие
условия:
79
1} H~LlUp):L(p)+\H\-i];.
2) M(v) > M(p) для любой вершины v из II;
3) ШН, р) = 0;.
4) Ш3Ш, р) = 0;
5) p<£A(q);
6) mt{H,p)<\H\ + L(p);
7) либо 2Wt (Я, р) = 0 и т* (Я, р) = L (р) + \ Я | =
= L (q), либо аИж (Я, р) = {q} и т* (Я', р)< L (р) + | Я |.
Доказательство. Для любого гамака
указанные условия выполняются в силу определения гамака
и лемм 18, 19, а также следствия из леммы 1.
Пусть некоторый подграф .Я удовлетворяет
условиям 1)—7). Из условий 3) и 6) следует, что II имеет
единственную начальную вершину р. Условие 7)
означает, что Я имеет конечную вершину q, для которой
либо L(q) = L(p) + \Н\, если множество Ф?,(Я, р)
пусто, либо q^?Sl,(H, p). Предположим, что у II
существует конечная вершина v, отличная от а. Из условия 7)
получаем, что M(v)> Mip), L(v) < Lip), и,
следовательно, v е Ш3Ш, р). Но Ш3(11, р) пусто по условию 4).
Следовательно, имеет место противоречие. Таким
образом, Я — гамак с начальной вершиной р и
конечной q.
С л е д с т в и е. Пусть р — некоторая вершина
графа и S — подграф L[L(p) : Lip) + k], k> 0, для
которых выполнено по крайней мере одно из следующих
условий:
1) W2(S, р) Ф 0;
2)m3iS, р)Ф0;
3) в S имеется такая вершина v, что М{а) < М(р);
4) Up) + k = n-l.
Тогда не существует такого гамака II с начальной
вершиной р, что S cz Я.
3.2. Алгоритм отыскания гамаков. Отыскание
гамаков происходит в результате исполнения п — 1 шагов,
на каждом из которых находятся все гамаки, имеющие
в качестве начальной некоторую фиксированную
вершину р. Для этого вначале помечаются все
предшественники р, затем последовательно рассматриваются
множества подряд занумерованных вершин L[L(p) :
:L('p) + ii, начиная с множества, для которого г = 0.
Чтобы определить, образует ли текущее множество
гамак, для р и для данного множества вершин
вычисляются множества Wlh 2Я2, 2R, и величины ml и щ. После
80
указанных вычислений происходит проверка условий
теоремы 11 и следствия из нее. В зависимости от
результатов этой проверки либо осуществляется переход
к рассмотрению следующего множества, либо
заканчивается нахождение гамаков с дапной начальной
вершиной.
Алгоритм:
Вход: Граф G = (V, Е), заданный списками
смежности A(v) и B{v), Л/-нумерация вершин и
соответствующая ей L-нумерация.
Выход: Множество гамаков.
начало
1. процедура ГАМАКИ Ш, L, р);
2. начало
3.' МАКС1 := МАКС2 :== Upl; МИОЖ1 := истина;
4. взять в качестве q вершипу р;
5. //:=0;
6. пометить каждую вершину v из В(р);
7. для к от L(p) до п — 1. шаг 1 цикл
8. начало
9. добавить к // вершину v, у которой L{v) = к;
10. для всех w из Aiv) цикл
11. начало
12. если МЫ) < М(р) то
13. если МНОЖ1 V w = q то
14: МПОЖ1:=ложь;
15. взять в качестве q вершину w;
16. иначе заверш-пть нахождение гамаков, у
которых р — начальная вершина;
17. иначе если L(w) > L(p) то
18. МАКС1 := max (MAKC1, Liw));
19. иначе завершить нахождение гамаков, у
которых р — начальная вершина;
20. конец цикла;
21. если v не есть р то
22. для всех и; из Biv) цикл
23. начало
24. если ЬЫ) < L(p) то
25. завершить нахождение гамаков, у которых р —
начальная вершина;
26. иначе МАКС2 :=тахШАКС2, L(w));
27. конец цикла;
28. если -1 МГГОЖ1 то
29. если МАКСК& + 1 Д Я не помечена то
6 В. А. Евстигнеев
81
30. H — гамак с начальной вершиной р и
конечной д;
31. завершить нахождение гамаков, у которых р —
начальная вершина;
32. иначе выбрать вершину и, v которой. Liu) =
= к + 1;
33. если МАКС1 = к + 1 Д и не помечена то
34. Н — гамак с начальной вершиной р и конечной
вершиной q;-
35. иначе;
36. конец цикла;
37. конец процедуры;
38. взять в качестве р вход s графа;
39. ГАМАКИ (Ж, L, «);
40. для всех v, являющихся конечными вершинами
гамаков и отличных от выхода графа, цикл
41. ГАМАКИ Ш, L,v);
конец
3.3. Полугамаки и шлейфы. Назовем вершину Ъ
обязательным преемником вершины а в графе G, если
Ъ *¥= а, а не является конечной вершиной и Ъ
принадлежит каждому пути от а до конечной вершины G.
Рассмотрим множество Tia) всех обязательных
преемников вершины, отличной от входной вершины а. Из
определения ясно, что Т(а) линейно упорядочено по
отношению к свойству быть обязательным преемником и,
кроме того, множество Т{а) не пусто (ему
принадлежит, например, выход графа). Минимальный элемент
Т{а) по отношению к рассматриваемому свойству
называется фокусом вершины а в G и обозначается Fia, G),
Иными словами, фокус Fia, G) — это блжкайший
обязательный преемник вершины а при движении от а
к выходу графа.
Полугамаком S(a, G) вершины а называется
подграф, порожденный всеми вершинами таких путей из
а в Fia, G), которые не содержат повторных
вхождений вершины Fia, G) (повторные вхождения а
допускаются).
Шлейфом вершины a ia¥= s) называется полугамдк
Sia, G), из которого удалена вершина Fia, G); дуги,
ранее направленные в Fia, G), становятся свободными.
С точки зрения теории графов шлейф не является
графом, так как в последнем не допускаются свободные
дуги, т. е. дуги без конечной вершины.
82
На рис. 2.24 представлены полугамаки п шлейфы
графа G, показанного на рис. 2.23.
Вершина
Обязательные
преемники
т, -.„/. Внутренние Входные вер-
ч'Опус вершины шины
иг, и7, и=, J
«5, г
1)5
«7. «в
«7, "в
«7, «6, «5. «4
47, «S, «
«4
v7
Вершина
Полугамак
Шлейф
V, Ьг
^>Ъ-
v3 v2 a,
Рпо. 2.24.
§ 4. Интервалы и сводимые графы
4.1. Подграф I(v) называется интервалом с
начальной вершиной v, если эта вершина принадлежит
каждой зоне I(v)' и для всякой вершины ц?, из I(v),
отличной от у, множество вершин 1 ю содержится в
I(v). Из определения интервала вытекает, что любые
два максимальных интервала графа не имеют общих
вершин.
Выделение интервалов в графе происходит
следующим образом. Пусть вершины графа как-то
упорядочены, например с помощью ./If-нумерации. Берем
первую вершину в качестве начальной вершины
интервала (вначале это вход графа) и включаем в интервал
6* 83
все те вершины, у которых все предшественники уже
включены в интервал, а также все те контуры, которые
проходят через данную вершину и у которых нет
общих дуг с контурами, не проходящими через данную
вершину. По завершении этого процесса каждая
вершина будет включена в какой-нибудь, возможно
тривиальный, интервал.
Пример. В графе на рис. 2.25 можно выделить
четыре интервала: I(s), /(14), I(vi0) и I{vit),
Граф G* называется производнъЫ графом, если:
а) вершины графа G* соответствуют максимальным
интервалам графа G;
б) вершина и графа G*, соответствующая интервалу
/(и), соединяется дугой (v, w) с вершиной и>,
соответствующей интервалу 1{и>), тогда и только тогда, когда
в G имеется дуга пз некоторой вершины интервала
Ни) в некоторую вершину интервала l(w).
Другими словами, производный граф есть фактор-
граф, но относительно интервалов, а не бпкомпонент.
Последовательность G0 = G, Gu ..., Gh, k>0, где
G, = G*t a G{ есть производный граф для Gi-U причем
для любого i, 1 < i =S к, Gi+i Ф Gh называется
интервальным представлением графа G. Эта
последовательность всегда конечна, т. е. для каждого графа
существует предельный производный граф.
4.2. Граф G называется сводимым, если его
предельный производный граф одновершинен.
84.
Граф на рис. 2.25 является сводимым, так как его
интервальное представление, показанное на рис. 2.26,
имеет одновершинный предельный граф.
<W >
Jll(s))
&■■'
ff,« оЦ1 (I(s)))
^JI(Vn)
Рис. 2.26.
I (I (Ok
Существуют несводимые графы. Граф на рис. 2.27
несводим, так как его интервальное представление
состоит всего из двух графов, последний из которых не
является тривиальным.
еа-
(?>о
В)
Рис. 2.27.
Лемма 20. Сводимый граф аранжируем.
Доказательство. Пусть некоторый граф G
сводим, т. е. его предельный граф Gm, m > 0,
представляет собой отдельную вершину. Рассмотрим процедуру
упорядочения вершин графа G путем приписывания
им различных последовательностей чисел. Порядок,
устанавливаемый применением этой процедуры на вер-
85
шипах графа, зависит от порядка, в котором
выбираются непосредственные преемники вершин в
интервале. Тем не менее все эти результирующие
упорядочения вершин сводимого графа являются
аранжировками.
Единственной вершине графа Gm приписываем
единицу, а для вершин каждого производного графа G,„
к = т — 1, ..., О, образуем последовательности так, что
последовательность 2:' Р, приписываемая некоторой
вершине р графа Gh, получается путем присоединения
числа пт-к (так называемого интервального номера
вершины р, т. е. номера р в содержащем ее максимальном
интервале Кр)) к последовательности S'hp),
приписанной вершине Кр) графа Gi+! и уже образованной на
предыдущем шаге.
Процесс нахождения интервальных номеров
состоит в следующем. Головная вершина интервала имеет
своим интервальным номером единицу. Следующее по
порядку натуральное число получает в качестве
интервального номера произвольная, незанумерованная
вершина интервала, все предшественники которой уже
имеют интервальные номера. (При организации этого
процесса следует считать дуги, заходящие в начальную
вершину интервала и принадлежащие зонам
интервала, отсутствующими.) В силу определения интервала
алгоритм заканчивает свою работу тогда и только
тогда, когда все вершины интервала будут иметь
различные интервальные номера. Покажем, что полученное
упорядочение вершин есть аранжировка.
Предположим противное, т. е. предположим, что
найдется пара вершин р и q в G, таких, что
некоторый простой путь из входа s графа G в q содержит р
и 9?-р>3?\- Другими словами, для
последовательностей 2% = [п0, пх, ...-, пт] и 2'q= [п0, пи .. ., пт],
приписанных соответственно вершинам р и q, существует
такое к, 0 =€ к < т, что щ — щ для 1 =£ i =S к и nk+i >
> nh+i. Из того, что первые к членов приписанных
Последовательностей совпадают, а (к + 1)-е различны,
следует, что р и q входят в одну вершину 1рд графа Gm~h>
но в разные вершины /р и /, графа Gm_(4+1). Отсюда и
из существования простого пути из входа графа G до
q, содержащего .р, а также учитывая то, что начальная
вершина интервала является его единственной входной
вершиной, непосредственно получаем следующее. Су-
86
ществует путь в IPq из 1Р в /„ и либо 7Р — начальная
вершина интервала Ipq, либо существует путь, не
содержащий начальной вершины интервала. Отсюда
следует, что интервальный номер вершины 1Р заведомо
меньше интервального номера /,, т. е. nh+i < пк+и что
противоречит предположению. Таким образом,
естественное упорядочение вершин сводимого графа
является аранжировкой и сводимый граф аранжируем.
Более того, имеет место теорема (доказательство
которой мы опускаем):
Теорема 12. Свойства сводимости, аранжируе-
мости и одновходовости зон графа эквивалентны.
4.3. Введем в рассмотрение два преобразования
графов.
Т'1: удалить петлю в вершине v.
Т2: заменить вершины v n w одной вершиной, если
?г не является входной вершиной и v — единственный
предшественник вершины w, т. е. Гщ1 = {v}. Дуга
(у, w) при этом преобразовании удаляется. Дуги, ранее
исходившие из этих вершин, а также дуги,
заходившие в и>, заменяются дугами, исходящими из новой
вершины и заходящими в нее.
Граф называется сводимым по Хехту и Ульману,
если он может быть преобразован в пустой
одновершинный граф с помощью последовательного
применения преобразований Т1 и Т2.
Л е м м а 21. Определения сводимого графа и
сводимого по Хехту и Ульману эквивалентны.
Доказательство. То, что интервально
сводимый граф сводим в смысле Хехта и Ульмана, вытекает
из возможности стягивания в одну вершину интервала,
поскольку все контуры интервала могут быть стянуты
в петли в начальной вершине интервала.
Если же граф сводим по Хехту и Ульману, то, взяв
вершину, в которую граф оказался стянутым, и
применяя преобразования, обратные преобразованиям Т1 и
Т2, мы можем получить лишь граф, являющийся
интервалом или в более общем случае графом, у которого
каждая зона будет одновходовой.
Лемма 22. Граф несводим тогда и только тогда,
когда он содержит конструкцию, показанную на
рис. 2.28, где волнистые линии соответствуют путям
в графе.
Нетрудно увидеть, что граф на рис. 2.28 содержит
зону (в нашем случае контур) с двумя входами.
87
Назовем носителем D(G) орграфа G максимальный
бесконтурный суграф G. Если T(G) — дерево поиска
в глубину для орграфа G, то носитель D{G) есть T(G),
Дополненное прямыми и поперечными дугами. Так как
T(G) определяется неоднозначно, то и
носитель в общем случае
определяется неоднозначно.
Теорема 13. Граф сводим по
Хехту и Ульману тогда и только тогда,
когда он имеет единственный носитель.'
Доказательство. (=>)
Предположим, что граф сводим, но его
носитель не единствен. Тогда .G имеет по
крайней мере два носителя D,{G) п
D2(G). Так как Dt и D2 различны, то
различны и их множества дуг, E,(D,)¥=
°¥=E2(D2). He имеет места ни одно из
включений Ei <= Е2 и Е2 cz Et в силу
максимальности носителя. Таким образом, Ej— Et не
пусто. Пусть (v, w) — дуга из Е2~ Et. Она ие можег
быть прямой дугой, так как все прямые дуги входят
в Ei, и не может быть поперечной по той же причине;
следовательно, (v, w) — обратная дуга. Если v — w, то
(v, w) — петля, что невозможно. Значит, v¥=w и v¥=~
^ s, где s — вход G. Пусть w = s. Так как в D2
существует путь ц из s в v,- то ц вместе с дугой (v, w)
образует контур, что невозможно. Значит, w^s.
Кроме того, путь р. не содержит вершины w, иначе также
был бы контур. Следовательно, дуга (v, iv) не может
принадлежать Е2 — Ех. Значит, Ег — Е, пусто, а отсюда
следует единственность носителя для сводимого графа.
(■*=) Пусть G — несводимый граф. Докажем, что его
носитель не едипствен. Из леммы 22 следует, что G
содержит по крайней мере одну конструкцию вида,
показанного на рис. 2.28. Обозначим'эту конструкцию
через &', а через V, W, X, Y, Z — соответственно
множества дуг путей из s в а, из а в Ь, из а в с, из Ь в с и из
с в Ъ в какой-нибудь конструкции %'. Эти пять
множеств не пересекаются, а V может быть пусто.
Построим теперь два различных носителя D, и D2
для G. Пусть 7\(G) есть дерево поиска в глубину для
G, содержащее дуги {V U W U Y U Z) — {(d, b)}, где
(d} b) — дуга в Z, заходящая в Ь, На рис. 2.29, а
показано начало построения этого дерева. Z' на рисунке
есть Z\{{d, b)). Аналогично, пусть T2(G) есть дерево
88
поиска в глубину, содержащее дуги [V U X U Z U Y) —
— {(е, с)}, где (е, с) есть дуга из Y, заходящая в с. На
рис. 2.29, б показано начало построения этого дерева,
У на рисунке есть Y\{(e, с)}. Пусть D, есть 7\(G) плюс
его прямые и поперечные дуги; аналогично определим
D2. Ясно, что D, и D2 — носители
графа G. Ни один из пих не
содержит всех дуг из Y U Z, так как иначе
получился бы контур. Но D, и D2
содержат разные подмножества
Y U Z, и, таким образом, Dl¥=D1.
Будем говорить, что вершина v
доминирует над вершиной w в G,
если у^ю и каждый путь из входа
s графа G в w содержит v.
Те о р е м а 14. Орграф G
сводим тогда и только тогда, когда
множество его дуг может быть разбито
на два множества Е{ и Ег таких, что
Ei порождает бесконтурный граф —
носитель D графа G, а каждая дуга
(v, w) из Ег обладает "свойством: либо v = w, либо w
доминирует над v в G.
Доказательство. (=»-) Предположим
противное, т. е. что w не доминирует над v в G. Тогда в
графе G имеется конструкция %', показанная на рис. 2.28,
что противоречит предположению о сводимости. G.
(<=) Если для каждой обратной дуги (у, w)
вершина w доминирует над v, то каждый контур в графе
имеет один вход, а следовательно, граф сводим.
4.4. Проверка графа на сводимость. Пусть v и w Ф
Ф s — две вершины в орграфе G с входом s.
Втягиванием вершпны w в v назовем преобразование графа,
при котором удаляется вершина w и инцидентные ей
дуги, добавляется дуга {v, х) вместо каждой удаленной
{w, x) с х Ф v, если (v, x) не была ранее в графе, и
добавляется (х, v) вместо каждой дуги {х, w) для хФ w,
если (х, v) не была ранее в графе.
Рассмотрим преобразование Т2': если (и,
w)—единственная дуга, заходящая в w, и w Ф s, то
втянем w в v.
Мы утверждаем, что граф сводим тогда и только
тогда, когда он может быть преобразован в пустой
одновершинный граф многократным повторением
преобразования .Т2', Это определение отличается от опреде-
П
89
ления Хехта и Ульмана тем, что там допускаются
петли и преобразования, приводящие к петлям. Легко
увидеть, что граф с петлями сводим в смысле Хехта и
Ульмана тогда и только тогда, когда он после удаления
петель сводим в указанном выше смысле. Пусть нам
известны полустепени захода каждой вершины.
Выберем вершину, в которую заходит только одна дуга,
и применим преобразование, Т2', стягивая граф и
изменяя число дуг, заходящих в каждую вершину.
Каждое применение Т2' требует 0{п) времени и
уменьшает каждый раз число вершин па единицу, так что
алгоритм требует 0(п2) времени. За счет использования
более тонкого метода модификации информации после
преобразования Т2' трудоемкость можно уменьшить до
0(т log m).
Определим C(w) как множество начал обратных дуг,
заходящих в w, P(w) — как множество вершин, из
которых существует путь хотя бы в одну вершину из
C(w), не содержащий w. Если обратных дуг нет, то
C{w) и-P(w) пусты.
Лемма 23. Граф G сводим тогда и только тогда,
когда для всех w и всех v e P(w) в дереве поиска в
глубину T{G) существует путь из w в v.
Доказательство. Для любых вершин v и w
в том случае, когда и не является потомком w, в T(G)
существует путь из s в и, который не содержит w.
Если существуют w и v^Piw) такие, что v не является
потомком w, то существует путь из s в некоторую
вершину в C(w), не проходящий через w, и граф G
несводим по теореме 14. Обратно, если G песводнм, то по
теореме 14 существуют обратная дуга (v, w) и путь
из s в и, минующий w. Тогда s e P{w) и s не является
потомком w. Лемма доказана.
Пусть w есть вершина с наибольшим Д/-номером в
G, в которую заходит обратная дуга. Предположим, что
для всех v e P(w) существует путь из v в w по
древесным дугам дерева T(G). Пусть G' образован из G
втягиванием всех вершин из P(w) в w.
Лемма 24. Каждая дуга (v', w') в G'
соответствует дуге (v, w') в G, такой, что в TiG) существует
путь из'и' в v.
Доказательство. Пусть (и, w') — дуга в G.
Если w'*=P(w), то v' ^P(w) U {w}. Если v^P(w), то
существует путь из v в w. Таким образом, либо (v, w')
не соответствует ни одной дуге графа G', либо (v, w')
90
соответствует дуге (i/, w') графа G' с v' — v пли v' =
= w и существует путь из w в v.
Пусть Т' — подграф графа G', дуги которого
соответствуют дугам из TiG).
Лемма 25. Т' с тем же упорядочением вершин,
что и в TiG), есть дерево поиска в глубину в G',
Обратные дуги соответствуют обратным дугам G, прямые
дуги С соответствуют прямым или поперечным дугам
G, поперечные дуги G' — поперечным дугам G.
Доказательство. Подграф дерева Т,
порожденный вершинами из Piw) U {wi, есть дерево. Каждая
вершина в С, исключая s, очевидно, имеет в точности
одну дугу из Т', входящую в нее, так что Т' есть
дерево. Более того, упорядочение вершин в Т' в
точности то же, что и в Г. Из леммы 24 следует, что
обратная дуга из G соответствует либо обратной дуге из G',
либо ничему не соответствует; прямые дуги G либо
ничему не соответствуют, либо соответствуют прямым
дугам G', а поперечные дуги G либо ничему не
соответствуют, либо соответствуют поперечпым или
прямым дугам G'. Отсюда следует, что Т' есть дерево
поиска в глубину в G'.
Пусть множества Р'(х) и С'(х) определены в графе
G' так же, как множества Р(х) ш С(х) в графе G.
Лемма 26. Для любой вершины х <■ w в Т'
существует путь из х в у для всех у е Р'(х) тогда и
только тогда, когда в Т существует путь из х в у для всех
у е Р(х).
Доказательство. Предположим, что
существует в Р'(х) вершина у, не являющаяся потомком х в
Т'. Тогда у не есть потомок х в Т. Более того,
существует путь р' в G', не проходящий через х и идущий
из у в некоторую вершину z и такой, что в G' дуга
(z', x) есть обратная дуга. По лемме 25 дуга (z', x)
соответствуем некоторой обратной дуге (z, x) в G'.
Подграф G', порожденный вершинами из множества Piw) U
U {w), сильно связен. Таким образом, существует не
проходящий через х путь из у в z в графе G,
состоящий из дуг, соответствующих дугам пути р' и,
возможно, некоторым дугам между вершинами в Pi.iv) U
U {w); таким образом, у е Р(х). Обратно, предположим,
что существует вершина у в Р{х), не являющаяся
потомком х в Т. Если y&P(w), то у^Р'(х) и у не есть
потомок 1в Г Если у ^P(w), то w не есть потомок х
в Г и weP'ix).
91
Доказанные леммы 23—26 лежат в основе
эффективного алгоритма для проверки сводимости графа.
Пусть Т есть дерево поиска в глубину для графа G,
и пусть Wi > wz > ... > wn — вершины из G, в
которые заходят обратные дуги. Вычислим 'PiwJ.
Если в P(wi) найдется некоторая вершина, не
являющаяся потомком wu то стоп; в противном случае мы
втягиваем вершины из P(wi) в ш{ для образования
графа G' и вычисляем P'(wz) в G'. Если P'(wz)
содержит вершину, не являющуюся потомком w2, то стоп;
в противном случае мы формируем G" втягиванием
Р'Ыг) в wz и вычисляем P"(w3) в G". Граф сводим,
если данной процедурой можно избавиться от обратных
дуг. Тонкий момент в этом алгоритме — формирование
графов G', G" и т. д. втягиванием вершин. Для
построения алгоритма используем какую-нибудь
эффективную процедуру объединения непересекающихся
множеств. Множество с именем v будет содержать
вершину v и все вершины, втянутые в у в текущем
графе. Вначале будут существовать п множеств, каждое с
именем, совпадающим с именем содержащейся в нем
вершины. Функция НАЙТИ (х) будет возвращать имя
множества, содержащего х, т. е. имя вершины, которая
соответствует х в текущем графе. Процедура
ОБЪЕДИНЕНИЕ (А, В, С) будет вычислять объединение
множеств А и В (уничтожая А п В), давая новому
множеству имя С. В дополнение к проверке
сводимости алгоритм вычисляет для каждой вершины первую
из вершин wu wz, ..., w„, в которую х втягивается. Эта
вершина обозначается Н{х) и Н(х) полагается равным
нулю, когда х никогда не втягивается.. Н{х)
используется для конструирования последовательности
преобразований Т2' для стягивания сводимого графа.
Алгоритм проверки графа на
сводимость:
Вход: Граф G = (У, Е) с входом s и
^-нумерацией вершин.
Выход: Ответ на вопрос: «Сводим пли нет
граф <??»
начало
1. вычислить ND(y) для каждой вершины v;
примечание ND(y) равна полустепени исхода
вершины v конец примечания
2. для у от 1 до га шаг 1 цикл
3. начало
92
4. построить списки всех обратных, прямых и
поперечных дуг, заходящих в v;
5. сконструировать множество с именем v,
содержащее v в качестве единственного элемента;
6. ЯЫ:=0;
7. конец цикла;
8. для из от п до 1 шаг — 1 цикл
9. начало
10. Р := 0;
примечание Р будет содержать вершины из
Р(из) в текущем графе конец примечания
11. для каждой обратной дуги {v, из), заходящей в
w, цикл
12. начало
13. включить НАЙТИЫ в Р;
14. <?:=Р;
примечание множество Q будет содержать те
вершины из множества Р, чьи входящие дуги не были
проверены конец примечания
15. пока Q Ф 0 цикл
16. начало
17. выбрать вершину х е Q и удалить ее _из Q;
18. для каждой древесной, прямой или поперечной
дуги (у, х), заходящей в х, цикл
19. начало
20. у' :=НАЙТИ(у);
примечание к этому шагу все обратные дуги
уже втянуты конец примечания
21. если w > у' V w + ND(u>) ^ у' то переход к
шагу 34;
22. если у' ф. Р Л у' Ф w то
23. добавить у' к множествам Р т& Q;
24. если Н(у') = 0 то Н(у') := из;
25. конец цикла;
26. конец цикла;
27. для ief цикл
28. начало
29. ОБЪЕДИНЕНИЕМ, из, из);
примечание это стягивание может порождать
параллельные дуги, которые не удаляются, так как
наличие их не влияет на алгоритм конец примечания
$0. конец цикла;
31. конец цикла;
32. примечание если алгоритм достигает этого
шага, то граф G сводим конец примечания
93
33. примечание если алгоритм достиг этого шага,
то граф G несводим конец примечания
34. конец цикла;
конец
Легко доказать индукцией по числу вершин, в
которые заходят обратные дуги, что эта процедура
правильно проверяет сводимость графа. Это следует из
лемм 23—26. Шаги 1—6 имеют трудоемкость 0{п + т).
Каждая обратная дуга в G проверяется в точности один
раз иа шагах 11—31. Один раз вершина становится
элементом множества Р, втягивается в некоторую
другую вершину, и составляющие ее вершины никогда не
перепроверяются. Таким образом, каждая прямая,
древесная или поперечная дуга проверяется в точности
один раз на шагах 18—25. Каждая вершина
становится элементом множества Р самое большее один раз во
время всех повторений цикла 8—34. Отсюда следует,
что цикл 8—34 требует Oin + m) шагов плюс Oin)
шагов для процедур ОБЪЕДИНЕНИЕ и Oim) для
НАЙТИ. Полная трудоемкость алгоритма определяется
трудоемкостью операций над множествами, что
составляет при эффективном способе построения объединения
множеств Oimin {n log n + m, m log* т)) или, более
точно, Oimaim, п)), где aim, п)— функция Аккермана.
4.5. Стягивание сводимого графа. Алгоритм,
описанный в п. 4.4, неконструктивен, но мы можем
использовать величины H{v) для построения
последовательности преобразований Т2', которая будет стягивать
сводимый граф. Для этого мы будем использовать
N-номера вершин. Предположим теперь, что мы
применяем алгоритм проверки на сводимость и каждой
вершине v сопоставляем пару illiv), Niv)). К концу
алгоритма мы упорядочим вершины так, что вершина,
помеченная парой (я,, г/,), будет встречаться'прежде,
чем помеченная парой ix2, у2), тогда и только тогда,
когда xt > хг или я, = хг и г/, < у2. Это упорядочение
вершин назовем редукционным порядком.
Трудоемкость процедуры — Oin).
Лемма 27. Если граф G сводим, то мы можем
втянуть вершины G путем использования
преобразования Т2' в соответствии с их редукционным порядком.
Докажем лемму индукцией по числу втянутых вер-
шии. Предположим, что все вершины после вершины и
в редукционном упорядочении могут быть втянуты.
94
Это порождает граф G', являющийся редукцией G.
Рассмотрим вершину v. Если это не вход графа, то в
вершину v заходит единственная древесная дуга. Если
в графе G имеется обратная дуга (и, iv), такая, что из
v в w идет путь, to все вершины х в пути по дереву
от v к w могут быть втянуты прежде v, так как
H{x)>M(w) и H(v) < M(v) sS M(w). Если граф G
содержит прямую дугу (v, w), такую, что из v в и> идет
путь, то H(w) < M(v) по леммам 23 и 26. Более того,
Н(х) > H(w) и N(x) ^ N(w) для всех вершин х на
пути по дереву из v в w. Отсюда следует, что все
вершины на пути по дереву из v в w втягиваются прежде, чем
втягивается w. Предположим, что G содержит
поперечную дугу (v, w) такую, что из v в w идет путь. Пусть х
есть общий предок вершин v и w с наибольшим М-воме-
ром. Тогда Я(ю)< Mix) по леммам 23 и 26, и все вершины
у на пути по дереву из х в w и из ж в и удовлетворяют
соотношениям Н(у) > H{v) и N(y) ^N(w). Таким
образом, все вершины на этих путях втягиваются ранее w.
Отсюда следует, что в G' вершина v может иметь
только одну дугу, входящую в нее, и поэтому она может
быть втянута. Лемма доказана.
На рис. 2.31 приведены значения переменных H(v)
и iV-номера вершин для графа, показанного на
рис. 2.30. Порядок
редукции: A, D, Е, Н, В, С, G,
J, F, I, К.
4.6. Строгой
последовательностью вершин графа
называется такая
последовательность вершин
(возможно, с повторениями),
что любой простой путь в
графе есть ее
подпоследовательность. Слабой
последовательностью вершин
называется последовательность, содержащая в
качестве подпоследовательности любой базисный путь
в графе, т. е. такой путь (д, = [vi, . . ., vh], что никакая
его собственная подпоследовательность не является
путем из v, в vh. Очевидно, что каждая строгая
последовательность одновременно является слабой.
Теорема 15. Каждый сводимый граф с к
вершинами имеет строгую последовательность вершин
длины не более чем к + cklogk, где с = 3/(log3/2) = 5,13.
95
Для доказательства теоремы проведем ряд
вспомогательных построений.
Марковский и Тарьян показали, что для бесконечно
многих значений п существуют сводимые графы с п
вершинами и полустепенями захода и исхода, не
превосходящими двух, для которых слабая
последовательность вершин имеет длину по крайней мере (1/2) log п —
— ОЫ log n).
Рис. 2.31.
Областью RI.V, Е') с головной вершиной ft
сводимого графа G = (V, Е) называется суграф,
порождаемый множеством вершип V и дуг Е' s V' X V} ft e V',
удовлетворяющий свойствам:
а) если (v, w) e E и w е V', причем w ¥= ft, то
veV';
б) если (v, w) e E, v е V и w ¥= ft, то (v, w) «s E'.
Таким образом, единственный способ попасть в
область — это пройти через головную вершину.
Заметим также, что Е' содержит все дуги из V X V, за
исключением тех, которые заходят в головную вершину,
начинаясь внутри области.
Лемма 28. Пусть R = (V, Е') есть область с
головной вершиной ft сводимого графа G = (V, E) с
входом s. Пусть ц есть простой путь в G, который
начинается в некоторой вершине вне R. Тогда ц не
содержит ни одной обратной дуги области R.
Доказательство. Пусть ц содержит две
различные вершины v и w, такие, что соединяющая их
дуга iv, w) — обратная. По определению области путь
ц достигает вершины ft раньше, чем v или ft — v. Так
как G есть граф с входом s, то существует путь v из s
в ft, и мы можем предположить без ограничения
общности, что путь v — простой. Таким образом, ни одна
вершина области Л, исключая ft, ~не входит в v снова.
96
Тогда путь.v, следуя по той части ц, которая ведет из
h в v, образуЬт путь из s в v, который, минует w, если
только w не совпадает с h. В первом случае мы
получаем противоречие с теоремой 14, которая утверждает,
что w доминирует над v. Во втором случае w дважды
встречается в пути ц, так как h = w — v исключается
нашим предположением. Лемма доказана.
Из теоремы 14 следует, что существует такое
упорядочение вершин сводимого графа, что любой путь,
не использующий обратных дуг, есть
подпоследовательность упорядоченной последовательности вершин.
Назовем такое упорядочение ациклическим. Из леммы
28 следует, что если путь входит в область R через
головную вершину, то он должен следовать по
подпоследовательности ациклического упорядочения, пока не
покинет эту область.
Заметим, что когда мы стягиваем сводимый граф
с помощью преобразований Т1 и Т2, вершины
постоянно соответствуют областям. Применение Т1 не
увеличивает числа вершин в области, хотя и добавляет
некоторые дуги. Таким образом, только Т2 строит области
с постоянно растущим числом вершин.
Лемма 29. Пусть R = (.V, Е') — область
графа G, изображаемая некоторой вершиной при
стягивании G, причем V не есть одноэлементное множество.
Тогда У может быть разбито на два непустых
непересекающихся подмножества вершин Vt и У2, таких,
что (У„ Ei) и (У2, Ег) — области, где £, =£" П (У,Х
X У,) и Е2 = Е' П (/г X Уг).
Введем теперь специальный класс сводимых графов,
так называемые спиральные графы, для которых легко
строятся требуемые последовательности вершин. Так
как любой сводимый граф достаточно просто
преобразуется в спиральный, то последовательность вершин
для спирального графа также просто преобразуется в
последовательность вершин для исходного. Класс
спиральных графов определяется рекурсивно.
1) Отдельная вершина есть спиральный граф.
2) Если G = (У, Е) есть спиральный граф с входом
s и v — новая вершина, то:
а) (У U {у), Е U E' U {{v, s))) есть спиральный граф
с входом s (здесь Е' — множество дуг из вершин w e У
в v);
б) (У U Ы, Е U E' U {(v, s))) есть спиральный граф
с входом v.
7 В. А, Евсщгнее!
97
3) Граф, отличный от определенного выше, не
является спиральным.
На рис. 2.32 изображены две конструкции
спиральных графов, соответствующих двум альтернативам
п. 2) определения.
При построении спирального графа вершины
добавляются к нему в определенном порядке. При этом все
дуги, исключая дуги {v, s),
добавляемые в случае 2),
j/^ч. «ввинчиваются в него», т. е.
Ы-^\ вначале к графу присоеди-
Л© \ \ няются их концы, а потом
I \ I уже начала, поэтому нача-
/ ла дуг располагаются даль-
\ А ше от центра.
\ G J Вершину v, добавляемую
^~т/ к спиральному графу по
' правилу 2а), будем называть
Рис. 2.32. ведомой вершиной, а
добавляемую по правилу 26)—
ведущей вершиной. Вход спирального графа — всегда
ведущая вершпна.
Лемма 30. 1. Каждый спиральный граф сводим;
все спиральные графы, из которых он образован,
представляют собой его области.
2. Дуги, добавляемые по правилу 2а), исключая
(и, s), и дуга (v, s), добавляемая по правилу 26),—
прямые, остальные — обратные.
3. Каждая ведущая вершина доминирует над всеми
ранее добавленными.
Доказательство. 1. По индуктивному
предположению граф на рпс. 2.32, а или 2.32, б сводим.
В процессе стягивания его в одну вершину мы придем
к паре вершин с дугами между ними. Этот граф,
очевидно, сводим.
2. Дуги, обозначенные как прямые, образуют
бесконтурный граф, и никакая дуга не может быть
добавлена без образования контура. По теореме 14 и части 1
леммы разделение дуг на прямые и обратные
единственно.
3. По части 2 леммы обратные дуги входят в
ведущие вершины из всех ранее добавленных вершин.
Поэтому утверждение 3 вытекает из теоремы 14.
Дадим теперь рекурсивный метод конструирования
последовательности вершин для спиральных графов.
98
Лемма 31. Пусть ц=>[у,, .,., vk] — простой путь
в сводимом графе, и пусть (v] _i, vt \, (vt _х, vt ), ...
...,(vir-u vir} — последовательность обратных дуг вдоль
ц именно в таком порядке. Тогда V\i доминирует над
v^-^для всех }, К) <к.
Доказательство леммы опускаем.
Так как отношение доминирования транзитивно, то
из леммы 31 следует, что каждое начало обратной
дуги* вдоль простого пути доминирует над всеми
предыдущими началами обратных дуг.
Лемма 32. Пусть G — спиральный граф,
образованный вершинами vu vz, ..., vk, добавлявшимися
именно в таком порядке. Пусть G' — спиральный граф,
состоящий из вершин vt, иг, ..., Vj-{ и дуг между ними в G.
Пусть G" — спиральный граф, образованный
вершинами Vj, vi+t, ,.., i\ и всеми дугами мер/еду ними. Пусть
А и В — последовательности вершин для G' и G", и
пусть А и В — множества вершин соответственно G'
и G", взятых в ациклическом порядке. Тогда АВВАВ
есть последовательность вершин для графа G.
Доказательство. Предположим, что простой
путь р начинается в G' и потом заходит в G". Если р
проходит более чем одну обратную дугу до того4 или
после того, как он покинет G', он никогда не сможет
вернуться в G', Из доказательства леммы 30 (часть 2)
вытекает, что каждая обратная дуга входит в ведущую
вершину. По лемме 31 вторая обратная дуга входит
в вершину, которая доминирует над началом h
предыдущей обратной дуги. По лемме 30 (часть 3),
примененной в вершине h, головная вершина в G' не может
быть достигнута без повторного прохождения h. Таким
образом, если путь р достигает G' и возвращается, то
он проходит в точности через одну обратную дугу. Часть
пути р до возвращения в G' есть, таким образом,
подпоследовательность ABB. При прохождении через G'
во второй раз путь р не может проходить через
обратные дуги по лемме 28.^Таким образом, путь р есть
подпоследовательность АВВА, пока он снова не покинет
G'. В этом случае р не может вообще вернуться в G',
так как тогда он должен был бы пройти через две
ведущие вершины, которые доминируют над головной
вершиной G', что невозможно. Таким образом, путь р
есть подпоследовательность АВВАВ. Случаи, когда
7*
99
путь р начинается в С, а не в С или когда р
начинается в G', но никогда не возвращается, легко
сводятся к рассмотренному.
Нам нужно расширить лемму 32, чтобы применить
ее для разбиения спирального графа на три части,
одна из которых состоит из одной вершины.
Лемма 33. Пусть граф G определен, как и в
лемме 32, подграф G' порожден вершинами vu ..., Vj-t и
G" порожден вершинами v1+l, ..., vk. Пусть А и В —
последовательности вершин для графов G' и G", и
пусть А и В — ациклические упорядочения этих
графов. Тогда ABBAvjBBAB есть последовательность
вершин для G.
Лемма 33 является непосредственным обобщением
леммы 32. Теперь нужно показать, что при
произвольном приписывании весов существует
последовательность вершин, в которой вершины с наибольшим весом
будут встречаться мепыпее число раз. Причина,
заставляющая рассматривать веса, состоит в том, что
произвольный сводимый граф будет стягиваться в
подграфы спирального. При таком подходе вершины
спирального графа будут изображать области разнообразного
размера и вес вершин будет соответствовать размеру
изображаемой области.
В оставшейся части параграфа используем
обозначения для констант: а = 2/log (3/2)' и Ь = (3/2)|/г.
Заметим, что a log 6 = 1.
Лемма 34. Пусть G — спиральный граф,
порожденный вершинами vu ..., vh именно в таком порядке.
k
Пусть Vi имеет вес со,, и пусть Q= ^^г- Тогда G име-
i—1
ет последовательность вершин, в которой vt
встречается самое большее alog(bQ/co() раз, je[lt к).
Для к = 1 утверждение очевидно. Предположим,
что к > 1 и что лемма справедлива для спиральных
графов с числом вершин, меньшем к. Легко показать,
что может встретиться один из случаев:
1. Для некоторого ;, 1 </ ^к, имеем
(1/3) Q < 2 Щ < (2/3) Q.
г=1
2. Для некоторого j
co;>(l/3)Q, 2 со*<(1/3)Q, 2' со*<(1/3)Й.
100
ы
i. (1/3)Q< 2(0^(2/3)0. Разбиваем граф G по
лемме 32, полагая, что G' состоит из вершин ь\, ...
..., Vj-i, a G" — из оставшихся вершин. Пусть
;'-1 ft
Q' = 2 м» и ^" = .2 Mi- По индуктивному предположе-
нию, примененному к G' и G", существует
последовательность вершин А для С, в которой vs встречается
самое большее alog(bQVo)i) раз для 1 =S i < j. Точно
так же существует последовательность вершин для G",
в которой vt встречается самое большее a log (М3"/а);)
раз для i s [у: /с]. По лемме 32 существует
последовательность вершин для G, в которой для i s [j ; /Ь]
вершина Vj встречается самое большее 2 + a log (bQ"/a)i)=
-alog^'-ftQ'/a,) раз. Так как Q"^(2/3)Q и
(2/3)22/о = 1, вершина vt встречается самое большее
a log (6Q/a),) раз. Аналогичные рассуждения
применимы и в случае i'e[l:/].
3-1 ft
2. a); > (1/3)Q, 2 at < (1/3) Q, 2 Mi < (1/3) Q- Ра-
i=l i=j+l
зобьем граф G на G', v, и G", как в лемме 33,
положив, что G' состоит из vu иг, ..., Уы и G" —из
вершин vs+i, vj+2, ..., vk. По индуктивному предположению
j—1 л
и из того факта, что 2 Mi и 2 Mi меньше, чем Q/3,
i=l i=j+l
найдутся последовательности вершин А и В для G' и
G", такие, что v{ встречается самое большее
a log (6Q/3a)i) раз для i¥=j. По лемме 33 найдется
последовательность вершин для G, в которой vt
встречается самое большее
4 + a log (bQ/Зш,) = a log(24/^Q/3a)()
раз. Так как (1/3)24/° = 3/4, то мы получаем в этом
случае требуемый результат. Наконец, существует одно
вхождение вершины vs в последовательность вершин
для G. Так как a log (bQ/toj) > a log b — 1,
доказательство закончено.
4.7. Построение последовательности вершин. В
основе построения последовательности вершин длины
Oin log n) для любого сводимого графа лежит
разбиение графа на куски, причем никакой из них не
превосходит двух третей целого графа. Куски сами по
себе — это области, и последовательности вершин для
101
них находятся рекурсивно. Потом мы образуем
подграф спирального графа стягиванием каждой из этих
областей R з отдельную вершину vR. Желаемая
последовательность вершин находится, если взять
последовательность вершин для спирального графа в
подставить ациклически упорядоченные последовательности
вершин области R на место вершины vR.
Лемма 35. Пусть G = {V, E) — сводимый граф
с входом s и с к > 1 вершинами. Тогда мы можем
найти множество непересекающихся областей Rt, ..., Rm,
объединение которых включает все вершины графа G,
причем:
1) ни одна из областей Rit ..., Rm не имеет больше
чем (2/3)к вершин;
2) существует последовательность областей S,, ...
..., Sm, такая, что:
а) S, •=/?,;
б) для i > 1 S, состоит из областей S^, и /?,,
причем одна предшествует другой;
в) Sm есть G;
3) граф, образованный из G стягиванием каждой из
областей Rt, ..., Rm в отдельную вершину без петель,
есть спиральный граф, в котором, быть моокет, не
удалена ни. одна дуга.
Доказательство. По лемме 29 каждая
область более чем с одной вершиной есть объединение
двух областей, одна из которых есть предшественник
другой. Заметим, что если Т — область более чем с
(2/3)& вершинами, то:
1) или она составлена из двух непустых областей,
одна из которых имеет более чем (2/3)& вершин,
2) или она составлена из двух областей, большая из
которых имеет от (1/3)& до (2/3)& вершин.
Рассмотрим алгоритм:
начало
Т := G;
пока Т имеет больше чем (2/3)& вершин цикл
начало
пусть Т составлена из областей Г, и Тг, причем Г,
имеет не меньше вершин, чем Тг;
печать (7\, Тг);
Т:=^Т1
конец
печать (Г, Г);
конец
102
Этот алгоритм будет производить последовательность
пар (Sm, Rm), {Sm-i, Rm-i\ ..., (St, RJ, что доказывает
Части 1) и 2) леммы.
Часть 3) докажем индукцией по I. А именно
докажем, что после редукции St есть спиральный граф с
отсутствующими, быть может, некоторыми дугами. Базис
индукции f"-1 тривиален. Если
Д( есть предшественник £<_, при
образовании S(, то результат
непосредственно следует из
конструкции 26) определения
спирального графа. Если же S(_i есть
предшественник для Rt, то
выполняется конструкция 2а).
Пример. Рассмотрим граф
на рис. 2.33. Он составлен из
областей (1, 2} и {3, 4, ..., 10}.
Последняя имеет более чем (2/3)Х
X 10 вершин, так что мы
печатаем пару (Sm, Дт)=(И, 2, ...,10),
(1, 2}). Потом мы работаем с
областью {3, 4,..., 10}, которая
может быть разбита одним из двух способов: либо
выделением вершины 3, либо вершины 10. Предположив
последнее, получаем пару (5m_j, /?m_t) =■ ({3, ..., 10}, (10}).
Потом мы разделяем область (3, 4, ..., 9} на (3} и
{4, 5, ..., 9}. Первая область есть Rm-i, а последняя
имеет не более чем (2/3) X 10 вершин, так же как и
5m_i и Rm-,. Таким образом, получаем:
I
1
2
3
4
{4,5,...,9}
{3} .
{10}
{1. 2}
Si
{4,5,.
{3, 4, .
{3, 4, .
{1, 2, .
,9}
,9}
10}
10}
Л е м м а 36.
на области Rlt
Пусть G — сводимый граф, разбитый
,, Rm, как в лемме 35. Пусть Rt
имеет последовательность вершин At и циклическое
упорядочение At для t e tl: ml. Пусть Н — спиральный граф,
построенный из G стягиванием каждой области R в
отдельную вершину и добавлением некоторых дуг {для
получения спирального графа). Пусть В —
последовательность вершин для II. Пусть последовательность С
построена из В заменой в В каждого вхождения
103
вершины Vi из Н, изображающей Rt, на ациклическую
упорядоченность А{. Тогда AiAi.,,AmC есть
последовательность вершин для графа G.
Доказательство. Пусть р — простой путь в
G. Мы можем записать р как р{рг, где р4 состоит пз
префикса р, т. е. его части от начала до того места,
когда р покидает одну из областей /?,, . . ., Rm, в
которой он начинается. Конечпо, р, есть
подпоследовательность последовательности AiA2...Am. Рассмотрим
путь q в Н, состоящий из тех вершин в графе Н,
которые представлягот области Ru .. ., Rm и через которые
проходит рг в G. Путь q должен быть простым., иначе
р2 будет заходить в одну и ту же область дважды. Так
как области могут посещаться только через их
головные вершины, то будет нарушена ацикличность пути
р2 и, следовательно, пути р. Такпм образом, q есть
подпоследовательность В и по лемме 28 р% есть
подпоследовательность С. Таким образом, р есть
подпоследовательность последовательности А^Аг. ..АтС.
Доказательство теоремы 15 проведем
индукцией по числу вершин к. Базис индукции к = 1
очевиден. Предположим, что утверждение теоремы
справедливо для графов с числом вершин меньше к.
По лемме 36 оценим сверху длину последовательности
вершин А{А2.. . АтС. Пусть ш*— число вершин в
области Rt. Тогда по индуктивному предположению А{
имеет длину, не превышающую ш( + с ы{ log ы{. По
лемме 34 спиральный граф Я, образованный из G так, как
указано в лемме 36, имеет последовательность вершин
В, в которой вершина, изображающая Rt, встречается
не более, чем a log {Ък/ад раз. Таким образом,
последовательность вершин С имеет длину самое большее
т
2 яоч log (Wv/cdj). Следовательно, AsA2...AmC имеет
i=l
длину, ограниченную сверху выражением
m
2 («П + «Di log Wj + ащ log (Ьк/щ)) =
rn m m
•= 2 wi + 2 (c■ — a)-wi l°g Wj + a 2 ffli log bk =>
m
— к + 2 (с — о) щ log Ш( + ак log к + ак log b, (*)
104
Так как ю,- ^ (2/3)& для всех t, то по лемме 35 имеем
т т
2 (с — a) ci)j log Wj ^ 2 (с — а) ^i l°g (2^3) к =
= (с — e)(AlogA-— Л log (3/2)). (•*)
Подставляя (»*) в (*), получаем величину к +
+ ск log /с - ск log (3/2) + ак log (3/2) + а/с log Ъ. Теперь
достаточно заметить, что —clog (3/2) + a log (3/2) +
+ a log & = — 3 + 2 + 1 = 0 при нашем выборе а, Ъ и с.
Теорема 16. Последовательность вершин для
сводимого графа с п вершинами и не более чем с In
дугами может быть построена с трудоемкостью
Oinlog n).
Доказательство. Достаточно просто
проверить, что конструкции лемм 32—34, 36 и теоремы 15
требуют времени, пропорционального длине
порождаемой последовательности. Остается задача,
рассматриваемая в лемме 35, где было доказано существование
последовательности областей Rh ..., Rm без указания
на способ ее эффективного построения. Но так как
описанный в п. 4.4 алгоритм проверки графа на
сводимость требует 0{п log n) времени, то построение
нужной последовательности Ru ..., Rm может быть также
проведено за то же время.
§ 5. Контуры в орграфах
Одной из важнейших задач, связанных с
контурами, является задача нахождения множества всех
контуров. Трудность ее состоит прежде всего в том, что
число контуров орграфа может быть экспоненциальна
большим относительно числа вершин. Поэтому при
разработке алгоритмов внимание обращается не на
полную трудоемкость алгоритма, а на относительную,
т. е. на трудоемкость, приходящуюся на один контур.
5.1. Алгоритм отыскания контуров с
использованием матрицы достижимости. Пусть заданы матрица
смежности A[G) — Wa^W и матрица достижимости
R(G) = 11гу11 орграфа G. Алгоритм начинается с того,
что рисуется вершина и ей присваивается метка «1».
Затем для каждого i, такого, что ацГц — 1, jell:»],
рисуется дуга и концевые вершины полученных дуг
помечаются метками «г». Далее берем некоторую
висячую вершину полученного корневого ордерева
105
с меткой «fc» (АчМ), рисуем дугу из этой вершины для
каждого /, такого, что аыгл = 1, /е[1;п], и
присваиваем метку «/» концевой вершине такой дуги. Заметим,
однако, что дугу нельзя построить, если / Ф 1 и при
этом ) уже выступала в роли некоторой вершины на
пути из корня дерева к вершине, помеченной меткой
«А:». Продолжаем этот процесс до тех пор, пока все
концевые вершины не будут иметь метку «1». Итак,
получены все пути от корня дерева до концевой
вершины для каждого простого контура, проходящего в
орграфе G через вершину vL. Эти контуры
определяются метками при вершинах в указанных путях.
Теперь образуем подматрицы Аг и R2, удаляя из А и R
первую строку и первый столбец. Аналогичная
процедура, примененная к Аг и Я2, найдет контуры,
проходящие через вершину vt, но не проходящие через
вершину vt. На третьем шаге исключим из А и R по
две первых строки и по два первых столбца. Работая
с полученными подматрицами Аг и Rs, найдем
контуры, проходящие через вершину v,, и т. д. Алгоритм
применим в случаях, когда матрица достижимости
уже известна или когда граф задается с помощью
АГ-формул.
Пример приведен на рис. 2.34.
S
Рис. 2.34.
5.2. Алгоритм Джонсона отыскания контуров. Пусть
орграф задан списками смежности AQ(v), причем
обращение к вершинам происходит по 'их Л/-номерам.
Работа алгоритма основана на поиске в глубину.
Поиск начинается в некоторой вершине sa, в процессе
его строится путь U0, vt, v,, ..., vk] такой, что Mivt) >
>M(s„) или, в силу нашей договоренности, vt > $<,,
t^litk). Контур объявляется построенным, если еле-
3 4 5 4 5 5
/\ I /\ i
4 5 5 1 2 5
Л Л
1
контуры'не проходят
■ i
1
А1" 2.1 2
I [ Через вершины 3 и4
12 1
106
дующая вершина Vk+t есть s0. В процессе поиска
вершины рассматриваемого пути хранятся в стеке —
текущем списке. Вершина у помещается в стек при
вызове процедуры КОНТУР(у) и удаляется после
возвращения из процедуры. Чтобы предупредить возможность
прохождения контуров, начинающихся в какой-либо
вершине пути, отличной от s0, необходимо указать, что
все вершины из текущего списка (кроме s0) не могут
быть использованщ дважды для его удлинения. С этой
целью вершина при помещении в стек блокируется
путем присвоения- специальной переменной Му)
значения истина. После удаления вершины из стека она
не обязательно разблокируется, особенно когда
возвращение из процедуры не связано с построением
контура. Задержка с разблокированием в- этом Случае
позволяет избежать поиска контура в той части графа,
в; которой такой поиск раньше был безуспешен. Для
недоступных (блокированных) вершин формируются
списки предшественников В(и). Вершины,
находящиеся в них, также недоступны и становятся доступными
одновременно с разблокированием исходной воршины.
процедура КОНТУР(целыи у,'логический /);
1. начало
2. /:=лоикь;
3. поместить вершину у в стек;
4. b(v):— истина;
5. для w^A(v) цикл
6. начало
7. если w = s то
8. начало
9. вывести контур, состоящий из вершин в стеке,
начиная с вершины s, без изменения самого стека;
10. /:= истина;
11. конец
12. иначе если b(w) то
13. КОНТУРА, g);
14./:=/Vg;
15. конец цикла;
16. если / то РАЗБЛОКЫ
17. иначе для w^A(v) цикл B(w) :=B(w) U {у};
18. удалить v из стека;
19. конец процедуры
При удлинении пути is, vu у2, ..., vh] дугой
(i7*, Vk+i) возможны три случая:
107
1. Если vh+i — s, то это означает, что построен
новый контур [s, vit v2, . . ., vk, s]. Выводим этот контур и
присваиваем переменной / значение истина, указывая
тем самым, что найден контур с начальной вершиной
s, проходящий через vh.
2. Если vh+i¥=s и vh+i не заблокирована, то
добавляем vk+i к рассматриваемому пути посредством
рекурсивного обращения к процедуре КОНТУР.
3. Если вершина vk+l заблокирована, то
пропускаем ее и ищем другую дугу, начинающуюся в вершине
vk. Если неисследованных дуг^ начинающихся в
вершине vh, нет, то vh удаляется из стека, и мы
возвращаемся назад в вершину ик-{. При этом мы делаем
вершину vh снова доступной, если она привела к
построению контура (/ имеет значение истина). В противном
случае она остается недоступной и добавляется в
каждое из множеств Biw) длят всех вершин w —
потомков vh.
Для того чтобы вершину г; разблокировать, нужно
изменить значение переменной b(v) на ложь. Однако,
если вершина v становится доступной, то Же самое
происходит со всеми ее недоступными
предшественниками, не принадлежащими рассматриваемому пути.
Таким образом, все элементы множества В(v) должны
быть сделаны доступными, и B(v) становится пустым.
Процесс разблокирования вершин проиводится
процедурой РАЗБЛОК:
процедура РАЗБЛОК(м);
1. начало
2. Ь(и) := ложь;
3. для w^B(u) цикл
4. начало
5. В(и):~ВЫ)\Ш;
6. если b(w) то РАЗБЛОКЫ;
7. конец цикла;
8. конец
Поскольку лЧобой контур целиком лежит внутри
некоторой бикомпоненты, то будем считать, что в графе
уже выделены бикомпоненты. Это позволяет
применять процедуру КОНТУР к одной из бикомпонент.
В итоге алгоритм приобретает вид:
Вход: Граф G = (F, E) с выделенными бикомпо-
нентами, заданный списками смежности A{v},
Выход: Список контуров.
108
начало
1. *:=1;
примечание вначале стек пустой конец
примечания
2. пока s < n цикл
3. начало
4. пусть S — (V„ Ea) — нетривиальная бикомпонен-
та, содержащая вершину с наименьшим номером в
подграфе, порожденном вершинами {s, s+1, ..., п],
и пусть A,(v) есть список смежности вершины v в S;
5. если АаФ 0 то
6. s := вершина с наименьшим номером в Vs;
7. для реУ, цикл
8. начало
9. b(v) := ложь;
10. B(v):=0;
И. КОНТУР(в, /);
12. *:=*+1;
13. конец цикла;
14. иначе s := п;
15. конец цикла;
конец
После обращения к процедуре КОНТУРЕ, /)
будут порождены все контуры, содержащие вершину s,
и ее можно будет удалить из графа. Это, конечно,
сильно изменит бикомпоненты графа. Корректность
алгоритма вытекает из леммы, которую мы приводим
без доказательства.
Лемма 37. Для любой вершины х Ф s существует
обращение к процедуре РАЗБЛОК(у), которая
присваивает переменной Ых) значение ложь тогда и только
тогда, когда:
а) из х в s существует путь, содержащий v, для
которого только v и s принадлежат стеку;
б) из х в s не существует пути, для которого
только v и s принадлежат стеку.
Алгоритм Джонсона имеет трудоемкость 0((п + тп) X
Х(с+1)) для графа с п вершинами, m дугами и с
простыми контурами, т. е. практически линейную
относительно числа дуг графа на контур.
5.3. Модифицированный алгоритм Джонсона.
Контур ^выделяется, как только он обнаруживается в
результате обхода графа. Для хранения текущего пути
используется стек, используются также и списки Biu).
.109
Однако вершина v включается в список В(и), если
(у, u)s£ и исследование этой дуги не ведет к
выделению нового контура. В дополнение к этой структура
мы используем позиционный вектор р и булевский
вектор достижимости Т. Если вершина v есть j-n по
счету вершина, считая от самой глубокой вершины в
стеке, то будем говорить, что ее позиция p(v) равна /;
если вершина v удалена из стека, то будем говорить,
что ее позиция равна N+ 1; piv) = iV+ 1. Если
вершина v еще не удалялась из стека, то полагают f(v) =•
= ложь, в противном случае r(v) = истина. Вершина v
блокируется (помечается), когда она вводится в стек,
и эта метка сохраняется, пока вершина находится в
стеке. При выводе из стека v разблокируется, только
если был найден контур, проходящий через нее. Если
вершина v покидает стек, имея метку, то она
разблокируется, как только из стека будет удалена вершина
Zi при отыскании контура с начальной вершиной
zh причем найдется путь [zk, zK-u ..., zj, zK*=v,
такой, что z<+i &B(zi), k > i > 1.
Алгоритм работает с графами, заданными
списками смежности. Предварительно в графе отыскиваются
бикомполенты. В каждой бикомпоненте выбирается
начальная вершина, в качестве которой берется
вершина с наибольшей степенью захода. Начальная
вершина удаляется из стека только после перечисления
всех контуров в этой бикомпоненте, поэтому и
требуется только одна начальная вершина на бикомпоненту.
Рассмотрим случаи, которые могут встретиться при
удлинении текущего пути lvt, vz, • • •,—tvJ дугой
Су»-|, vk).
1. Если vh не помечена, то, значит, она отсутствует
в стеке, текущий путь удлиняется, вершина v„
заносится в стек и проверке подвергается дуга, исходящая
из у».
2. Если vh помечена и не находится в стеке, то она
недоступна и должна быть пропущена. Вершина vk~i
заносится в список 2?(у»), a vh удаляется из A(vk-,).
3. Если vh помечена и находится в стеке, то,
значит, найден контур, который сразу же выписывается.
Чтобы на этом шаге не нарождались одинаковые
контуры, используется наблюдение: порожденный контур
есть новый контур тогда и только тогда, когда по
крайней мере одна из его вершин ни разу не
удалялась из стека. Тот факт, что вершина не удалялась из
110
Стека, запоминается с помощью .переменной q,
локальной по отношению к рекурсивной процедуре. Для
каждого данного вызова процедуры КОНТ переменная q
обозначает самую верхнюю вершину в стеке, которая
никогда не удалялась. Поэтому, если позиция p(vh) ^
< q, то найден новый контур; в противном случае
порожден дублетный контур и i>„_i вносится в список
B(vk), a vh удаляется из A(vh-i).
В случаях 2 и 3, когда вершина vk помечена,
элементарный путь не удлиняется. Если простой путь не
может быть больше удлинен, алгоритм переходит к
предыдущей вершине в стеке, и т. д. Когда начальная
вершина удаляется из стека, рассматривается новая
бикомпонента, пока не будут рассмотиены все
вершины.
Алгоритм:
Вход: Граф G = (V, E), заданный списками
смежности A(v).
Выход: Список контуров.
начало
1. процедура КОНТ (целый v, q\ логический /);
2. начало
3. процедура НЕКОНТЧх, у)\
4. начало
5. включить х в В(у)\
6. удалить у из А(х);
7. конец;
8. процедура РАЗМАРКЫ;
9. начало
10. mix) := ложь;
11. для у^В(х) цикл
12. начало
13. включить х в А (г/);
14. если т(у) то РАЗМАРК(у)
15. конец цикла;
16. положить В(х) := 0;
17. конец РАЗМАРК;
18. mi.v) : = истина; /;ч=ложь;
19. включить v в стек;
20. f := число вершин в стеке;
21. p(v):=*t;
22. если "п г (v) то q := t;
23. для w^A(v) цикл
24. начало
25. если ~im (v) то
111
26. начало
27. KOHT(u>, q; g);
28. если g то / := истина
29. иначе НЕКОНКу, w)
30. конец
31. иначе если piw) < q то
32. начало
33. вывести контур от w до v из стека, потом
удалить и>;
34. /: = истина;
35. конец
36. иначе НЕКОНКу, и>);
37. удалить у из стека;
38. если / то РАЗМАРКЫ;
39. г(у) := истина;
40. p(v):=N+l;
41. конец цикла;
42. конец КОНТ;
43. AD(y) : = списки смежности для бикомпонен-
ты D;
44. для / = 1 шаг 1 до 7V цикл
45. m(j):— Hj) : = ложь;
46. для каждой нетривиальной бикомпоненты цикл
47. начало
48. s: = вершина с наибольшей полустепенью
захода в этой бикомпоненте;
49. KOHKs, ,);
50. конец цикла;
конец
Корректность алгоритма устанавливается
последовательностью лемм, доказательства которых не
приводятся.
Лемма 38. Каждая вершина попадает в стек по
крайней мере один раз.
Лемма 39. Если vt, ..., vh — вершины,
содержащиеся в данный момент времени в стеке и найден
новый контур, проходящий через vh,. то вершины у(, ...
..., vk оказываются непомеченными после удаления
их из стека.
Лемма 40. Пусть [у(, ..., vh, yj — контур такой,
что Vi, ..., vk или циклическая перестановка их уже
встречались в к верхних позициях стека в некоторый
ранний момент времени и по крайней мере одна из
этих вершин прежде удалялась из стека. Если vh .,., vk
112
занимают теперь к верхних позиций в стеке, то они
удаляются из стека.
Лемма 41. Пусть [zi, ..., zj — простой путь,
(z», v) — дуга, причем v находится в стеке и ранее из
него не удалялась. Тогда, если ги ..., zK еще не в
стеке, то zt не помечена.
Лемма 42. Пусть v{, ..., vh,- Vi — подходящая
циклическая перестановка для контура, такая, что
вершина Vi была первой среди vh /<=[!:&], при каком-
нибудь включении в стек. Тогда существует такая
конфигурация стека, при которой вершины vt, ..., р,-,
/s[l:ftJ, встречаются в / верхних позициях стека
прежде, чем v{ покидает стек в первый раз.
Лемма 43. Если вершина находится в стеке, то
она помечена.
Лемма. 44. Каждый простой контур в графе
порождается по крайней мере один раз.
Лемма 45. Каждый простой контур порождается
самое большее один раз.
Трудоемкость алгоритма составляет О(т) на
каждый простой контур, за исключением первого, на
который тратится 0(п + т) операций.
5.4. Отыскание контуров фиксированной длины.
Алгоритм использует матрицу смежности A(G) и
матрицы Ан~* и Ак, если длина отыскиваемых контуров
равна к. Выберем некоторое i, такое, что a\f = 1. Это
означает, что вершина vt принадлежит контуру длины
к. Тогда вершина v} принадлежит тому же контуру,
если выполняются следующие три условия:
а) af> = 1;
б) ati — 1, т. е. существует путь длины 1 из v( в v,;
в) ан ~ 1) т. е. существует путь длины к — 1 из
V) В Vi.
Алгоритм основан на последовательной проверке
условий до выявления всех вершин контура.
5.5. Дипломатической матрицей орграфа
называется прямоугольная (0—1)-матрица Я = ИйцН размера
сХп, где с — число контуров, а и — число вершин и
\ 1, если вершина v} принадлежит контуру С с,
hi; = \ л
I 0 в противном случае.
Матрицей вложенности орграфа G называется
матрица Е = Не,-,! размера сХс, где с — число контуров, а
8 В, А, Евстигнеев
113
(1, если контур С) вложен в контур Ct, т. е.
все вершины контура С) принадлежат
контуру С<;
О в противном случае.
Построение матрицы вложенности происходит по
правилу: если рассматривать строки цикломатической
матрицы как булевские векторы Ct и применять к ним
теоретико-множественные операции, то достаточно
положить:
а) бц = 1 и е(, «= 0, если £( П С> =■ Ct (контур Ct
вложен в контур Cj)\
б) ец = 0 и ец-=1, если С{ЛС}«=£^ (контур Cs
вложен в контур d);
в) ец = 0 и ец = 0, если Г( П £j ^ £( ■?*= Cj.
Полученную матрицу вложенности £ можно
рассматривать как матрицу смежлости некоторого
бесконтурного орграфа, в котором вершина у е Гх для
некоторой вершины х, если контур С, вложен в контур Сх.
Представление вложенности в виде орграфа позволяет в
свою очередь организовать обход исходного графа в
порядке, отражающем вложенность контуров, а также
использовать его для сегментации программ.
Пример. Для графа с цикломатической матрицей,
представленной на рис. 2.35, а, соответствующая ей
матрица вложенности показана на рис. 2.35, б, а граф
вложенности — на рис. 2.35, в.
5.6. Гамильтоновы контуры и циклы. Для нас
интерес к гамильтонову циклу связан в первую очередь
с задачей о коммивояжере, заключающейся в
отыскании во взвешенном графе гамильтонова цикла
минимальной длины. К задаче о коммивояжере сводится
большое число оптимизационных задач, однако ее
ценность состоит еще в том, что она является
своеобразным эталоном сложности. Существующие точные
методы не позволяют решать ее уже для графов с
числом вершин, приближающимся к ста. Известные
приближенные методы дают удовлетворительное для
практики решение—для графов с числом вершин до
2000.
5.7. Эйлеров цикл соответствует обходу всех ребер
графа, причем каждое ребро при таком' обходе
проходится в точности один раз и только в одном
направлении, в то время как гамильтонов цикл' соответствует
обходу всех вершин.
114
Теорема 17. Связный неориентированный граф
содержит эйлеров цикл тогда и только тогда, когда
степень каждой вершины четна.
с,
с,
с,
с,
с,
с,
С
с,
с,
Номера вершин
111111111122222
123456789012 3 45678901234
000000 0 0 0000011110000000
000000000000000000001110
000000000000000000001000
000001 100000000000001000
0 00011111111000000000000
000011111111111111000000
000000011000000000000000
0000000001 100000 0 0000000
000000000000001 100000000
о)
12 3 4 5 6 7 8 9
000000001
0 01000000
000000000
000000000
0 0 0 10 0 110
1000'10000
000000000
000000000
000000 0 00
9 Сг
с3
Рис. 2.35.
Необходимость условия очевидна, так как эйлеров
цикл, проходя по каждому ребру, должен столько раз
выйти из вершины (каждый раз по новому ребру),
сколько он в нее заходил.
Для доказательства достаточности дадим алгоритм
построения эйлерова цикла в графе, удовлетворяющем
условиям теоремы. Начиная с некоторой вершины v„
будем обходить ребра графа, стирая пройденные ребра
8*
115
и образующиеся при этом изолированные вершины,
пока не придем снова в вершину va. Это возможно,
так как, заходя в вершину по непройденному. ранее
ребру, мы имеем возможность выйти из него в силу
четности степени вершины. Если при возвращении в
v0 все ребра окажутся пройденными, то нужный цикл
построен. В противном случае в оставшейся непрой-
денной части графа возьмем вершину vt,
принадлежащую построенному циклу Ф и являющуюся началом
еще не пройденного ребра. Начиная с vu будем
обходить не принадлежащие Ф ребра до тех пор, пока не
придем снова в у,. Это возможно, поскольку в
оставшейся после удаления ребер цикла Ф части графа все
степени вершин четные. Построим новый цикл Ф',
объединяя циклы Ф и Ф( (вновь построенный)
следующим образом: берем часть цикла Ф от v0 до vu цикл
Ф4 и затем оставшуюся часть цикла Ф от v{ до v„.
Если после этого в графе останутся непройденные
ребра, процесс продолжаем, взяв цикл Ф' в качестве
Ф. Через конечное число шагов процесс закончится
построением эйлерова цикла, так как постоянно будут
выполняться условия теоремы.
Теорема 18. Связный орграф содержит
эйлеров контур тогда и только тогда, когда для каждой
вершины полустепень захода равна полустепени
исхода.
Следствие. Каков бы ни был связный граф,
всегда существует обход его ребер, при котором
каждое ребро проходится дважды — в прямом и обратном
направлениях.
В самом деле, достаточно заменить каждое ребро
парой противоположно направленных дуг, чтобы
получить орграф, удовлетворяющий условиям теоремы 18.
5.8. Цикломатическим числом X(G) графа G
называется величина A(G) = m(G)-n(G) + x(G), где п —
число вершин, m — число ребер, и — число компонент
связности.
Заметим, что цикломатическое число определено
только для неориентированного графа.
Для связного графа х = 1 я выражение для К
приобретает вид %.~m-~ n + i — m — in — 1), откуда
немедленно следует, что X есть число ребер, не
принадлежащих произвольно выбранному каркасу. Так как
каждое такое ребро, называемое хордой графа,
присоединенное к каркасу, относительно которого определено
UG
рассматриваемое множество хорд, порождает в
точности один цикл, то мы получаем множество циклов,
характеризующихся тем, что каждый из них имеет хотя
бы одно ребро, не содержащееся в другом цикле этого
множества. Назовем множество полученных таким
образом циклов множеством фундаментальных циклов
(относительно фиксированного каркаса). Основное
свойство множества фундаментальных циклов состоит
в том, что оно является базисом пространства циклов
графа, т. е. любой цикл может быть представлен как
линейная комбинация фундаментальных циклов.
Множество фундаментальных циклов может быть
аналогичным образом определено для орграфа, если
под циклом понимать цикл для орграфа (т. е.
замкнутую последовательность дуг), а под каркасом —
некоторый оркаркас.
Подобно дипломатической матрице определяется
матрица фундаментальных циклов С}. Для ее
построения перенумеруем фундаментальные циклы
Относительно каркаса Т некоторым произвольным
способом: 1, 2, ..., Я(С) = тп — п + 1. Пусть хорда, которая
появляется в цикле d, нумеруется как ребро i, is
s[l:X(G)J. Остальные ребра, т. е. ребра каркаса,
занумеруем Я + 1, Я + 2, ..., т. Тогда матрица
фундаментальных циклов примет вид С/ = [/С1г], где / —
единичная матрица порядка Я. Так как Cf есть
подматрица цикломатической матрицы данного графа, то
ранг цикломатической матрицы не меньше ранга
матрицы фундаментальных циклов, т. е. не меньше Я.
Более того, можно доказать, что ранг цикломатической
матрицы в точности равен Я, откуда и вытекает
основное свойство множества фундаментальных циклов.
Связь матрицы Cf фундаментальных циклов с
матрицей инцидентности B(G\ графа устанавливается
теоремой, которую мы приводим без доказательства.
Теорема 19. Матрица инцидентности В графа G
может быть представлена в виде
где Bi2 — неособенная квадратная матрица порядка
п — 1. Матрица фундаментальных циклов для каркаса,
соответствующего столбцам подматрицы fi12, имеет вид
117
5.9. Гйаф называется контурно-связным (LC-граф),
если он содержит две вершины, скажем vA и vB, и три
простых контура Са, С» и Ст, такие, что:
а) не существует вершины, одновременно
принадлежащей всем трем контурам Са, Ct и Ст;
б) Са содержит вершину vA, но не содержит vB;
в) С» содержит вершину vB, но не содержит vA;
г) С-, содержит и vA, и vB.
Пример. Граф на рис. 2.36 контурно-связен
относительно вершин vB и vc.
Граф называется k-контурно-связным (£СШ-граф),
где к > 2, если в нем найдутся к вершин vt, ..., vk,
к простых контуров Си ..., Ск
и простой контур С, такие,
что:
а) не существует вершины,
одновременно принадлежащей
контурам С а С,, ..., Ch;
б) для всех I, fe[l:fc],
контур d содержит все вершины i?,, ..., vk, кроме у<;
в) С содержит все вершины у,, ..., у».
Заметим, что контурно-связный граф есть 2-кон-
турно-связный. Граф называется KLC-графом, если
найдется такое к, что граф является Л-контурно-
связным.
Граф называется петлевым, если у каждой
вершины есть петля и эти петли исчерпывают все множество
контуров графа.
Назовем подмножество V вершин орграфа G =
— (V, Е) сечением, если суграф G'—(V—V, E'),
получаемый из G удалением вершин из V' вместе с
инцидентными им дугами, является бескоптурпым. Сечение
называется минимальным, если оно содержит
минимальное число вершин. Число вершин в минимальном
сечении графа называется его контурным рангом kG
или просто рангом.
Библиографический комментарий
Параграф 1 написан по материалам работ И. В. Поттосина
[69, 70J, С. Эрнеста, К. Балке и Дж. Андерсона [110], В. Н.
Касьянова Г44—47]. Понятие прямой нумерации было введено в
работе [110], аранжировки — в работах И. В. Поттосина, N-, L-,
К-, Г-нумерация—в работах В. Н. Касьянова.
Различным методам построения транзитивных замыканий
посвящена обширная литература; один из первых алгоритмов,
118
яо-вндимому, принадлежит Дж. Бэйкеру [97]; также одним из
первых, но наиболее часто применяемым является алгоритм
С. УоршалЯа [162] (см. также [61, 72]). Алгоритм Уоршалла
послужил основой для создания целого ряда других
алгоритмов. Среди них алгоритмы Л. Торелли [155], П. Пурдома [144]
и А. Мунро [136]. Алгоритм Торелли имеет трудоемкость 0{п*)
и рассчитан на работу с графами, заданными списками
смежности; алгоритм Пурдома имеет трудоемкость 0(л3) при прочих
равных условиях. Укажем еще на алгоритм Арлазарова — Ди-_
ница — Кронрода — Фараджева [5] с трудоемкостью 0(n*/logn).
Алгоритм замыкания относительно множества вершин
принадлежит В. В. Мартынюку [60]; аналогичный алгоритм, но с
трудоемкостью 0(п2) был предложен ранее А. П. Ершовым в [29].
Простейший матричный алгоритм отыскания бикомпонент,
описанный в § 2, принадлежит, по-видимому, С. Рамамурти;
долгое время была надежда получить на его осноае простой
алгоритм отыскания иерархии зон, что оказалось неоправданным
[146]. Несколько методов описано в книге А. А. Зыкова [33];
наиболее эффективные алгоритмы основаны на обходе графа,
представленного списками смежности, с использованием
стратегии поиска в глубину. К алгоритмам такого рода относятся
описанный в п. 2.3 § 2 алгоритм И. А. Фараджева [76], а также
алгоритмы А. В. Карзанова [39] и Р. Тарьяна [150]. Близок к
ним (в смысле использования стратегии поиска в глубину)
алгоритм В. Н. Касьянова [42], основанный на специальных
нумерациях вершин. Алгоритмы отыскания вложенных зон взяты
из работ [46] (алгоритм, основанный на ^-нумерации), [92]
(матричный алгоритм) и [110] (алгоритм на базе прямой
нумерации). Понятие линейной компоненты принадлежит
И. В. Поттосину [69], алгоритм отыскания линейных компонент
принадлежит В. Н. Касьянову [46], алгоритм отыскания
блоков—Е. А. Диницу, М. А. Зайцеву и А. В. Карзанову [24].
Понятие гамака было впервые сформулировано А. П.
Ершовым, приведенное в книге определение принадлежит И. В. Пот-
_тосину [69], алгоритм отыскания гамаков — В. Н. Касьянову
t43], понятия полугамака и шлейфа — В. Э. Иткину [37, 38].
[онятия интервала и сводимого графа восходят к работам
Дж. Кока [49] и Ф. Аллен [93]; связь сводимости и
аранжировки установлена В. Н. Касьяновым [41], ему же принадлежит
теорема 12. Альтернативное определение сводимого графа,
принадлежащее М. Хехту и Дж. Ульману, дано в [116]; алгоритм
проверки графа на сводимость разработан Р. Тарьяном [152];
Дж. Хопкрофт и Дж. Ульман дали его улучшенный вариант в
[118]. Длинные последовательности вершин в сводимых графах
описаны в работах [90, 129]. Эффективный алгоритм
объединения множеств может быть найден в [7], доказательство
леммы 31 — в [117].
Одним из первых алгоритмов перечисления контуров
является алгоритм Дж. Тьернана [156], его стратегия была
использована в алгоритме А. Берзтисса [10] и др. Улучшенный
алгоритм был предложен X. Вайнблатом [163] (см. также [25]).
Р. Тарьян [151] показал, что существуют графы, на_ которых
алгоритм Вайнблата имеет экспоненциальную трудоемкость, и
предложил другой метод с трудоемкостью О(пт) на контур;
такую же трудоемкость имеет алгоритм Арлазарова — Ускова —
Фараджева [6]. Алгоритм с трудоемкостью 0{п + т) на кон-
118
тур был предложен Р. Ридом и Р. Тарьяном [145]. Алгоритм с
такой же трудоемкостью, но основанный на оригинальной
технике расстановки меток, был предложен Д. Джонсоном [1)9];
модифицированный алгори гм^ с той же трудоемкостью,
продолжающий линию Тьернана — Тарьяна — Джонсона, был
предложен Дж. Шварцфитером и П. Лаутером [149].
Дать краткий обзор литературы по методам решения задачи
о нахождении гамильтонова цикла, достаточным условиям
существования гамильтонова цикла и методам решения задачи
о коммивояжере не представляется возможным, некоторая
полезная информация может быть найдена в- книгах [27, 33, 52,
ГЛАВА 3
ИТЕРАТИВНЫЕ АЛГОРИТМЫ ГЛОБАЛЬНОГО
АНАЛИЗА ГРАФОВ. ПУТИ И ПОКРЫТИЯ
§ 1. Итеративный алгоритм Килдала
1.1. Полурешегкой называется множество L с идем-
потентной, коммутативной и ассоциативной бинарной
операцией. Обозначая результат этой операции над
элементами а и Ъ из L через а Д Ь и используя в
более сложных случаях скобки, мы получим, что
полурешетка определяется следующими аксиомами:
а) а /\а = а;
б) а Д Ь = Ь Л я;
в) а Л (Ь Л с) - (а Л Ъ) Л с
для всех а, Ъ, се L.
Операция Л определяет частичный порядок на
элементах из L по правилу::^ у <f^x /\у = х, Ух, у е
е£. Аналогично, z < у «=> z ^ г/ & х Ф у. Для данного
X s L запись Л £ или Л ^t означает попарное приме-
ненне операции Л (для простоты будем говорить о
пересечении) к элементам их X. Предполагается, что
L содержит нулевой элемент О, О Л # = 0. Можно (но
не обязательно) предполагать, что в L есть
максимальный элемент или единица 1, т. е. элемент, для
которого 1 Л £ =■ £, Va:e£. Если в L единицы не
было, то можно рассматривать пополненное множество
L', добавив к L единицу 1.
Для данной полурешетки L допустимым
множеством функций F называется множество функций / на
L, удовлетворяющих следующим условиям:
1. Каждая функция /ef дистрибутивна
относительно операции Л', т. е. для любых х и у из L имеет
место равенство f{x Л 2/) = / (•*) Л / (у)-
121
2. Существует тождественная функция е е F, т. е.
для всех x&L имеем е(х) — х.
3. Множество F замкнуто относительно композиции
функций, т/е. ifg]{x) = f(g(x)) <=F, если /sf и
g^F.
4. Для каждого xsi существует конечное
подмножество H^F, такое, что х =• Д /(0).
/SH
Для данной полурешетки £ последовательность
[«1, ..., хп] элементов из L называется цепью, если
для js[l;n] имеем Xj>;r1+1. Полурешетка L
называется ограниченной, если для каждого хsi существует
константа Ьх такая, что любая цепь, начинающаяся в
х, имеет длину, не превосходящую Ъх.
Пусть теперь L — ограниченная полурешетка,
и пусть F—множество функций, определенных на L,
причем множество F удовлетворяет условию 1
относительно L. Тогда для любого конечного подмножества
/ s L имеет место соотношение / { Л х\ =» Л / (~)-
\xsJ J xeJ
Лемма 1. Для данной ограниченной полурешетки
L и множества F функций на L, удовлетворяющих
условиям 1—3, F есть допустимое множество для V', где
i'-f*|3/11...1/.e^«*- Л Л (0)1.
Так как любое подмножество L, замкнутое
относительно операции Л. удовлетворяет условиям
идемпотентности, коммутативности и ассоциативности
относительно Л и, следовательно, является полурешеткой,
достаточно показать, что F удовлетворяет условиям
1—3 относительно L', если F удовлетворяет условиям
1—3 относительно L.
Условия 1 и 2 удовлетворяются для F относительно
L', так как V есть подмножество L. Предположим,
что F не удовлетворяет условию 3 относительно V',
т. е. существуют x^L' и f,g&F, для-которых jg(x) e
&L — L'. Но из того, что х s L', следует х е А h(0)
лен
для некоторого конечного НsF. Таким образом,
fg(x)~fg( А 40))=. A fgh{0). Следовательно, fg(x)
\ftsH ) лен
принадлежит V по определению, что противоречит
нашему предположению.
Л е м и а 2. Для данной ограниченной полурешетки
L с сопоставленной ей системой функций F из х> у,
где x,y^L, следует, что fix) > f(y) для всех /sf,
122
Лемма 8. Для любой ограниченной полу решетки
L и любого счетного J з L из неравенства х > у,
выполняемого для всех is/, следует /\ х^у.
же J
1.2. Пусть G=-(F, E) есть орграф с входом «.
Пусть, далее, дана полурешетка L с операцией Л
и множеством F сопоставленных ей функций, и пусть
М: V -*■ F есть отображение множества вершин V в
множество F, ставящее в соответствие вершине v
функцию /„(я) или, в другой записи, /(у, х).
Итеративный алгоритм глобального анализа орграфа G состоит
в вычислении «меток» вершин при следующих
условиях:
а) все метки принимают свои значения из
полурешетки L;
б) задана начальная метка (чаще всего это 0
полурешетки) для входной вершины s;
в)" метка в вершине v определяется метками ее
непосредственных предшественников с помощью
функций /и.
Процедура расстановки меток носит название
разметки вершин графа; в отличив от нумерации
разметка допускает наличие у разных вершин одинаковых
меток.
Алгоритм Килдала ИФЬ):
Вход: Граф G — {V, E) с входом s и iV-номерами
вершин (в алгоритме JV-номера используются для
идентификации вершин), полурешетка L и система
функций F.
Выход: Граф С с размеченным множеством
вершин.
Примечание. Если через B(v) обозначается
множество предшественников вершины у, т. е. В (v) —
= Г^" * то через B*{v) в алгоритме обозначается
множество тех вершин из B(v), iV-номера которых меньше
N-номера вершины v.
качало
t: элемент из L;
&: массив [1, ..., к] элементов нз L;
/: целый; с: булевский;
1.«Ш:--0;
Шаг 1
2. для / от 2 до А: шаг 1 цикл
3. начало
4. *[/]':- Л /,(«I91)J
123
Я. конвц^кла;
6. с :«= истина;
7. пока с цикл
8. начало
9. с :«= ложь;
Шаг 2
10. для / от 2 до it шаг 1 цикл
11. начало
12. «.— л /9(«М);
вево')
13. если £ =7*= St[/] тэ
14. начало
15. с := истина;
16. *[/]:-*;
17. конец
18. конец цикла;
19. конец цикла;
конец
Теорема 1.Для графа G, полу решетки L,
отображения М: V -»■ F и дерева поиска в глубину Т метка
9,(0 вершины v с N-номером i после k-й итерации
алгоритма равна &(£)=* Л /р(0), где &w(0 —
~ {р\р = ц[з, Пир содержит самое большее к —А
обратных дуг согласно N-нумерации, индуцированной
деревом Т).
Доказательство проводится индукцией по числу к
полных итераций алгоритма.
Базис (к — i). Мы действуем по индукции по
iV-номерам / вершин G.
Базис (/=1). Очевидно, что тривиальный путь
есть единственный элемент в ^(1,(1), так как каждая
дуга, входящая в 1, есть обратная дуга. Таким
образом, 51.(1) должна быть равна е(0)=0. Так как мы
положили Я(1):=0 в первой итерации, то базис
есть.
Шаг индукции (/>1). Все пути из входа 1
в вершину ) могут быть записаны в виде </>, />, где /?
есть путь из 1 в q<^B*(j), если они не содержат
обратных дуг. По предположению индукции % (q) =
— Л /р(0) для каждой вершины q из B*(j).
(Здесь и далее /,>(•) = /im(/{„-Д• •• /*х(•)•••)) для
пути р ~ [i,, г2, ..., im, im+t] и /р = е для m — 0.) Шаг 1
124
алгоритма гарантирует, что
«(/)- Л /,(*(?))- Л Л Лр,л(0) =
?eB*(j) вэв*(Лр-^(1)(9)
- Л /q(0).
Это завершает индукцию по / для случая /с «= 1.
Шаг индукции (/с>1). Снова применим
индукцию по /.
Базис (/ = 1). Очевидно, что 0= Л /р (0)^
ре5э(1)(1)
5* Л /р (0)- Таким образом, Л /р (0) = 0.
После /с итераций алгоритма й(1) остается равной 0,
так что Я (1) = Л U Щ после /с-й итерации.
ps£>W(i)
Шаг индукции (/> 1). Каждый путь Q в &w(j)
имеет форму </», <7>, где либо 1) q<^B*{j) и />е
s#<*)(g), либо 2) qeB(j)\B*(j) и />е£»<*~'>(д).
Другими словами, 2) соответствует случаю, когда (д, /)
есть обратная дуга, т. е. q^j, a 1) соответствует
обратному случаю, когда q < /. Когда в алгоритме
переменная t вычислена для ;' при /с-й итерации, метка
51(g) будет равна:
а) Л /р(0), если q<j, т. е. в случае 1), при-
p=£><ft)(9)
мененном к q;
б) Л /р (О), если q > /, т. е. в случае 2).
р=$»(ь-%)
Заметим, что а) следует из предположения
индукции для /, а б) — из предположения индукции для к.
На /с-й итерации переменная t полагается равной
Л /<?(0), и, таким образом, метке Ш]) прида-
Qe^ *>(>)
ется это значение, если оно не было дано ей раньше.
Лемма 4. Алгоритм останавливается после к
итераций тогда и только тогда, когда для каждой
вершины /еУ и для каждого пути p^&ij) существуют
пути ри .. ., рт, принадлежащие ^><-k~i4j) и такие, что
МО» л /рЛО).
Доказательство. Необходимость. Из
леммы 3 имеем
Л /q(0)= Л /q(0),
125
так что равенство t «= Ж/) на к-& итерации алгоритма
обязательно имеет место, а переменная с будет иметь
в конце этой итерации значение ложь.
Достаточность. Предположим, что алгоритм
закончил свою работу после тга-й итерации, т < к.
Тогда для произвольной вершины / и пути p^ZPij)
должно быть выполнено условие fv (0)^3* Л /о (0).
Мы должны показать, что существует конечное
подмцожество 5 множества 0>lm~i)(j), такое, что
/р(0)> Л МО). Пусть QUQ2, ...-пути из ^<m-"(y),
перенумерованные в произвольном порядке, и пусть
xi =" Л /<?ь(0)- Очевидно, что xt> xi+l для всех i.
Из условия ограниченности полурешетки вытекает
существование только конечного числа значений i, для
которых Xi>xt+i. Пусть и — наименьшее из таких
значений, и пусть S = {<?х, ..., Q\ }. Тогда
Л /о(0)= Л МО),
так что 5 есть искомое конечное множество.
Теорема 2. Для данных полу-решетки L,
системы функций F, графа G и отображения М: V-+F
алгоритм Килдала останавливается после d(G) + 3
итераций, где d(G) — наибольшее число обратных дуг
в простых путях G, в том и только том случае, если
система D = {L, Д, F) удовлетворяет условию
(V/, g<=Fy (Vz e L) [fg (0) > g (0) Л / (*) Л х]. (3.1)
Доказательство. Необходимость.
Исходя из леммы 4, достаточно показать, что для каждой
вершины /sF и каждого пути ре&Ц) существуют
пути р„ ..., рт в ВРтгК)), такие, что /р(0)>
*3s Л ^ (0)- Мы докажем это утверждение индук-
Ki<m
цией по числу к обратных дуг, содержащихся в р, />==
— Eli, ..., l'r], ГДв I*i г=1 И !,=/.
Базис ((Xfcs£d+1). Этот случай тривиален,
так как достаточно положить т = 1 и pt — р.
Индуктивный шаг (&>d+l). Так как путь
р содержит больше чем d+l обратных дуг, он не
может не содержать контура по определению числа d.
Возьмем наибольший номер а, такой, что ia = ^ для
некоторого Ъ > а. Мы утверждаем, что путь pi =
126
■= llit ..., iJ должен содержать по крайней мере одну
обратную дугу, ибо путь [i.+i, ..., ij не содержит
контуров и, таким образом, имеет самое большее d
обратных дуг. Дуга Ий, i*+i) должна быть
обратной, а так как путь р по
предположению имеет более d + 1 обратных дуг,
то наше утверждение справедливо.
Путь рг «= [г«, ..., У содержит по
крайней мере одну обратную дугу, так как
каждый контур в графе обязательно
имеет одну обратную дугу
относительно некоторого дерева поиска в
глубину. Пусть теперь р3 = [ib, ..., tj, a /?4 —
путь без обратных дуг из вершины 1 в
вершину i„, как это показано на
рис. 3.1. Такой путь по дереву поиска
в глубину всегда существует.
Положим теперь х =/р (0). Имеем
/р(°) — /p3(/p2(/pi(0)))^ (по определению)
> /р8 (/Pi (0) А /р2 (я) Л*)= (по предположению)
■=/,,(/р1(0)Л./р1(/р1(0))Л/Р4(0))«.
- /рЛ <°)л W*A(0) л 1*гК <°> -
= Ы0)Л/р-(0)Л/,»(0),
где /? «= [ij, ..., t*., 4+1, ..., ir1, p" •= (p^ i«+j, ..., *6,
t6+1, ..., tr>^ И /7 = <p4, 1ц.», •••, lr>. P, /J И р —
пути в G, причем каждый из них содержит самое
большее к — 1 обратных дуг. Отсюда немедленно следует
справедливость индуктивного предположения?
Достаточность. Предположим, что условие
(3.1) не выполнено, т. е, имеет место соотношение
(3* е L) (3/, g<=F) [fg (0) > * (0) Л / (*) Л *Ь
По условию 4), которому удовлетворяет система
функций F, будучи допустимой для L, существуют функции
hu ..., hn e F такие, что х =■ A fti (0). Возможны
два случая.
Случай 1. ff(x)Pf (х) А а;. На рис. 3.2 показан
граф, для которого d(G) = 0. После третьей итерации
алгоритма Килдала имеем St (п + 2) = х A J{x) /\jf{x),
в то время как Щп + 2)=х /\ f (х) после второй итера-
Рис. 3.1.
127
ции. Следовательно, алгоритм требует не менее
> idiG) + 3) = 3 итераций.
Рис. 3.2.
я+4.
Рис. 3.3.
Случай 2. //(я) > / (ж) Л #• Рассмотрим граф
рис. 3.3 с diG) — 2. Имеем:
после первой итерации;
«(и+ 2) = *,
St (ге + 3) = х,.
St (гс + 4) = х^
«(и + 5) =» хх
St(re + 6) = 0;
после второй итерации:
St in + 2) = х,
*(п + 3) = *Л/(*),
St (га + 4) = х Д / (*)«
«(л+5) = *Л*(0),
Я (и + 6) = 0;
после третьей итерации:
*{n + 2)~gWAf(x)Axt.
«(/» + 3) = * (0) Л /(*) Л х Л //(*) =
*(п + 4)=г*(0)Л/(*)Л*.
8Ця + 5) = £(0)Л/(*)Л^
SC(ra + 6) = 0;
128
после четвертой итерации:
%(n + 2) = g(0)Af(x)Ax,
Я (л + 3) = g (0) Л / И Л * Л /* (0),.
* (л + 4) = £(0) Л / W Л х Л /*(0),
Я(л + 5) = ?(0)Л/ЙЛ1,
Я (п + в) = 0;
после пятой итерации:
Я(л + 2) = ^(0)Л/ЙЛ^Л/?(0>,
«(я + 3) = * (0) Л /(*) Л а: Л /*(0) А //*(<)),
Я (и + 4) = *(0) Л /(*) Л х Л /*(0) Л //*«>) =
*=g№Af{x)AxAfg(0)%
*(/» + 5) = *(0)Л/(*)Л*Л/*(0),
Я (л + 6) = 0.
Имеем St (п + 2) = g (0) Л /(ж) А% после четвертой
итерации и Я (я + 2) = g (0) Л / (х) Ах A fg (0) после
пятой итерации. Из предположения, что (3.1) не имеет
места для /, g и х, вытекает, что g (0) Л f(x) А ХФ
Ф8(й) Л / {х) А х A fg (0)- Таким образом, алгоритм
Килдала требует не менее 6 > idiG) -i- 3) = 5 итераций
/П+1 ©Л(
* ТУ
/ лег**4
/ yAJf
/ADtd±n*\
<Dldtt)*l
(T
>©2
n+ 3
>Л. d+n+i
^X
rf+л+Лг)
Рис. З.4.
и, фактически, останавливается после шестой
итерации. В общем случае любой граф, дерево поиска в
глубину которого имеет вид, показанный на рис. 3.4,
требует не менее d(G) + 3 итераций алгоритма. Теорема
доказана.
9 В. А. Евстигнеев
129
1.3. Алгоритм Кнлдала для полурешетки с
единицей. Скорость работы алгоритма выше, когда
полурешетка L содержит единицу 1. Изменения в алгоритме
незначительны.
начало
1. «(1):-0;
2. для / от 2 до п шаг 1 цикл
3. начало
А. «(/) := 1;
5. с := истина;
6. конец цикла;
7. пока с цикл
8. начало
9. с :•= ложь;
10. для / от 2 до га шаг 1 цикл
1 1. начало -
12. «:- Д /?(«(?));
qSBU)
13. если гфШ}) то
14. с := истина;
15. §!(/):= t;
16. конец
17. конец цикла;
18. конец цикла;
конец
§ 2. Пути в орграфах
Простейшим примером применения разметки
графов служат алгоритмы отыскания кратчайших путей
в графе.
2.1. Пусть G — обыкновенный орграф, т. е. орграф,
вершинам и дугам которого не приписаны никакие
веса. Путь (xta, b] называется кратчайшим путем из
а в Ъ, если длина его наименьшая из длин всех путей
из а в Ь.
Пусть для простоты ищется кратчайший путь из
входа графа s в выход t. Пусть, далее, L — множество
целых положительных чисел, пополненное символом °°,
операция Л есть взятие минимума, функция /0(91(и))
есть «метка Ши) плюс 1». Тогда алгоритм Килдала
для случая, когда 1 принадлежит L, примет
следующий вид. (Мы по-прежнему считаем, что все вершины
имеют УУ-номера, N(s) = 1, N(t) = п.)
130
начало
1. И(1):=0;
примечание роль нуля 0 в нашем случае играет
число нуль конец примечания
2. для / от 2 до п шаг 1 цикл
3. Ж; )':=«>;
примечание роль единицы 1 в нашем случае
играет °° конец примечания
4. с := истина;
5. пока с цикл
6. начало
7. с : = ложь;
8. для / от 2 до п шаг 1 цикл
9. начало
10. t:= min {Sf fa) + 1};
И. если t¥=%(j) то
12. начало
13. с := истина;
14. Ж;):-*;
15. конец
16. конец цикла;
17. конец цикла;
конец
Однако для отыскания кратчайшего пути метод
поиска в глубину не дает нужного порядка обработки
вершин. Так, для графа на рис. 3.3 окончательная
метка для вершины п -Н2 будет найдена после двух
итераций алгоритма, т. е. вначале этой вершине будет
приписана метка на основе метки вершины п+ 1, а
затем уже будут учтены полученные позже метки
вершин 2, 3, ..., п. Более подходящим является просмотр
вершин, основанный на поиске в ширину, который
приводит к традиционному виду алгоритма.
Шаг 1. Пометим вершину х0 меткой Х0 = 0.
Шаг 2. Все вершины у е Тх0 пометим меткой
Итерационный шаг. Пусть V(k) —
множество вершин, помеченных меткой к. Пометим вершины
из множества V (к + 1) = U Tv, которые не были
vevw
помечены ранее, меткой X — к + 1.
Алгоритм заканчивается, когда будет помечена
искомая вершина хп. Нетрудно убедиться, что метка Х(у)
вершины у есть длина кратчайшего пути из хй в у.
9*
131
Собственно кратчайший путь из ха в хп отыскивается
обратным ходом от хп к хй с общим шагом.
Итерационный шаг обратного хода.
Если г/г — последняя найденная вершина кратчайшего
пути, то в качестве вершины г/г_! берется вершина х
такая, что х е r~V и X {х) = X {ут) •— 1.
Отыскание кратчайшего пути заканчивается, когда
будет достигнута начальная вершина х0.
Алгоритм носит название волнового алгоритма.
2.2. Алгоритм Дейкстры. Пусть граф G не имеет
контуров отрицательной длины. Для простоты будем
считать, что все дугп и пмеют положительные веса —
длины 1(a).
В алгоритме Дейкстры выделяются две части:
отыскание длины кратчайшего пути методом расстановки
меток и отыскание собственно кратчайшего пути
обратным ходом. Для удобства изложения будем считать,
что ищется путь пз входа орграфа х„ в вершину х„.
начало
1. *,(*,):-= 0;
2. объявить метку Х(х„) постоянной меткой;
3. всем вершинам у е Гх0 приписать временные
метки Х{у) = 1(х0, у);
4. Xi'.== вершина графа с наименьшей временной
меткой;
5. объявить X(xi) постоянной меткой;
6. для i от 1 до п шаг 1 цикл
7. начало
8. для всех у <= Тх( цикл
9. начало
10. если у не имеет временной метки то
И. Uy):=X(xi) + l(xh у)
12. иначе К(у) := min Шу), X(xt) + Кх(, у));
13. конец цикла;
14. xi+i := вершина графа с наименьшей временной
меткой;
15. объявить метку X(xi+i) постоянной меткой;
16. конец цикла;
конец
Для отыскания собственно кратчайшего пути
используется итерационный шаг обратного хода. Пусть
г/т — последняя найденная вершина кратчайшего пути
(вначале это — вершина х„). В качестве вершины yr-t
132
берется вершина X, такая, что х е Т~гуг и к(х) =
— Х(ут) —Их, ут).
Алгоритм заканчивается, когда будет достигнута
вершина ха.
Пример. Пусть в графе на рис: 3.5 требуется
найти'кратчайший путь иза в Ъ. Длины дуг
обозначены числами возле соответствующей дуги.
Последовательное изменение меток вершин показано в
таблице 3.1. Окончательное распределение меток и
кратчайший путь показаны на рис. 3.6.
Рис, 3.5.
2.3. Критическим путем в орграфе с входом s и
выходам t называется самый длинный путь между этими
вершинами. Если кратчайший путь в орграфе не
существует при наличии контуров отрицательной длины,
то критический путь не существует в орграфе с
контурами. В обоих случаях это соответствует
неограниченности полурешетки L относительно операции min в
первом случае и операции max во втором.
Итак, пусть G — бесконтурный граф. Отыскание
критического пути в нем из входа s в выход t может
быть осуществлено с помощью алгоритма кратчайшего
пути, если веса и>(е) дуг заменить либо на (—w(e)),
либо на 1/ц>(е). В последнем случае метки, уже не
должны рассматриваться как длины.
133
2.4. Отыскание кратчайшего пути в орграфе с
контурами отрицательной длины. Кратчайшим путем
между вершинами а и Ъ в орграфе с контурами
отрицательной длипы принято считать простой путь
наименьшей длины между а и Ъ. Это приводит к мысли
перечислить все простые путп между заданными
вершинами и из них выбрать путь наименьшей длины.
Т а 6 л п ц а 3. 1
Вершина
а( ^ ха)
с(=.х2)
Я = *i)
Ц - та)
d( =- ,t)
g( ~ *i)
;'(=^ *«)
e( = x,)
b( = x„)
Мет):н
|ТГ| 0
6
HI
8
0
III
4
7
10
0
6
4
111
0
13
0 0
0 6
4 4
7 7
|1T| 9
1.4 | U |
14 14
15
(I
С
4
7
A
13
IZI
1Г.
22
0
fi
4'
/
9
13
li
|~ПГ|
20
0
0
4
7
9
13
Г»
15
Jll
Вначале рассмотрим алгоритм перечисления всех
простых s — f-путей в обыкновенном орграфе с
использованием оператора склейки, допускающий обобщение
на случай перечисления всех (!) путей в орграфе и
легко реализующийся на ЭВМ.
Пусть орграф G — LV, U) задан списком дуг:
G = {em\em = <ц, .г, ;/>, и = (х, у), не Ш.
Работа алгоритма состоит в последовательном
удалении вершин (исключая s и t) и одновременной замене
дуг их склейками — отрезками путей из s в t. Склейка
дуг и отрезков путей производится оператором
склейки Д, который заменяет список путей из {#;} в
вершину х — список 5+ — и список 5~ путей из х в {г//}
одним списком путей 5+Д5~ из {xj в {г/;}.
Пусть S+ = {St, ..., sN}, Si = <yii, x;, хУ, i—1, ...
...,N, S~ = {tu ..., tM), Ь°*<ц,,х,у3>, /=1 M,
S+, S~¥=0,— указанные выше списки путей. Тогда
склейкой 5+Д5~ путей из S+ и S~ называется множе-
134
ство R простых путей, такое, что
R = {rfj| Гц = <uix„ ^1, х,-, i/j>, uix,, i/jJ =
= нТх,-, xl U (itx, г/,], i = 1, ..., N; j = 1, ..., M),
причем одинаковые элементы в R учитываются по
одному разу.
3 а м е ч а п и е. Употребление здесь
теоретико-множественной операции объединения возможно, так как
в силу принятых в главе 1 соглашений путь
полностью определяется множеством своих вершин.
Алгоритм:
начало
1. Я, := U;
примечание в качестве начального значения
множества R путей из s в t берется множество дуг U
конец примечания
2. Х4:= V\U, t);
3. пока Xi не пусто цикл
4. начало
5. выбрать произвольную вершину х в Л^;
6. Х,:=ХМх)\
7. Rt = {r\r = (\x{r), x(r), x>, геЛ„ х(г) е
sXt U is, Ш;
примечание формируется множество путей,
входящих в х конец примечания
8. R- = {г | г = <ц (г), х, у(г)>, геЛ„ у(л) ^ X, U
U(s, t}};
примечание формируется множество путей,
исходящих из х конец примечания
9. Л^Дд^+иЛГ);
примечание формируется множество путей, не
затрагиваемых удалением вершины х конец
примечания
ю. д1:=д? и №**:);
11. конец цикла;
конец
Множество /?i после окончания работы алгоритма
даст искомое множество.
В случае взвешенного графа рассмотрим алгоритм
с трудоемкостью Oin + m) операций на путь,
использующий метод разметки из алгоритма Джонсона
перечисления контуров в орграфе. Алгоритм наряду с
генерированием s — i-путеи вычисляет и их длину.
135
Пусть орграф G = (V, E) задан списками
смежности, и пусть w(e) — вес дуги е — (а(е), fUe)), где через
а(е) мы будем обозначать начало дуги, а через |J(e) —
ее конец. Будем предполагать, что граф не имеет
петель.
процедура ГЕНЕРИРОВАНИЕ ПУТЕЙ;
1. начало
Ain), Bin): списочный массив; fi(e), w(e): массив;
Ь: логический массив;
2. процедура ОБХОД(v, /);
примечание v- есть последняя достигнутая при
обходе вершина, переменная / имеет тип логический
конец примечания"
3. начало
g: логический;
4. процедура РАЗБЛОКЫ;
5. начало
6. Ь(и) := ложь;
7. для у^В(и) цикл
8. начало
9. удалить у из В(и);
10. если Ь(у) то РАЗБЛОК(г/);
11. конец цикла;
12. конец РАЗБЛОК;
13. /:=ложь;
14. b(v) := истина;
15. для eeKrf цикл
16. начало
17. у:=р(в);
18. занести е в текущий список PS;
19. d:=d+w(e);
20. если у =t то
21. начало
22. занести путь, хранящийся в текущем PS, в
список путей;
23. выдать длину пути из s в t;
24. / := истина;
25. конец
26. иначе если—i b(y) то
27. начало
28. ОБХОД (у, g);
29. если g то /:= истина;
30. конец
31. удалить е из текущего списка PS;
136
32. d:=d-wie);
33. конец цикла;
34. если /то РАЗБЛОКЫ;
35. иначе для е е Aiv) цикл
36. начало
37. у:~р(е);
38. если v*£Biy) то занести v в Ж//);
39. конец цикла;
40. конец ОБХОД;
41. Р5:=0;
42. d:=0;
43. для каждой вершины и графа G цикл
44. начало
45. Ми) := ложь;
46. 5(м):=0;
47. конец цикла;
48.' ОБХОД (s, );
конец ГЕНЕРИРОВАНИЕ ПУТЕЙ
Нетрудно убедиться, что этот алгоритм порождает
все пути из s в t без дублирования и пропусков.
Трудоемкость алгоритма составляет О in + т) на путг.,
требуемая память — 0(п + т).
2.5. Перечисление всех путей в графе. Рассмотрим
некоторые свойства матриц смежности орграфов.
Лемма 5. Пусть G = (X, U) и II = (X, U) - два
орграфа с одним и тем же множеством вершин и с
матрицами смежности A(G) = Нац11 и A(H) = tibtj\\
соответственно. Матрице A(G) X А(Н) — произведению
матриц AiG) и АШ) — отвечает мультиграф,
образованный следующим образом: из вершины xt в
вершину Xj идет столько дуг, сколько существует различных
путей, ведущих из х{ в Xj и составленных из двух дуг,
первая из которых принадлежит U, а вторая — U.
Доказательство. Путь вида ixt, xh, x}], где
(xt, xk) e{/, a ixh, Xj) e U, существует, если ал • bk] =
= 1; поэтому общее число путей из х( в xh
образованных дугой из множества U и последующей дугой из
п
множества U, равно 2 Яг/г^яа это и есть И, /)-й эле--
мент матрицы AiG)XA(H).
Следствие 1. Элемент рц матрицы Р — Ая,
полученной возведением матрицы смежности AiG) графа
G в степень 8, равен числу различных путей длины 8,
идущих чз xt e х}.
137
Следствие 2. В графе G существует путь длины
0 тогда и только тогда, когда А*ФО; не существует
контуров тогда и только тогда, когда А* = 0, начиная
с некоторого 60.
Метод перечисления всех путей в орграфе основан на
лемме 5. Пусть цх = [.т,^, . . ., xip, xk] и [i2 = [xh х^,...
■ ■ ■ > xiq] ~ некоторые простые пути. По определению
оператора склейки А
[^i » • • •. Xjp, Xh, Xj , . . ., Xjg], еСЛИ Xh—Xi И
__ получившийся путь простой;
11 0 (пустая последовательность вершин) в
противном случае.
Если MxiXh = {Ич» Иг» • • • 1 Ип • • • 1 Ил} есть множество
путей длины р из ж4 в a;fc, а Л/'>т.= {vj, v2, .. ., v<, . ..
..., vr} есть множество путей длины q из хк в х„ то
-Л/д^АМ*^ есть множество простых путей из Xi в х-.
Для любых целых положительных чисел г и s
имеем A/(;+s) = U (Л/^ДЛ/* ), /г =] X |. Исходя из ука-
ft=x
аанных соотношений, видим, что это есть не что иное,
как определение «умножения» матриц с буквенными
элементами Ш11(г+а) = Ш11(Г>ДШ11!". Беря в качестве
ИЛ/11 = \\гпц\\ матрицу смежности A(G), записываемую
в виде
lx{Xj, если ai;- = 1;
ma = { _
- 10в противном случае,
нетрудно убедиться в том, что |1Л/11(!) есть матрица
путей длины. 1, Ш11<2) = 11А/11<0Д11Л/11(" — матрица путей
длины 2 и т, д.
§ 3. Пути, удовлетворяющие дополнительным
ограничениям. Покрытия
Задача о кратчайшем пути очень часто встречается
в ситуации, когда необходимо учитывать
дополнительные ограничения. Наличие их может значительно
повысить сложность задачи.
3.1. Кратчайший путь, проходящий через заданное
множество вершин. Рассмотрим два ограничения:
кратчайший путь должен проходить через выделенное
138
множество вершин, и кратчайший путь дола<ен
содержать как можно меньше невыделенных вершин.
Первая задача хорошо известна в теории исследования
операций. Эффективно она решается только для
бесконтурных графов. Рассмотрим ее для бесконтурного
взвешенного графа. С одной стороны, этот случаи
включает в себя и обыкновенные графы, с другой
стороны, он более близок к требованиям практики.
Итак, пусть G — бесконтурный орграф с
множеством вершин У. Пусть, далее, С есть подмножество V;
каждой вершине У;изС приписан вес w(vc)>0.
Требуется отыскать такой s - t-путь, чтобы сумма весов
входящих в него вершин из С была максимальна.
Предлагаемый алгоритм основан на сведении задачи к
задаче о критическом пути и имеет трудоемкость
Oim), где т — число дуг. Определим для каждой дуги
(х, у) в G длину Их, у), положив Их, у) = wix), если
х^С, и Их, у)=0 в противном случае. Обозначим
новый граф с взвешенными дугами через И.
Лемма 6. Путь ц из s в t в графе G имеет
наибольший суммарный вес вершин тогда и только тогда,
когда и. имеет наибольшую длину среди всех s — t-ny-
тей в графе II.
В случае графа с контурами в качестве
приближенного решения можно взять решение задачи для графа
Герца, взяв в качестве веса вершины, получаемой в
результате стягивания бикомпоненты, сумму весои
входящих в нее вершин. Однако такой подход не
охватывает все возможные комбинации контуров,
которые могут встретиться в бикомпонентах.
Пусть теперь требуется найти s— f-путь с
наибольшим весом, содержащий как можно меньше вершин
из V\C. Чтобы удовлетворить этому ограничению,
припишем каждой вершине, не принадлежащей С,
небольшой отрицательный вес (—е), причем подберем е так,
чтобы выполнялось неравенство 1/е > min {w(uc)}-\ V |.
vc<=C
Тем самым задача снова свелась к задаче о
критическом пути.
3.2. Минимальное покрытие вершин орграфа
путями. Рассмотрим задачу отыскания такого
минимального но числу путей покрытия, а именно
подмножества множества всех s — £-путей, что каждая
вершина орграфа принадлежит хотя бы одному такому
пути.
139
Путевое покрытие (или покрытие путями) вершин
графа G"{V, E) есть множество путей Р = {ри ...
..., рк}, таких, что для каждой вершины vt е V
существует путь pj&P, которому эта вершина
принадлежит. Покрытие Р называется минимальным, если не
существует покрытия Р' такого, что \Р'\ < \Р\, где
|J?I есть мощность множества Р.
Множество S вершин графа G называется
несравнимым, если для любой пары вершин vt и v} из S ни
v{ не достижима из vt, ни vj не достижима из v(.
Вершины из множества S называются несравнимыми.
Пусть iy(G) — мощность наибольшего несравнимого
множества вершин в G, й пусть p^(G) — наименьшее
число путей, необходимых для покрытия вершин G.
Теорема 3. Минимальное число
непересекающихся путей, которые в совокупности покрывают все
вершины бесконтурного орграфа G, равно
максимально возможному числу вершин в подмножестве попарно
несравнимых вершин, если это число конечно.
Другими словами, U(G) = pv(G) для любого
бесконтурного графа.
Обобщением теоремы 3 на случай произвольных
орграфов служит
Теорема 4. Для любого орграфа k(G) = pv{G).
Доказательство проведем индукцией по числу
бикомпонент. В орграфе G — (V, Е) обозначим через
<У> подграф, порожденный множеством вершин V,
V сг V. Пусть теперь подмножества Vh ..., Vk
порождают бикомпоненты в G.
Базис (& = 1). Граф G сильно связен. Легко
показать, что существует путь p[vt, u}], который
покрывает все вершины в G для любых vt и v}. Таким
образом, pv(G) *= 1. Так как любые две вершины в биком-
поненте взаимно достижимы, то iv(G) == 1, т. е. iv(G) =
= Pv(G).
Индуктивный шаг. Предположим, что iv(G) =
= p,(G) для всех к< п. Пусть к —п. Рассмотрим
орграф G' = (V, Е'), где V' = K ...,V'h] u (V'u Г>) е
<=£ , если вершина бикомпоненты <Vj> достижима из
некоторой вершины <Vi> (граф Герца для G). Ясно,
что G — бесконтурный граф. Пусть S — несравнимое
множество в G', мощность которого равна h(G'), \S\ =
= U(G'). ■ Пусть <Dn(S)> — подграф графа G',
порожденный множеством вершин Dn(S) — {vt\ vt достигает
S или Vi&S), a (AidS1)) — подграф графа G', порож-
140
денный множеством вершин Dd(S) = {u,\ V; достижима
из 5 или Vj e 5). Имеем два случая.
1. Предположим, что существует несравнимое
множество 5 с \S\ =U(G'), такое, что \Dn(S)\<k и
\Dd(S)\<k. Так как S есть подмножество множеств
D„{S) и Dd(S) и каждое несравнимое множество
вершин в <Dn(S)) или WAS)) есть несравнимое
множество вершин в G', то M<D„(S)>} = i,({Od(S)»=yG')=
=» |5|. По индуктивному предположению существуют
покрытия Рп и Pd вершин из <D„(S)> и <Д,(5)>
соответственно, такие,что \Рп\ — \РА = \S\ и pv«Dn(S))) =
= UWJS)» = iMDAS)» = py{<DtLS)>) = iv(G'). Пути
из Pn заканчиваются в вершинах из S, а пути из Р*
начинаются в вершинах из S. Мы можем тогда соеди-.
нить эти пути и образовать покрытие вершин из (?',
для которого pAG') = iv(G'). Но iw(G') = iw{G), -потому
что если {V, ..., Vi\ —несравнимое множество в G',
то, выбрав по вершине из каждого множества Vh ...
..., Vh мы получим несравнимое множество для G;
обратно, если ivh ..., v) — несравнимое множество
вершин в G и i^eF,, ..., Vj^Vu то fVu .. .,Vj]—
несравнимое множество для G'. Более того, если
р [К v't] - [К(v'„ v'h) V4... v\.{v\., v\) v't]
путь в G', то существует путь в G, который
покрывает все вершины во всех бикомпонентах (V,), <у{ >, ...
• • •, <^i>! (Уд в G. Это непосредственно следует из
того факта, что в бикомпоненте (Vj) существует путь
plva, v'b], покрывающий все вершины iVJ для любых
va и иь в Vj. Таким образом, для данного покрытия
вершин из G' легко можно построить покрытие той же
мощности для вершин из G. Так как рЛО не может
быть меньше, чем JV(G) «= iv(G'), то отсюда следует, что
/>v(G) = iv(G).
2. Предположим, что не существует несравнимого
множества S с \S\=i,(G') такого, что \Dn(S)\<k и
\Dd(S)\ < к. Тогда каждое максимальное несравнимое
множество S должно быть или множеством входов в
G', или множеством выходов в G'. В любом случае
пустые — вход, a v't — выход в G' и пусть р [v'„ v't] —
путь в G'. Рассмотрим орграф G, = G' \{у,, vt]. Ясно,
что число вершин в Gx равно к — 2 и по
индуктивному предположению существует покрытие вершин из
Gu для которого iv (G'j => ру (G^). Можно легко убе-
141
диться в том, что £v(Gj) — iv (С)— 1. Тогда, добавляя
Р [v's, vt\ к покрытию вершин из Gu мы получим
покрытие вершин из G', для которого ЦС) = pv(G').
Как и в предыдущем случае, мы покажем, что iv(G') =
= U(G) и pv(G') =j7v(G).
Доказательство теоремы 4 не предлагает
эффективного алгоритма для определения величин UiG) и pv(G),
но делает очевидным тот факт, что достаточно
построить покрытие вершин для графа Герца, чтобы
получить покрытие вершин для исходного графа.
3.3. Метод минимального потока построения
покрытия. Преобразуем вначале бесконтурный орграф G =
= (У, Е) в потоковую сеть. Для этого каждую
вершину Vi e V\{s, t) расщепим на две вершины у* и v{ и
Рис. 3.7.
добавим дугу (уь У{), как показано на рис. 3.7.
Получившийся граф обозначим через Gt = (Vf, Ef).
Сопоставим каждой дуге {а, Ъ) графа G} величину гаЬ
следующим образом:
10, если а == S или Ъ = t;
0, если (а, Ъ) = (у", i>j), vu v) es Vf;
1, если (а, £) = (yjr v"), v'u v'[ e V/.
Полученный взвешенный граф будет представлять
собой потоковую сеть, если величины гаЬ мы будем
интерпретировать как ограничение на величину потока
по дуге.
Дотоком по сети с ограничениями гаЬ на поток снизу
называется целочисленная функция /(e), определенная
на множестве дуг сети Е и удовлетворяющая условиям
/(а, Ъ)>гаЬ, (а, Ь)еЕ,; (3.2)
S f(vi,vi)= 2 /(^) Vi>,-е T7\(Sl *)•
(3.3)
142
Величина F= 2 f(s, vi) "= 2 f (vit t)
называем A{s) vxeB{t)
ется величиной потока. Поток / по сети с
ограничениями на поток снизу называется минимальным
потоком, если не существует потока /' с меньшей
величиной, который бы удовлетворял условиям (3.2) и
(3.3).
Теорема 5. Пусть / — минимальный поток в Gs;
тогда F = pv{G) = U(G).
Доказательство. Так как все ограничения на
поток — целые числа ив С( отсутствуют контуры, мы
можем сопоставить каждой единице потока
единственный s — f-путь. Множество этих путей образует
покрытие вершин в G,. Ясно, что F>U(Gf), так как
никакие две вершины в несравнимом множестве не
могут принадлежать одному и тому же пути. Если мы
установим единичный поток на каждом пути р( в
минимальном покрытии вершин в G,, мы получим
допустимый поток. Таким образом, F^p^(Gf), а отсюда
следует, что F = p4iGt) = iy(G,), а из конструкции Gs
следует, что p4{G) = pv(Gf) и /V(G) «=■ iT(G/).
3.4. Метод максимального паросочетания для
отыскания покрытия. Пусть G = (V, E) — бесконтурный
орграф, и пусть \V\ — п. Построим двудольный граф
G'-={V',E'), в котором V'-XuY-{xt xj U
U {j/i, •••, Уп) и (хи Hi) e£" тогда и только тогда, когда
vs достижима из v( в G. Паросочетанием в G'
называется подмножество дуг графа G', не имеющих общих
вершин. Паросоче'тание с наибольшим числом дуг
называется максимальным паросочетанием.
Теорема 6. Пусть G = (V, E) — бесконтурный
орграф, G' = (XUY, E') — соответствующий
двудольный граф, и пусть М — максимальное паросочетание
в G'. Тогда UG)-\V\-\M\.
Доказательство. Построим орграф G" =
= (V, Е"), где (v(, V))eE", если (х,, у,)&М. Из
определения паросочетания следует, что G" состоит из g
компонент, каждая из которых есть простой путь или
изолированная вершина. Мы утверждаем, что g =■
= IV1 — \М\. Существуют в точности |У| — \М\
вершин в X, которые не являются концевыми вершинами
дуг из М. Если х( — такая вершина, a t/< — конец
некоторой дуги в М, то отсюда следует, что v( есть
последняя вершина простого пути в G", и обратно. Если
обе эти вершины я, и г/,- не являются концами дуг в М,
143
то v{ — изолированная вершина в С, и обратно.
Таким образом, g— \V\ — \М\.
БуДем считать изолированные вершины в G"
путями нулевой Длины. Тогда, поскольку для каждого
пути /?"=ЬДУ(, ^)^...Уц_,(у»_,, vk)v.h] в G"
существует путь p = [plv(, Vjiplv,, i>t_,]/>[iv-i, vh]] в G, мы
можем легко построить покрытие вершин из G, такое,
что \Р\ «=* 1VI — \М\. Чтобы показать, что Р есть
минимальное покрытие, предположим, что существует
покрытие Р' с \Р'\ < \Р\. Рассмотрим орграф G,,
получаемый из G добавлением к Е всех дуг (vt, vt), если
Vj достижима из v{, т. е. транзитивное замыкание. Для
данного Р' можно легко построить покрытие Pd
различными путями вершин из Gt, мощность которого
\Pd\ равна \Р'\. В этом случае существует паросоче-
тание М' в G', такое, что каждая дуга в М'
соответствует дуге в пути из Pd и наоборот. Име.ем, что
| М' | =» 2 I (Р) — IVI — I P'd \i где lip) — длина пути
pep'd
р в P'd. Но \Р'А = \Р'\<\Р\ и \M'\-\V\-\P'd\>
> \М\, что противоречит предположению о
максимальности паросочетания М в G'.
Трудоемкость метода зависит от трудоемкости
алгоритма для решения задачи о максимальном паросоче-
тании. Наилучший известный алгоритм имеет
трудоемкость 0(n1/2m) или 0(и5/2), так как в нашем случае
т = 0(п%).
3.5. Задача о требуемых путях. Пусть G «= (V, Е) —
орграф, и пусть Л«={я1, ..., я*}— множество
некоторых путей в G. Будем говорить, что s — f-путь р{
накрывает путь nj&R, если р( представим в виде [ап^У,
где а и 1 — простые пути. Задача о требуемых путях
состоит в следующем: найти минимальное по
мощности множество s — f-путей Р = {р{, ..., рт), такое,
что для любого я<еД найдется путь Ps&P,
накрывающий его.
Мы можем взять вместо G его граф Герца G* и
заменить требуемые пути в G эквивалентными путями
в G*. Будем считать, что ни один требуемый путь я<
не является подпутем я>. Пусть я{= [vt (v^,)...(, i>it)i4t]
и пу = [v}i (y^,) ... (, Vjt)vjt] —требуемые пути. Будем
говорить, что nt достижим из П(, если:
a) Vf достижима из vit или vj = vit
144
либо
б) Щ = Я(]Я;2, Л, = Я^Я^ И Я^ = Я;].
Прямым следствием этого определения является
следующая лемма.
Лемма 7. Отношение достижимости для
требуемых путей определяет частичный порядок на
множестве требуемых путей.
Чтобы решить задачу о требуемых путях, постронм
орграф GR~{VR, Er), где VR = {vu ..., v„) и {vt, vj e
^ ER, если Kj достижим из Ki в G*. Таким образом,
требуемые пути в G* соответствуют вершинам в GR.
Орграф GR не содержит контуров, и для каждого пути
в Gr найдется соответствующий путь в G.
Теорема 7. Пусть Ря — минимальное покрытие
вершин из GR. Тогда найдется соответствующее
минимальное покрытие Р для требуемых путей в G*,
такое, что \Р\ = \PR\.
Следовательно, задача о требуемых путях
оказалась сведенной к задаче нахождения минимального
покрытия вершин.
3.6. Минимальное покрытие дуг орграфа путями.
Задача состоит в отыскании минимального по числу
путей подмножества всех путей, такого, что каждая
дуга принадлежит хотя бы одному такому пути. При
этом возможно дополнительное требование о том,
чтобы все пути исходили из одной вершины. Рассмотрим
вначале покрытие дуг орграфа путями, исходящими
из входа орграфа. Пусть Р — некоторое покрытие дуг
орграфа. Назовем число путей в Р кратностью
покрытия Р, а сумму длин всех путей из Р — длиной
покрытия Р. Ясно,, что покрытие Р орграфа G
существует, если каждая его вершина, из которой исходит
хотя бы одна дуга, достижима из начальной вершины.
Можно показать, что это условие и достаточно. Будем
называть граф, для которого существует покрытие,
правильным.
Покрытие Р — {/?!, ..., рк} орграфа G называется
приведенным, если выполняются следующие условия:
а) для всех i*£j, Ki, j^k, путь pt не является
начальным отрезком пути ps;
б) для всякого q, являющегося начальным отрезком
пути pt, д¥=р{, ie[l;A;], множество Р' — {р,, ..., р{-х,
q, pi+l, ..., рк) не является покрытием.
Пусть Р — приведеппое, покрытие орграфа G. Из
условия б) следует, что если р&Р и заканчивается
10 В. А. Евстигнеев
145
дугой и, то эта дуга не принадлежит никакому
другому пути из Р. Отсюда непосредственно вытекает, что
для правильного графа всегда существует
приведенное покрытие, кратность которого не превосходит
числа дуг орграфа. Из определения приведенного
покрытия следует также, что минимальное по длине
покрытие является приведенным.
Приведенное покрытие орграфа, являющееся мп-
нимальным по кратности и по длине, называется
минимальным.
Можно показать, что минимальное покрытие
орграфа существует не всегда. В самом деле, для графа
на рис. 3.8 существуют два
приведенных покрытия: Pi = {iui, иг, и3, ц4, и5,
щ, щ, ии и2, щ, us, щ, иа]} и Р% =
■={[«!, Щ, U3, Ц4, И3, И„, U8, U9], [щ, Uz,
Ut\). Покрытие Pi минимально по
кратности (кратпость его равна 1), но
не минимально по длине (длина его
равна 13). Покрытие Рг является ми-
Ряс. 3.8. нимальным по длине (длина 11), но не
минимальным по кратности
(кратность 2). Легко установить, что для данного орграфа
минимального покрытия не существует.
Сформулируем достаточные условия существования
минимального покрытия. Пусть Д(у) = deg+ (v) —
— cleg- (i>). Назовем вершину v положительной, если
A(i')>0, и отрицательной в противном случае.
Множество всех положительных вершин обозначим через
V+, множество отрицательных — через V~. Обозначим
теперь через R+ подмножество вершин из множества
Г+, из которых не достижима ни одна отрицательная
вершина.
Теорема 8. Орграф G имеет минимальное
покрытие, если для него R+ = F+.
Доказательство. Если у правильного графа G
множество V* пусто, т. е. для всех вершин
полустепень захода равна полустепени исхода, то по теореме
18 главы 2 G обладает эйлеровым контуром. Очевидно,
что этот эйлеров контур является минимальным
покрытием.
Предположим теперь, что Т7+ не пусто и,
следовательно, V" также не пусто. Поскольку V+ = R+, а
множество Л+ состоит из вершин, из которых не достижима
ни одна отрицательная вершина, то граф G заведомо
146
не сильно связен. Покажем, что кратность такого
покрытия равна я (G) = 2 А (у)-
кеУ+
Вначале покажем, что кратность покрытия не
превосходит я(С). Для этого проведем из каждой
вершины v e У+ в вершину v„ (рассматриваемую как вход)
ровно Д(у) дуг вида (v, vj. В полученном сильно
связном мультиграфе В зафиксируем контур,
проходящий через все дуги Н. Этот контур не содержит
двух следующих друг за другом дополнительных дуг,
более того, его можно выбрать так, чтобы каждая
дополнительная дуга входила в него ровно один pay.
Наличие такого контура гарантирует существование
покрытия, кратность которого не превосходит n(G).
Пусть теперь Р = {ри ..., pki — некоторое покрытие
графа G, Замкнем каждый путь ри добавив • дугу
(f(, v0) из вершины Vi, в которой этот путь
заканчивается. Обозначим через С контур в полученном графе
Н, проходящий через все дуги // и соответствующий
покрытию Р. Превратим В в мультиграф #', заменив
каждую дугу и орграфа G столькими копиями, во
сколько путей из покрытия Р она входит, или,
другими словами, сколько раз она встречается в контуре С.
В силу теоремы 18 главы 2 мультиграф В' обладает
эйлеровым контуром. Поскольку для любой вершины
v мультиграфа В' имеем Д(у)=0, то в вершину v0
заходит не менее 2 А (у) замыкающих дуг, откуда и
VSR +
следует, что кратность покрытия Р не менее 2 А (у).
KSR +
Так как R+ = V+, то отсюда вытекает оценка
кратности минимального покрытия.
Пусть теперь Р есть покрытие орграфа G
минимальной длины d, и пусть каждый путь из Р
заканчивается в вершине, отличной от v0. Более того, он
заканчивается в вершине из R+, так как в противном
случае длину покрытия можно уменьшить.
Предположим, что Р не минимально по кратности, т. е. его
кратность превышает n(G). Построим сильно связный
граф В, замкнув каждый путь дугой, ведущей в v„,
и построим для пего эйлеров мультиграф В'.
Поскольку кратность покрытия Р больше я(0, то в G
найдется вершина t e V+, из которой в графе В выходит
I замыкающих дуг, причем l> A(t). Следовательно,
в графе Н найдется дуга «eG, заходящая в вершину
10* 147
F и принадлежащая по крайней мере двум путям из
Р. Тогда из графа Ш удалим одну дугу и',
соответствующую дуге и, и удалим одну замдкающую дугу,
исходящую из I. Затем из начала дуги и' в вершину
(.'о проведем одну дугу. Легко увидеть, что
полученный граф Н" является эйлеровым и эйлерову контуру
графа Н" соответствует покрытие графа G длины
d — 1. Следовательно, Р не является покрытием
минимальной длины.
Рассмотрим, наконец, минимальное по длине
покрытие Р = {/>i, ..., pj графа G, у которого некоторые
пути заканчиваются в v0. Пусть кратность покрытия
Р больше n(G) и пути р,, ..., pL закапчиваются в v0.
Легко увидеть, что покрытие Р' — iipiPz-.•/>i+J,
Pi+2, ■ ■., Pi>) также является покрытием минимальной
длины и все пути из Р' закапчиваются только в
положительных вершинах графа G. Теорема доказана,
так как кратность такого покрытия Р' минимальна.
Опишем алгоритм построения приведенного
покрытия правильного графа G. Пусть пути искомого
покрытия обозначаются />,-, а мпожество вершин графа
G, из которых исходит хотя бы одна дуга,
обозначается Т. Каждой вершине х е Т поставим в
соответствие множество Aix) дуг, исходящих из х. Дуги в
Aix) занумерованы числами 1,2,..., причём если из
двух дуг щ и щ из Aix) одна, скажем щ, является
петлей, то i<j. Пусть, кроме того, <piu) обозначает
номер дуги и в множестве Aix), а Ыр) — конечную
вершину пути р, исходящего из вершины х. В
алгоритме, кроме построения покрытия, производится
вычисление параметра /, необходимого для оценки длины
полученного покрытия.
Вход: Граф G = iV, E), заданный
упорядоченными списками дуг Aiv), исходящих из вершин.
Выход: Покрытие Р =» {р(}.
начало
1. процедура УДЛИНЕНИЕМ;
2. начало
3. выбрать из Aiv) дугу и с наименьшим номером;
4. р(:=р^;
5. Aiv):=Aiv)\{u);
6. если ф(и) ¥= 1 то / : = / + 1;
7. если Ai8iPi))^0 то УДЛИНЕНИЕМ/!,»
8. иначе если из SipJ достижима хотя бы одна
вершина у с Aiy) ¥* 0 то
148
0. начало
10. построить кратчайший путь qt из б{р{) в у;
11. />,: = piqj;
12. УДЛИНЕНИЕМ/»,));
13. конец
14. иначе добавить pt к Р;
15. конец УДЛИНЕНИЕ;
16. Р:=0; г:=1; ;':=0;
17. для всех iet цикл А{х) := Л"Ы;
18. z := s; ■
19. УДЛИНЕНИЕМ);
20. J:=i+1;
21. если (J Л (ж) = 0 то стоп
жег
22. иначе переход к шагу 18;
конец
Теорема 9. Для правильного графа всегда
существует покрытие длины, не превосходящей величи-
1
ны m + 2i(t — l) {т{ — 1), где m — число дуг орграфа,
i=i __
a nit — мощность множества Aixt), xt^ T.
Доказательство, Упорядочим множество
{ffiijx ет отношением ^ и обозначим упорядоченное
таким образом множество через (mi, ..., mt), причем
m.i'Cmj, если £</. Будем считать, что /-Й шаг
алгоритма составляют построения, выполняемые
алгоритмом при фиксированном параметре ;'. Путь qjr
строящийся на шаге 10 алгоритма, назовем транслирующим
путем. Очевидно, что длина покрытия равна сумме
числа дуг графа и длины всех транслирующих путей.
Из описания алгоритма следует, что длина
транслирующего пути q, не превосходит числа таких вершин
иезТ, для которых на /-м шаге A~(v) = 0. Поэтому
для значений ;', /s[0; mi —U, длина q; равна нулю,
а для значений / из интервала [пг^, тг — 1] длина q,
не превосходит единицы. На последнем шаге работы
алгоритма значение / равно 2(^1— !)• Отсюда вид-
г=>1
но, что суммарная длина транслирующих путей не
/
превышает величины Q = 2j {i — 1) {m-i — 1)-
i=l
В случае бесконтурного графа минимальное по
кратности покрытие дуг орграфа можно построить с
149
помощью минимального потока по сети. Для этого
достаточно приписать каждой дуге .орграфа
ограничение на поток снизу гаь, равное единице. Для графов
с контурами, как и в случае покрытий, вершин,
необходимо построить сначала минимальное по кратности
покрытие дуг для графа Герца, а затем использовать
тот факт, что все дуги бикомпоненты можно покрыть
одним путем.
§ 4. Отыскание доминаторов в орграфе
Вершина D(v) называется доминатором для
вершины v, если D(v) лежит на каждом пути из входа
графа в вершину v. Вершина Id(v) называется
непосредственным доминатором для v, если любой другой
доминатор для v является также доминатором для
Mi;).
В этом параграфе описывается алгоритм
отыскания непосредственных доминаторов для каждой
вершины графа. Трудоемкость алгоритма — 0(п log п + тп).
Если m^ nlogn, то алгоритм имеет трудоемкость
О(тп) и оптимален с точностью до постоянной.
4.1. Преобразования, сохраняющие доминаторы.
Предположим, что в графе G = (У, Е) с входом s
выполнен поиск в глубину, в результате чего все
вершины получили М- и iV-номера, а все дуги оказались
разбитыми на классы древесных, прямых, поперечных
и обратных дуг. Для каждой вершины v определим
тогда множество F{v), где F{v) = {w\ w Ф v и
существует вершина и, достижимая из w по древесным
дугам по пути, проходящему через v, и такая, что {и, и;)
есть обратная дуга в G). Пусть вершина H(v) имеет
наибольший М-поыер в Fiv), если F(v) Ф 0. (Здесь и
далее мы будем иснользовать только Д/-помера. При
необходимости мы будем идентифицировать вершины
М-номерами.) Ясно, что вершина Hiv) достижима из
w по Т, если w^Fiv). Рассмотрим преобразование:
удалить из G все обратные дуги и добавить новые
обратные дуги (v, Hiv)) для каждой вершины v, для
которой H(v) определено. Это преобразование носит
название замены обратных дуг.
Пример. После замены обратных дуг в графе
на рис. 3.9 вершина К потеряла обратную дугу, а
вершины /, F и С приобрели. Древесные дуги графа
изображены на рисунке сплошными жирными линиями,
150
прямые — сплошными тонкими, поперечные —
волнистыми, обратные — штриховыми. Первое число из пары
чисел, сопоставленных каждой вершине, есть М-по-
мер, второе — iV-номер.
а) Граф G
Рис. 3.9.
Лемма 8. Пусть G' — граф, получаемый из G
заменой обратных дуг, и пусть Т — дерево поиска в
глубину для G. Если (и, w) — обратная дуга в G и в
Т существует путь ив w в и, содержащий вершину v,
то в G' существует путь из v в w, содержащий только
обратные дуги.
Доказательство проводится индукцией по длине
пути в G из w в v. Детали предоставляются читателю.
Лемма 9. Вершина w является доминатором
вершины v в G тогда и только тогда, когда w доминирует
v e G'.
'Доказательство. Предположим, что w не
доминирует v в G. Тогда в G существует путь из s в г,
не содержащий w. Предположим, что этот путь
содержит обратную дугу {и, и'), причем w достижима из
и' по Т. Тогда мы можем заменить часть пути,
начинающуюся в s и включающую последнюю такую
дугу, путем из древесных дуг. Это дает нам путь в G
из s в v, который не содержит ни w, ни одной
обратной дуги (it, и'), такой, что w достижима из и' по Т.
Если мы теперь заменим каждую оставшуюся
обратную дугу в пути соответствующим путем из обратных
дуг в G', что гарантируется леммой 8, мы получим
путь в G' из sb v, который не содержит w, откуда и
следует, что w не доминирует v в G'.
S) Граф G1
151
Обратно, предположим, что w не доминирует v
в С. Тогда существует путь р в G' из s в v, не
содержащий w. Предположим, что этот путь содержит
обратную дугу (и, Н(и)), причем w достижима из
Щи) по Т. Тогда мы можем заменить часть р' этою
пути, расположенную ближе к s и включающую
последнюю такую дугу, путем из древесных дуг.
Это дает нам путь р" в G' из s в v, не содержащий
ни w, ни одной обратной дуги (и, Hiu)), такой, что
w достижима из 11{и) по Т. Для любой обратной дуги
(и, Н(и)) в пути р" существует соответствующая ей
обратная дуга {и', IIЫ)) в G, причем w достижима из
Н(и) по Т. Если мы заменим каждую обратную дугу
{и, Н(и)) в р! путем из древесных дуг из и в и' и
следующей за ним обратной дугой (и, Н(и)), то мы
получим путь р в G из s в v, не содержащий и>.
Отсюда следует, что w не доминирует v в С. Лемма
доказана.
Пусть теперь G есть граф, к которому уже
применено преобразование замены обратных дуг. В
соответствии с соглашением о возможной идентификации
вершин их Д/-номерами будем писать v < w, понимая под
этим, что M(v) <M{w). Пусть {и, v) и {ui, v) — две
прямые дуги в G, причем Ui > и. Рассмотрим
преобразование: удалить прямую дугу~(и,, v).
Лемма 10. Пусть G' — граф, получаемый из G
удалением прямых дуг. Вершина w доминирует
вершину v в G тогда и только тогда, когда w доминирует
v в G'.
Доказательство. Так как G' есть суграф G,
то каждый путь в G' есть путь в G. Таким
образом, если w доминирует v в G, то w доминирует
v вС.
Обратно, предположим, что w не доминирует v в G.
Тогда существует путь р в G из s в v, не содержащий
w. Если р не содержит дугу (u,, v)} то р есть путь в
G' и w не доминирует v в G'. Предположим, что р
содержит дугу (ии v). Если w — потомок ии то мы
можем заменить часть пути р ближе к s, включающую
в себя дугу (ui, v), путем из древесных дуг из s в и
и следующей за ним прямой дугой (и, v), получив в
результате путь р' в G' из s в v, не содержащий w.
Если w не является потомком ut, мы заменим (uh v)
в р путем из древесных дуг из и, в v и получим путь
/ в G' из $ в у, не содержащий w; в любом случае
152
w не может доминировать v в G', что и доказывает
лемму.
Пусть v — вершина в G, такая, что из нее выходит
одна обратная дуга iv, Hiv)), заходит самое большее
одна прямая дуга и не заходят ни поперечная, ни
обратная дуги. Преобразование «удаление обратной дуги»
состоит в удалении обратной дуги iv, H(v)) и
добавлении дуги iu, Hiv)), если iu, v) существует и
(и, H(v)) есть обратная дуга, т. е. если u<H(v).
Лемма 11. Пусть G' — граф, получаемый из G
удалением обратных дуг. Тогда вершина d доминирует
w в G' тогда и только тогда, когда d доминирует w в G.
При этом предполагается, что ни одно удаление
обратной дуги не применялось к вершинам х с
номерами меньшими, чем номер вершины v.
Доказательство. Предположим, что d не
доминирует w в G. Тогда существует путь р в G из s в
w, не содержащий d. Если р не содержит iv, Hiv)),
то р есть путь в G'. Если р содержит iv, Hiv)), то* р
должен содержать либо дугу iu, v), либо древесную
дугу, заходящую в v. Если d не есть непосредственный
предок для Hiv), то мы можем заменить часть р
ближе к s, содержащую дугу iv, Hiv)), путем из
древесных дуг из s до'Жу); в результате получим путь в G',
не содержащий d. Предположим теперь, что d есть
непосредственный предок для Hiv). Если дуга перед
дугой (v, Hiv)) в р есть iu, v) и u<Hiv), то мы можем
заменить iu, v) и iv, Hiv)) дугой iu, Hiv)) и получить
путь в С, не содержащий d. Если дуга перед iv, Hiv))
есть древесная дуга или дуга iu, v) и и 5= Hiv), то по
лемме 8 мы можем заменить iv, Hiv)) и дугу перед
ней путем из обратных дуг и получить путь в G',
который не содержит й. В любом случае d не
доминирует w в G'.
Обратпо, предположим, что d не доминирует w в
G'. Тогда существует путь р' в G' из s в ю, не
содержащий d. Если р' не содержит iu, Hiv)), то р' есть
путь в G. Предположим, что р' содержит iu, Hiv)).
Если d¥=v, то мы можем заменить iu, Hiv)) в р' на
iu, v) и iv, Hiv)), что даст нам путь в G, не
содержащий d. Если d = v, то мы можем заменить часть
пути р' ближе к s, содержащую дугу iu, Hiv)), путем
из древесных дуг из s в Hiv), что дает нам путь в G,
не содержащий d. В любом случае d не доминирует
w в G, что и доказывает лемму.
153
Пусть Gti) есть суграф графа G, порожденный'
древесными дугамп н дугами, заходящими в вершины
v, где M(v) > i. Тогда i-м семидоминатором Sdti, v)
вершины v называется ее непосредственный доминатор
Id(v) в Gti).
В дальнейшем будем предполагать, что иФ\, так
что все семидоминаторы определены.
Лемма 12. Если v ¥= 1 и i>v, то Sdti, v) есть
непосредственный предок вершины v в дереве Т
поиска в глубину.
Лемма 13. Если v Ф1, то для всех i вершина
Sdti, v) достижима из Sdti — 1, v) no Т.
Справедливость данной леммы вытекает из того,
что Gti) есть подграф графа Gti — 1).
Лемма 14. Если v¥=i и Sdii, v) = i, то Id(v) — 1.
Доказательство. Из леммы 13 следует, что
Sd(i, v) достижима из Sd(0, v) по Т и Sd(0, v) =ld(v).
Таким образом, если Sdti, v) доминирует v в G, то
Sdti, v) = Id(v). Теперь покажем, что Sdti, v)
доминирует v в G, если Sdti, v) — i.
Предположим, что существует путь р в G из s в v,
не содержащий i = Sdti, v). Тогда v должна быть
достижима из i по Т. При этом некоторая дуга пути р
должна начинаться в вершине, не являющейся
потомком вершины i, и вести в вершину — потомок i. Пусть
(и, w) — последняя такая дуга в р. Тогда w > i и все
дуги, следующие за {и, w) в р, имеют оба конца среди
потомков I. Так как все потомки вершины i имеют
Л/-номера, большие i, и так как и не является
потомком I, то мы можем заменить часть р от начала пути
до дуги {и, w) путем из древесных дуг из s в и и
получить путь в Gti), не содержащий i. Но это
противоречит определению Sdti, v), поэтому вершина Sdti, v)
должна доминировать v в G. Лемма доказана.
Лемма 15. Если v¥=l u'i^v, то: либо Sdti, v) =
— Id(v), либо I достижима^из Sdti, и) по Т.
Доказательство проводится индукцией по i с
использованием лемм 12—14.
Лемма 16. Если и не доминирует v в G и дуга
(и, v) в G заменена дугой Udtii), v), то d доминирует
w в G тогда и только, тогда, когда d доминирует w в
результирующем графе G'.
Доказательство. Предположим, что d не
доминирует w в G. Тогда существует путь р в G из s
в w, не содержащий d. Если р не содержит дугу {и, v),
154-
то р — путь в G. Предположим, что р содержит дугу
(и, v). Тогда р содержит Idiu) и мы можем заменить
часть пути р от Idiu) до v дугой (Idiu), v) и получить
путь в G' из s в w, не содержащий d. Таким образом,
d не доминирует w в G'.
Обратно, предположим, что d не доминирует го в
С. Тогда существует путь р' в G' из s в и>, не
содержащий d. Если ildiu), v) не лежит на пути р', то //
есть путь в G. Предположим, что ildiu), v) лежит на
пути р'. Если d — и, тогда как и не доминирует v, то
существует путь q в G из s в w, не содержащий й.
Заменяя путем q часть пути />' ближе к s,
включающую дугу- ildiu'j, v), получим путь р в G из s в и>, не
содержащий d. Предположим, что йФ и. Если каждый
путь из" Idiu) вив графе G содержит d, то d
доминирует и. Также и каждый путь из s в d должен
содержать Idiu), так как Idiu) доминирует и. Тогда
Idiu) доминирует d, или Idiu) = d. И в том, и в
другом случае приходим к противоречию. Отсюда следует,
что существует некоторый путь г из Idiu) в и в графе
G, не содержащий d. Заменяя г и дугу iu, v) на дугу
ildiu), v) в р', получим путь в G из s в w, не
содержащий d. Ни в одном случае d не может
доминировать w в G. Лемма доказана.
Пусть iu, v) — поперечная дуга в графе G.
Преобразование «замена поперечной дуги» состоит в
удалении дуги (и, v) и добавлении дуги iSdiv, и), v).
Лемма 17. Пусть G'— граф, полученный из
G заменой поперечной дуги. Тогда d доминирует
w e G тогда и только тогда, когда d доминирует w
в G'.
Доказательство. Если iu, v) — поперечная
дуга, то v < и. Если Sdiv, и) = Idiu), то
справедливость леммы вытекает из леммы 16, так как и не
может доминировать v, если только не имеет место
достижимость v из и по Т, что невозможно по
определению поперечной дуги. Предположим, что Sdiv, и) Ф
Ф Idiu). Тогда v достижима из Sdiv, и) по древесным
дугам по лемме 15. Теперь предположим, что d
доминирует w в G. Тогда существует путь р в G пз s
в w, не содержащий d. Если iu, v) не является дугой
в р, то р есть путь в G'. Пусть р содержит iu, v).
Если d не является предком Sdiu, v), то мы можем
заменить часть пути р ближе к s, включающую дугу
iu, v), путем пз древесных дуг из s в Sdiv, и) п
155
дугой (Sdiv, и), v) и получить путь в G' из s il и\ не
содержащий d.
С другой стороны, пусть d — предок Sd(v, и).
Рассмотрим часть пути р из .9 в и. Пусть (у, z) —
последняя дуга в этой части пути р с у < и. Тогда вершина
у должна быть предком вершины и, так как по
свойствам поиска в глубину и Д/-нумерации любой путь
из у в и должен проходить через общего предка а
вершин у и и и эта вершина удовлетворяет
соотношению а^у^и. Вершина у должна быть предком v,
так как у ^ v *S и, и любой предок вершины и,
который не является предком вершины и, будет иметь
номер больший, чем номер вершины и. Часть пути р от
у до и лежит в подграфе G(v), так что у достижима
из Sd(v, и) по древесным дугам. В противном случае
будет существовать путь в G(v) из s в и, не
содержащий Sdiv, и), что певозможно. Таким образом, на пути
р найдется такая вершина у, что в дереве Т
существует путь \i[d, v] = (d, ..., Sd(v, и), .. ., у, . .., v). Мы
можем замепить часть пути р от у до и, включающую
дугу (и, v), путем из древесных дуг из у в v. Это дает
нам путь в G' пз s в w, не содержащий d, и d не
доминирует w в G'.
Обратно, предположим, что d не доминирует w в
G'. Пусть р' — путь пз s в w в графе G', не
содержащий d. Если р' пе содержит дуги (Sd(v, u), v), то р
есть путь в G. Предположим, что р' содержит
(Sd{v, и), v). Если d — и, то мы можем заменить дугу
(Sdiv, и), v) в р путем из древесных дуг из Sd(v, и)
в v и получить путь из s в w в G, пе содержащий с/.
Если d¥=u, то должен быть путь </ в G(i>) (и,
следовательно, в G) из вершины Sd(v, и) в и, не
содержащий d. Иначе Sd(v, и) доминирует d и d доминирует
и, что невозможно. Заменяя дугу (Sdiv, и), v) в пути
р' путем q и дугой (и, v), получим путь из s в w в G,
не содержащий d. В любом случае d не может
доминировать вершину w в G, что и доказывает лемму.
4.2. Закончим теоретическое обоснование
алгоритма вычисления доминаторов.
Лемма 18. Пусть i — вершина в G, такая, что
в нее заходят самое большее две дуги — древесная
дуга (и, i) и, возможно, прямая дуга (w, i). Если ни
одна прямая дуга не заходит в i, то Sd(i — 1, v) =
= Sd(i, v) для всех v. Если в I входит прямая дуга
(w, i), то Sd(i— l, v) = w для всех v, которые дости-
156
жимы из i no T, и в Т найдется путь из и в w,
содержащий Sdii, v), и Sdii — l, v) = Sdii, v) для всех
остальных вершин.
Доказательство. Если в i пе заходит ни
обратная дуга, ни поперечная, ни прямая, то Gii) =
= G(t—1); таким образом, первая часть леммы
справедлива. Предположим, что в i заходит прямая дуга
iw, i). Так как Gii — 1) не имеет дуг, кроме древесных
и дуг, которые ведут в вершины с номерами
большими, чем номер i, то любой путь в G(i — 1), который
содержит дугу iw, i), должен заканчиваться в
вершине — потомке L Таким образом, пути из s в
вершины, не являющиеся потомками i, одни и те же и в
G(i), и в G(i— 1). Это означает, что если v не
является пвтомком i, то Sdii, v) "Sdii — 1, v).
Предположим, что v — потомок i. Если Sdii, v) *f*
¥=Sdii—i, v), то должен быть путь в G(i— 1) из s
в v, не содержащий Sdii, v), который, однако, не
является путем в Gii) с тем же свойством. Путь р
должен содержать прямую дугу iw, i). Но если в Г не
существует пути из w в и, содержащего Sdii, v), то
мы можем заменить дугу iw, i) в р путем из
древесных дуг из w в i и получить путь в Gii) из s в v,
который не содержит Sdii, v). Из этого противоречия
следует, что если Sdii — 1, v) ^ Sdii, v), то существует
путь в Т из w в и, содержащий Sdii, v).
Предположим теперь, что такой путь в Т
существует. Если и достижима из Sdii, v) в дереве Г, то
вершина d доминирует Sdii, v) в подграфе Gii)
только в том случае, если Sdii, v) достижима из d по Т и
d доминирует v в Gii). С другой стороны, любая
вершина, которая не является предком Sdii, v), не может
доминировать v в Gii). Таким образом, в Gii) домина-
торы вершины vсуть предки Sdii, v). Теперь в Gii— 1)
вершина р доминирует вершины и; и у, если w
достижима из d по Т. Если Sdii, v) достижима из d по Т,
но d не есть предок вершины w, то d не доминирует
v, так как путь из древесных дуг из s в w с
последующей прямой дугой iw, i) и путем из древесных дуг
из i в v есть путь в подграфе Gii— 1), не
содержащий d. Тогда доминаторы v в подграфе Gii— 1) суть
предки w и Sdii — 1, v) — w.
Лемма 19. Пусть G' — граф, получаемый из графа
G применением преобразования «удаление прямых
дуг», а также преобразований «удаление обратных
157
дуг» и «замена поперечных дуг». Тогда множества
семидоминаторов в G' и G совпадают.
Доказательство. Мы должны сравнить до-
минаторы в подграфах G(i) и С(г'), чтобы проверить,
что i-e семидомипаторы в G п G' одни и те же. Пусть
G' образуется пз G удалением прямых дуг, и пусть
dii, v) — удаленная прямая дуга, (и, v) — другая
прямая дуга в G п ил>и. Если i>vt то G(i) = G'(i),
и лемма справедлива. Если i < v, то п (и, v), и (и,, v)
имеются в G(i), G'(i) образуется из Gii) удалением
прямой дуги, утверждение леммы следует пз леммы 10.
Предположим, что G' образуется из G удалением
обратной дуги. Пусть '(v, //(у))—удаленная обратная
дуга, а (и, IHv))— добавленная обратная дуга,
причем в v заходят только древесная дуга и прямая дуга
Ы, v) и выходит только одна обратная дуга. Если i 5*
5=//d>), то G(j) = G'(0, и лемма справедлива. Если
i<H(v), то (i>, H(v)) и (и, v) принадлежат G(i), дуга
(и, Il(v)) принадлежит G'(i) n G'ii) образуется из
G(i) удалением обратной дуги. В этом случае лемма
следует из леммы 11.
Предположим, что граф G' образован из G заменой
поперечной дуги. Пусть (и, v) — поперечная дуга в G,
которая заменена па дугу (Sdiu, v), v), в результате
чего "получен G'. Если i>v, то G'(i) = G(i), и лемма
справедлива. Если i < v, то G(v) естьсуграф графа G(j)
и v-й семпдоминатор вершины и один и тот же и в
G(i), и в G. Дуга (и, v) содержится в Gii), и дуга
(Sd(v, и), v) — в G'ii). Отсюда следует, что G'ii)
образуется пз G(i) заменой поперечной дуги, и лемма
справедлива по лемме 17.
4.3. Алгоритм отыскания домипаторов. Приведем
набросок алгоритма в алголоподобном виде.
процедура ДОМИНАТОРЬКС, в);
начало
Шаг 1
1. Применим процедуру ПОИСКЕ, п) для
классификации дуг и построения М-пумерации вершин,
достижимых из s; пусть G,— подграф графа G,
содержащий все вершины, достижимые из s; пусть Gt имеет
я, вершин;
2. для каждой вершины v из G, но не пз G, цикл
МЫ:=0;
Шаг 2
3. для каждой вершины v пз G, цикл
158
4. вычислить Ж у);
5. применить замену обратных дуг к Gt для
получения графа G2;
Шаг 3
6. для i от п1 шаг —1 пока 0 цикл
7. для у от 1 до /г, цикл
S. вычислить Sd(i, v);
9. для i от 1 до Hi цикл
10. /d(i):-Sd(0, i);
конец
Полный текст алгоритма включает в себя
процедуру поиска в глубину, которая сортирует обратные
дуги по значению их второй вершины, а также
используется для начала процесса удаления прямых дуг
и для выработки информации о предках вершин для
инициализации процесса ^вычисления семидоминаторов.
Операции над множествами и над очередями здесь не
реализуются, но предполагается выполнение
примитивных операций. Однако время, требуемое этими
операциями, включается в оценку времени всего алгоритма.
Вход: Граф G с входом s, заданный списками
смежности A(v).
Выход: Множество доминаторов.
процедура ДОМИНАТОРЬКС, в);
начало
1. процедура ПОИСК(у);
2. начало
примечание здесь используется
модифицированная процедура поиска в глубину; она нумерует
вершины графа М-номерами, классифицирует дуги,
удаляет все, кроме одной, прямые дуги (Siv), v),
входящие в v, сортирует обратные дуги, вычисляет число
потомков и предка каждой вершины в дереве поиска
в глубину; вершины, не достигаемые при таком
поиске, не имеют домннаторов; переменная тп обозначает
последний М-номер М, переменная h обозначает
последний jV-номер Л°; ND(v) обозначает число
потомков вершипы v в дереве Т конец примечания
3. m :=J{iv) := fh + 1;
4. ND(v) : = 1;
5. для we A (v) цикл
6. начало
7. если Ж{ш) = 0 то
8. начало
159
9. ПРЕД0КЫ:=1;;
10. ПОИСКЫ;
11. ND(v):=ND(v) + ND(w);
12. конец
13. иначе если JViw) = 0 то
14. начало
примечание вершина w помещена в стек, а
(у, w) есть обратная дуга конец примечания
15. добавить {v, w) к ГРУИПА(н>);
16. конец
17. иначе если J((v) <J(iw) то
18. пометить {v, w) как прямую дугу;
19. если Л(и)<&Ы то
20. &(w):-JHv);
21. иначе добавить (v, w) к списку поперечных
дуг, входящих в w;
22. n:-Jf(v):=n-U
23. конец цикла;
24. конец ПОИСК;
Шаг 1
25. m : = 0; h := и+ 1;
26. для каждой вершины у цикл
27. начало
28. ЛГЫ:=./ГЫ:=0;
29. ГРУППАЫ := пустой список;
30. Id(v):=0;
31. 24i;):=tt;
32. конец цикла;
33. ПОИСКЫ;
34. «1 := т;
примечание отныне мы полагаем, что каждая
вершина идентифицируется своим Л/-номером конец
примечания
35. модифицируем все структуры данных так,
чтобы все вершины идентифицировались своими номерами;
Шаг 2.
36. для / от 1 до п, шаг 1 цикл
примечание производится вычисление H(v) для
каждой достижимой вершины v конец примечания
37. начало
38. ЯШ := 0;
39. a(i):= пустое множество;
40. конец
41. для i от 2 до я, шаг 1 цикл
42. оШРЕДОКШ) ;= оШРЕДОКШ U oii))\
160
43. для w от п, до 1 шаг — 1 цикл
44. начало
45. пока ГРУППАЫ Ф 0 цикл
46. начало
47. выбрать (и, ц;) из ГРУППА(из1;
48. удалить {и, из) из ГРУППАМ);
*
49. пока —\(u-+w) цикл
»
примечание запись m->u? означает, что из
достижима из и по древесным дугам конец примечания
50. начало
51. а;:=-НАЙТИ(и);
примечание функция НАЙТИ (ж) вычисляет
номер множества, содержащего х в качестве элемента
конец примечания
52. если Жв) = 0 то
53. начало
54. а(х) :=а(х) U а(и);
55. Н(и) := из;
56. конец
примечание после этого шага все величины
Hiv) будут вычислены правильно конец примечания
57. и := х;
58. конец цикла;
59. конец цикла;
60. конец цикла;
Шаг 3
61. примечание на этом шаге производится
вычисление семидоминаторов конец примечания
62. для г от 1 до и, шаг 1 цикл
63. о,(г) := Ш;
примечание а{ содержит информацию о
поддеревьях доминаторного дерева конец примечания
64. Для i от ге, до 1 шаг — 1 цикл
65. начало
66. для каждой поперечной дуги (и, i) цикл
67. начало
примечание производится превращение дуги
(и, £) в прямую дугу повторяющейся заменой
поперечных дуг конец примечания
68. z — НАЙТИЫ;
69. если (х-*- i) то
70. заменить [и, I) на (х, i)
71. иначе начало
72. (х, 1;):=НАЙТИЫ;
U Б. А- Евстигнеев 161
73. заменить {щ i) на (х, i);
74. конец
75. если «-vS'(i) то 2'(i):=x;
примечание если в i заходят две прямые дуги,
то одна удаляется конец примечания
76. конец цикла;
77. если Н (v)<v Л 2 (v) < v Д SB <& Щ > Н {v) то
78. 242»):=// (и);
примечание если из i исходит обратная дуга, то
она удаляется и добавляется, если необходимо, прямая
дуга конец примечания
79. примечание вычисляются Sd(i— 1, v) для всех
таких v, что Sd(i—1, v) ¥= Sd(i, v); семидоминатор
вершины v есть приоритет а2, содержащего ее, если v > 1
и Id(v) пока еще не известны конец примечания
80. ОЧЕРЕДЬШ := пустая очередь;
81. для »еГ( цикл
82. начало
83. ОЧЕРЕДЬШ := ОЧЕРЕДЬШ U ОЧЕРЕДЬЫ;
84. удалить о2(г, ;') с наивысшим приоритетом г из
ОЧЕРЕДЬШ;
85. конец цикла;
86. пока г = i цикл
87. начало
88. для каждого элемента v e о2(г, /) цикл
89. начало
"90. Id(v):=-i;
91.,Oi(£) :=o,(i) Uo,W;
92. конец цикла;
93. удалить о2(г, /) с наивысшим приоритетом z из
ОЧЕРЕДЬШ;
94. конец цикла;
95. добавить a2(z, /) к ОЧЕРЕДЬШ;
96. если 2{i) > i то
97. начало
98. а2(ПРЕДОКШ, i) := М;
99. добавить а2(ПРЕДОКШ, i) к ОЧЕРЕДЬШ;
100. конец цикла;
101. иначе начало
102. aj&ii), i):=(i};
103. удалить о2(г, /) с наивысшим приоритетом г
из ОЧЕРЕДЬШ;
104. конец
463
105. пока 2?(i) < z цикл
106. начало
107. o,(S?(i), i) i-o^U), fl Uo,(*. j);
108. удалить az(z, j) с наивысшим приоритетом z
из ОЧЕРЕДЬЮ;
109. конец цикла;
110. добавить аг(г, /) к ОЧЕРЕДЬЮ;
111. добавить ах{£Ш, I) к ОЧЕРЕДЬЮ;
112. конец цикла;
конец
4.4. Замечания к алгоритму. 1. Шаг 1 имеет
трудоемкость 0(п + т).
2. Прямой алгоритм для вычисления Hiv) требует
ОЫг) времени. В данном случае предполагается
использование хорошего алгоритма для вычисления
объединений множеств, в результате чего алгоритм имеет
почти линейную трудоемкость. Обратные дуги
вначале рассортировываются с помощью ^/-номеров их
концов, потом вычисляются Illv) с помощью обработки
обратных дуг {и, w) в порядке убывания номеров
вершин w. Каждая вершина получает метку Н точно один
раз. Если (и, и>) — следующая для обработки обратная
дуга, то каждая не помеченная к данному моменту
вершина, исключая w, на пути из и> в и имеет метку
Н, равную w, и может быть так помечена.
3. После строки 56 все значения Н будут
вычислены. Чтобы алгоритм работал эффективно, шаги 43—56
алгоритма не должны перепроверять, вычислены или
нет значения Н для вершин. Для этого нужно иметь
хороший метод Для вычисления объединения
множеств. У нас будут подмножества, занумерованные от
1 до «1. Всякая вершина у^-1 всегда будет
находиться в множестве, номер которого равен наибольшему
собственному непомеченному предку вершины v;
вначале, если (у, w) — древесная дуга, вершина w входит
в множество^ имя которого v.
Чтобы обработать обратную дугу (и, и>), найдем
множество ии содержащее и, множество и2,
содержащее ult и т. д., пока не достигнем множества ия такого,
что un-*~w. Вершины ut, ц2, ...., un-t и, возможно, и
суть непомеченные вершины на пути в дереве Т из
w в и. Мы пометим их значением Н вершины w и
потом вычислим объединение множеств с именами
ц„ иг, ..., и„_1, н„ и, возможно, и, дав ему имя ц„.
11»
163
Все объединения множеств здесь являются
объединениями непересекающихся множеств. Операция
НАЙТИЫ вычисляет номер множества, содержащего
х в качестве элемента. При использовании
эффективных реализаций для поиска и объединения множеств
трудоемкость шага 2 есть 0{n\ogn + тп).
4. Назовем дерево доминаторным деревом для
графа G, если оно пмеет то же множество вершин, что
и G, и вершина w является потомком вершины v в
дереве тогда и только тогда, когда v есть
непосредственный доминатор для ю. Предками вершины v в
дереве являются в точности все доминаторы для w.
При вычислении семидоминаторов на шаге 3
строится домннаторное дерево от висячих вершин к" корню:
в любой данный момент времени часть доминаторно-
го дерева, которую мы знаем, будет состоять из
отдельных вершин и их потомков. Пусть это множество
поддеревьев есть1 F. Для храпения информации о F
используются множества а,, занумерованные от 1 до
rii. Если v — вершина в F, то v будет храниться в
множестве 0[, номер которого есть ЛГ-номер корня того
поддерева F, которое содержит v. Если v не входит пи
в одно поддерево F, то v будет храниться в оДу).
Первоначально каждое множество a(v) содержит
только v. Для изменения множества at каждый раз, когда
мы вычисляем Idiv) для новой вершины, мы полагаем
OiUdiv)) = aLiv) U a,ild(v)). Для этого можно
использовать эффективный алгоритм объединения множеств.
Так как для большинства вершин Sd(i — 1, v) =
= Sd(i, v), то имеет смысл вычислять только те семп-
доминаторы, которые изменяются при изменении i.
В качестве структур данных для этих вычислений
используются очереди с приоритетами.
Чтобы реализовать вычисления семидоминаторов,
используя приоритетные очереди, создадим очередь
для каждой вершины v. Очередь для вершины v будет
содержать множества а2, каждое из которых есть
множество потомков v. Всё вершины в а2 будут иметь
одно и то же значение Sdiv, w), и это значение будет
приоритетом множества а2 в очереди. В множество о2
включаются только те вершины, чьи значения Id не
известны. Таким образом, если Sdiv, w) есть
приоритет некоторого множества а2 в очереди для вершины
#
v, то имеет место соотношение Sd(v\w)—>-v.
164
Чтобы модифицировать семндомннаторы при
обработке вершины v, обозначим через (i?(u), v) прямую
дугу (произвольную, если их несколько), заходящую
в v. Все вершины из Tv к этому моменту уже
обработаны. Сначала мы конструируем приоритетную
очередь для v, комбинируя очереди вершин из Tv.
Каждое множество а2 в новой очереди имеет приоритет,
соответствующий некоторому предку вершины v.
Удалим, каждое множество о2, имеющее приоритет v —
наивысший возможный приоритет. Каждая вершина в
удаленном множестве а2 имеет значение Id, равное
v (по лемме 14). Пометим эти вершины значениями
Id и модифицируем множества о\. Если v не имеет
входящих в нее прямых дуг, то добавим к очереди
новое множество а2(и) с приоритетом, равным
непосредственному предку вершины v. Если в v входит прямая
дуга, то удалим из очереди каждое множество а2 с
приоритетом, равным или большим чем 3?Lv), найдем
объединение а2 всех этих множеств, добавим к нему
в качестве элемента вершину v и включим это новое
множество о2 в очередь с приоритетом S£{v). Это
реализует лемму 18 для модификации семидоминаторов.
Библиографический комментарий
Алгоритм Килдала был опубликован в 1973 г. в работе [122],
изложенный в § 1 вариант алгоритма Килдала принадлежит
Дж. Каму и Дж. Ульману [120] (см. также [11]). Он основан
на поиске в глубину.
Кратчайшим путям посвящена обширная литература,
наиболее распространенные методы Форда, Дейкстры и др.
изложены во многих книгах по прикладным аспектам теории
графов, например в [7, 9, 72, 78] и др. Методы отыскания путей
при наличии ограничении можно найти в [27]. Алгоритм
отыскания путей между заданными вершинами в обыкновенном
графе принадлежит С. Межику [135], во взвешенном графе —
С. Цукияме и др. [157]. По поводу генерирования всех путей
в графе с использованием матрицы смежности см. [52].
Описанный в § 3 метод отыскания кратчайшего пути,
проходящего через заданное множество вершин, принадлежит
X. Габову и др. [114] (о других методах и подходах см. [27]).
Задачи о покрытиях вершин графа излагаются по работе
С. Нтафоса и С. Хакими [141], метод построения приведенного
покрытия дуг орграфа — по работе И. С. Грунского и Д. В.
Сперанского [22]. Теорема 3 из п. 3.2 известна в комбинаторике
под названием теоремы Дилуорса [81]. О потоках в сети см. [1,
9, 78]. Упомянутый в п. 3.4 алгоритм для решения задачи о
максимальном паросочетании принадлежит Дж. Хопкрофту и Р.
Карпу (об этом см. [53]). Отыскание домипаторов в орграфе
излагается по работе Р. Тарьяна [153]; об эффективном алгоритме
построения объединения непересекающихся множеств см. [7].
ГЛАВА 4
ОПТИМИЗАЦИОННЫЕ ЗАДАЧИ НА ГРАФАХ
§ 1. Построение оптимальных нумераций
1.1. Нумерацией, оптимальной относительно
функционала er(F), называется такая нумерация F вершин
графа, для которой значение функционала £Г
минимально. Оптимальная нумерация F называется
допустимой, если для любой дуги (х, у) графа имеет
место неравенство F(x)> F{y). Допустимая нумерация
F называется плоской, если при расположении вершин
графа в целочисленных точках числовой оси его дуги
не пересекаются.
В дальнейшем мы будем рассматривать только
допустимые нумерации.. Кроме того, мы будем
предполагать, что вершины орграфа расположены в
целочисленных точках числовой осп. В силу этого соглашения
будем говорить не о нумерации вершин графа, а об
укладке графа в одномерную целочисленную решетку или
просто об укладке. Укладку F будем записывать в виде
F=(vl, ..., у„), причем имеет место цепочка
неравенств F{Vi) < F{p,_) <.. .< Fivn).
Растянутостью укладки F(vt, ..., v„) называется
число Pf = шах (Fivi), ..., Fivn)) — min iF(vi), ...
..., F(vJ) — n + 1. Сжатием укладки F на множество
чисел а + 1, ..., а + п, где а — натуральное число,
называется укладка Fu у которой Fl(vl) = a+1, ...
>.., FiivJ = a+ n.
Заметим, что при сжатии укладки допустимость
нумерации сохраняется.
Пусть дана укладка Fiv{, . .., vn). Будем говорить,
что дуга [х, у) проходит над вершиной z, если имеет
место неравенство F{y) < F(z) < Fix). Дуги ix, у) и
166
(у, w) пересекаются, если выполняется одно из
условий:
а) дуга (х, у) проходит над вершиной v, и дуга
(у, w) проходит над вершиной у;
б) дуга (х, у) проходит над вершиной w, ж дуга
(и, w) проходит над вершиной х.
Пусть w{x) есть число дуг, проходящих над
вершиной х.
Шириной укладки F называется функционал
W(F) T=maxw(x). Укладка,' ширина которой мини-
X
мальна среди всех укладок графа, называется
оптимальной по ширине укладкой, а ее ширина — шириной
графа.
Длиной укладки F(vu ..., vn) называется
функционал П (F) = 2 I F (х) — F (У) I- Укладка, длина ко-
(*,y)eJE(G)
торой минимальна среди всех укладок данного графа,
называется оптимальной по длине укладкой, а ее
длина — длиной графа.
1.2. Построение оптимальной по ширине укладки.
Пусть T — (V, Е)—корневое ордерево с корнем г.
Укладка минимальной ширины для дерева Т
получается в результате заполнения таблицы с тремя
столбцами и п строками, где га = 1VI, по строке на каждую
вершину, и пусть р(£, /) обозначает содержимое клетки
таблицы на пересечении 1-й строки и /-го столбца,
* = 1, .... п\ / = 1,2,3.
Алгоритм:
Вход: Ордерево Г«=(7, Е) с корнем г, заданное
списками смежности.
Выход: Оптимальная по ширине укладка ф =
■= (vi, ..., vn) и ширина W{T) дерева Т.
начало
1. провести поиск в ширину и занумеровать
вершины в соответствии с порядком их обхода при этом
поиске;
примечание это означает, что номер 1 получает
корень, далее нумеруются его потомки, затем потомки
потомков и т. д. конец примечания
2. для I от п до 1 шаг —1 цикл
3. начало
4. если номер вершины v равен i то р(£, 1) := v;
примечание с этого момента вершины идентифи-
W
цируются номерами соответствующих строк таблицы
конец примечания
5. конец цикла;
6. для i от 1 пока i ^ n цикл
7. начало
8. если i — висячая вершина то
9. начало
10. рЦ, 2):=0;
11. р(г, 3) := i;
12. конец
13. иначе начало
14. упорядочить вершины у0, уи ..., ук из Г( в
порядке убывания содержимого р(г/, 2) второго столбца,
пусть упорядоченная последовательность есть у, ,
У]^ • • ■ i У]к>
примечание в соответствии с правилами
заполнения первого столбца все строки, соответствующие
вершинам у j , J/,-,..., yjh, у;ке заполнены конец
примечания
15. для t от 0 до к шаг 1 цикл
16. начало
17. pt:=p(Vih,2) + t;
18. p(i, 2) :=max(p(i, 2), /?,);
19. p(i, 3):=p(i, 'd)p(yjt, 3);
20. конец цикла;
21. конец;
22. конец цикла;
23. Ы7:=р(га, 2);
24. ф :=р(и, 3);
конец
Пример заполнения таблицы для дерева Т,
показанного на рис. 4.1, а, приведен на рис. 4.1, б.
Предположим теперь, что имеется таблица,
заполненная по алгоритму для дерева T = (V, E) с
корнем г.
Теорема 1. Для каждой вершины peF
содержимое третьей клетки строки, соответствующей
вершине v, т. е. p(v, 3), есть укладка поддерева T(v) с
корнем в вершине v; при этом ее ширина равна
числу, стоящему во второй клетке той же строки, т. е.
p(v, 2).
Из теоремы и того факта, что Т(г) = Т, немедленно
следует, что последовательность ф(г), стоящая в по-
168
следпсп строке третьего столбца, есть укладка
дерева Т с шириной W — р(г, 2).
Теорема 2. Для каждой укладки дерева Т ее
ширина не меньше содержимого р(г, 2) второй клетки
последней строки.
V
L ■
К
J
I
И
G
F
Е
D
С
В
А
«(»)
0
0
0
0
1
0
1
0
2
2
0
2
qp(t')
L
К
,1
I
KLH
G
1JF
Е
IJFKI.HGD
UFKLHGDEC
В
1JFKLHGDECBA
б)
Рис. 4.1.
Из теоремы 2 окончательно вытекает, что алгоритм
действительно строит укладку минимальной ширины.
1.3. Построение оптимальной но ширине укладки
взвешенного ордерева. Пусть каждой дуге вей орде-
рева T = (V, Е) приписан неотрицательный вес Р{и),
а каждой вершине v — вес P(v). Рассмотрим плоскую
укладку ср взвешенного ордерсва Т. Определим для
каждой вершины v полный вес Q{v) следующим
образом:
— если вершина v — висячая, то Q{v) —P{v);
— если вершина v — внутренняя с множеством
потомков Tv = {г/,, ..., г/,,,}, причем вершины у(
выписаны в порядке их следования в плоской укладке ср, то
Q{v)
max \ max
, 2Д(у.) + ^)'
i=l J
(4.1)
где R(yf) есть вес дуги, заходящей в вершину у(.
m
Будем считать, что ^(^2^ {уг) + Р {v); тог-
да имеет место неравенство Q(v) — R(v)>Q.
№
Шириной плоской укладки (p(v) взвешенного
поддерева T{v) с корнем v называется полный вес Q{v)
вершины v. (В случае v = г это будет служить
определением ширины плоской укладки всего дерева.)
Изложим метод решения задачи о построении
укладки с наименьшей шириной. Вначале рассмотрим
решение в классе плоских укладок, а затем в
произвольном случае.
Теорема 3. Для того чтобы Полный вес
внутренней вершины v в классе плоских укладок Фпл был
минимален, достаточно упорядочить ее потомков уи ...
..., Mm согласно соотношению
Q(Vi) - ЯШ > Q(vx) - Шу>) > . > QiyJ - my J. (4.2)
Для доказательства теоремы необходима следующая
лемма.
Лемма 1. Укладка cpi = (vh ..., vk, vh+u ..., vm)
потомков вершины обеспечивает полный вес вершины
v не больший, чем укладка ф2 = (у1( ..., vk+i, vh, ,.., vm),
если
Q(vK) - R(vh) > Q(vh+i) - R(vL^). (4.3)
Рассмотрим три случая,
Ы
1. ДОПУСТИМ, ЧТО (Я (У) = 2 R {Щ) + Q {V}), ] ф kt
1=1
m
k+lt или Qa) (v) = 2 R N + P И- ТогДа QiV (v) >
>Qm(v). p
2. Если Q{1) (v) = 2 R Ш + {Q Ы - R Ы), то
i=l
ft+1
<?(2) (v) > 2 R (Vi) + (Q (vh) - R Ы) >
i=l
> 2 R (Vi) + {Q (vh) - R (vk)) > Q(1) (v).
i=l
ft+1
3. При Qll\v)=? ^R{Vi) + (Q(vh+1)-R(vh+1)) имеем,
i=l
используя (4.3),
ft+1
QW (P) > 2 *M + (Q (vh)-R(vh))^
i=l
ft+1
>2й И + «2 K+i) - Д (^ft+i)) = <2(1) M-
i=l
170
Следовательно, при всех возможных случаях
справедливо неравенство
Qmiv)>Qwiv).
Доказательство теоремы 3. Пусть для
некоторой укладки ф потомков вершины v выполнены
соотношения (4.2). Предположим, что ф неоптимальна,
т. е. существует укладка ф', обеспечивающая
минимальный вес Qiv). Так как ф' Ф ф, то в ф' найдется
хотя бы одна пара соседних вершин vt и vi+l, таких,
что Q(Vi) — Riv{) < Q(vi+l) — R(vi+i). Согласно лемме 1,
поменяв местами эти вершины, мы получим
улучшение полного веса Qiv), что противоречит
оптимальности ф'. Следовательно, укладка ф с соотношениями
(4.2) обеспечивает минимум полного веса Qiv).
Из теоремы 3 непосредственно вытекает алгоритм
нахождения в классе Фпл плоской укладки
минимальной ширины. Он заключается в том, что если на
каком-то шаге для внутренней вершины v e V известны
минимальные полные веса ее потомков, то для
получения минимального полного веса Qiv) вершины v
необходимо упорядочить ее потомков согласно
соотношениям (4.2). Процесс заканчивается определением
минимального веса кория с одновременным
получением плоской укладки минимальной ширины всего
дерева.
Рассмотрим решение поставленной задачи в классе
произвольных укладок. Пусть задана произвольная
укладка ф ордерева Т. Будем считать, что ф состоит из
нескольких последовательно расположенных кусков
%, ...,tym, каждый из которых включает набор
вершин, расположенных в порядке их следования в
укладке ф. Обозначим через ц-iv) путь из корня г дерева
в вершину v. Рассмотрим вершину Vj{ из ф,. Пусть
vt. —первая из вершин if>(, лежащая на пути из г
в ф, и такая, что v^ е Ц.(г>(;), i </, 1 </^ni.
Переопределим вес вершины Vjt (новые характерна
стики помечены штрихом):
п определим вес куска ify и полный вес куска fy
171
соответственно:
i?(^)=2i?'K)' / = 1,...,»»;
г
Ы
Q (Ь) = max /2 Д fa) + <? fa)") - 2 Я М-
i-jSifj V i j t=l
В этих формулах суммирование ведется по всем
тем вершинам, которые лежат на пути из корня в ifc.
Заметим, что при разбиении исходной укладки на
куски следует добиваться неотрицательности i?(ij)j)
и Q($j).
Назовем укладку ф минимальной, если она сама и
любой ее кусок являются укладками с наименьшей
шириной.
Теорема 4. Из произвольной укладки дерева, для
которого известны минимальные укладки всех его
поддеревьев, последовательным улучшением можно
получить минимальную укладку всего дерева.
Доказательство. Пусть у дерева Т имеется
I поддеревьев оь . . ., о„ причем соответствующие им
укладки СС|, ..., oci являются минимальными. Проведем
разбиение каждой из этих укладок на куски. Пусть
va — вершина, для которой полный вес S (ах) =
= 2 R (vt) + Q (l't) равен ширине укладки а1 —
t
= (v'u . . .,v'p), т.е. 5 К) = max(5(yi), ■ ■ .,
^(ур)).Образуем первый kj7cok "ф[ укладки cti так, чтобы,
во-первых, его полный вес был равен S{at), во-вторых, вес
R(tyi) был минимален. Обозначим множество вершин
ipi через {v'a, v'a+1, ..., v'b], as^bs^p. С оставшейся
частью. укладки at поступаем аналогично. В
результате получаем представление а{ в виде
последовательности кусков tyi, . .., tyg.
Параллельно с выделением kj^ckob ведется расчет
их характеристик R(\p') и Q(ty'); при этом должны
выполняться условия неотрицательности весов /?(\|/)
и Qity'). Из определения кусков имеем
<?Uvi)^^(4vi) + <?(^)-
172
В итоге получаем соотношения
Отсюда и из теоремы 3 вытекает, что куски ор1т . . .
...,t[)<j должны следовать в минимальной укладке
дерева в том же порядке, в каком они следуют в
минимальной укладке поддерева.
Такое же разбиение проводим над укладками всех
остальных поддеревьев а2, о3, ■ ■., Oi.
Возьмем произвольную укладку ср дерева Т. Будем
последовательно улучшать ср, приведя ее к
минимальной. Закрепим положение вершины va в укладке ср
и стянем к ней слева и справа все вершины, которые
t
принадлежат куску три одновременно упорядочивая их
согласно следованию в укладке аь При этом
положение -вершин, стянутых справа, не ухудшится, а из
того, что R (ipi) .минимально, вытекает, что и
положение вершин, следующих за ними, также не
ухудшится. Так как на вершине va достигается максимум в
tpi, то, хотя положение вершин из tpi, стянутых слева,
и ухудшается, ширина укладки в них не больше
ширины укладки в va. Положение оставшихся слева
вершин не ухудшится. Такую операцию проведем со
всеми кусками всех поддеревьев. После этого
упорядочим сформированные куски по убыванию разностей
<?(Ъ)-ШЪ), /=1,2,...
Единственность получаемой таким образом укладки
следует из ее построения. Следовательно, она будет и
минимальной ввиду произвольности исходной укладки.
Следствие. Для того чтобы минимальная
укладка дерева была плоской, достаточно, чтобы для любой
внутренней вершины v e V и любого ее потомка у
выполнялось неравенство R(v) =S R(y).
Алгоритм:
Вход: Дерево T={V, E), веса дуг и веса вершин.
Выход: Минимальная укладка.
начало
1. занумеровать все вершины дерева в соответствии
с некоторой произвольной укладкой ср = (v,, ..., vn)
дерева;
173
2. организовать информацию о дереве в виде
таблицы Ж,:
"1
"■.
г^Ч
Г"Ч
*К)
Л(»1)
J>l)
*(»|)
уп-1
"п
Г"»»»-!
*<"„-!>
Л("п)
*(»»-1>
РЮ
3. для каждого множества Tv{, у которого
элементы в Mi расположены последовательно, цикл
4. начало
5. провести разбиение каждого множества вершин
{Гу(, Vt) на минимальные куски способом, изложенным
в доказательстве теоремы 4;
6. определить характеристики кусков Д(г|>4) и <?(^);
7. конец цикла;
8. сформировать таблицу Мг, в которой каждая
запись соответствует куску, а не вершине и имеет вид:
ь
г-Ч;
ад
Wi)
9. если все минимальные куски приписаны к
корню то стоп
10. иначе переход к шагу 3;
Ясно, что последний сформированный массив
определит минимальную укладку дерева.
Пример. Рассмотрим дерево на рис. 4.2; его
характеристики заданы таблицей 4.1,
Таблица 4.1
Я
р
V,
5
20
20
«1
1
1
1
"I
5
7
7
»«'
5
6
6
»•
10
4
20
t>«
10
5
15
i
)
и, 1
!
!
1
25
Рис. 42,
174
Полные веса вершин в этой таблице
соответствуют плоской укладке минимальной ширины: <р =
■= (i>t, v2, Vs, vs, t\, ve, f7). Ее ширина равна <?«=25.
Составим таблицу Л/, (таблица 4.2).
Таблица 4.2
«I
"2
иЬ
"8
»i
"в
*
»|
1'5
Щ
У, .
"в
V,
^
ь
1
10
5 '
5
10
-
20
1
4
7
6
5
1
Просматриваем таблицу Л^. Находим множество
{Vi, vz), приписанное к вершине v5. Рассмотрим
множество ivi, vt, vb}. Для него max [20; 5 + 1; 5+1 +
+ 4] =■ 20, т. е. максимум достигается на v и Rt < Rs.
Образуем первый кусок, состоящий из vu t|?i = (ft);
второй кусок, состоящий из вершин иг и iv. if» =»
•=(у», Vs) (его параметры следующие: <?(ф2) ■■= 5,
/?(i|)j) =i?s —i?i = 5). Третий кусок образуется из
множества {Vj, у4}, приписанного к вершине vt. Для
расширенного множества {vlt i>4, vt) имеем max [7; 5 + 6;
5 + 5 + 5J «" 15, и, так как максимум достигается на
вершине ув, третий кусок имеет вид ■фз = (v3, vif vt);
его параметры: Q(\fra) = 15, ЛЬ|)3) = 10. Все три куска
приписаны к вершине у,. Составим таблицу Мг
(таблица 4.3).
Таблица 4.3
Фх
| ^2
^3
4>«
"7
"7
У,
"7
5
5
10
—
20
5
15
1
В таблице М2 все куски приписаны к вершине г„
являющейся корнем. Алгоритм заканчивается. Для
175
получения минимальной укладки упорядочим куски .
величине разностей Q — R. Итоговая
последовательность (ifi, г|-3, ib, гр4), Для которой max [20; 5 + 15; 5 +
+ 10 + 5; 5 +10 + 5+1] =21, определяет
минимальную укладку ф0 = (vh vs, vit v6, v2, vit v7) с шириной 21.
1.4. Построение оптимально!*} по длине укладки ор-
дерева.
Лемма 2. Пусть T=(V, E) — дерево с п
вершинами, ф — нумерация его вершин с растянутостью
P<t(V) = к, Ф1—сжатие ф на множество Номеров
(1, 2, ..., п). Имеет место неравенство П{Т, ф,) <
<1ЦТ,<р)-к.
Доказательс тво. Если растянутость
нумерации ф не равна нулю, то это означает, что меШду
отдельными группами номеров, идущих подряд, имеются
пробелы. Будем строить новую нумерацию, выделив в
ф последнюю группу подряд идущих кх пробегов,
сохранив помера с первого до стоящего перед :
последней группой пробелов и уменьшив остальные i номера
на ки Тем самым множество вершин разбивается на
два подмножества — F, с измененными номерами и У2
с оставшимися неизменными номерами. Длины дуг
1ф(£) — ф(г/)1 дерева уменьшаются на ki толькЬ в том
случае, если они соединяют вершины из V\ и У>,
а такая дуга, по крайней мере одна, существует.
Продолжая процесс, получим искомый результат.! Лемма
доказана.
Пусть T=(V, Е)—произвольное дерево с: п
вершинами, Ф„ — совокупность всех допустимых
нумераций ф дерева Т, таких, что ф(У) = (1, ..., п). Из
леммы 2 следует, что в Ф„ обязательно содержится
оптимальная нумерация дерева Т, поскольку для любой
нумерации <р0 дерева Т нумерация ф,, являющаяся
сжатием ф0 на множество номеров Н, 2, ..., п], а
значит, принадлежащая Ф„, обладает свойством
П (Т, ф1) < П (Т, Фо) - РФо (У) < П (Т, Фо). В
оставшейся части параграфа под оптимальной нумерацией
произвольного дерева Теп вершинами будет
подразумеваться именно оптимальная нумерация,
содержащаяся в Ф„.
Пусть вершина и имеет своими потомками
вершины г/i, у2, . ■., ijd (d>0), и пусть п{ есть количество
вершин в поддереве Т(у{) с корнем г/,, is[l : d].
Можно считать вершины уи .. ., yd упорядоченными так,
что nt 5= «2 5?.: .S5 nd.
176
Назовем весом вершины v величину b(v), где
d
2((i-'l)«i + 1). еслп d^O;
О в противном случае.
Построим нумерацию А{Т) дерева Т, обладающую
следующими свойствами:
а) А(Т)—допустимая нумерация дерева Т;
б) если v — корень дерева Т, yh .. ., yd — его по-
d
томкп иФ = Л (Л, то П (Т, Ф) = Ь (v) + 2 П (Г (^));
i=i
в) Л(71) — оптимальная нумерация дерева Т.
Построение нумерации А(Т) и доказательстве
свойств а) — в) проводятся индукцией по количеству
вершин дерева.
Дерево Т0, состоящее из единственной вершины v0,
имеет тривиальную оптимальную нумерацию ф0:
ф0(г;0) = 1 Положим А(Т0) = ф0. Пусть Т = (V, Е) —
«-вершинное дерево с корнем v0; vh ,.., vd — его
потомки, d~^\, nt — число вершин в поддереве 7Чу4),
*e[l:dj. Тогда
d
п= 2 Щ + 1- (4.4)
Можно считать, что «) 3= «2 ^.. .5= rcd. Каждое из
поддеревьев T{vd имеет меньше чем н вершин, а значит,
но предположению индукции нумерации A(T(v{))
определены и обладают свойствами а)—в). Пусть ф( —
= A(T{vt)), is [1 : d]. Образуем (р2 —сжатие ф2 на
множество «i + l, «i+2, ..., «i + re2 (фактически ф2
является сдвигом фа); фз — сжатие ф3 на множество п^ +
+ га2+1, ..., П1 + «г + «з; ..., Фй — сжатие ф„ на
множество
k-l h-l k-1
2"i + t 2 «; + 2, ..., 2 rti + nhi k=\,...,di
i=l i=l ?=1
t
и <$d — сжатие ф^ на множество
d-i ri-i d-l
2 «■ + 1, 2 "i + 2, . . ., 2 Щ + nd.
i=l i = l i=l
Каждая вершина дерева Г, кроме v0, принадлежит
однаму из поддеревьев T{vt), |еЦ : dJ, ц соответству-
12 В. А. Евстигнее- 177
ЬИ-
ющей нумерацией ей сопоставлено некоторое число
d
между 1 и 2rai = п —1j причем разным вершинам со-<
4=1
поставлены разные числа. Вершине v„ сопоставим
число га. Теперь всем вершинам дерева Т сопоставлены
различные номера от 1 до га, а значит, мы построили
нумерацию А{Т) для дерева Т. Обозначим ее через <р0.
Покажем, что ф0 обладает свойством а). Возьмем
произвольную дугу (х, у) 6= Е. Если х =» v„, то ф0(х) =
■= га, и, следовательно, ф0(у) «S га — 1 < га. Если же х Ф
■И" v0, то (х, j/) ез Г(1\) для некоторого i между 1 и d;
а так как ф< по предположению индукции допустима,
Ф{ есть сжатие ф(, то Ф1 допустима и ф0 (х) = ф4 (х) >
> ф!(у) - Ф0 (у).
Покажем, что ф0 обладает свойством б);
Очевидно, что
d d
П (Г, Фо) = 2 П (Г М, ф'О + 2 (Фо (у.) - Фо Ы). (4-5)
i=l 1=1
При переходе от ф( к ф{ номера всех вершин в T(v()
изменяются на одно и то же число, поэтому из
оптимальности q>i для T(v{) следует
П (Т (Vi), фО - П (Т Ы ф1) - П {Т (Vi)). (4.6)
Так как вершина vt — корень поддерева T(v,), то ео
номер является наибольшим среди номеров вершин
i
поддерева T(v{), т. е. ф0 (i>i) = 2 "а Для всех I. . Под-
ft=i
ставляя это равенство вместе с (4.6) в (4.5) и учиты*
вая (4.4), получаем
Щг,Фо)- 2 п(гу + 2(2 nh + i- 2n») -
i=i »=i \ &=1 &=1 /
-2п(ги) + 2( 2 nfc + 0-
i=l 1=1 \fc=n+l /
d
= 2П(Г (Vi)) + ra2 + 2ra3 + 3ra4 + ... + (A-l) raft + ...
i=l
... +(d-l)nd + d1 (4.7)
т. e. H{T1%) = b{v0)+^U{T(Vi)).
1=1
178
Покажем, что ф0 обладает свойством в). Возможны
два случая: deg+ (v0) = d = 1 и deg+ (v0) = d> 1.
В первом случае для любой допустимой нумерации ф
дерева Т имеем ф(у0) «= га и фСу^^га — 1. Обозначив
через 1р нумерацию, которую ф индуцирует на ТЧу,),
получаем, что
ШТ, ф) = ШП»,), $) + i> ШПу,), ер,) + 1 - П(Г, ф,),
т. е. что ф» оптимальна. Рассмотрим второй случай.
Пусть ф — произвольная нумерация вершин дерева Т,
и пусть ф'НЦеП^), т. е. вершина, имеющая при
нумерации ф номер 1, принадлежит поддереву T(vk),
Обозначим через Vh множество вершин дерева T(vh),
через T(.vh) — поддерево .дерева Т, порожденное
множеством вершин Vk—V\Vk, через ty„ (соответственно
через t|)*) — нумерацию, которую нумерация ф
индуцирует на T{vh) (соответственно на Tivk)), Очевидно,
ШТ, ф) = П(Г(^), ^) + ШПуД г|>») + га-^(уА). (4.8)
По лемме 2 и определению растянутости P$k
получаем, что
П (Т (vk), %)> П (Т Ы) + Рч.к = П (Т Ы) +
+ (% (vh) -1 - nh + 1) = П (Т (vh)) + Цк Ы - nh. (4.9)
Так как число вершин в дереве T(vk) с корнем v0
меньше чем га, то по предположению индукции имеет место
неравенство
n(T(vk), ty»
d
> 2 П (Т (и{)) + п2 + 2га3 + ,,, + (к - 2) raft_x +
i=l,i#ft
+ (А — 1) nh+1 + knh+2 + .,. + (d - 2) nd + (d - 1).
Подставим это неравенство вместе с (4.9) в (4.8):
П(ГзФ)>
d
> 2 П (Т (vt)) + га2 + 2га3 + ... + (к - 2) гай_х +
+ (к — 1) raft+1 + fcnfc+, + ... + (d - 2) nd + (d — 1) +
d d
+ 2 «i + 1 - raft = S П (Г (pj)) + rai + 2ra2 + 3ra3 + . ..
i=l i=l
... + (k - 1) raA_! + A-raft+1 + (k + 1) raft+3 + ...
... + (d — 1) nd + d.
12* 179
Вычитая из этого неравенства равенство (4.7),
получаем, что
П(Г, Ф)-ПСГ, <po)S*(nl-na) +
+ 2(га2 - га,) +...+ (к - l)(ra,_t - raj > 0.
Это означает, что нумерация ср0 оптимальна.
По индукпин, используя (4.7), нетрудно показать,
что П(Г)= 2 b(v).
vev
Чтобы построить нумерацию AiT) дерева Т —
= (V, Е), нуншо определить количество вершин в
каждом поддереве T(v), v^V, и упорядочить поддеревья
Tivt), ..., T{vd), где i\, ..., vd — потомки вершины v,
по числу вершин в них. Можно подсчитать, что
трудоемкость описанного способа построения нумерации
AiT) для га-вершинного дерева равна O(ralogra).
1.5. Алгоритм построения оптимальной по длине
укладки ордерева. Построение оптимальной по длине
укладки сводится к заполнению таблицы с га строками
по строке на каждую вершину, но уже с пятью
столбцами. Пусть pii, /) обозначает содержимое клетки
таблицы на пересечении i-й строки и /-го столбца.
• Вход: Ордерево T — iV, E) с корнем г, заданное
списками смежности.
Выход: Оптимальная по длине укладка ср„ и
длина ордерева Yl.iT).
начало
1. провести поиск в ширину и занумеровать
вершины в соответствии с порядком их обхода;
2. для i от га до 0 шаг — 1 цикл
3. если номер вершины v равен i то р(г, l):=i>;
4. для i от 1 до п шаг 1 цикл
5. начало
6. если v из р(г, 1) есть висячая вершина то
7. начало
8. pii, 2):=1;
9. pii, 3) :=0;
10. pU, 4):=p(i-l, 4);
примечание для i = l p(l, 4) = 0 конец
примечания
11. pii, 5) :=v;
12. конец
13. иначе начало
180
14. упорядочить вершины уи ..., yd из Tv в
порядке убывания содержимого р(г/5, 2) второго столбца,
пусть упорядоченная последовательность есть ух , ...
15. p(t, 2) := 1; p(i, 3) :== 1; p(i, 5) := 0;
16. для t от 1 до d шаг 1 цикл
17. начало
18. p(i, 2):=р(г, 2) + p(yh, 2);
19. p(i, 3):=p(i, 3) + (f-l)p(»i()2);
20. p(i,5):=p(i, 5)p(yit, 2);
21. конец цикла;
22. p(i, 4) :=p(i, 3) + pCi — 1, 4);
23. pU, 5) :=p(i, 5)w;
24. конец
25. конец цикла;
26. ШЛ :=p(n, 4);
27. ф0 := р(и, 5);
конец
Итак, после заполнения таблицы в клетке 4
последней п-п строки (рис. 4.3) будет стоять длина дерева Т,
а в клетке 5 этой же строки будет выписана
последовательность всех вершин этого дерева. Сопоставляя
вершине, стоящей в этой последовательности на г-м
и
L
К
J
MI
н
JKLG
F
Е
MIND
JKLGC
MINDEFB
MINDEFBJKLGCA
Рпс. 4.3.
месте, номер i, получаем оптимальную нумерацию
дерева. Пример использования алгоритма показан на
рис. 4.3.
Приведем без доказательства оценки для длины и
ширины ордеревьев. Пусть Td есть и-вершннное
дерево, полустепени исхода вершин которого не превосхо-
181
м ■
L
К
J
I
Н
G
F
Е
D
С
В
Л
1
1
1
1
2
1
4
1
1
4
5
7
13
0
0
0
0
1
П
В
0
0
я
1
6
7
0
0
0
0
1
1
7
7
7
10
11
17
24
дят d (d> 2). Для таких деревьев имеют место
следующие оценки:
— для длины
d — l
41ogd
п log n + О (п log и) < П (Г*) <
d-
21ogd
— п log n + О {п log n);
— для ширины
W(Td) = d0logn +0 {log п).
1.6. Укладки неориентированных деревьев. Точное
решение задачи об оптимальной по длине укладке
достаточно сложно. Приведем алгоритм построения
плоских минимальных укладок с трудоемкостью ОЫ),
дающий приближенное решение, превосходящее
соответствующую величину в классе всех укладок не более
чем в полтора раза.
Выделим класс укладок Ф*, каждой укладке
которого соответствует разложение дерева на
последовательность цепей 0"j, /e[l;Z], обладающих
следующими свойствами:
а) концевые вершины цепей являются висячими
вершинами в поддеревьях, в которых они выделяются;
б) нумерация вершин каждой цепи монотонна
относительно возрастания или убывания номеров, а
нумерующие последовательности всех поддеревьев,
образующихся в процессе разложения на цепи, сплошные.
Можно показать, что все минимальные укладки
содержатся в классе Ф*. Нетрудно увидеть, что
концевые вершины цепей а;, /stl:/J,— вершины нечетной
степени, a l — n при 2га вершинах нечетной степени
в произвольном дереве.
Хотя класс плоских нумераций Фпл не совпадает
с классом Ф* и ни один из них не содержится
целиком в другом, справедлива
Лемма 3. Всякая минимальная плоская укладка
ф принадлежит классу Ф*.
Доказательство этой и следующей лемм мы
опускаем.
В силу этой леммы в дальнейшем имеет смысл
рассматривать только те плоские укладки, которые
входят в класс Ф*.
182
Лемма 4. Укладка ф» из класса Ф* является пло-
h
ской тогда и только тогда, когда подграф [) tfj связен
j=i
при любом к е [2 : I — 1J.
Установим необходимое ц достаточное условие
минимальности плоских укладок. Выделим в дереве Т =
= (V, Е) произвольную вершину v( "степени p(vt) и
все инцидентные ей ребра (У{, i>jr), г е [1 : р]. Любая
вершина i>m, тпФ I, связана с вершиной vt
единственной цепью. Будем говорить, что вершина vm
принадлежит ветке, выходящей из vt по ребру (vif Vjr)t r e
е [1 : р], если в вершину vm можно попасть из v( по
цепи, содержащей ребро (t^, Vjry Число всех таких
вершин (число вершин в ветке) обозначим через П}г(
г е= [Ир].
Рассмотрим произвольную укладку ф s ф*.
Упорядочим ветки к каждой вершине Vi в соответствии с
порядком прохождения через vr цепей из {о,}, /е[1:Д.
Будем называть полученный порядок веток
Недопустимым, если не найдется 'ни одной пары веток к
произвольной вершине v{ степени deg (у() ^ 3 с числом
вершин пт и щ, г, q е [1 ; pi, таких, что
( q при четном г;
пт < Па, где г <
1д — 1 ПРИ нечетном г.
Способ выделения цепей а3-, /е[1:Д,
индуцирующий «(-допустимый порядок веток, также будем
называть rii -допустимым.
Теорема 5. Плоская укладяа феф*
произвольного дерева T—{V, E) минимальна тогда и только
тогда, когда способ выделения цепей ajt ]^il:l],
является п,-допустимым.
Доказательство. Необходимость. Пусть
Ф — минимальная плоская укладка. Для вершин
степени degC^J^r необходимость условия теоремы
очевидна. Рассмотрим произвольную вершину vt степени
deg (v{) > 3. Возможны два случая.
1. Цепь а, проходит через вершину vit При этом
из лемм 3 и 4, а также из свойств укладок класса Ф*
следует, что нумерующие последовательности всех
веток к вершине v( будут сплошными.
Взаиморасположение их вдоль числовой прямой приведено на
рис. 4.4, где n2s-i и п2„ se[l: lp/2\], суть числа вер-
183
шин в ветках, по которым s-я цепь разложепия
проходит через Vt. При нечетной степени deg (vt) указаны
две возможности для нумерации вершины vt,
поскольку здесь последняя цепь разложения проходит через
v{ только по одной ветке (с числом вершин пр) и в
зависимости от выбора направления нумерации на
этой цепи последняя ветка может быть занумерована
как до, так и после вершины v{.
, <?(Ъц) Щ-д ?(а) ?(%) ?(%>
1 Ш& !_!_• ЕШ - Г77777П ■ ■ .. 17777т П
Л, 'Пр-\ Пр Пг
degCzij четно
9>(Ч)
. №,) ?(%-£' \ №r-i) №r) „
1 УтЪ • • ■ V77777A , Т7777П , ТТТТТА ■ ■ • У777777\ п
П\ Лр-г пр пр-\ пг
deg ivL) нечетно
Рис. 4.4.
Предположим, что условие теоремы не выполнено
для вершины Vi, т. е. найдется хотя бы одна пара
веток к вершине vt, порядок выделения которых не
является «(-допустимым. Построим тогда укладку ф' ^
е ф*5 отличающуюся от ф лишь порядком нумерации
этих веток (пусть число вершин в них равно пг и /г„,
r<q). Нумерующие последовательности всех веток к
' вершине vt сохраним сплошными, оставив прежним и
порядок нумерации внутри каждой ветки. При этом
длины ребер (длина ребра есть модуль разности
номеров его концов) могут измениться лишь у ребер,
инцидентных vt. Рассмотрим характер соответствующего
изменения длины всего дерева. При нечетном г имеем
2 I Ф(^) — Фи) I = 2 I ф' (v\) — ф' (vu) I,
так как ф'(fj-) = ф(у^) для /<> —1, а число
вершин vtj с ф(у^) < Ф iv-) (cp' (Vi.)< ф' (f;)) равно числу
вершин vtj с <p{vi.) > ф(1>;)(ф'(^у)> ф'(^)). При
четном г по таким же соображениям приходпм к
равенству
г-2 г-2
2 | Ф Ш — Ф (Vij) | = 2 | ф' (Vi) — ф' (Vi:) |-
3=1 3=1
184
p
Величина 2 I Ф (vO — ф(у^)| для нечетного г или
i=r
р
же величина 2 | Ф (у0 _ ф(у^)| Для четного г обя-
3=г-1
зательно уменьшится при переходе к укладке ф', и не
менее чем на nq — пг.
Итак, длина укладки П(Г, ф) = 2 ! Ф (у0 — Ф (vi) I
уменьшается при переходе от укладки ф к укладке ф'.
Нетрудно увидеть, что ф' — плоская укладка, если
таковой является ф. Таким образом, мы пришли к
выводу, что ф не является мппимальной плоской
укладкой, как это утверждалось. Следовательно,
предположение о невыполнении условия теоремы для
произвольной вершипы v{, лежащей на цепи ait певерно.
Отсюда, в частности, следует, что при минимальной
плоской нумерации цепь at проходит через вершины
дерева по веткам с наибольшим числом вершин.
2. Цепь О) не содержит вершину v{. Пусть ак, ks
el2:Z— U,— первая цепь разложения, проходящая
через vt. Так как U а; связно (по лемме 4), то цепь ah
3=1
обязательно проходит через vt no ветке, содержащей
предыдущие выделенные цепи as, j ^[l : к — {]. Число
вершин в той ветке больше, чем в какой-либо другой
ветке к vt, так как она содержит цепь оь проходящую
через вершины дерева по веткам с наибольшим
числом вершин. Следовательно, нарушение условия nt-
допустимости невозможно ни на одной паре веток к
вершине v„ содержащей ветку с оь Поскольку
нумерация остальных веток к вершине у( устроена так же,
как и в части 1 доказательства (сплошные
нумерующие последовательности), то дальнейшее
доказательство проводится аналогично.
Достаточность. Нетрудно убедиться в том, что
если способ выделения цепей Oj, j^llill, удовлет-
h
воряет условию теоремы, то U Oj связно при всех
к ^ 12:1 — 11; любая укладка ф е ф* является при
этом плоской (лемма 4). Все такие укладки обладают,
кроме того, одинаковой длиной. Действительно, если
укладки отличаются лишь направлением роста
номеров вдоль некоторых цепей из \а,), j^[l:l], то
справедливость доказываемого утверждения непосредствен-
185
но следует из свойств укладок класса Ф* и
определения длины укладки. Если меняется разложение на
цепи Oj, /ell: I], то это влияет лишь на порядок
нумерации веток с одинаковым числом вершин для
некоторых вершин vt. Из способа выделения цепей
следует, .что ветки к любой вершине vt, содержащие
одинаковое число вершин, имеют сплошные нумерующие
последовательности. Поэтому _ меняя порядок
нумерации таких веток, всегда можно перейти от .одного
разложения к другому, сохранив неизменной длину
укладки. Отсюда, поскольку минимальные плоские
нумерации содержатся среди рассматриваемых нумераций
(это следует из необходимости условия теоремы),
получаем минимальность всех укладок,
удовлетворяющих условию теоремы.
Замечание. Теорему 5 удобно сформулировать
для дальнейшего изложения так:
Теорема 6. Плоская укладка произвольного
дерева является минимальной тогда и только тогда,
когда цепи о,-, /ell: И, проходят через каждую
вершину по еще не пройденным веткам с наибольшим
числом вершин.
Основываясь на теореме 5, можно предложить
эффективный алгоритм построения минимальной плоской
укладки произвольного дерева.
1.7. Алгоритм построения минимальной плоской
укладки. Пусть дерево T=(V, E) с п вершинами
задано списком ребер.
Алгоритм:
Шаг 1. Превратить исходное дерево в корневое
ордерево с корнем в центроиде дерева.
Шаг 2. Упорядочить массивы Г_1У{, 1е[1:гс],
по весам вершин.
Ш а г 3. Выделить цепи cv / <= 11 : Z].
Шаг 4. Построить минимальную укладку вершин
дерева.
Раскроем содержание каждого шага.
Шаг 1. Для выполнения этого шага необходимо
провести ранжирование вершин, начиная с висячих,
а также сформировать множества Г-1^ и Ti^. При
ранжировании вершин каждая из них
рассматривается в качестве корня поддерева, состоящего из вершин
меньшего ранга, и ей присваивается вес, равный
числу вершин в соответствующем поддереве. Первая вер-
m
шина V{, вес которой равен п( > и/2 (она, очевидно,
является центроидалыши), рассматривается в качестве
корня всего дерева, ей присваивается максимальный
ранг после окончания процесса ранжирования всех
остальных вершин дерева, а вес nt полагается равным
п. Этот шаг можно выполнить за 0{п) операций.
Ш а г. 2. За один просмотр массивов Г-11Ч» Je[l: n]t
формируем массив, в котором в ячейке с адресом к =»
•= Ко + п{ будет содержаться число вершин с весом,
равным nt. Теперь нетрудно найти адреса, начиная с
которых будут расположены массивы ]/{щ) вершин
веса nt. За второй просмотр массивов Г- yit ie[l: n],
рассортируем входящие в них вершины по массивам
V(nt), последовательно заполняя каждый из них.
Заново сформируем массивы Г-,у{, i^ll:n]. Для этого
последовательно просматриваем все массивы V(nt) и,
используя массивы Tvt, определяем для очередной
вершины Vi, i e [ 1 ; п), ее потомка vh j e [ 1 : п\, / Ф i,
после чего заносим вершину в очередную ячейку
массива Г-1^,-. Очевидно, что после просмотра всех вершин из
V мы получим массивы Г~'у{, каждый из которых
упорядочен в порядке возрастания весов входящих в них
вершин.
Этот шаг можно выполнить за 0{п) операций.
h
Шаг 3. Поскольку (J 0;- связно при любом к, к а
i=i
е [2 :I— И, то в каждом поддереве разложения можно
оаранее указать вершину (опорную), через которую
пройдет первая цепь его разложения (опорной
вершиной всего дерева является центроид дерева).
Поддеревья разложения определяются следующим образом.
Пусть T={V, E) — дерево с п вершинами, на котором
задана некоторая нумерация ср. Выделил! в дереве цепь
Oi = (F,, Ei), соединяющую вершины <р_1(1) и qr'(rc).
Каждой вершине vt e Vit степень которой больше или
равна трем, поставим в соответствие поддерево Т^ ■=■
={Vi, Ei), i e [1:Tcj], множество вершин которого
состоит из v{ и всех вершин, которые соединяются с
вершиной v( цепями, не содержащими ребер из EL.
Множество Ei образовано ребрами этих цепей. Будем
называть поддеревья Т\х = (V\, Ё\) поддеревьями
разложения. В каждом таком поддереве снова выделим
цепь, соединяющую вершины с наибольшим и наи-
187
меньшим номерами, что приведет к образованию
новых поддеревьев разложения. Этот процесс
продолжается до тех пор, пока не будет получено разложение
дерева -на пореберпо непересекающиеся цени.
Используя опорные вершины в качестве исходных,
а также упорядоченные массивы Г_1у,-, isl.lm],
производим выделение цепей ah j^ll:n],
проходящих через вершины vt, ге[1;«], по не пройденным
веткам с наибольшим числом вершин. При этом
производится модификация веса каждой вершины vt. При
модификации текущее (начальное) значение веса
вершины Vi уменьшается па величину веса той вершины
из Т~'ии по которой проходит очередная цепь ои /=
= 1, ,.., 1.
Шаг 4. Пусть {v{}, i е [1: kj], есть множество
вершин цепи о,, /е[1: Л. Обозначим через <Pmin(l'g)>
/s[l:/], q e [1: A*j], наименьший номер, который
может иметь вершина v\ при заданном направлении
возрастания номеров вершин вдоль цепей ат, т^И : ]'].
Так как мы строим укладку ф из класса Ф*, то для
упрощения обозначений всегда оказывается
возможным считать, что индекс г перечисляет вершины вдоль
каждой цепи' а} в порядке возрастания номеров.
Обозначим модифицированный вес вершины v\ через п\.
При этом получаем для фШ1ъ(уд) следующее
выражение:
ч-1 ..
*Pmin(l'g) = фЫ) + 2«i, ] = i,...,l, q=l,...,kj,
i=l
причем q>(v\) = 1, ф(^) = фт!п(1-'Г), где v?f т<=
eLl:/—1], reLl:A'm],— опорная вершина
поддерева, в котором выделяется цепь о,-, /е [2 : Л. Для
вершин р', У которых на данном этапе разложения веса
равны п\ —- 1, имеем <$m\n(v\) — ф(у1)> т. е. каждая
вершина получает свой окончательный номер при
выделении* последней проходящей через нее цепи о;-.
Очевидно, что число операций, необходимых для
расстановки указанным способом номеров вершин дерева,
не превосходит 0{п). Отсюда следует, что
трудоемкость всего алгоритма равна 0{п). Расход памяти
равен Oinlogn).
Приведем без доказательства оценки для длины
неориентированных деревьев. Имеем:.
188
— для класса всех п-всршпнных деревьев
n = lraV4J;
— для класса и-всршшшых деревьев, степени
вершин которых не превосходят d > 3,
12 log d 8 \ log re j ^ ^4 log (d — 1) &
1.8. Укладкп произвольных графов. Известны
следующие оценки.
Для ширины графов:
— для класса и-вершинных бесконтурных орграфов
W=[n/2i;
— для класса и-верпганных бесконтурных
орграфов, степени вершин которых не превосходят d,
d" logn «S W sg dlogn;
— для класса произвольных орграфов, степени
вершин которых не превосходят d,
o.M-D^W^dn/2
(здесь а0е(0, а(), a c.i — такая положительная
константа, что a in < (3/2) р'п — 1, р' — число,
определяемое соотношением [pni=p'n, p^(0, 1/2J).
Для длины графов:
— для класса D бесконтурных орграфов
7П2^П(Д)^Лп2,
где 1, А — коэффициенты, не зависящие от п\
— для класса графов, степени вершин которых не
превосходят d,
4a0n2^mTd)^(l/2)Adn\>
•где ао определяется, как и выше, а ^ и А —
коэффициенты, не зависящие от п;
— для класса Dd бесконтурных орграфов, степени
вершин которых не превосходят d,
d'n log n =£= П(1Н) «: dn log n.
Пусть W(G, ф, t) — ширина укладкп ф
п-вершинного графа G в вершине t.
Теорема 7. Если ф — укладка п-вершинного
графа G, то
п<с1ф)«;£ичс,см).
189 '
Следствие 1. Если сро — оптимальная по
ширине укладка, а П (G) — min П {G, ср), где минимум бе-
ф
рется по всевозможным укладкам, то
П(С)<П(С1Фо) =
- "S W (G, Ф, 0 <(« - 1) W (Gx Фо) = (в - 1) W (G).
Следствие 2. Если G получается из графа G
добавлением к вершин степени два на ребра графа G,
то W(GW)^W(G) и n(Gik))^(n + k-l)W(G).
1.9. Построение оптимальных по числу соседней
связности укладок. Пусть ср — допустимая укладка
орграфа G = (V, E). Будем говорить, что вершины vk и
vk+l находятся в отношении соседней связности, если
(bVm vh) s Е. Числом соседней связности укладки ср
называется величина
п-1
х (ф) = 2 б (Уй+г, vk)t
/1=1
где б(ук+1, у») = 1, если (vh+l,vk) е£,пО в"противном
случае.
Компонентой укладки ф назовем
последовательность вершин этой укладки С = (у^, . ..,3',),
удовлетворяющих условиям:
а) s(yv «v0""0;
б) 8(^+11^,)-0;
в) б(%+1, ^jp) = l, /> = 1, ...,*—1,
Очевидно, что всякую укладку ф можно
представить в виде последовательности компонент ф = (С,, .,,
..., Cq). Будем называть d компонентой 1-го ранга.'
Л е м м а 5. Если q — число компонент в
укладке ф, то и(ф) =»га — q.
Числом соседней связности графа G называется
величина x(G) = max (и(ф)}, где Ф(0 — множество
фбФ(О)
всех укладок графа G. Укладка ф,еф(С) называется
оптимальной по числу соседней связности, если
и(фо) = x(G).
Точное решение задачи построения оптимальной
укладки имеет экспоненциальную трудоемкость,
поэтому для решения практических вадач целесообразно
использовать эвристические алгоритмы. Введем
вспомогательные определения.
190
Путь ц = [х^, ,,,, £jp] в графе G называется
проникающим, если
а) deg+^y-O;
б) в графе G отсутствуют дуги вида (у, £;д), где q a
е[1:р] чаЛ и К].
Проникающий путь ц — [х{ ,,,,, а;!р] называется
максимальным, если в графе G не найдется вершины у
такой, что путь ц'= [xif-,,., х{р, у] также является
проникающим.
Назовем дугу (ж, у) избыточной, если в графе G
существует хотя бы один путь ц из х в у длины /(ц) >
S» 2. Можно показать, что удаление избыточных дуг
не изменяет числа соседней .связности. Пусть граф G'
получается из графа G удалением всех избыточных
дуг; при этом всякой укладке <p(G) графа G
однозначно соответствует укладка <p'(G) графа G'.
Алгоритм:
Вход: Орграф G=»(V, E), заданный списками
смежности.
Выход: Укладка ф, являющаяся приближенным
решением задачи.
начало
1. удалить все избыточные дуги;
примечание теперь граф G превратился в G'
конец примечания
2. G, := G';
3. для I от 1 пока G^Z цикл
4. начало
5. в графе Gt определить множество М{
проникающих путей;
6. выбрать в Mi путь щ наибольшей длины;
7. С,:-ц?;
8. Gi+1:^Gi\nU
примечание при удалении пути щ удаляются
все его вершины и инцидентные им дуги конец
примечания
9. конец цикла;
10. ф:=(С„ С2, ...);
конец
Для определения максимального проникающего
пути на шаге 6 можно воспользоваться методом нахож-
Щ
дения критического пути в бесконтурном орграфе.
Трудоемкость алгоритма равна Oin2). Повысить
точность получаемого решения можно за счет введенпя
операции прогноза на один шаг.
Алгоритм с прогнозом:
Вход: Орграф G=(.V, E), заданный списками
смежности.
В ы х о д: Укладка гр = (С,, ..., Ск), являющаяся
приближенным решением задачи.
начало
1. удалить все избыточные дуги;
2. G,:=G';
3. для i от 1 пока Gt Ф О цикл
4. начало
5. в Gj определить множество Ш{ проникающих
путей;
6. для каждого пути ц е Mt цикл
7. начало
8. G,((.i) := G,\ji;
9. в С((ц) найти максимальный проникающий путь
10. конец цикла;
11. среди всех путей ц е М( выбрать путь ц4, для
которого величина ЦНч) + 4ni (и)) наибольшая;
12. С4:=цГ;
13. Gi+1 :== бг\(.ц;
14. конец цикла;
15. ф:= (С!, Сг, ...);
конец
§ 2. Конструирование оптимальных деревьев
В параграфе будут рассмотрены различные
критерии оптимальности корневых деревьев и каркаеов
неориентированных графов, а также алгоритмы
построения оптимальных и почти оптимальных деревьев.
2.1. Оптимальные бинарные деревья. Бинарное
дерево определяется рекурсивно следующим образом:
— пустое дерево, состоящее из единственной
вершины у,, есть бинарное дерево;
— бинарное дерево Тп с п > 1 вершинами есть
упорядоченная тройка (71,, у о, Тг), где v0 — корень
дерева Тп, а Гг и Тт — бинарные деревья с щ и пт верши-
192
нами соответственно, называемые левым и правым
бинарными деревьями (га, >0, га, > 0, га, + и, = п —■ 1).
Бинарное дерево представляет собой
ориентированное дерево, у которого в каждую вершину, отличную
от корня, входит только одна дуга, а выходит не
более двух. При этом для каждой выходящей дуги
известно, является ли она правой или левой. Каждая
вершина бинарного дерева, отличная от корня, может
рассматриваться как корень бинарного поддерева с
вершинами, достижимыми из нее. Бинарное поддерево
с корнем в вершине х будет обозначаться через fix)
(рис, 4.5).
Рис. 4.5.
Уровнем Ых) вершины х в га-вершинном дереве Тп
называется длина пути из v„ в х. Корень v„ есть
единственная вершина уровня 0. При графическом
изображении дерева вершины одного уровня располагаются
на одной прямой.
Взвешенным корневым деревом f7"„ над
последовательностью неотрицательных весов «о, Pi, ait ..., pn, a„
называется бинарное дерево Т
2п-и с га внутренними
вершинами vu vit ..., vn, каждой из которых
сопоставлен вес Pi, н с п + 1 висячими вершинами wb wu ...
..., wn, каждой из которых сопоставлен вес a.j.
Пример взвешенного корневого дерева над
последовательностью весов [4, 2, 6, 1, 1, 1, 8, 7, 5, 8, 4, 2, 1J
показан на рис. 4.6.
Стоимостью взвешенного корневого дерева £Г"„ над
последовательностью весов «о, pi, ait ..., p"n, an
называется величина
С (Гп) - 2 р, (L (v,) + 1) + 2 щЬ (и,,).
Для дерева на рис. 4.6 стоимость равна 131.
*3 В. А. Евстигнеев 193
2.2. Построение оптимальных деревьев. Алгоритм
основан на следующем принципе оптимальности:
оптимальное бинарное дерево Тп над последовательностью
весов ceo, Pi, oci, ..., f}„, a„ имеет корнем вершину с
весом {J<, оптимальпое бинарное дерево Т i-j над
последовательностью весов ceo, Pi, cti, ..., Pi-i, a,-i в
качестве левого поддерева и оптимальное дерево Тп^ над
последовательностью весов a,-, j}i+i, а(+|, ..., р„, а„ в
качестве правого поддерева.
Пусть C(i, /) — стоимость оптимального поддерева
над последовательностью весов a,, {5t-+i> a<+i, ..., fy, a,,
и пусть
w(i, /) = |3,+1+. ..+ fa + a{+...+ au 0<i<;'<«,
есть-сумма этих весов. Так как минимально
возможная стоимость дерева с корнем в вершине с весом рк
равна w{i, j) + C(i, к— i) -rC(k, j), то имеем
рекуррентное соотношение, вытекающее из
сформулированного принципа оптимальности:
С(*,/)-0,
C(i, j) = w(i, j) + min (С (г, к - 1) + С (к, /)), i < /. (.)
Если г<у, то пусть Жг, ;') обозначает множество всех,
индексов, при которых достигается минимум в (#);
это множество определяет возможные корни
оптимальных деревьев. Как показал Д. Кнут, нет нужды искать
все множество R(i, j); достаточно найти только те
элементы r(i, j) этого множества, которые
удовлетворяют неравенству
r(i, /-l)*£r(i, y)<r(i+l, /)
при условии неотрицательности весов. Теперь в (*)
в.место j — i значений к нужно проверять только
194
r(i+l, i)-Hi, /~1) + 1 значений. Это позволяет
сократить трудоемкость до 0{п2) при требуемой
памяти 0(п2).
Алгоритм К:
Пусть даны неотрицательные веса а0, {Ji, ait ...
$п, <Хп. Алгоритм К последовательно строит
оптимальные бинарные деревья tU, /) для весов а,, р\+1, ...
..., Pj, «j. Для этого вычисляются величины: CU, j) —
стоимость дерева Ш, j), 0 < 2 «б / ^ я; Hi, j) — корень
дерева tU, /), 0*?г*«£/<я; wU, j) — полный вес
дерева tU, j), O^Kj^n. Результаты работы
алгоритма определяются величинами Hi, /): если £ = /, то
дерево tU, /) пусто; если г¥=/, то левым поддеревом
является дерево tU, Hi, /) —1), а правым — t{r{i, /), /).
Вход: Последовательность весов о0, р\, ctif ...
Выход: Оптимальное дерево над данной
последовательностью весов.
начало
1. для i от 0 до п шаг 1 цикл
2. начало
3. CU, i) = 0;
4. ivU, i) ;= ай •
5. для / от i + 1 до п шаг 1 цикл
6. начало
7. wU, /) ;= wU, j - 1) + Pj + a;;
8. конец цикла;
9. конец цикла;
10. для / от 1 до п шаг 1 цикл
И. начало
12. C(}~i,j):=w(j-l, j);
13. r(/-l,/):=/;
14. конец цикла;
15. для d от 2 до п шаг 1 цикл
16. начало
17. для / от d до я шаг 1 цикл
18. начало
19. положить i:=j — d;
20. положить к равным тому индексу к, при
котором выражение CU, к— {} + С(к, j) достигает
минимума;
21. С := min (С(г, к - 1) + С(к, /));
22. C(i, i):=w(i,)) + C;
23. конец цикла;
13* 195
24. конец цикла;
примечание после завершения цикла по d
будут определены параметры оптимального дерева и всех
его оптимальных поддеревьев конец примечания
конец
Применение алгоритма К на практике
нецелесообразно, ибо можно построить почти линейными
алгоритмами деревья со стоимостью, лишь незначительно
отличающейся от оптимальной.
2.3. Построение почти оптимальных деревьев.
Рассмотрим некоторые элементарные преобразования де-
?евьев. Первое преобразование определяется так. Пусть
Т{п)) — множество n-вершинных бинарных деревьев,
Тк s {Tw}, v — пекоторая вершина из 7\. Тогда:
а) если v — корень дерева Tt, то гр(у, Г,) = 7\;
б) если v — корень левого поддерева вершины w,
то ф(у, 7*1) = Тг, где Тг получается из Г, поднятием
вершины v на место вершины w, так что w становится
корнем правого поддерева вершины v (при этом
вершина v и каждая вершина из Tt(v) поднимается вверх
на один уровень, а вершина w и каждая вершина из
T,(w) опускается на один уровень);
в) если v — корень правого поддерева, то
преобразование ф(у, TJ определяется симметричным способом.
Преобразование ф(у, Т) показано на рио. 4.7.
' \Trw IAIA
TriV) TfCWJ
Рис. 47.
Более общее преобразование q>m(v, ТУ состоит в
поднятии вершины у на А уровней. Оно заключается
в А-кратном применении преобразования ф(у, Т), т. е.
Ф(,)(у, T)-<p(v,T) и ф^(у, Л-ф(р, ф^-'Чу, Л).
Преобразование ф(*'(у, Т) показано на рис. 4.8.
На использовании преобразований ф(у, Т) и ф(*'(у,
Т) основан алгоритм построения почти оптимальных
деревьев.
196
Вход: Последовательность весов а0, р\, ait »?i
..., Р„, ап, параметр /с.
В ы х о д: Почти оптимальное дерево Т.
Рис. 4а
шчало
1. выбрать в качестве начального приближения
какое-нибудь бинарное дерево Т над последовательностью
весов а5, р\, а^ ..., j}„, а„, например дерево,
показанное на рис, 4.9;
Рис. 4.9.
2. вычислить стоимость с(Т) дерева Т\
3. для всех v e 7(7") цикл
4. начало
б. Г(у):-Ф(и, Т)\
6. вычислить стоимость c(T(v)) дерева ГСу)',
7. если с(Г(1;))<с(Л то
8. начало
9.T:-T(v)\
10. сеЛ:-.с(Г(1;))|
11. /:«=• истина;
12. конец;
197
примечание логическая перемеипая /
фиксирует факт существования хотя бы одного дерева Tiv),
стоимость которого меньше стоимости дерева Т конец
примечания
13. если / то переход п __.,, _
14. иначе стоп;
конец
Данный алгоритм осуществляет локальный поиск
по множеству деревьев {jT<T!)}. Точность решения и
скорость работы алгоритма существенно зависят от
величины параметра к.
Развитием данного алгоритма являемся top-down-
алгоритм. Пусть Wii, j) обозначает множество весов
{pji *Zm*S:j}, a Tii, j) — множество бинарных
деревьев на этом множестве весов. Для дерева Tii, /) из
Tii, )) в качестве корня берется вершина,
соответствующая весу §т, причем |}т удовлетворяет условиям:
а) {Jm велико;
б) разность между стоимостями поддеревьев
Tii, m— 1) и Tim + 1, ;') мала;
в) разность между высотами (наибольшими
значениями уровня) поддеревьев Tii, m — 1) и Tim + i, j)
мала.
Для интерпретации условий примем в качестве
меры баланса стоимостей правого и левого поддеревьев
дерева Tii, j) величину
ат — min
m-i ) }
где wi (т) = 2 Р»> «V (т) = 2 Р*< ' "> = 2 Р*-
В качестве меры баланса высот тех же поддеревьев
примем величину
. (i + dt(m) 1-Mr(m»
Tm = mln ^ _ : _ j,
где d,im) = log im-i+ 1), dr(m) = log (/- m + 1),
d = log ij~i + 2).
Top-down-алгоритм Aii, j) представляет собой
рекурсивную процедуру конструирования_оптимального
дерева Т*Ц, /) для множества весов Wii, j). Пусть
fin) — функция, выбор которой определяет степень
198
приближения решения н оптимальному. Функция
может иметь вид:
а) fin) «= М, где М — константа;
б) fin) = Fin), где Fin) — монотонно возрастающая
функция, 1 «£ Fin) ^ п;
в) fin) - max iFin), M).
Алгоритм АН, j):
Вход: Множество весов (!<, *,., .fa (все a», A: s
е 10 : п], полагаем равными нулю).
Выход: Почти оптимальное дерево T*{t, /),
начало
1. процедура ДЕРЕВОМ, /);
2. начало
3. для к от i до / шаг 1 цикл
4. начало
5. вычислить Hik);
примечание Hik) есть одна из функций Я((А:) =
•=faXah или Я2(А:) =» $к X ак + т* конец примечания
6. конец цикла;
7. сформировать множество INT из fin) весов из
ТГ(<, /'), которые имеют наибольшие значения
функции Hik);
8. построить алгоритмом К оптимальное дерево над
множеством весов 1NT, налагая еще одно ограничение:
каждая вершина либо не должна иметь потомков, либо
иметь их ровно два;
9. wh*: — корень построенного оптимального дерева;
10. ДЕРЕВО U, к*- 1);
11. ДЕРЕВО (Л*+ 1, Я; _
12. сформировать оптимальное дерево для Wii, /)
в виде iT*ii, А*-1), wh*, Т*(к* + 1, ;));
13. конец процедуры ДЕРЕВО;
14. n:-=/-i+l;
15. если п = \ то взять в качестве оптимального
дерева дерево вида T*ii, /) = (0, wh 0);
16. если «>2A«</W то построить
оптимальное дерево над множеством весов Wii, j)
алгоритмом К;
17. если n>f{n) то ДЕРЕВО (i, /)j
конец
Трудоемкость алгоритма равна Oin"2 log n), если
fin) = М, a Oin3/-) в остальных случаях. Трудоемкость
может быть понижена за счет использования более
тонкого выбора множества ШТ.
199
2.4. Статистический анализ почти оптимальных
деревьев. Для построения почти оптимальных деревьев
чаще всего используются две эвристики, которые мы
сформулируем в виде правил. .
Правило 1. Размещать вершины с большим
весом как можно ближе к корню; аналогично поступать
с каждым поддеревом.
Правило 2. Выбирать корень так, чтобы
уравновесить полные веса правого и левого поддеревьев;
аналогично поступать с каждым поддеревом.
Упомянутый во втором правиле вес поддерева
может измеряться по-разному. G двумя подходами к
измерению весов мы ознакомились при описании
алгоритма АН, /), третий состоит в принятии в качестве
веса поддерева числа его вершин.
Для оценки этих и других эвристик с точки
ярения стоимости дерева сделаем некоторые
предположения относительно пространства, из которого
выбираются веса а0, Pi, oci, ..., Р„, а„.
а) В случае деревьев с взвешенными внутренними
вершинами (веса а0, oci, .,,, а„ не учитываются) веса
Pi, <. •f рп выбираются независимо из неотрицательных
вещественных чисел с данным законом распределения.
Если Ei есть математическое ожидание относительно
этого распределения, то тогда £\(р) есть ожидаемое
значение отдельного веса.
б) В общем случае веса вершин $и ..., р„ и веса
листьев (висячих вершин) а0, аи ..., а„ независимо
выбираются из двух множеств неотрицательных
вещественных чисел со своими законами распределения.
Пусть Еи Ег — математические ожидания
относительно этих распределений.
Получены следующие оценки стоимости для
различных классов деревьев:
— для оптимальных деревьев на множестве весов
Pi, .... Р.
£,(|roptl)-£,(p)nlogn + 0(n);
— для балансированных по числу вершин деревьев
на множестве весов (J„ ..., р„
Ei(\TJ) = Ei($)nlogn + 0(n);
— для случайных деревьев на множестве весов
Р.,...," Р.
El(\Tca\) = 2ln2El(^nlogn + 0(n);_
200
— для монотонных деревьев, т. е. деревьев,
построенных на основании правила 1,
Я,(1TJ) - 2 In 2Е^)п log п + О(п);
— для оптимальных деревьев в общем случае
^(iToptD-
«= Е^)п log п + Е2(а)(п + 1) log (п + 1) + О(п);
— для балансированных по числу вершин деревьев
в общем случае
EA\TJ) = Е^)пlog п + Е,(а)(п + 1} log (п + 1) + О(п);
— для случайных деревьев в общем случае
- 2 In 2[Ei($)n log n + EtiaHn + 1) log (n + 1) + 0(n)].
Отсюда видно, что деревья, для которых
выполняется баланс по числу вершин в левом и правом
поддеревьях, асимптотически так же хороши, как и
оптимальные. Тот факт, что эвристика, позволяющая
строить монотонные деревья в соответствии с правилом 1,
дает плохие результаты, должен рассматриваться как
неожиданный.
Для деревьев, балансированных по сумме весов
вершин, существуют более точные результаты. Пусть
Оо, ..., On, Si, ..., 8„ — веса вершин, удовлетворяющие
нормирующему условию 2а» + 2fb = 1 и условию
tf-2Pilog(l/ft) + 2>il°g (l/«i). Тогда
справедливы оценки:
а) (171og3)tf^|ropt|<|r=|<2 + (l-log(V'5-l))-1#
или 0,63 < \T0Vi\ < \TJ < 2 + 1.44Я;
б) H-logH-loge + i*z\T0,t\*z\Tj<H + 2.
Это означает, что бинарные деревья,
балансированные по суммам весов, по стоимости всегда близки к
оптимальным.
Приведем пример того, что правило 1 строит «пло-
71
хие» деревья. Пусть п = 2* - 1, §« = 2-* + е(, 2ei = 2~\
8i>ei>...>en>0 для i «= [ 1 : гс] и щ = О для /а
eiO:rc]. Для указанных весов правило А строит
дерево, показанное на рис. 4.9. Его стоимость удовлет-
201
воряет следующему неравенству.
I 7\ | = £ {№ + 1) + £ ссА-= £ М >
Рис. 4.10 показывает балансированное по весу
дерево для тех же самых весов. Стоимость его
ограничена сверху, как показано ниже, величиной 21ogn:
1Г-1- £pi(£i + l)+ i^<2^1)i(ii + l)<
i«=l j=0 »=1
Таким образом, \Ti\/\T=\ >n/(41ogn). Этот пример
является серьезным аргументом против использования
правила 1.
2.5. Конструирование динамических почти
оптимальных деревьев. Рассмотренные методы построения
оптимальных и почти оптимальных деревьев были
основаны на предположении, что множество весов было
известно заранее, поэтому было заранее известно
число внутренних вершин.
--С^"5 Рассмотрим теперь
ситуацию, когда множество
весов заранее не известно и
на вход алгоритма
построения дерева подается
поэлементно последова-
/ ^'' v '' w N тельность весов {fty/^Pv
Рис. 4.10. Pi2,. •., Pim)n3 некоторого
достаточно богатого
множества. Построение дерева проводится с учетом
условия: если номер ih очередного поступающего на вход
алгоритма веса р\й меньше номера веса в корне, то
соответствующая весу pih вершина будет помещена в
левое поддерево корня, в противном случае — в
правое. Аналогично поступаем с каждым поддеревом.
Для простоты ограничимся случаем весов [}, так
что стоимость дерева после обработки первых N весов
из последовательности {$} будет иметь вид \Т \ =
202
N
= 2 Pi^i- Изложим два подхода к решению задачи.
Первый подход основан на применении
преобразования <p(i>, Т), описанного выше и называемого далее
простым вращением, и преобразования, называемого
двойным вращением и представляющего собой
последовательно примененные простые вращения. Схемы
обоих преобразований приведены на рис. 4.11. Эти
преобразования будут применяться для локальной
минимизации стоимости дерева. • Второй подход основан
на построении специального класса деревьев.
Рис. 411.
Пусть р, q, г и s — полные веса потомков вершин
vA, vB и vc (см. рис. 4.11), где под полным весом
вершины понимается либо вес вершины, если она
висячая, либо сумма веса вершины и полных весов ее
потомков. Тогда:
— простое вращение применяется, если
$(vA)+p>$(vB) + r
пли iwix) — полный вес вершины х)
w(vA) — q > w{v8) — w(vA)
(таким образом, локально минимизируется стоимость
поддерева с корнем в вершине vA);
— двойное вращение применяется после проверки
неприменимости простого вращения, если
2$(vB)+p+q>$(vc)+s
или
2w(vB) — р — q> w(vc) — w(vA).
203
Пример применения указанных преобразований см.
на рис. 4.12.
Статистическое исследование этой эвристики
показывает, что деревья, построенные при применении
только простого вращения, дают 5-процентное
отклонение от оптимума, а построенные с использованием
двойного вращения — 3-процентное. Можно показать,
что при использовании
А*г
А-г
AM A-1
\ А-1
А-1
Рис. 412.
только простого
вращения средняя стоимость
д-1 Дерева над множеством
весов f}j = 1/п
пропорциональна Т/пп.
2.6. Класс Bui
динамических деревьев.
Определим следующий
класс взвешенных
деревьев:
а) стоимость
деревьев цз fii/j близка к
оптимальной;
б) класс Z?i/s содержит в качестве подмножеств
множества оптимальных, балансированных по весу ц так
называемых минимаксных деревьев;
в) существует алгоритм А, который представляет
собой последовательность локальных преобразований
и который переводит дерево Та, не принадлежащее
после добавления или удаления вершины к классу Bi/S,
в эквивалентное дерево Ть из класса Bi/t.
=0
Рис. 4:13.
Локальные преобразования представляют собой уже
изученные вращения (простое и двойное) и, кроме
того, еще одно вращение — вращение 3 (рис. 4.13).
Пусть Т — бинарное дерево, вершины которого
имеют неотрицательный вес {$Ы, и пусть S(T) — суммар-
204
ный вес вершин дерева Т. Тогда будем говорить, что
дерево Т принадлежит классу Bi/3, если:
а) Г — пустое дерево;
б) Т-(Т,, vt; Тг), Т,еВ1/г, TreBt/i и 5(7",) <
< (2/3)5(7"), S(Tr) < (2/3)5(7").
Теорема 8. Пусть Т е Bi/3, и пусть р = (р\,..., р\»)
есть множество нормализованных весов, на котором
построено дерево Т; тогда
\Т\<Нф/НШЗ,2/3) + 1,
где HW3, 2/3) = 1,088.
Доказательство существенно использует следующее
утверждение, которое мы приводим без доказательства.
Лемма 6. Пусть~$ = (${, ..., pj, р\ > 0, ККп,
п
2 Pi = 1- Пусть, далее, (г0, г,, ..., rm) — подпоследо-
4=1
вательпость последовательности (0, 1, ..., п) с г0 = 0,
rm = n,
Ti
P,-(Pry_1+l,...,Prj), l</<m, P'= S Pi'
7"ог<?а
я (р) = я (р\ р2,..., рт) + | р'я (р'/р*).
Доказательство теоремы 8 будем вести индукцией
по числу вершин. Для п— { теорема очевидна.
Предположим, что она верна для деревьев с числом
вершин меньше п, и докажем её для п. Пусть wk—__ко-
рень дерева Т. Пусть ft = (p\/si, ..., pV-i/*i) и р' =
ft-I п
= (Pfc+i/Sz, • • -, ?>JS2), ГДе «i = 2 Pi. S2 = 2 Pi —
i=l i=h+l
нормализованные веса поддеревьев Th Тт. По
определению стоимости дерева имеем
m-£piLi = :spiL1 + pk-+ 2 ра=
i=»l i=l i=ft+l
- * (| * ^ " «) + '• (J, * № -»)) + 2 A.
поэтому
_ |7'|=e1|7'I| + e,l7'r| + l. (4.10)
205
Пусть d— 1/Ж1/3, 2/3). По предположению
индукции имеем
|Г,| ^dH(f) + l, \Tr\^dH(f) + l. (4.11)
Подстановка (4.11) в (4.10) дает неравенство
\Т\ < d(SiH(fl) + 52Я(р)) + », + »2 + 1. (4.12)
Из леммы 6 вытекает равенство
Нф = H(su яг, 3,) + SiH(f) + s2HC$2),
которое вместе с (4.12) дает оценку сверху для
стоимости:
IЛ *£ dH($) - dH(su вг, 3») + *, + *,+ 1. (4.13)
Теперь рассмотрим два случая:
а) Зь>2/3. Тогда s„ s2 < 1/3, 7/(s„ s2, Зя) > s, + s2,
откуда, учитывая (4.13) и неравенство d>l, получаем
1Г| <d#(jf) + l.
б). j}4 < 2/3. По определению класса В1/3 имеем st =f
^ 2/3 и s2 < 2/3. Очевидно, что
st + s2< 2/3, *s + 3* < 2/3, s2 + 3* < 2/3
(в противном случае из условий st + s2> 2/3, st + 3* >
> 2/3 и s2 + Зь > 2/3 следовало ' бы неравенство
2(5, + s2 + 3*) > 8/3, или 2 > 8/3, что невозможно).
Так как st + s2 ^ 2/3, то по лемме 6 имеем
Я(«„ st, fr) >#(», + *„ $k)>H(2/3, 1/3-) (4.14)
(поскольку 3k<2/3, Si + s,^ 2/3, Н{х, 1-х) = Я(1-
— х, х) и Я(л:, 1-х) есть, монотонно возрастающая
функция на отрезке [1/2, 1]).
Подстановка (4.14) в (4.13) дает искомое
неравенство
\T\<dH(f) + l.
Следствие. Если T&Bt/s и Т'opt — оптимальное
на том же множестве весов дерево, то \Т\ ^.
^ 1,088(1 ropt I + log I Jopt I) + 2,202.
Для доказательства достаточно воспользоваться
оценками для |Гор1| в п. 2.4.
Теорема 9. Пусть Bovt — множество
оптимальных, Bmm — множество минимаксных, а ВкЬ — множе-
206
ство балансированных по весу деревьев; тогда
Bopi U Bmm U ВЛ <=■ В1/3.
Г—1 71
Замечание. Пусть £/(г) = 2 Pi- ^ (г) = 2 Pi-
1=1 1=7-+1
1 ^ г < п, и пусть !i> — номер вершины, являющейся
корнем. Тогда Т=^(Т,, vK, TT) называется
балансированным по весу деревом, Т е ВкЬ, если Т, е ВкЬ, Tr е
ейй и |1,(н;)-Я(н;)|<|1(г)-Я(г)| для всех ге
ell:«], Дерево Т называется минимаксным деревом,
feZ?mm, если Tt^Bmm, Tre=Bmm и max (L(w, R(w)X
«£ max (L(r), R(r)) для всех ге[1:в].
Доказательство теоремы 9. Пусть T<^Bmm;
тогда из неравенств
5(г,)- 2 р(*)<4-5<г)'
5(ГГХ(1/2)5(Г)
следует, что 71 е £,„.
Пусть теперь T^Bopt имеет вид, показанный на
рис. 4.14, и пусть s,- есть сумма весов вершин дерева
с корнем в вершине wt. Предположим, что T&Bi;3;
тогда S(TT) > (2/3)S(T). Рассмотрим два случая:
a) $(wt).+ st>(.№)S(T). В этом случае дереве-Г
(рнс. 4.15) эквивалентно по множеству весов дереву Т
и |71']<|71|, а это противоречит оптимальности
дерева Т.
Рис. 4.14. Рис. 4.15. Рис, 4.16.
б) $(wt) + s>< ШШ(Т) =* sk>(.i/3)S(T). Теперь в
противоречию приводит дерево Т" на рис. 4.16.
Рассмотрим дерево Т, показанное на рис. 4.17 и
принадлежащее классу Bwb. Пусть 7\ — поддерево с
корнем Wi. Положим si«=iS'(7,<), &*=$(ии) и
предположим, что Т&В1/3. Из этого предположения вытекает
207
A*.
X8*» № ла5
неравенство Si>(2/3)s». Пусть wx-~ вершина из 7\ о
весом p(wx) >0 и такая, что для всех шеГ, из
р(г^)>0 следует w < wx, т. е. все вершины w
принадлежат левому поддереву
*Wq дерева с корнем в
вершине юх. Рассмотрим теперь
дерево с корнем в верши-
Рис. 4.17. Рис. 4.18. не ш*> но эквивалентное
по множеству весов
дереву Т (рис. 4.18). Пусть Т\— дерево с корнем
w\, si = 5(Г-); тогда
s'i = »i — Р*, (4.15)
s's = s3 + P2« (4-16)
Рассмотрим два случая:
а) sx^s3- В этом случае (4.15)—(4.17) приводят
к неравенству Si — рх — sa — р2 ^ Si — «з, или р„ + р2 < О,
что противоречит неравенству рх > 0.
б) Sj < s3. В этом случае (4,15)—(4.17) приводят
к неравенствам s3 + р2 — «i + Р* ^ Si — s,, 2(ss + р2) +
+ Р, 2* 2s, + рг, а так как 2(*ss + р2)< (l/3)sa и 2s. >
> (2/3)s2 в силу неравенства s, > (2/3)sz, то отсюда в
свою очередь следует
р, > (2/3)в, + р2 ■> в, - р, < (i/3)»i.
Из неравенства Si > (2/3)s2 следует р2 +s3 < (l/3)s2 и
i,-i,>(1/3)i,. (4.18)
С другой стороны, из неравенств st — рх< (l/3)s! и
Рг + s3 < (l/3)sa вытекает ■
I «з + Рг - «1 + «V| = I s[ - 41 < (1/3)».. (4.19)
Нетрудно заметить, что неравенства (4.18) и (4.19)
противоречат неравенству (4.17). Теорема доказана.
Опишем на содержательном уровне алгоритм,
который гарантирует, что после включения или удаления
вершины результирующее дерево будет снова
принадлежать классу Bi/S. Алгоритм состоит из двух частей.
Первая часть включает вершину в дерево или удаляет
вершину из дерева и хранит путь от корня к включае-
208
мой или удаляемой вершине в стеке S. Кроме того,
она приводит в порядок суммы s( весов вершин на
пути из корня к .включаемой или удаляемой вершине.
Вторая часть проверяет, является ли дерево,
полученное в результате работы первой части, элементом
класса Вц, или нет, и над деревом производятся
соответствующие операции, пока дерево не станет
удовлетворять требованиям класса BUi. Во время работы этой
части справедлив следующий инвариант: если
вершина находится в вершине стека S, поддеревья этой
вершины суть элемепты класса В,/3.
Первая часть алгоритма работает следующим
образом.
Если мы включаем вершину, то мы храним
последовательность вершин от корня до включаемой
вершины в стеке S.
Если мы удаляем вершину, то храним
последовательность вершин от корня к удаляемой вершине, но
без нее, в стеке S.
Теперь рассмотрим два случая:
а) Вершина w, удаляемая из дерева, есть висячая
вершина или она имеет только одно поддерево. Тогда
мы удаляем вершину w и подсоединяем ее поддерево
на освободившееся место к предку удаленней
вершины w; стек S остается без изменения.
б) Вершина w имеет два поддерева. Тогда,
начиная с вершины, являющейся корнем правого
поддерева вершины w, движемся вниз последовательно по
левым поддеревьям, пока не достигнем вершины w\ не
имеющей левого поддерева. Занесем вершины этого
пути в вспомогательный список AL (без w').
Поменяем местами вершины w и w' а удалим
w, как это делается в случае а).
Потом добавим вершину w' в стек S. "^
Теперь включим в стек вершины из
списка AL в том же самом порядке, щ3
в котором они были занесены в
список AL.
Вторая часть состоит из следующих Рис. 4.19.
шагов.
Ш а г 1. Если стек S пуст, то алгоритм
заканчивается. В противном случае пусть wz — вершина стека S
и корень дерева, показанного на рис. 4.19.
Введем следующие обозначения: р\ = р(ц>(), Т< —
дерево с корнем wt (до вращения), Si-S(Ti).
№ В. А. Евстигнеев
209
Возможны четыре случая:
а) s, + fijSs (1/3)$а и Ba + s, 3s (l/3)sa —переход к
шагу 2;
б) Si + 3j < (l/3)s2 и В, + s9 > (l/3)s2 — переход к
шагу 3;
В) S, + a2<(l/3)s2, B8 + Se<(l/3)s2 И в, + аа + 8,+
+ В4 3* (l/3)sg — переход к шагу 4;
г) a8 + se*£(l/3)s2 и Si + рг + ss + а4 < (1/3)ва
—переход к шагу 5.
Шаг 2. Удалить вершину ш2 из стека S и перейти
к шагу 1.
Шаг 3. Провести простое вращение и перейти к
шагу 1.
Ш а г 4. Провести двойное вращение, включить
вершину wt в стек и перейти к шагу 1.
Ш а г 5. Провести вращение 3 и ввести вершину wa
в стек S. Если 84 + ss > (l/3)(s, + 34 + s3), то перейти
к шагу 1; если s4 + 32 > (l/3)(si + В2 + s3 + В4 + ss), то
удалить вершину ц>2 из стека 5, ввести вершину ц\
в стек 5, перейти к шагу 1; в противном случае
применить ряд дополнительных преобразований к
поддереву с корнем Wi, удалить вершину и\ из стека S и
перейти к шагу 1.
Примечание. Мы не уточняем суть
дополнительных преобразований в шаге 5, так как этот шаг,
по свидетельству автора алгоритма, нужен для оценки
трудоемкости алгоритма и на практике встречается
чрезвычайно редко; в экспериментах на массиве из
нескольких тысяч деревьев он не встретился ни разу.
Теорема 10. Пусть T<=Bi/3, и пусть Та — дерево,
полученное из Т в результате включения или
удаления вершины. Тогда применение описанного
алгоритма преобразует дерево Та в дерево Ть из класса В1а,
Доказательство. Используем инвариант,
упомянутый в описании алгоритма: если вершина
находится в вершине стека, то поддеревья дерева с корнем
в этой вершине принадлежат классу В1/3.
Пусть Тг — дерево с корнем и>2 до вращения. Тогда
Tn&Bi/s и Тгг^В1/3. Пусть Т' — то же дерево после
вращения, и пусть w' — корень дерева Т'\ докажем,
что
5(г;) + р(и;')>(1/3)5(Г)-=-(1/3)*„
5(Г;) + РМ>(Ш)5(Г) = (1/3)811
210
т. е. 7" удовлетворяет условиям определения класса
Вцз- Как только мы поместим корни поддеревьев,
которые не проверяются, в стек, теорема будет доказана.
Рассмотрим четыре перечисленных при описании
алгоритма случая.
а) Неравенства st + fj2 > (l/3)s2 и ss + §2 ^ (l/3)s2
верны в силу исходного предположения.
б) Покажем, что
?,t*,X1/3)j„ (4.20)
s, + P, + Si + p,>(l/3)s„ (4.21)
Но (4.20) верно по предположению, а (4.21)
следует из неравенств s9 *S (2/3)s8 =S (2/3)s2.
в) Покажем, что
s, + p, + s, + pt>(l/3)s2, (4.22)
Pi + *. + P. + s.Xl/3)s2. (4.23)
Но (4.22) верно по предположению, а (4.23)
следует из неравенств s3 =S (4/9)s8 u ss > (2/3)s2:
^ + s< + £s + s, =
= 5S - s3 > (5/9)se > (5/9)(2/3).?2 > (l/3)s,.
Первое из неравенств вытекает в свою очередь из
неравенств s3 < (2/3)s4 и s4sS(2/3)s8, которые являются
следствиями принадлежности деревьев Тк и 778 классу
Вц3. Второе неравенство вытекает пз неравенства
s, + p,<(l/3)s,.
г) Покажем, что
«2 + Р2 + «з + Р4 + h + Ре > (1/3) «2. (4-24)
Ре + *7 + Р* + *. > (1/3) *а, (4.25)
*4 + р4>(1/3)(*3 + р4 + *5), (4.26)
«з + Р4 + Ч> (!/3) (*i + Р2 + *з + Р4 + h)-
(4.27)
Неравенство (4.24) вытекает из равенства
Si + (32 + s3 + $t + ss + £„ = s2 - (p8 + s,) - s„ (4.28)
если учесть, что ^« +se < (l/3)«2, s7<(2/3)se (так как
Г.еВ,/,), se=£(2/3)s4 (так как Г4е=Я,/а), s4*£(2/3)s,
(так как Г8е=Я1/3), s7 < (8/27)s8< (8/27)s2 (в силу трех
предыдущих неравенств). Подстановка этих неравенств
U* 211
в (4.28) дает
*,+ P, + S, + Pi + Ss + P,>
> *, - (1/3)*, - (8/27)*, Xl/3)*,.
Неравенство (4.25) вытекает из равенства
Ре + «7 + Р> + s, =* *, - (*, + р2 + s, + р\) - *5, (4.29)
если учесть, что st + р, + s, + р4 < (l/3)s2, s5^
sS(8/27)s8sS(8-/27)*, (так как Т„ Tk, Г.еД,,,).
Подстановка этих неравенств в (4.29) дает искомое:
(I, + *, + р8 + *„ > *, - (1/3)*, - (8/27)*2 > (1/3)*,!
Неравенство (4.26) непосредственно следует-из
того, что Г4 <= Si/S.
Для доказательства неравенства (4.27) заметим, что
неравенства {$» + *,< (l/3)s2, «i + Рг + *, + Р* < (l/3)s,
дают вместе неравенство
*, > tl/3)*„ (4.30)
которое вместе с условием Г4 е 5I/S приводит к
неравенству
s3 + ptXl/6)*2. (4.31)
Из (4.31) и неравенства *t + р2 + *3 + р4 < (1/3)*,
вытекает неравенство *i + р, < (l/6)s2; из него и
неравенства (4.31) следует *3 + Pi<*i + p2, откуда и вытекает
(4.27). Теорема доказана.
Без доказательства укажем, что при достаточно
слабых предположениях о законе распределеиия весов
среднее число операций в случае включения вершины
меньше чем 0(1), где I — число вершин в пути от
корня до включенной вершины.
2.7. Построение оптимальных каркасов. Пусть
имеется неориентированный граф G = (V, Е), каждому
ребру которого сопоставлен вес (или длина) Не), «е£
Простейшей задачей о построении оптимального
каркаса является задача о кратчайшей связывающей
сети, или задача нахождения каркаса с наименьшей
суммой весов входящих в него ребер. Эта задача хорошо
известна; напомним здесь два алгоритма ее решения:
алгоритм Краскала и алгоритм Прима.
Первый состоит в упорядочении ребер графа по
убыванию (или возрастанию) их длин. После этого
ребра графа рассматривают последовательно и либо
212
удаляют ребро из графа, если не нарушается
связность, либо оставляют, если связность нарушается.
Нетрудно увидеть, что в результате останется ровно
I VI — 1 ребер; совокупность их определяет связный
суграф с тем же множеством вершин, что и исходный
граф, т. е. каркас. Минимальность суммы весов ребер
вытекает из построения.
Второй алгоритм состоит в последовательном
наращивании фрагмента или фрагментов (вначале это —
отдельные вершины) за счет добавления ребер,
дающих наименьшее приращение стоимости фрагмента
(суммы весов ребер) и не приводящих к образованию
циклов. Алгоритм является реализацией метода
динамического программирования и обладает высокой
эффективностью.
В общем случае, когда зависимость стоимости
дерева от весов ребер имеет более сложный вид, для
отыскания оптимального каркаса неизбежно
применение полного перебора. Для этой цели пригоден подход,
основанный на процедурах генерирования всех
каркасов графа, в частности на процедуре быстрого
перебора всех частичных графов с заданным циклома-
тическим числом. Изложим основную идею этой
процедуры.
к-графом данного графа G = (V, E) называется его
частичный граф GX = {X, E'); Е'<^Е, с
дипломатическим числом К, имеющий столько же компонент
связности, что и граф G.
Предлагаемый ниже алгоритм требует
упорядоченного перебора С\Е\ сочетаний ребер, где А/Х=1У1 +
+ К — р, с проверкой сохранения числа р компонент
связности в каждом частичном графе. Перенумеруем
в произвольном порядке ребра исходного графа. Нам
нужно для получения каркаса исключить \Е\ — Мх
ребер» Если при исключении.первого ребра число
компонент связности не изменяется, то переходим ко
второму ребру, и т. д. Пусть на некотором шаге
исключено какое-то ребро. Попробуем исключить еще одно
ребро, начиная с номера, на единицу большего
номера последнего ребра, помещенного в стек. Действуя
так \Е\ — Мх раз, получим первый Х-граф. В стеке
при этом окажутся ребра, исключенные из исходного
графа. Для того чтобы найти очередной Я-граф,
исключил! из стека последнее загруженное ребро и
вернем это ребро в граф. Попробуем исключить из графа
213
ребро с номером, на единицу большим номера ребра,
только что присоединенного к графу. Если это
возможно, то получим очередной Я-граф, если нет —
перейдем к следующему ребру, и т. д. Если мы
достигнем ребра с наибольшим номером и ни одно из ребер
нельзя исключить, то достанем из стека последнее
загруженное в него ребро и вернем это ребро в граф.
Попробуем исключить из графа ребро с номером, на
единицу большим номера ребра, только что
присоединенного к графу, и т. д. Каждый раз, когда
сформирован очередной искомый граф, в стеке оказывается
\Е\ —Мх исключенных ребер.
Действуя таким образом, можно перебрать все X-
графы. Процесс закончится при попытке достать
ребро из пустого стека. Алгоритм организован так, что
если частичная конфигурация исключенных ребер
изменяет число компонент связности, то автоматически
игнорируются все «висящие» на ней конфигурации.
§ 3. Балансированные деревья
В этом параграфе мы рассмотрим деревья,
критерием оптимальности которых служат некоторые
структурные характеристики. В случае АВЛ-деревьев такой
характеристикой служит разность между высотами
правого и левого поддеревьев для каждой вершины,
в случае ВВ-деревьев—некоторая функция,
отражающая соотношение числа вершин в правом и левом
поддеревьях для каждой вершины.
3.1. Балансированные по высоте деревья, или АВЛ-
деревья. Бинарное дерево называется балансированным
по высоте или АВЛ-деревом, если для любой его
вершины высота правого поддерева отличается от
высоты левого поддерева не более чем на единицу.
(Высота поддерева есть разность между наибольшим из
уровней его вершин и уровнем его корня).
Теорема 11. Наибольшая длина ветвей в п-вер-
шинном АВЛ-дереве не превышает (3/2) log п.
Доказательство. Наиболее асимметричное
АВЛ-дерево Th высоты h имеет наиболее
асимметричное АВЛ-дерево Th-t высоты h—l в качестве одного
из своих поддеревьев и наиболее асимметричное АВЛ-
дерево 7\-2 высоты h — 2 в качестве другого (как
показано на рис. 4.20).
214
Обозначая число вершин в Th через nh, получаем
рекуррентное соотношение
nh ?= «ft_l + пк-г+ 1, ?г_1 = 0, и0 = 1. (4.32)
Для ft = 3 и ft = 4 можно непосредственно проверить,
а затем по индукции доказать, что при ft > 3
справедливо неравенство nh > аЛ+\
где а = 05 + 1)/2 есть
положительный корень
уравнения х2 = х+\.
Следовательно, число вершин п
удовлетворяет неравенству п 3*
> nh > аЛ+\ откуда ft + 1 <
< log 2 • log n ~ 1,44 log n.
Ho ft + 1 — это число вер- рис 4.20.
шин в пути длины ft из
корня в некоторую вершину. Следовательно, для АВЛ-
дерева это число никогда не превышает 1,44 log и. Для
случайного дерева средняя длина пути из корня в
висячую вершину составляет ~ 1,39 log n, а в худшем
случае она может оказаться равной п. Таким образом,
худший случай для АВЛ-дерева ненамного уступает
средним возможностям случайного дерева. В среднем
для АВЛ-дерева можно получить оценку с log n (для
больших п), где
1,04.
_
V~p
/Aj
-с
"1/5 log a
Для получения этой оценки обозначим через Ph
суммарную длину внутренних путей в дереве Th
высоты ft. Для Ph имеет место следующее рекуррентное
соотношение, вытекающее из рассмотрения наиболее
асимметричного АВЛ-дерева высоты h (рис. 4.20):
Р»«=Ра-, + Р/-» + в»-1, P-j-Pg-O. (4.33)
Деление этого соотношения на nh дает
^ft = "ft-1 _ Ph-1 nh-2 _Ph-2 , a 1_
"ft "ft 'nh-i "ft 'nh-2 V
и, следовательно,
r, "ft-1 <j , "ft-2 о , a 1
"ft "ft nh
Опуская член (—1/щ) и используя приближенное зна-
215
ченне Пи
\fa 1,9 f ч • 1 для замены nh-Jnh и п^-г/п*
■)
их приближениями (2/V5+1), 1/У(1 + У5)/2
соответственно, получаем
Решая это уравнение, получаем
подставляя значение для Л, окончательно имеем
S^1■5I^Йwi'llo«"^,'04"»•
Проведенный анализ показывает, что
балансированные по высоте деревья имеют достаточно короткие
пути из корня в висячие вершины, что позволяет
использовать их для организации поиска в больших
массивах информации. Чтобы окончательно убедиться в
этом, нужно показать, что включение и исключение
вершины можно проводить, оставляя деревья
балансированными.
3.2. Включение новой вершины в А В Л-дерево.
Будем характеризовать каждую вершпну дерева парами
00, 01 или 10, смотря по тому, равны ли высоты
правого и левого поддеревьев для данной вершины,
больше высота правого поддерева или наоборот. При этом
будем считать, что если вершина не имеет с какой-
нибудь стороны потомка, то длина ветви с этой
стороны равна нулю.
Включение новой вершины в АВЛ-дерево
происходит следующим образом. Вначале мы подвешиваем
новую вершину так, чтобы дерево оставалось
бинарным, и приписываем ей характеристику 00,
Следующий шаг состоит в исправлении изменившихся
характеристик вершин дерева, с изменением, если нужно,
структуры дерева. Это исправление касается только
вершин, лежащих на пути от корня до новой
вершины. Для определенности будем называть этот путь
отмеченным. Прежде всего скорректируем
характеристику предка w новой вершины. Имеются всего две
возможности: а) 'характеристика w равна 00, и б)
характеристика w равна 01 (для определенности пола-
218
гаем, что новая вершина была подвешена к w слева).
В первом случае мы изменяем 00 на 01 или 10,
смотря ио тому, с какой стороны была подвешена
вершина. Во втором случае новая вершина добавляется
к вершине w со свободной стороны, при этом длины
обеих ветвей, исходящих из w, становятся равными
(равными,1), поэтому замена 01 на 00 завершает
включение новой верщины.
Рассмотрим структуру отмеченного пути, когда
вершина w имеет характеристику 00.
Лемма 7. Подпуть Q отмеченного пути Р, во всех
вершинах которого характеристики равны 00, а в
первой {ближайшей к корню) характеристика отлична от
D0, имеет длину, равную высоте поддерева с корнем
в первой вершине подпути Q.
Доказательство. Допустим, что наше утверж-
дейие неверно. Обозначим первую вершину подпути Q
(в которой характеристика отлична от 00) через v.
Из всей совокупности путей, начинающихся в у и
имеющих длину, большую чем длина пути Q, выберем
путь R, имеющий с Q наибольшее число общих
вершин. Пусть t — последняя общая вершина путей Q
и R. Тогда ее ветви имеют разную длину;
следовательно, характеристика вершины t не може*т быть
равна 00. Лемма доказана.
Из леммы 7 вытекает, что корректировка
характеристик приведет к изменению характеристик вершин
подпути Q с 00 на 01 или 10 и при этом любое
поддерево с корнем в вершине остается балансированным.
Возможны три случая:
1) Q = P. Тогда все дерево остается
балансированным.
2) Подпуть Q лежит в короткой ветви поддерева
T(v). Тогда после добавления новой вершины
получилось балансированное дерево, и характеристику
вершины v нужно только заменить на 00.
3) Подпуть Q лежит в длинной ветви поддерева
Г(у).-Если при этом последние два шага при
движении к v осуществлялись в одном направлении, т. е.
оба перехода были от правого потомка к предку или
оба — от левого, то выполняется простое вращение
(рис. 4.21). Если два последних шага выполнялись в
разных направлениях, то выполняется двойное
вращение (рис. 4.22). На этих рисунках нарушение
баланса происходит в вершине ve, т. е. первой вершине
217
подпути Q. Можно проверить, что условия на высоты
поддеревьев до и после преобразований выполнены и
Новая
вершина
Новая
вершина
Рис. 421.
i Новая
вершина
Новая
вершина
Рпс. 4.22.
что после этих локальных преобразований в целом
дерево является балансированным по высоте.
3.3. Удаление вершины из АВЛ-дерева. Удаление
вершины принципиально не отличается от процедуры
включения, уточнения требуют только детали.
Преобразованием типа <p(v, T) удаление любой вершины
можно свести к удалению вершины с одним пустым
поддеревом. Если исключаемая вершина имеет одно
пустое поддерево, то, согласно ограничению на высоты
деревьев, другое поддере-
верши р*
висячая
«=Ф
во состоит из одной
вершины, как показано на
рис. 4.23. В этом случае
влияние на балансирован-
ность дерева такое же,
как если бы. исключалась
вершина. Следовательно, имеет смысл
рассмотреть только этот последний случай.
Когда исключается висячая вершина, поддерево,
состоящее именно из этой вершины, теряет единицу
Рис. 4.23.
218
высоты. Снопа пройдем отмеченный путь — путь ot
удаленной вершины до корня, проверяя в каждой
вершине, какое влияние может оказать укорачивание
поддерева. Преобразование, которое нужно применить
зависит от характеристики вершины до удаления, от
направления последнего шага и в некоторых случаях
от условия на высоту потомка вершимы. (В
описанных ниже случаях штриховые линии обозначают
укорачиваемое поддерево.) В некоторых случаях
преобразование восстанавливает высоту поддерева до той, ка-
к*ая была до исключения; если это не так, то алгоритм
заканчивается, поскольку исключение не влияет на
характеристики всех расположенных выше вершин.
В других случаях сведения о том, что поддерево
укорачивалось, должно быть продвинуты вверх по пути
к корню.
1. Если текущая вершина имеет характеристику
00, то укорачивание дерева не влияет на высоту
поддерева, имеющего корнем текущую вершину. Алгоритм
заканчивает свою работу (рис. 4.24).
.00 лЪ 10 /-00
АД - ДА£h - ДА
Рис. 4.24. Рис. 4.25.
2. Если текущая вершина имеет характеристику
01 или 10 и последний шаг начинался из более
высокого из двух поддеревьев текущей вершины, то
продолжается движение вверх, при этом продвигается
информация о том, что дерево укоротилось (рис. 4.25).
3. Если текущая вершина имеет характеристику
01 или 10 и последний шаг начинался из более
низкого из двух поддеревьев текущей вершины, то в
текущей вершине ограничение на высоту поддеревьев
нарушается. Различаются три подслучая и их
зеркальные отражения в соответствии с условием на высоту
в другом потомке текущей вершины.
а) Подходящее простое вращение восстанавливает
ограничение на высоту поддеревьев в текущей
вершине без изменения высоты поддерева, имеющего корнем
текущую вершину. Алгоритм заканчивает работу
(рис. 4.26).
219
б) Подходящее простое вращение восстанавливает
ограничение на высоту поддеревьев в текущей
вершине. Продолжается движение вверх, при этом
продвигается информация о том, что поддерево, имеющее
корнем текущую вершину, укоротилось (рис. 4.27).
Рис. 4.26. Рис. 4.27.
в) Подходящее двойное вращение восстанавливает
ограничение на высоту поддеревьев в текущей вершине.
Рис. 4.28.
Продолжается движение вверх, при этом
продвигается информация о том, что поддерево, имеющее
корнем текущую вершину, укоротилось (рис. 4.28).
3.4. Балансированные по весу деревья (ВВ
-деревья). Это класс бинарных деревьев, в которых
ограничение на высоты поддеревьев заменено
ограничением на число вершин в поддеревьях. Хотя они
базируются на других принципах и не сравнимы с АВЛ-де-
ревьями — поскольку эти классы не содержат друг
друга и практически не пересекаются,— они обладают
схожими свойствами. От АВЛ-деревьев В5-деревья
отличаются тем, что содержат параметр, который
может изменяться так, что можно произвольно
ограничивать длину самого длинного пути из корня в
висячую вершину за счет увеличения дисбаланса.
Пусть Tn = (Th v, TT) есть бинарное дерево с
корнем vt где Г, и Т, — бинарные поддеревья с щ и п,
220
вершинами соответственно, п, + п, «»п — 1, П|>0,
пг > 0.
Корневым балансом $(Тп) бинарного дерева Тп «=»
«= (Г», у, Тт) называется величина
р(Г„)-<п,+ 1)/(п+1), n^l.
Для корневого баланса всегда выполняется
неравенство 0<§(Г„)<1.
Дерево Тп называется балансированным по весу
с балансом а, 0 < а < 1/2, если оно удовлетворяет
следующим условиям:
а) а<$(ТпХ1-а;
б) Г/, Гг — балансированные по весу деревья с
балансом а.
Класс бинарных деревьев с балансом а будем
обозначать через BBla]. Пустое бинарное дерево Т0, по
.определению, входит в BBla] для любого а. Класс
BBla] становится все более ограниченным по мере
того, как а меняется от 0 до 1/2. Случай а — 1/2
означает, что левое и правое поддеревья каждой вершины
содержат одинаковое число вершин; поэтому классу
BBli/2] принадлежат только полностью
балансированные деревья с п — 2* — 1 вершинами. В примерах на
рио. 4.29 баланс каждого поддерева выписан рядом с
корнем каждого поддерева; минимум етих балансов —
8то максимальное а, при котором данное дерево
принадлежит BBla]. Заметим, что деревья Фибоначчи,
определяемые соотношениями
Ft - пусто, Fx - ., Fi+i - д
?i Па
принадлежат BBl 1/3].
Интересно отметить, что имеется «пробел» в
балансах деревьев.
Теорема 12. Для всех а из интервала 1/3 < а <
<1/2
BBla] = BBli/2].
Доказательство. Пусть дерево Т не является
полностью балансированным бинарным деревом, т. е.
нусть оно-не принадлежит ВВП/2]; тогда рассмотрим
минимальное поддерево Т' (дерево наименьшей
высоты) дерева Т, не принадлежащее ВВП/2], т. е. не
221
являющееся полностью балаисированным бинарным
деревом. Дерево Т' должно иметь два полностью
балансированных поддерева Tt и Тт с I = 2" — 1 и г —
= 2! — 1 вершинами соответственно, причем s Ф t.
Предположим, что s < t. Тогда корневой баланс дерева Т'
равен p(r) = l/(l + 2'-)sSl/3, откуда следует, что Т
не может принадлежать ВВ[а] для любого а > 1/3.
Рис. 4.29.
Теорема 13. Для любого а, 0 < а < 1/2,
существуют в BBia] деревья, не являющиеся АВЛ-деревъями.
Для доказательства достаточно указать пример
такого дерева. Им может служить, например, дерево на
рис. 4.29, г, которое принадлежит классу BBli/Sl, по
не является балансированным по высоте. Аналогичным
образом может быть построено такое дерево для
заданного а.
Теорема 14. Для любого а, 0 < а < 1/2,
существуют АВЛ-деревъя, не принадлежащие BBia].
Доказательство. Рассмотрим дерево Т, левое
поддерево которого является наиболее асимметричным
балансированным по высоте деревом высоты h,
показанным на рис. 4.2Q, с Пп вершинами, где nh«
« 1,9((1 + У5)/2)\ а правое поддерево которого есть
полностью балансированное бинарное дерево высоты h
с 2м'1 — 1 вершинами. Дерево Т балансировано по
высоте, но ^(Г) ->- 0 при h ->- оо.
Из теорем 13 и 14 следует, что балансированность
по весу и балансированность по высоте являются
независимыми критериями балансированности.
Теорема 15. Высота дерева Тп из класса BBia]
не превышает
(log (n + 1) - l)/log (1/(1 - а)).
* Чтобы получить эту оценку, рассмотрим наиболее
асимметричное /г-вершинное дерево Тп из класса
222
BBial («наиболее асимметричное» в данном случае
означает дерево совершенно другой структуры, нежели
в случае АВЛ-деревьев). Это дерево имеет а(/г+1) —
— 1 ~ а/г вершин в одном из его поддеревьев,
например в левом, и (1 — а)(п + 1) — 1 » (1 — а)п вершин в
другом. Оба поддерева являются наиболее
асимметричными; отсюда следует, что высота ha(n) этого
наиболее асимметричного дерева Тп в BBtcd
удовлетворяет рекуррентному соотношению
h*(n) = 1 + A-„t(l - а)(п + 1) - 1] ж 1 + Ав[(1 - а)п\
с решением
ha(n) * log (в + l)/log (1/(1 - а)) + 0(1).
Для полностью балансированных бинарных
деревьев (а = 1/2) эта формула дает A1/a(n) « log (n+ 1).
Для а=» 1 — У 2/2 — наибольшего значения а, для
которого работает описываемый ниже алгоритм
перестройки, имеем
h-YInin) * 2 log (n + 1) + 0(1).
Таким образом, длина самого длинного пути из корня
в висячую вершину — высота — наиболее
асимметричного дерева из ВВП — У 2/2] лишь в два раза больше
высоты полностью балансированного дерева.
Что касается средней высоты, то в принципе она
может быть вычислена аналогично тому, как это
делалось для АВЛ-деревьев, если принять во внимание,
что суммарная длина внутренних путей в Г„
удовлетворяет неравенству
I Тп | < jjL^ (п + 1) log (п + 1) - 2л,
1де Я(а) = —а log а — (1 — а) log (1 — а).
3.5. Включение новой вершины в ВВ -дерево.
Сопоставим каждой вершине ВВ-дерева число Six), равное
числу вершин в поддереве Т(х) с корнем в вершине х.
Пусть fx есть путь из корня во вновь включенную
вершину w ВВ-дерева. Двигаясь по пути \х в
направлении от корня, проверяем на каждом шагу, нарушит
ли добавление вершины баланс дерева; если нет, то
добавляем единицу к Six) и продолжаем движение.
Если же добавление вершины нарушает баланс, то
223
прежде чем двигаться дальше, проводим необходимые
преобразования, тем более что они те же самые, что
и для АВЛ-деревьев.
Алгоритм включения новой вершины в
ЯВ-дерево:
начало
1. найти путь ц из новой вершины w в корень;
2. упорядочить вершины пути ц в направлении от .
корня; пусть это будет последовательность Vi , fj2, . .,
..-, «V
3. для / от 1 до к шаг 1 цикл
4. начало
5. вычисляем баланс v вершины и{. по формуле
S /левый потомок vim\ -f- l
v = — = ;
6. если w включена в левое поддерево дерева
Т{уч) то
7. если a «S v < 1 — a то
8. 5(^.)!=5(^) + 1;
9. иначе если S (у{ Л = 2 то
10. использовать вращение без учета вершины w\
11. иначе начало вычислить значение (5 — баланс
правого поддерева — с учетом новой вершины w;
12. если 1 - р < (1 - 2а)/(1 - а) то
13. применить простое вращение
14. иначе применить двойное вращение;
15. конец
16. иначе если a ^ v < 1 — a то
17. 5(^.):=5(^) + 1;
18. иначе если S (у^) = 2 то
19. использовать простое вращение без учета
вершины w;
20. иначе вычислить значение Р — баланс левого
поддерева — с учетом новой вершины w;
21. если р < (1 - 2а)/(1 - а) то
22. применить простое вращение
23. иначе применить двойное вращение;
24. конец цикла;
конец
224"
Схемы простого и двойного вращений с указанием
новых балансов показаны на рис. 4.30.
Пример включения вершины w в дерево,
показанное на рис. 4.29, г, дан на рис. 4.31.
а-а+(»-а;а
4 а ■ А
в)
Рис. 4.30,
2/5-1/3 A/l>
1/3*1/4 1/Zc
</г „ . . . ,
\w 1/2 1/2 1/2 1/2 1/2
Рис. 4.31.
Удаление вершины из ВВ-дерева происходит
аналогично включению. Следуя по пути {X из корня в
вершину, подлежащую удалению, уменьшаем на единицу
значение Six) для каждой пройденной вершины. Если
при этом дерево становится несбалансированным, то
применяем соответствующее преобразование и
движемся дальше. Когда мы достигаем вершины xN, которую
намерены удалить, может встретиться один из трех
случаев. Если xN — висячая вершина, то просто
удаляем ее. Если xN имеет только одного потомка,
соединяем предка вершины xN ребром с потомком
вершины xN и, таким образом, удаляем вершину xN. Если
же вершина xN имеет двух потомков, то проделываем
описанные операции с одним из ее потомков, заботясь
15
Р. Л- Евстигнеев
225
о соответствующих изменениях величин Six). Если же,
проделав все преобразования, мы выяснили, что
удалять вершину нет смысла, то исправляем величины
Six), но не реконструируем дерево.
3.6. Выровненные деревья. Под выровненными
деревьями мы будем понимать бинарные деревья, у
которых все висячие вершины расположены на одном
уровне. К выровненным деревьям относятся такие
классы деревьев, как Я-деревья, или деревья
соседства, Я5-деревья, или братские деревья, и др.
3.7. Бинарное дерево называется Н-деревом, если
все висячие вершины находятся на одном и том же
уровне и каждая вершина с единственным потомком
имеет правого соседа с двумя потомками.
Теорема 16. Н-дерево высоты h имеет по
крайней мере (3/2)" висячих вершин.
Доказательство проводится индукцией по h.
Очевидно, что теорема справедлива для h — О и для h~{.
Каждое Я-дерево Т' высоты h + 1 состоит из Я-дере-
ва Т высоты h, имеющего по индуктивному
предположению п 3* (3/2)Л висячих вершин. Каждой висячей
вершине такого дерева сопоставлены один или два
потомка, причем каждой второй вершине нужно
сопоставлять двух потомков. Для четного п дерево Т'
имеет самое меньшее
nil + 2«/2 = (3/2Ы > (3/2)*+1
висячих вершин, для нечетного п — по меньшей мере
(п - 1)/2 + 2(га - 1)/2 + 2 = 1/2 + (3/2)n > (3/2)"+1
висячих вершин.
Пример Я-дерева приведен на рис. 4.32.
Пусть Я-дерево имеет по крайней мере две вися-
чие вершины. Добавление
,/^\. повой вершины может
^>» быть произведено лишь на
/ \. самом нижнем уровне,
f Д X т. е. добавлена может
I / \ / \ быть только висячая
вершина. При добавлении но-
Рпс. 4.32. вой вершины у некоторой
вершины может оказаться
три потомка, а при удалении может появиться
вершина без потомков на уровне выше уровня висячих
вершин. В обоих случаях восстановление структуры
Л
226
Я-дерева происходит с помощью алгоритма
упрощения.
Алгоритм упрощения (в вершине v):
1. Если вершина v не имеет потомков, то удалить
v и вызвать алгоритм упрощения для предка
вершины V.
2. Если вершина v имеет в точности одного
потомка, то возможны четыре случая:
а) Вершина v имеет соседа v' с одним потомком.
В этом случае потомка вершины v перевешиваем к v',
удаляем v и применяем алгоритм упрощения к
предку вершины v.
б) Вершина v не имеет соседей. В этом случае
удаляем вершину v и делаем ее потомка новым корнем.
в) Вершина v имеет левого соседа v' с двумя
потомками и не имеет правого соседа. В этом случае
перевесим правого потомка вершины v к вершине v
и применяем алгоритм упрощения к вершине и'.
г) Вершина v имеет правого соседа с двумя
потомками и либо не имеет левого соседа, либо имеет
левого соседа с двумя потомками. В этом случае
никакие преобразования не нужны.
3. Если вершина v имеет точно двух потомков, то
преобразования не нужны.
4. Если вершина v имеет трех потомков, то
возможны следующие два случая:
а) Вершина v имеет соседа v' с одним потомком.
В этом случае перевесим одного потомка вершины v
вершине v'.
б) Вершина v не имеет соседа с одним потомком.
В этом случае образуем новую вершину v',
единственный потомок которой был самым левым потомком
вершины v. Если v была корнем дерева, то образуем
цовый корень с потомками v и v'. Если же вершина v
имеет предка, то подвесим вершину v'
дополнительным потомком к предку вершины v и применим
алгоритм упрощения к предку вершины v.
Алгоритмы включения и исключения имеют
трудоемкость CHlogn), где п — число висячих вершин.
3.8. Будем говорить, что вершина 5! есть брат
вершины х и записывать х = $х, если х и х имеют одного
и того же предка. Бинарное дерево называется НВ-де-
ревом, если все висячие вершины находятся па одном
и том же уровне и если каждая вершина х с одним
потомком имеет брата $х с двумя потомками. Деревья,
15* 227
показанные на рис. 4.33, б и 4.33, <?, представляют
собой примеры братских деревьев, в отличие от
дерева на рис. 4.33, а.
Сравнение ЯВ-деревьев с Я-деревьями показывает,
что существуют Я-деревья, не являющиеся НВ-це-
ревьями, и, наоборот, существуют ЯЯ-деревья, не
являющимися Я-деревьями.
^ /x(iA
Рпс. 4.33.
Теорема 17. НВ-дерево высоты h имеет по
крайней мере Fib (Л+ 2) висячих вершин. Здесь Fib (h)
обозначает h-e число Фибоначчи: Fib (1) = Fib (2) = 1,
Fib (h + 2) = Fib Ш + Fib (h + 1).
Доказательство. ЯЯ-дерево с наименьшим
числом висячих вершин при заданной высоте
получают! делая на каждом уровне число вершин с одним
потомком как можно больше, а число вершин с двумя
потомками как можно меньше. Обозначим через Ni(h)
наибольшее число вершин на уровне h с одним
потомком, а через Nt(h) — наименьшее число вершин с
двумя потомками на уровне h. Тогда число вершин на
уровне h в ЯЯ-дереве с возможно большим числом
висячих вершин равно N(k) — Nt(h) + N2(h). Из
определения ЯЯ-дерева следует, что если вершина на
уровне h имеет одного потомка, то у нее на уровне h+l
должен быть потомок с двумя потомками (или без
потомков, т. е. висячая вершина). Если вершина на
уровне h + 1 имеет двух потомков, то один из ее
потомков на уровне h+l обязательно имеет только
одного потомка. Отсюда следует:
NM + 1) = ЛГ,(й), N»(h + 1) = ВД> + ЛГ,(й).
Так как корень ЯЯ-дерева должен всегда иметь двух
потомков, то jViCO) == 0, N2(0) = 1. Из этих
соотношений следует, что ЛГ,(1) = ЛГ,(0) + Nz(0) = I и ЛГ,(й+2)=»
= N,(h + 1) + Nt(h + 11 = ВД) + Nt(h + 1). Кроме того,
для всех h>0 имеем Nz(h) = Fib (h + 1). Отсюда вы-
228
текает, что
ЖО) = NM + JV2(0) = 1 = Fib (2),
MA + 1) =ВД + 1) + ВД + 1) = N,(h) + ВД + 1) =
■- Fib (h + 1) + Fib (h + 2) = Fib (Л + 3).
Итак, для любого h ~> 0 справедливо соотношение
МЛ) = Fib (Л + 2). Теорема доказана.
Поскольку Fib in) есть целое число, следующее за
числом (ап - рп)/У5, где а-(1 + У5)/2, р — (1 — У5)/2,
то наименьшее число висячих вершин в Ш?-дереве
высоты h менее чем на единицу отличается от числа
(а-2/У5)а"-1,17(Ы,618\
• Включение новой вершины, так же как и в случае
.//-деревьев, возможно лишь на уровне висячих
вершин. При этом возможно появление вершины с тремя
потомками. Восстановление структуры Я5-дерева
производится с помощью алгоритма упрощения,
устроенного так, что его применение ограничено вершинами
с тремя потомками, причем либо все три потомка —
висячие вершины, либо по меньшей мере два из них
сами имеют в точности по два потомка.
Алгоритм упрощения (в вершине v);
1. Если вершина v имеет в точности два. потомка,
то никакие преобразования не нужны.
2. Если вершина v имеет в точности трех потомков,
то возможны два случая:
а) Вершина v не имеет братьев. Создадим
вершине v брата v' и передадим ему в качестве потомка
одного из потомков вершины v, имеющего, в свою
очередь, двух потомков. Если вершина v была корнем,
то образуем новый корень — предка вершин v и v'',
б) Вершина v имеет брата ш. Тогда, если ш имеет
точно одного потомка, то передадим ему одного
подходящего потомка вершины v. Если же брат w имеет
точно двух потомков, то создадим для v
дополнительного (третьего) брата v' и передадим ему в качестве
потомка одного из потомков вершины и, имеющего по
крайней мере двух потомков. Затем применяем
алгоритм упрощения к предку вершины v.
Нетрудно увидеть, что в случае б), когда
вершина v имеет в точности одного потомка, этот потомок
должен быть либо висячей вершиной, либо вершиной
229
с двумя пбтомками. Вновь введенный потомок
вершины w имеет в каждом случае брата с двумя
потомками (если он не является висячей вершиной).
Удаление вершины есть в любом случае удаление
висячей вершины, поэтому единственным осложнением
может быть лишь появление внутренней вершины без
потомков, т. е. висячей вершины на уровне выше
уровня остальных висячих вершин. В этом случае
применяется другой алгоритм упрощения.
Алгоритм упрощения при удалении
(в вершине v):
1. Если вершина v не имеет потомков, то удаляем
ее и применяем алгоритм упрощения к предку
вершины V.
2. Если вершина v имеет точно одного потомка,
то либо вершина v не имеет братьев, либо имеет хотя
бы одного брата.
а) Вершина v не имеет братьев. Если при этом
вершина v не имеет предка, т. е. является корнем, то
удаляем вершину v и делаем единственного потомка
вершины v новым корнем. В противном случае предок
вершины v имеет брата — вершину w с двумя
потомками w' и и>". Пусть w' будет ближайшим соседом v.
Тогда, если w" имеет двух потомков, то делаем
вершину w' братом v и применяем алгоритм упрощения
снова к вершине v. Если же вершина w" имеет
одного потомка, то тогда вершина w' должна иметь двух
потомков; дадим вершине w" в качестве
дополнительного потомка потомка .вершины w' и сделаем
вершину w' братом v. После этого применим алгоритм
упрощения снова к вершине v.
б) Если вершина v имеет брата w, то
преобразования нужны только в том случае, когда вершина w
имеет только одного потомка. Мы сделаем потомка
вершины w потомком вершины v, удалим вершину w
и применим алгоритм упрощения к предку вершины v.
Трудоемкость всех описанных алгоритмов равна
CKlogn), где п — число висячих вершин.
3.9. Бинарное дерево называется HS-деревом, если
справедливо следующее: все висячие вершины
находятся на одном уровне, и если вершина х имеет
только одного потомка, то этот потомок есть либо висячая
вершина, либо сам имеет двух потомков.
Очевидно, что каждое Яй-дерево является также
ffS-деревом, но обратное неверно. Алгоритм включе-
230
япя нового слова в Я^-дерево тот же, что и для НВ-
деревьев; алгоритм удаления несколько отличается в
деталях.
3.10. Бинарные деревья малой высоты.
АВЛ-деревья, балансированные по весу деревья, Я-деревья и
Яй-деревья могут рассматриваться, как деревья с
малой высотой, поскольку их высоты равны 1,44 log (n +
+ 2), 1,071 log (n + 1), 1,709 log n, 1,44 log (n +1)
соответственно. Но зачастую бывают нужны деревья как
можно меньшей высоты. Докажем существование для
любого е > 0 балансированных выровненных бинарных
деревьев с высотой (1 + е) log n + 1.
Напомним, что вершина vt называется
непосредственно правым (непосредственно левым) соседом
вершины Vo, если v„ и Vi — вершины одного и того же
уровня и вершина vt появляется непосредственно
справа (слева) от вершины v0 в графическом изображении
дерева, содержащего v0 и Vi в качестве вершин.
Для любого положительного целого к определим
класс /с-деревьев. Упорядоченное бинарное дерево
называется к-деревом, если:
а) все висячие вершины располагаются на одном
и том же уровне;
б) вершина v с одним потомком имеет по крайней
мере одного правого соседа и первые к правых
соседей (или все правые соседи, если их число меньше к)
вершины v имеют двух потомков.
f) 2-дерево ^ "
Рис. 4.34.
Замечание. Требование иметь хотя бы одного
соседа гарантирует отсутствие вырожденных деревьев
с единственной висячей вершиной.
Любое /с-дерево есть /с'-дерево для к' < к. 1-дере-
вья — это в точности Я-деревья. На рис. 4.34
изображены 1-дерево, 2-дерево и дерево, которое не
является /с-деревом ни для какого к,
231
Теорема 18. к-дерево высоты h имеет по
крайней мере Nk(h) висячих вершин, где
1, если h = 0;
Nh (h) = 2h~1 + 1, если А > 1 и 2л_а + 1< ft + 3;
(2 — 17(ft + 1))л_1 в остальных случаях.
Доказательство проведем индукцией по h. Ясно, что
теорема справедлива для й = 0 и й = 1. Если не
существует по крайней мере ft + 3 вершин на уровне
h > 2, то самое большее одна вершина на уровне h
имеет только одного потомка. Пусть h0 — наименьшее
число, такое, что 2 ° + 1 !>ft +3. (Отсюда, кстати,
следует, что й0^3 для каждого k>l.) Следовательно,
для каждого h«[2, ha] имеет место соотношение
Nh(h) > "f-1 + i.
Теперь докажем, что для всех h> h0 справедливо
неравенство Nh(h) > (2 - l/(fc + 1))"+ 1. Если ft = ft» 4-
h -a
+ 1, то из минимальности h0 имеем 2 ° +1 < к + 3.
Следовательно, 2 ° + 1< 2 (ft +1)4-1. Для Nkih)
вершин на уровпе h0 имеем
ft + 3 < 2h°~1 + 1 = Nh (h0) < 2 (ft + 1) + 1 = 2ft + 3.
Поэтому самое большее две вершины на уровне h0
имеют единственного потомка, откуда следует, что
минимальное число вершин на уровне ha + 1
удовлетворяет неравенству
W* (К + 1) > 2Nh (h0) -2 = 2 (2Л°-1 + .1) - 2 - 2ft° =
-=2"-1X2-l/(ft + I))*"1.
Рассмотрим теперь шаг индукции перехода от h к
/г+1.
Nh(h+ 1) > (наибольшее число вершин на уровней
с единственным потомком) + 2(наименьшее число вер-
'7Nh(h)-2\
шин на уровне h с двумя потомками) ^ I , , .— I +
+ 2 (к ^ТТТ-2 + l) = ^ W - 2] (2 - ^) + 3 >
>((2-^)--2)(2-/7±1) + 3 = (2-^Г-
-4 + гЬ + 3>(2--гтт,
232
и т. д. Включение повой вершины происходит с
помощью алгоритма /с-включения.
Алгоритм:
1. Если вершина v после включения новой
вершины имеет точно двух потомков, то никакие
преобразования не нужны.
2. Пусть v имеет трех потомков, тогда:
а) Хотя бы одна вершина из к левых или правых
соседей вершины v имеет точно одного потомка.
Берем одного из ближайших соседей с единственным
потомком и вызываем процедуру ПЕРЕБРОСА/, v).
б) Если ни одна вершина из к левых или правых
соседей не имеет точно одного потомка, то создадим
новую вершину v' с левым потомком вершины v в
качестве ее единственного потомка. Возможны два под-
случая: вершина v имеет или не имеет предка. Если
не имеет, то создадим новую вершину w в качестве
нового корня с потомками v и v'. В противном случае
подвесим v' в качестве нового потомка к предку
вершины v и применим алгоритм fc-включепия к
вершине — предку v.
Процедура ПЕРЕБРОСА, vz), вызываемая в
случае 2а), определена для двух вершин у, и у2, Vi Ф v2,
расположенных на. одном и том же уровне. Вызов
этой процедуры предполагает, что все вершины между
vt и Vz на том же уровне, что и vL, имеют двух
потомков, Vi имеет только одного потомка, вершина
v2 — трех.
процедура ПЕРЕБРОС^, у2);
1. начало
2. если vz — правый сосед вершины vt то
3. w := непосредственный правый сосед
вершины Vi\
4. иначе w := непосредственный левый сосед
вершины Vi\
Ъ. т::— потомок вершины w, являющийся
непосредственным соседом потомка вершины vs,
6. сделать г дополнительным потомком вершины yt;
7. если и>Фи2 то ПЕРЕБРОСА, v2);
8. иначе стоп;
конец
Удаление вершины есть удаление висячей
вершины. Для восстановления структуры ^-дерева
используется алгоритм й-удаления (в вершине у).
233
Алгоритм:
1. Если вершина v не имеет потомков, то удаляем
ее и применяем алгоритм /е-удаления к предку
вершины V.
2. Если вершина v имеет одного потомка, то
возможны два случая:
2.1. Одна вершина из к левых или правых
соседей вершины v имеет одного потомка. Находпм
вершину и' с единственным потомком, который является
ближайшим соседом такого вида. Вызываем процедуру
ПЕРЕБРОС^', v), удаляем v и применяем алгоритм
/с-удаления к предку вершины v.
2.2. Ни один из к левых или правых соседей не
имеет в точностп одного потомка. Здесь возможен
целый ряд вариантов:
2.2.1. Вершина v имеет по крайней мере одного
правого соседа; преобразования не нужны.
2.2.2. Вершина v не имеет правого соседа. Здесь
также возможен ряд вариантов:
2.2.2.1. Если вершина v не имеет левого соседа, то
удаляем v и берем единственного потомка вершины v
в качестве нового корня.
2.2.2.2. Вершина v имеет по крайней мере одного
правого и самое большее к ^ 1 левых соседей. Пусть
v' — непосредственный левый сосед вершины v.
Сделаем правого потомка вершины и' левым потомком
вершины v, так что у v теперь два потомка.
2.2.2.3. Вершина v имеет по крайней мере к + 1
левых соседей. Пусть w есть к + 1-й левый сосед
вершины v. Имеют место две возможности:
а) Вершина w имеет только одного потомка. В этом
случае вызываем процедуру ПЕРЕБРОСЕ, v),
удаляем вершину v и применяем алгоритм /с-удаления к
предку вершины v.
б) Вершина w имеет двух потомков. Пусть v' —
непосредственный левый сосед вершины v. Сделаем
правого потомка вершины v' левым потомком
вершины V.
Трудоемкость алгоритмов включения и удаления
вершин для А-дерева высоты h пропорциональна его
высоте h.
Теорема 19. Для каждого г > О существует
такое к, что класс k-деревъев есть класс
балансированных бинарных деревьев высоты ^(1 + е) log n + 1, где
п — число висячих вершин.
234
Доказательство. Из описания алгоритмов
видно, что класс А-деревьев есть класс балансированных
бинарных деревьев для каждого к. Остается показать, что
можно выбрать к подходящим образом. Выберем к >
S* 1/(2 —21/<1+|!)) — 1. По теореме 18 для А-деревьев
высоты hen висячими вершииами и к+ 1^=1/(2 —
-2,/(1+г>) имеем (2 - 1/(к + l))""1 < и, т. е. Л-К
«Slog«/log (2-l/(A;+l))=s: logn/log21/(1+8)=(l + e)logn.
Теорема доказана.
В заключение приведем высоты А-деревьев для
малых значений к. Заметим, что для к > 2 высоты
меньше, чем высоты любого известного ранее класса
балансированных бинарных деревьев (табл. 4.4).
Таблица 4.4
h
1
2
3
4
(Высота ft-дерева)—1
1,71 log n
1,36 log n
1,24 log га
■ 1,18 log n
h
5
9
99
(Высота ft-дерева)—1
1,14 log n
1,08 log n
1,01 log n
3.11. Выровненное дерево называется т-арным
выровненным деревом, если оно удовлетворяет
следующим условиям:
а) каждая вершина имеет не более т потомков;
б) каждая вершина, кроме корня и висячих
вершин, имеет не менее т/2 потомков;
в) корень, если он не является висячей вершиной,
имеет не менее двух потомков.
При добавлении новой висячей вершины может
появиться вершина с т + 1 потомками. В этом случае
она расщепляется на две вершины, у каждой из
которых либо по ((/?г + 1)/2) потомков, если т нечетно,
либо у одной L(m+l)/2] потомков, - а у второй
[(т + 1)/2] + 1. Если у предка расщепленной
вершины менее ((т+1)/2) потомков, то процесс включения
новой вершины заканчивается; в противном случае
процедура расщепления продолжается. Если
расщепляемая вершина есть корень, то образуется новый
корень, потомками которого становятся новые вершины.
Пример включения повой вершины в 5-арное
дерево показан на рис, 4.35.
235
Удаление вершины происходит также на уровне
висячих вершин. Если при удалении вершины у ее
предка остается менее т/2 потомков, то
вершина-предок сливается с одним из своих братьев (либо с
ближайшим справа, либо с ближайшим слева). Если
получившаяся после слияния вершина имеет более т + 1
потомков, то она расщепляется, как это делается при
Рис. 4.35.
включении новой вершины. Так как при слиянии
вершин может возникнуть вершина с малым числом
потомков на более высоком уровне, повторяется
процедура слияния, и т. д.
Пример удаления вершины из 5-арного дерева
показан на рис. 4.36.
3.12. Плотные т -арные деревья. Вершина v с
единственным потомком от называется унарной, вершина
с двумя потомками — бинарной; вершина, имеющая
наибольшее возможное число потомков т или
являющаяся висячей, называется насыщенной; в противном
случае о ней говорят как о ненасыщенной.
m-арное дерево Т называется r-плотным, где г —
натуральное число, ге[1:/п —1], если выполнены
следующие условия:
а) корень дерева Т по крайней мере бинарен;
б) каждая ненасыщенная вершина, отличная от
корня, имеет не менее г насыщенных братьев;
в) Lee висячие вершины, располагаются на одном
уровне.
Сформулируем некоторые следствия из данного
определения.
236
Следствие 1. Если вершина v есть
единственный потомок своего предка — вершины <pi>, то она
должна быть насыщенной.
Следствие 2. Если вершина v имеет к потомков,
ке[2:т],'то существует самое большее одна
ненасыщенная вершина среди этих потомков при k^r и
не менее г насыщенных потомков при k^r+.i.
Рис. 4.36.
Класс то-арных деревьев называется плотным, если
он представляет собой класс г-плотных то-арных
деревьев для некоторого г.
Мы будем говорить о слабо плотных то-арных
деревьях, если имеем в виду класс 1-плотных деревьев,
и о сильно плотных wi-арных деревьях, если имеем в
виду класс m — 1-плотпых деревьев. Заметим, что
существует только один класс плотных бинарных де.-
ревьев и он совпадает с классом братских деревьев, или
#Б-деревьев. Существуют два класса плотных 3-арных,
или тернарных деревьев. На рис. 4.37 показаны два
тернарных дерева; первое представляет собой пример
сильно плотного, а второе — слабо плотного
тернарного дерева. Оба имеют по И висячих вершин.
Заметим, что для данной высоты h полное яг-арноо
дерево, т. е. дерево, в котором каждая внутренняя
вершина имеет m потомков, имеет наибольшее число
висячих вершин среди всех г-плотных то-арных деревьев
высоты h.
Пусть Th есть г-плотное то-арное дерево высоты h
с наименьшим возможным числом висячих вершин и о
237
насыщенным корнем. Тогда дерево Ти+г получается
(с точностью до симметрии) из те — г копий дерева Тк и
г копий дерева 7\+1, как показано на рис. 4.38. Кроме
того, Г0 есть дерево, состоящее из одной вершины,
a Ti имеет вид, показанный на рис. 4.39.
m -г г
Рис. 4.38.
Это дает следующее рекуррентное соотношение для
числа /mi„(r, те, К) висячих вершин r-плотного те-арно-
го дерева Th:
LinO, те, h + 2) =
= (те — r)lmln(r, m, h) + rlmia(r, те, h+i),
Linir, m, 0) — 1, Zmin(r, m, 1) = те. (4.34)
Так как корень r-плотного те-арного дерева должен
быть по крайней мере бинарным, то r-плотное
/га-арное дерево высоты h с
наименьшим возможным числом
висячих вершин должно иметь вид,
показанный па рис. 4.40.
Поэтому r-плотное /га-арное
дерево высоты h > 1 имеет по
крайней мере Lmla(r, m, h)
висячих вершин, где
Л
/м
/;>!
Рис. 4.40.
Ашп {г, m, h) =
12, если h = 1;
^ Umin (''i m-x h — 1) + 1шт (ri m1 h — 2)j если h > 1.
238
Для того чтобы решить соотношение (4.34),
заметим вначале, что 1тш(г, т, h)=ah+i, где ап =
= Ы — г)ап-г + га„-1, п > 2, аа = 1, а{ = 1. Используя
известные методы решения рекуррентных соотношении,
получим решение соотношения (4.34) в виде
ап = A&i + 42сс",
где а1 = (1/2)(г+У4(та-г) + г2), а, = (1/2)(г-
- У4(то - г) + г8) А = (1 - а,)/^ - а2), i2= («! - 1)/
/(«1 — а2).
Для всех Л > 1 имеем
Anin (^ то, h) = ah + аЛ_! =
«= (Л^^/а!) cc'i + (Л8.Л2/а2) a J.
Отсюда вытекает, что для специального случая
бинарных деревьев {т — 2, г— 1)
1 -■- УЪ 1 - Т/5
«1 = 2 ... а2 = —т^.
. _ 1 14-1/5 . 1 1 - УГ
Л1-уТ 2—' Л2==_уГ ~'
п, следовательно, минимальное число висячих вершин
в братских деревьях высоты h равно приблизительно
1,171 • (1,618)".
Далее, слабо плотное тернарное дерево (то = 3,
г = {) высоты h имеет не менее 2" висячих вершин,
а наименьшее число висячих вершин сильно
плотного тернарного дерева (то = 3, г = 2) равно
Апш (2, 3, h) _ № ((1 + /2 У - (1 - /2)Л).
Заметим, что число висячих вершин сильно
плотного то-арного дерева высоты h пропорционально (то — 1)\
В этом случае г => то — 1 и, следовательно, 1а2|<1,
a ai приблизительно равно то — 1 (для больших то).
Библиографический комментарий
Первой работой, посвященной оптимальным нумерациям ор-
дерева — укладкам, является заметка А. П. Ершова [28],
изданная в 1958 г. Его метод был переоткрыт другими авторами,
изложен на языке теории графов Р. Редшеёвским и стал широко
известен благодаря переводу работы последнего на русский
язык [71]. Доказательства теорем 1 и 2 могут быть найдены
в этой работе (см. также [25]). Оптимальная укладка взвешен-
239
ного дерева рассматривалась в работе [79], развитие в сторону
введения регистровой памяти для организации вычислений было
сделано Р. Сети и Дж. Ульманом. Подробнее об этом см. в
главе 6. Алгоритм построения оптимальной по длине укладки
ордерева излагается по работе М. А. Шейдвассера [85], алгоритм
укладки неориентированного дерева — по работе М. А.
Иорданского [36] (см. также [34]). Вывод оценок для длины и
ширины ордерева можно найти в [86]. Точное решение эадачи об
укладке неориентированных деревьев достаточно сложно. Один
из первых результатов относится к 1971 г., когда в работе [64]
был предложен метод ветвей и границ, затем в 1973 г. был
применен метод последовательного анализа вариантов с
экспоненциальной трудоемкостью [16].' Точное решенпе с трудоемкостью
0(л3) было дано в 1976 г. в работе [21)- Пока неизвестно,
существует ли точный алгоритм с мепынеп трудоемкостью. Что
касается приближенных методов, то в работе [86] с помощью
минимальных укладок корневых ориентированных деревьев
удалось получить приближение к оптимальному решению не хуже
чем в два раза. Трудоемкость соответствующего алгоритма не
более О (я2 log л). Поскольку оптимальные нумерации таких
деревьев являются плоскими, то, как показано в [18],
эффективность поиска приближенного решения можно увеличить в п раз,
используя предложенный в [17] алгоритм построения
минимальной плоской укладки деревьев. Наконец, в [36] был
предложен алгоритм построения плоских минимальных укладок с
трудоемкостью О (л), и там же было показано, что
минимальная длина укладки в классе плоских укладок превосходит
соответствующую величину в классе всех укладок не более чем в
полтора раза (предварительное сообщение об этом алгоритме
было дано в [35]). Построение оптимальных по числу соседней
связности укладок деревьев и бесконтурных орграфов
излагается по работе [50].
Алгоритм К построения оптимальных бинарных деревьев
был разработан Д. Кнутом в 1971 г. и позднее вошел в его
книгу [48], в соответствии с которой и излагается здесь.
Описанный в п. 2.3 алгоритм построения почти оптимальных деревьев
принадлежит Б. Бруно и Э. Коффману [105], top-down-алго-
рптм —Ё. Нисикаве, Ё. Ёсиде и Т. Фукумуре [140].
Приводимый в п. 2.4 анализ принадлежит Ю. Нивергельту и К. Вонгу
[139], оценки для балансированных деревьев принадлежат
К. Мельхорну [134] и П. Байеру [99], пример того, что
правило 1 строит «плохие» деревья, принадлежит К. Мельхорну.
Первая эвристика построения динамических деревьев
принадлежит Дж. Баеру [95], вторая, приводящая'к классу деревьев
Z?i/3, — К.. Унтерауэру [159]; упоминаемые на шаге 5 алгоритма
вспомогательные действия по восстановлению структуры
дерева из класса Bi/3 представляют собой алгоритм М. Фредмана
[113], Что касается остальных помещенных в § 2 алгоритмов и
результатов, то за ссылками на литературу мы отсылаем к
обзору автора [26]. Построение оптимальных каркасов,
требующее полного перебора, дано в соответствии с работами Г58,
59, 73].
За ссылками на литературу к § 3 мы также отсылаем к
обзору [26], указав только на доступные работы по отдельным
классам деревьев. Это работы [2, 48, 55] (АВЛ-деревья), [7]
(2-3-деревья), [48, 72] (5-деревья), [72] (55-деревья).
ГЛАВА 5
РАЗРЕЗАНИЯ И РАСКРАСКА ГРАФОВ
§ 1. Разрезания графов
1.1. Постановка задачи. Пусть задан взвешенный
граф G — (X, U), \Х\ = п, вершины vt и дуги иц
которого имеют веса с, и сц соответственно, и пусть задан
набор чисел imj, mk>0, k&iiiri. Требуется найти
разрезание ЖХ) = (X,, ..., Хк) графа на к кластеров —
подграфов <Xft>, для которых выполнены следующие
условия:
а) Х= U Xh, Xif] Xi=01 1ф]\ (5.1)
б) С'м= 2 et^mh, A = l, ..Mr; (5.2)
г
в) 2 .2 си -»- тах (5.3)
или
г) 2 2 2 cy->min. (5.4)
Ограничение (5.2) может иметь вид
Ст = М, (5.2а)
Ст^М, (5.26)
С<»> = отк, (5.2в)
C(t|eU,B], (5.2г)
Задача о разрезании во многом аналогична
известной в исследовании операций одномерной задаче о
рюкзаке. Пусть рюкзак альпиниста вмещает М
килограммов груза, и пусть имеется набор различных
Предав В. А. Евстигнеев 241
метов, которые он хотел бы взять с собой. Каждый
предмет, кроме веса, характеризуется еще некоторой
ценностью,--а сумма весов всех предметов превышает
М. Математическая постановка задачи следующая:
Пусть с, — вес предмета t<=ll:n], wt — ценность
предмета t, M — емкость рюкзака. Максимизировать
п ' п
2 wtlt при условии 2 cfYi ^ ^h где
(=1 i=l
1, если предмет t находится в рюкзаке;
О, в противном случае,
Задача о разрезании графов может рассматриваться
как обобщение этой задачи, а именно как задача о
размещении связанных между собой предметов с
заданными весами по нескольким рюкзакам или кластерам,
каждый из которых имеет емкость М.
Задача о разрезании графа (бесконтурного
ориентированного) на минимальное число частей сводится к
задаче целочисленного программирования. Пусть п —
число вершин в графе, q — число кластеров,
полученных после разрезания (заметим, что значение q до
решения задачи неизвестно). Пусть, далее, Шц — число
дуг, ведущих из кластера Х( в кластер X) и наоборот;
М — заданная константа. Введем переменные *{а'
(1, если вершина у4 включена в кластер Xj)
1 [0 в противном случае.
Задача оптимального разрезания состоит в
нахождении двоичных Yfj, таких, что выполняются
ограничения
п q
t=i j=i
(5.5)
и таких, что функционал
п п q
J = 2 2 mih 2) YwYaj (5.6)
достигает своего минимума. Ограничения (5.5), так же
как и (5.2), могут иметь различный вид.
1.2, Разрезом R(XU X2) в неориентированном графе,
разделяющим вершины а и Ь, называется множество
ребер вида (х, у), где х^Хи у&Хг, удаление которых
разбивает граф по крайней мере на две компоненты
242
Ъ
связности Ga и Gb, причем a^Ga, & е Gb. Разрез
называется собственным, если ни одно его собственное
подмножество разрезом не является.
Разрезом R{Xa, Хь) в ориентированном графе
G(X, U), разделяющим вершины а и Ъ, называется
множество дуг вида (х, у), где х е Ха, у е Хь, такое,
что любой путь из flsX, в Ъ е Хь содержит по
крайней мере одну дугу из R(Xa, Хь).
Пусть дан орграф со взвешенными дугами, и пусть
dj — вес дуги иц. Величиной разреза R(XU X2)
называется сумма весов входящих в него дуг.
Минимальным разрезом, разделяющим вершины а и Ъ,
называется разрез минимального веса, разделяющий эти
вершины. Задача отыскания для заданных вершин а и Ъ
минимального разреза, разделяющего их, сводится к
отысканию максимального потока по сети с входом а,
выходом Ъ и весами Сц, взятыми в качестве
пропускных способностей дуг. Положив все cfl равными 1, мы
можем найти разрез с наименьшим возможным числом
дуг. Для неориентированных графов задача решается
аналогично.
3 а м е ч а н и е. Ранее мы ввели понятие
минимального потока в сети с ограничениями на величину
потока снизу. Нетрудно внести соответствующие
изменения в определение, чтобы получить определение
максимального потока, т. е. потока с наибольшей
возможной величиной, удовлетворяющего ограничениям на
величину потока по дуге сверху.
Выделение блоков в графе и нахождение
минимального разреза представляют задачу разрезания
графа в ее «естественном виде», т. е. когда кластеры
определяются структурой графа и ничем более.
1.3. Разрезание деревьев методом динамического
программирования. Алгоритм предназначен для
решения задачи (5.1), (5.26), (5.4), т. е. задачи:
Найти разбиение вершин дерева Т{Х, U), каждая
из которых имеет вес d, на к кластеров Хи ..., Хк
таких, что
X>=UXU Xi(\XJ = 0, i^jl (5.1)<
i=l
2 q<A/, (5.26)?
fc-l h
Hi 2 2 Cij-vmin. (5.4)'
16* 243
Для представления разбиения будем использовать
списки вершин кластеров. Каждый кластер,
образованный при разбиении дерева Т, представляет собой либо
поддерево, либо лес, т. е. несвязный граф, каждая
компонента которого есть дерево. Однака мы ограничимся
такими разбиениями дерева Т, у которых каждый
кластер представляет собой поддерево. Это ограничение
не слишком сильное, так как кластеры оптимального
разбиения любого связного графа могут быть
модифицированы путем образования из каждого кластера
нового множества кластеров, каждый из которых
представляет собой связный подграф. Так как исходное
разбиение было оптимальным, а новое разбиение имеет
вес не больше исходного, такая модификация приводит
снова к оптимальному разбиению, в котором каждый
кластер соответствует связному графу.
Для удобства обозначений превратим Т в
ориентированное упорядоченное дерево Г', как это показано
на рис. 5.1. При этом вершина i>( становится корнем
(будем считать, что вершина v{ имеет номер £), а
потомки каждой вершины, включая корень,
упорядочиваются слева направо в порядке возрастания пх
номеров.
Рпс. 5.1.
Динамическое программирование дает возможность
использовать основное свойство дерева, а именно его
ацикличность, для нахождения глобально
оптимального разбиения на основе локальной информации.
Алгоритм порождает оптимальное разбиение дерева Т'
путем нахождения разбиений все увеличивающихся по
размеру поддеревьев дерева Т', пока не будет разбито
само дерево Т'.
Первый шаг в алгоритме разбиения состоит в
генерировании тривиального разрезания висячих вершин
244
дерева Т'. Потом формируется множество вершин
в дереве Т', у которых все поддеревья уже разрезаны.
Предположим, что в этом множестве есть вершина х.
Шаг 1. Найти разрезание поддерева Т^х),
образованного вершиной х и её" первым поддеревом.
Шаг 2. Комбинируем это разрезание и
разрезания второго поддерева вершины х для создания
разрезания поддерева, образованного вершиной а; и ее
первыми двумя поддеревьями.
Шаг 3. Комбинируем разрезания, полученные на
шаге 2, с разрезаниями третьего поддерева вершины х
для создания разрезания поддерева, образованного х
и первыми тремя поддеревьями.
Шаг 4. Продолжаем эту процедуру до тех пор,
пока не будет разрезано все дерево с корнем в
вершине х.
Если в результате разрезания дерева с корнем в х
окажется, что предок х становится вершиной, у
которой завершено разрезание всех ее поддеревьев, то
добавим эту вершину к нашему множеству.
По окончании разрезания дерева с корнем в
вершине х удалим х пз множества вершин W,
обладающих тем свойством, что все их поддеревья разрезаны.
Выбираем другую .вершину из W и разрезаем
соответствующее поддерево. Как 'только множество W будет
исчерпано, алгоритм заканчивает свою работу:
оптимальное разрезание получено.
Прежде чем этот алгоритм рассматривать
практически, нужно найти некоторый эффективный метод
получения разрезаний поддерева, состоящего из
.вершины w и ее первых i+1 деревьев, из имеющегося
разрезания поддерева, образованного этой вершиной
п ее первыми i поддеревьями, и известного к этому
моменту разрезания z'+.l-го поддерева. Заметим, далее,
что число разрезаний поддерева может быть очень
велико. Например, .рассмотрим дерево, состоящее из
вершины, все поддеревья которой суть висячие
вершины. Число разрезаний этого дерева, при которых
соблюдены ограничения на вес и связность, равно
2j [ 4 к гДе " — число вершин в дереве, а М — ог-
раничение на вес кластера. Для М > nil эта граница
растет, как 2Л. Поэтому при решении задачи нужно
удалять большое число разрезаний каждого дерева.
245
Рассмотрим некоторое поддерево Ti(w) дерева 7"
на рис. 5.2, состоящее из вершины w и ее первых I
поддеревьев. При доказательстве оптимальности мы
покажем, что нужно провести максимум М разрезаний
Tt(w) в процессе работы алгоритма. Если с — вес
вершины w, то множество разрезаний есть w{'\ £<=[c, Ml,
Корень дерева Т'
Первый
потомок
корня
Поддерево
Последний
потомок
^ корня
Поддерево Тг«., (и>)
Поддерево T(v)
Рис. 5.2.
где каждое разрезание w{'} отличается от других
разрезаний поддерева Tt(w) следующими свойствами:
1. Разрезание w{l) есть разрезание поддерева Ti(w),
для которого вес кластера, содержащего вершину w,
равен i.
2. Разрезание wu) есть разрезание с наибольшим
весом среди всех разрезаний, обладающих свойством 1.
Рассмотрим метод генерирования разрезания
поддерева Tt+iiw) для данных разрезаний поддеревьеи
Tilw) и T{v), где вершины- поддеревьев Ti(w) и Т(и)
заключают в себе вершины поддерева Tl+t{w).
Рассмотрим два поддерева Tt(w) и T(v) на рис. 5.2 и
будем считать, что их разрезания уже известны. Чтобы
получить разрезание поддерева Ti+i(w), получающегося
в результате склейки деревьев Tt(w) и T(v), будем
использовать две операции:
1. Склеивание кластеров разрезания подграфа Т<(ш)
с кластерами разрезания подграфа T(v) с помощью
слияния вершин в кластерах, содержащих вершины
w и v, в один кластер.
246
2. Склепваппе кластеров w{i) n v0).
Заметим, что любая другая комбинация разрезаний
ц>"> и va) нарушает ограничение на связность.
Будем использовать обозначение C{wl", v{1)] для
разрезания, получающегося в результате применения
первой операции. Вес кластера разрезания C[wu\ vU)],
содержащего вершину w, равен i + j, а величина
разрезания есть сумма величин wU) и vU) и веса дуги
(vt, Vj). Разрезание, получаемое в результате второй
операции, может обозначаться подобным же образом,
если мы определим vw как разрезание поддерева T(v),
которое имеет наибольшую величину среди всех
разрезаний T(v). (Если вторая операция использовалась
для комбинации w{'} с любым разрезанием v{'\
результирующее разрезание никогда не будет иметь
величину, большую чем С[ш{", у(0)]. Таким образом, мы
рассматриваем только комбинации C[w(,), vi0}] с другими
разрезаниями при формировании некоторых й/(",
используя вторую операцию.) Тогда C[w{l)t, vw]
изображает разрезание поддерева Tt+l(w), у которого кластер,
содержащий вершину w, имеет вес i и величина
которого равна сумме величин ю{г) и v{"\
/к
Пусть
Тогда
ф(12), 7(1,]=(
ф<12>. 7(0)]=(
Л
V
*Чч)Ы
,(Ю) ( Л
7- "8. "4)(1'г)(с
v&, ч)Ы)Ы)(
=1для всех i
=1для всех (
3.
) Ы) U).
з)(юо)(гб).
Вб) \В1< V2J-
i
г' 3
Ф(12))=
l(7(11))=
ф(0>)=>
l(c[8(12),
l(C[8(12),
lv
0,
7<чн
7(0,])=2.
Рис. 5.3.
Заметим, что мы сделали предположение о цело-
численности весов' всех вершин в дереве Т и,
следовательно, в дереве Т'. Поэтому разрезание гощ
поддерева Ti+1(w) выбирается из множества {Ciw{i), y(fe_1,J,
247
C[wm, у**--»], .... C[u>(*-f), p'0], Clwm, vw]), где пред^
полагается, что вершины w и v имеют единичные веса
(рис. 5.3). Разрезание C[wM, vm] с наибольшей
величиной из этого множества берется в качестве wm.
Перейдем к описанию алгоритма. Пусть piv) есть
разрезание поддерева Tt(v) с корнем v, содержащего i
первых поддеревьев вершины v в качестве своих
поддеревьев, Lip, v) — величина разрезания piv).
Алгоритм:
Вход: Дерево T=iV, Е), целочисленные веса civ)
его вершин, веса с[е) дуг, ограничение М на вес
кластера.
Выход: Разрезание дерева на к кластеров, вес
которых не превышает М.
начало
1. занумеровать вершины дерева Т в произвольном
порядке;
2. образовать ориентированное упорядоченное
дерево Т' с корнем в вершине vt;
3. для всех висячих вершин i\ цикл
4. начало
5. p(vt) := (v<); tw :-im :-W;
6. Lip, »,):=-0; Ш"):=Ш(0,);=0;
7. конец цикла;
8. для каждой внутренней вершины v{ цикл
9. начало
10. p(Vi) := iv,); i"> := (v,);
11. L(p, i;,): = l; LU<"):=0;
12. конец цикла;
13. ^сформировать множество W вершин, для
поддеревьев которых получены оптимальные разрезания;
примечание на данном шаге в это множество
входят лишь те внутренние вершины, у которых
потомки суть висячие вершины конец примечания
14. для Xt^W пока W не пусто цикл
15. начало
16. для всех и>к<=Гх{ цикл
17. начало
18. для / от с{х{) до М шаг 1 цикл
19. начало
20. образовать множество разрезаний х^=С\ха,
Уъ) = [С[№, ки~е)], С[#<+», fcf*-c-"], ..., C[i«\ k<0)\\
с помощью операций, описанных выше;
248
21. выбрать разрезание х, из С[х„, у А с
наибольшей величиной L{x{1));
22. конец цикла;
23. для /' от c(xi) до М шаг 1 цикл
24. начало
25. Й»:-*(,я;
26. £(ДО)1-£(*{Л);
27. конец цикла;
примечание обновление разрезаний
осуществляется только после завершения всех итераций по /
конец примечания
28. im := разрезание иэ множества разрезаний с
наибольшей величиной;
29. конец цикла;
30. удалить потомков вершины xt из дерева Т'\
31. удалить вершину а?( из множества W;
32. если для всех поддеревьев вершины — предка
вершины Xi получены оптимальные разрезания то
включить предка вершины х{ в множество W; ■
33. конец цикла;
34. г(0) есть оптимальное разрезание дерева 7";
конец
Покажем, что полученное разрезание оптимально.
Рассмотрим некоторое оптимальное разрезание q
дерева Т'. Предположим, что каждый, кластер разрезания
q содержит связное поддерево дерева Т'. Разобьем все
кластеры на три группы:
1. Кластеры, соответствующие поддеревьям, корни
которых суть первые i потомков некоторой вершины и>.
2. Единственный кластер, который содержит
вершину w.
3. Все остальные кластеры.
Приступим к удалению из кластеров разрезания q
вершин (исключая вершину w), которые не
принадлежат поддереву с корнем, являющимся одним из
первых I потомков w. Получившиеся кластеры
представляют собой разбиение w поддерева Tiiw) на рис. 5.2.
Мы теперь утверждаем, что если кластер на и>,
содержащий вершину w, имеет вес /, то величина w равна
величине разрезания wa).
Предположим, что величина разрезания w меньше,
чем величина разрезания wU), Создадим разрезание р,
249
величина которого превышает велпчпну разрезания на
то же число, на которое величина разрезания w(,)
превышает w. Далее:
а) Сделаем кластеры разрезания р, содержащие
вершины вне поддерева ГДи>), равными кластерам
разрезания q из третьей группы.
б) Добавим оставшиеся вершины дерева 7", т. о.
вершины вне кластера из w или вершины одного из
кластеров третьей группы разрезания q, к кластеру,
содержащему вершину w. Заметим, что эти вершины
суть в точности вершины из единственного кластера,
представляющего вторую группу разрезания, не
находящиеся в поддереве Tt(w).
Ясно, что q не может быть оптимальным, если w
со величине не равно wU).
Наконец, оптимальное разрезание 7", кластеры
которого образуют связные подграфы, никогда не может
быть образовано из некоторого разрезания w поддерева
Ti(w), если w обладает следующими свойствами:
1) его кластер, содержащий вершину w, имеет
вес /;
2) его величина меньше, чем величина
разрезания ю{'\
Мы можем тогда игнорировать все такие
разрезания при генерировании оптимального разрезания
дерева 7".
Рассмотрим число шагов, требуемых для
формирования всех возможных разрезаний при
комбинировании поддеревьев TAw) и T(v) на рис. 5.2 для создания
разрезаний поддерева Ti+i(w). Существует самое
большее М разрезаний дерева Ti+i(w), представляющих
множество оптимальных разрезаний wa). Каждое из таких
разрезаний выбирается из максимум / разрезаний
C[w„, vb], где a + b—j и a>i, b>0. Наибольшее
число разрезаний, которые должны быть рассмотрены при
формировании wU), определяется суммой 1 + 2 + 3 + ...
... + М = М(М + 1)/2.
При формировании оптимального разрезания дерева
Т' требуется скомбинировать разрезания некоторого
поддерева Tt(w) с разрезаниями некоторого поддерева
T(v) по одному разу для каждой дуги в дереве. Так
как дерево с п вершинами имеет п — 1 ребер,
вычислительная сложность алгоритма пропорциональна М2п
и не зависит от структуры дерева,
250
Пример. Пусть дерево, показанное на рис. 5.4,я,
требуется разрезать на кластеры, вес которых не
превышает трех. Вес каждой вершины равен одному, веса
Рис. 5.4.
ребер указаны на рисунке. Ориентированное
упорядоченное дерево Т', получающееся из дерева Т,
показано на рис. 5.4, б. Проиллюстрируем шаги
формирования оптимального разрезания в соответствии с
алгоритмом.
Начальные значения:
1(|) = 0;,),
2<" = (у2),
3<') = 3(0, = (у3),
4<» = 4(0) = (у4),
5(1> = 5(0> = (уД
Ш(1))=0,
L(2(1>) = 0,
ШС0)) = 0,
Ш(0,) = 0,
L(5<0)) = 0.
Формирование разрезания поддерева с корнем в
вершине vz:
Первая итерация:
2«> = С[2(1), 3<0)] = (у2)(у3)* с величиной L = 0.
Данное разрезание единственное; оно и берется в
качестве оптимального • разрезания из семейства
C[wa, Vbl = wU), (В дальнейшем выбираемые
разрезания будут отмечаться звездочкой.)
C[2W, 3(1)] = (у.2, у3)* с величиной = 4,
С[2 \3 ] не существует^ так как
не определено 2(2).
После завершения первой итерации полагаем:
2(1, = (r2)(L'3), 2<2, = (y2, v,).
251
/.= 12
з5 )Стоимость=3
Вторая итерация:
2(1) = С [2(1), 5(0)] = (у2) (ра) (у5)* с величиной = 0;
С[2а\ 5())] = (v2, vb) {v3)* с величиной •= 6,
С [2(2), 5(0)] — (гл,, v3) {vb) с величиной = 4;
С [2(1\ 5(2)] не существует, так как
5<2) не определено,
С[2<2\ 5(1)] = (у2, у3, у5)* с величиной = 10,
С [2(3), 5(0)] не существует, так как
2(2) =
)(3)
-,(3)
не определено.
После завершения второй итерации полагаем:
2(0) = (v2, v„ vt), L(2(0)) = 10,
2(,, = (y8)(i;,)(i;,)) L(2(1>) = 0,
2(2) = (i;2, v.Xi;,), L(2(I>) = 6,
2(3) = 2«»i L(2(3)) = 10.
Формирование разрезания поддерева с корнем в
вершине VU
Первая итерация:
1(1> = С [l(1)5 2(0)J = (Vl) (i7S) va, vb)* с величиной = 10;
'C[l(1), 2(1)] = (ylf v2)(va, p6)* с величиной = 3,
^^(2)^2<o)] не определено, так как
не определено l(2)j
С [1(1), 2(2)] » (у,, у,, wj) (у,)* с величиной = 9,
С [l(2)j 2(1)] не определено2 так как
не определено 1(2),,
C[l(s)j 2(0)] не определено, так как
не определено 1(3).
|(21 _
1(Я) =
После первой итерации полагаем:
1
en
(vt)(vt, Vi, vt), lm = {vu v2)(v3, vt),
l!3' = (i;3, y„ Vi){v3).
252
Вторая итерация:
1<« = С [1(1), 4(0)] = (Vl) (v2, v3, vb) (vj* с величиной = 10;
C[l(1), 4fl)] = (vl v4)(v2l v9, vb)* с величиной = 12;
С [l(2), 4(0)] = fa, vt) fa, v6) fa) с величиной = 3;
не определено! так как
не определено 4(2),
_ С [l(3), 4(1)] = fa, va, vt) fa, уа) с величиной = 5,
С [i(3\ 4(0)] = fa, v„ vb) fa) fa)* с величиной = 9.
После завершения второй итерации полагаем:
1(1>-(i>i)(i>», i>„ vtUvJ, L(l<") = 10,
^'-(р., p4)(w», p., p.), Ш(2)) = 12,
lt3) = Су1? i>„ p.Xv.Ki^), L(l^») = 9,
Поэтому оптимальное разрезание данного дерева
(рис. 5.4, е) имеет вид
l(0)-=fa, iO(v„ i>„ p,), L-12.
1.4. Разрезания графов общего вида. Наложим
некоторые ограничения: вершины графа должны иметь
неотрицательные целочисленные веса с,, веса ребер
должны быть положительны, все рассматриваемые
графы должны быть связны. Для несвязного графа все
компоненты связности разрезаются независимо.
Последнее ограничение состоит в том, что мультнграфы
должны преобразовываться в графы с помощью процедуры:
все параллельные ребра между вершинами хну
заменяются одним ребром, вес которого равен сумме весов
исходных ребер.
Применим метод динамического программирования.
Занумеруем вершины графа в произвольном порядке.
Исходя из этой нумерации вершин, будем считать, что
/-й шаг процесса разрезания порождает допустимые
разрезания подграфа, порожденного всеми теми
вершинами, номера которых не больше /. Эти разрезания
соответствуют состояниям /-го шага. Разрезания на
7-м шаге порождаются разрезаниями, полученными на
/ — 1-м шаге, путем добавления вершины с номером /
к этим разрезаниям с учетом весовых ограничений.
f(8) __
253
Метод решения состоит в определении, к каким
кластерам, полученным на / — 1-м шаге, может быть
добавлена вершина с номером / так, чтобы в итоге были
получены допустимые разрезания /-го шага.
Определим к-смежность вершины Vj как допустимое
разрезание, порожденное на /-м шаге, которое
включает в себя кластер, содержащий вершину vt и
имеющий вес к. Пример 2-смежности вершины vk показан
на рис. 5.5, а. Рис. 5.5, б показывает, что й-смежность
вершины определяется неоднозначно.
я) Ь5 i^S 6)
Рпс. 5.5.
Допустимым разрезанием графа G называется
разрезание, кластеры которого удовлетворяют условиям:
а) сумма весов вершин в кластере не превосходит
весового ограничения М;
б) вершины кластера порождают связный подграф.
В процессе разрезания связного графа будут
рассматриваться только допустимые разрезания.
Связным множеством для вершины V) называется
такое множество вершин, что если,одна или более
вершин из этого множества встречается в,кластере
разрезания, порожденного на /—1-м шаге, то
гарантируется, что добавление вершины vs к такому кластеру
может на шаге m>j привести к образованию связного
подграфа.
Связное множество для вершины vs обозначим через
&(]). Вершина v(, входящая в связное множество ®Ч/),
обладает свойствами:
1. i</.
2. Вершина v{ либо смежна с вершиной vu либо
лежит на пути [уь vtv L>L,, ..., vtr, Vj], причем ^Ct^AI
и t s {i, tu t2, ..., tT, />, ti > j, U > /, ..., U > /.
Второе свойство гарантирует, что разрезание с
кластером, содержащим две вершины vt и vh которые в
настоящий момент не связны, но становятся связни-
254
ми, если вершины vtl, y,2, ...,vtr будут добавлены к
кластеру, генерируется на /-м шаге.
На рис. 5.6 показаны связные множества вершив
графа G.
<А
уЛ
У8*
Ls
^>
ф(.1)=0,
^(2)= {г,},
f (3)={t>,, fj},
"g'(4)={f1, i'3>,
^(5)=Иг4}.
Рис. 5.6.
Опишем алгоритм динамического программирования
для формирования оптимального разрезания графа.
Эффективность алгоритма зависит от выбора нумерации
вершин. / — 1-й шаг алгоритма имеет в качестве своих
состояний допустимые разрезания подграфа,
порожденного вершинами с номерами 1, 2, ..., /. Будем
обозначать такое множество разрезаний через Pj-i.
Добавим вершину Vj ко всем разрезаниям из Pj-i, которые
содержат кластер, удовлетворяющий критерию: добав-»
ление вершины v, не выводит вес кластера за пределы
ограничения на вес, и существует вершина в
множестве &(]), входящая в этот кластер.
Как и выше, под величиной разрезания будем
понимать сумму весов ребер, входящих в подграф,
порожденный вершинами кластеров, причем оба конца
каждого из таких ребер должны принадлежать одному
кластеру.
Алгоритм:
Вход: Граф G = (F, E), веса с, вершин vs, веса
ребер.
Выход: Оптимальное разрезание Р с кластерами,
вес которых не превышает М.
начало
1. для каждой вершины vf цикл
2. начало
3. найти связное множество. 94/);
4. конец цикла;
5. /:=0; Р„:=0;
6. для / от 0 пока / < п цикл
255
7. начало
8. образовать ^-смежности для к = с^;
примечание каждая такая А-смежность
образуется добавлением кластера, содержащего вершину
V) (одну), к множеству кластеров разрезания из Pi-\
конец примечания
9. для к от Cj до М цикл
10. начало
11. образовать ^-смежности вершины Vj, используя
только те разрезания из множества Pj-it которые
имеют по крайней мере один кластер с вершиной из
множества ff(j);
12. конец цикла;
13. сформировать множество Ps разрезаний из
построенных А-смежностей;
14. вычислить величины построенных разрезаний;
15. конец цикла;
16. выбрать допустимое раарв^ание в множестве Р„
с наибольшей величиной;
конец
Пример использования алгоритма дан на рис. 5.7.
Результаты вычислений сведены в таблицу. Каждая
строка таблицы соответствует шагу алгоритма; к-ш
столбец и /-я строка таблицы содержат ^-смежности
вершины Vj.
Оценим скорость роста требуемого времени при
применении алгоритма. Установим для этого скорость
роста числа допустимых разрезаний для связного графа,
так как трудоемкость алгоритма растет пропорциональ-
п
но величине "^ пр.(logр.), где Pi=\Pj\, а объем тре-
буемой памяти растет пропорционально nph где п —
число вершин в графе.
Рассмотрим вначале рост мощности множеств Р,.
Предположим, что граф полный; предположим также,
что ни одно весовое ограничение не нарушается.
Верхняя граница для мощности Ps есть число способов,
которыми / различных объектов могут быть
распределены по i неразличимым ячейкам, где ie[l:j].
Известно, что это число есть число Стирлинга второго рода
S{i, /'). Таким образом, р■ = | Р ■ I < 2 $ (/» 0-
! = 1
Метод вычисления такой суммы неизвестен, но
верхняя граница может быть выведена из рекуррентного
§56
1-11-1
p p
p £
p »
« л t-
II II II
>J -J kj
p p1 p
p p i?
p P P
££"5
н О "f м
I! II II !!
i-i i-i ^ i-i
p p p p*
"i £ £ £
p p1 p p
p" i" p_ p
1Л T- CO ^,
kj Ij >J к) в
О OJ
_: ,-c -с л к s
p » p p ч«'J 2
^ . . ns га Р
p"£ w£o&p"5
p p p p b5
p p
p £.■-■£. с
»"
-* OS Г- »н
II II II II
l-l l-l l-l l-l
P P P p
P P P p
P P P1 p
"£ "7; "S *
p p p p
l-l
p
О Л П 00
Z, P P P
Z, P P
p~ p" p~ £,
1T1111 "J 111 If
Hainan
iiii£?i?m
?????£££??£
^?p-£???p-p-£
? sis?? si el's
м те
i?H
Евстигнеев
257"
соотношения /?i< (1 + Ул-i, где tj — Cij). Это вытекает
из того факта, что Pt состоит из двух подмножеств:
а) 1-омежностей в множестве Р) (их число — Pi-t)\
б) ft-смежностей в Pi для А;>1. Мощность множества
&-смежностей ограничена числом ^Pj-i, хак как каждая
вершина в множестве *&{]) может породить не более
чем P)-i разрезаний в Р;; отсюда и из того, что для
полного графа IWij)] —j — 1, следует неравенство
Нижняя граница числа допустимых разрезаний
растет, как f\ где 1 < / < 2; это вытекает из решения
задачи для дерева.
Итак, трудоемкость и требуемая память алгоритмов,
основанных на динамическом программировании,
растут экспоненциально с ростом числа вершин графа,
ограничивая полезность этих алгоритмов.
1.5. Использование свойств разрезаемых графов.
Первое свойство касается изолированных множеств
Используя это понятие, покажем, что рост числа
разрезаний, порождаемых на шаге /, зависит только от
числа вершин с номерами, меньшими /, связанных с
вершинами, чьи номера больше или равны /, и не
зависит от /. Второе свойство связано с наличием в
графе точек сочленения.
Изолированным множеством I(j) для вершины и}
называется множество вершин {vj, удовлетворяющих
условиям:
а) i<]';
б) вершина vt не смежна ни с одной вершиной с
номером, большим /.
На рис. 5.8 приведены изолированные множества
для вершив графа G.
Xli/
«А
г1*
К
vA ?(1) — 0,
? *(2) = 0.
f(3J = 0,
Z(4) ={»,),
Z(5) = <»„ t>2> *,),
Рис. 5.8.
Лемма 1. Мощность множества /(/) не зависит
от весового ограничения.
Лемма 2. Связное множество и изолированное
множество взаимно исключают друг друга.
258
Лемма 3. Пусть #(/)mai обозначает множество
вершин с номерами, меньшими), не являющимися
элементами множества /(/). Тогда ^(/Этах^ lvt\i = 1, ...
,;., /— 1) — /(/) и не зависит от весового ограничения.
Лемма 4. ^Ч/ЭтиЭ^Ч/) для каждого весового
ограничения М.
Заметим, что У(/) зависит от М, а ФЧртях не
зависит.
Докажем, что мощность множества /(/) есть
неубывающая функция от /.
Теорема 1. J(/)s/(/+l).
Доказательство. Предположим, что /(/') =>
^/(;+1). Тогда найдется по крайней мере одна
вершина v(, которая принадлежит множеству /(/), но не
принадлежит К; + 1). По определению изолированного
множества вершина у, не смежна с вершиной, номер
которой больше /; следовательно, она не смежна с
вершиной, номер которой больше /+1, что
противоречит предположению. Поэтому /(/) s /(/ + 1).
Покажем, как понятие изолированного множества
может быть использовано для модификации процесса
разрезания.
Выше мы определили ^(ртах как множество тех
вершин с номерами 1, 2, ..., / — 1, которые не входят
в множество /(/). Разрезания, порождаемые на / — 1-м
шаге, могут быть разделены на непересекающиеся
подмножества, в каждое из которых входят только те
разрезания, которые имеют одно и то же
распределение вершин из ^Ч/)тах по кластерам разрезания. Более
того, каждый кластер, содержащий одну или более
вершин из ®Ч/)т«» имеет тот же самый вес, что и соответ^
ствующий ему кластер из другого разрезания, но из
того же множества разрезаний. Примером таких
разрезаний могут служить разрезания (уь уг)(у4)(у8, у») и
(vJivJivJCvt, ys) из одного и того же множества, где
^Ч6)тах ■= lvk, vj и каждая вершина имеет единичный
вес. Назовем два разрезания подобными, если они
принадлежат одному и тому же множеству разрезаний.
Доминантным разрезанием множества подобных
разрезаний назовем разрезание наибольшей величины.
Если имеются два или более подобных разрезаний с
одним и тем же наибольшим весом, то в качестве
доминантного берется одно из них.
Причина введения доминантных разрезаний состоит
в том, что все разрезания из множества разрезаний
17* 259
Pj-i, генерируемых на / — 1-м шаге (кроме
доминантных), могут быть исключены из дальнейшего
рассмотрения. Этот результат снижает верхнюю оценку
числа допустимых разрезаний, генерируемых на ;-м шаге,
с ;'! до tj(tj\)M \ где tj = I^CyOmaxI. Для малых
значений М и tj происходит значительное снижение числа
допустимых разрезаний.
Теорема 2. Для генерирования разрезаний на
к — 1-м шаге необходимы только доминантные
разрезания, полученные на k-м шаге.
Доказательство. Пусть G есть гс-вершинный
граф. Разрезание р графа G на некотором шаге к
может быть представлено в виде последовательности пар
[v,,( )], [v2, Х2], [vs, X3], ..., [vk, Xk], в которых
первый элемент есть вершина с номером i =S к, а второй —
кластер, к которому вершина vf была добавлена на i-м
шаге ( ( ) обозначает пустой кластер). Преимущество
такого представления состоит в том, что оно полностью
описывает, как было порождено разрезание р.
Например, разрезание [v{, ( )], [v2, \ )j, [v3, {v2)l, lvk(vt)],
[vs, (v2, vs)] в обычной записи имеет вид p = {v,,, vk)X
X (v2, v,, v5)..
Пусть Pi — множество разрезаний, порождаемых на
г-м шаге. Определим теперь образующую разрезания р
из разрезания q, где р берется из Ph, a q — из Ph j < к,
как последовательность [vJ+t, Xj+i], lvj+2, Х^г], ...
..., lvk, Xh]. Это обозначение есть вариант
использованного выше представления разрезания р, при котором
игнорируются шаги, ведущие к образованию
разрезания q.
Пусть разрезания / и g, порожденные на к — 1-м
шаге, подобны, и пусть / есть доминантное разрезание,
a g таковым не является. Предположим, что
существует разрезание графа G, например gn, полученное из g,
величина которого больше величины любого
разрезания графа G, полученного из /, и покажем, что это
неверно. Пусть образующая gn из g есть lvh, Xk],
lvh+i, Xk+i], ..., lv„, X„]. Так как / и g подобны, то
существует разрезание /„, получаемое из /, с
образующей [у„, Xj, [yt+i, Xh+l),_..., Оп, Хл] такой, что для
i<^ik:n] кластеры Xt и Xt имеют один и тот же вес
п вершины в кластере Xt отличаются от вершин в
кластере Л', только в том случае, если они принадлежат
множеству Пк). Так как вершины в изолированном
260
множестве для вершины vh не соединены ребром нп
с одной вершиной, чей номер меньше чем к — 1, то
величина каждого разрезания, порожденного на шагах
к, ft+1, ..., п, не зависит от вершин из множества
Кк), которые встречаются в кластерах вместе с
вершинами из множества ^ЧАОтатд
Так как кластеры Xt и A',-, jelhnl, имеют
вершины, различающиеся только тогда, когда они
принадлежат множеству Кк), сумма весов ребер в Xs и
Х{ может отличаться на сумму весов тех ребер,
которые соединяют вершины из множества Кк), входящие
в кластеры. Так как / есть доминантное разрезание
(/ доминирует g), то сумма весов ребер в кластере Xt
равна или больше суммы весов ребер в кластере Xt п
разрезание }п доминирует разрезание gn.
Следовательно, величина /„ больше или равна величине gn. В силу
о^
^ь^
>
*0
^3
У^ 1(Ъ) — {vu юг, и.},
6 «45) =(к.).
" max
Множества подобных разрезаний в Pt (см. рис. 5.7):
S,
(»l)(Vt)( 0))(Oj)
(»i, »г)(»з)(»4),
(Ol, »3)(»s)(»l),
(»1. «2, «з)(»«.),
8,
(»а)(В|, »2, «<)■
'»«)(»!, »а. «Л,
(V,)(.V2, Bj, 1),),
S,
L — 0, (»i)(»j)(o., ».), I. = 1.
L = 5, («i)(«2)(«s, o<). t = 6,
L = 3, (oi, 1)з)(ог, ot), L = 4,
L = 8, (0|, 1)з)(«з, i'i). Ь = 11,
L = 6.
L = 9,
L = 7.
Доминантные разрезания в Р4:
в
в
в
Si: (»i, «г, »з)(»»), t = 8,
S2: (oi, u2)(U3, 04), L = il,
S3: (»!)(0i, «3, o»), £ = 9.
Рис. 5.9.
этого удаление всех разрезаний из множества
разрезаний Pk-i, доминируемых каким-либо разрезанием,
повышает эффективность процесса. Теорема доказана.
Пример, иллюстрирующий теорему, приведен на
рис. 5.9;
261
Заметим, что мощность изолированного множества
для вершин графа есть функция нумерации вершин.
Однако техника нумерации, минимизирующая число
допустимых разрезаний, не известна.
Выше мы ввели понятия разделяющей вершины и
блока в графе п дали алгоритм их отыскания. Если в
связном графе имеется более одного блока, то имеет
смысл находить оптимальные разрезания каждого
блока в отдельности в любом порядке и потом
комбинировать пх для получения оптимального разрезания
всего графа.
Теорема 3. Если граф G имеет q блоков, д>\,
то оптимальное разрезание popt графа G может быть
получено отысканием вначале оптимальных
разрезаний его блоков и последующим комбинированием
полученных разрезаний.
Доказательство. Рассмотрим вершинное
представление разрезания рор1:
[()•■■()][()■■■()]■■■ К )■■■()][( )...()]
где NCi есть (возможно, пустое) множество кластеров,
вершины которых не являются точками сочленения и
все они принадлежат одному и тому же блоку Bt.
Множество С состоит из кластеров, каждый из которых
содержит по крайней мере одну точку сочленения.
Вершинное представление popt допускает такую форму из-
за специального свойства графа с блоками. Так как
единственной вершиной п блоке В{, смежной с
вершинами вне блока, является точка сочленения, кластер,
который содержит вершины из В,, но не содержит
точки сочленения, должен содержать исключительно
вершины из 5( в силу ограничения на связность
подграфа, порожденного вершинами' кластера. Это свойство
оправдывает подразбиение NCf.
Каждый кластер Х&С содержит два типа вершин:
1. Множество точек-сочленения {i'hv ...,i'ht\-
2. Множество вершин [viv vi2, .. ., via, viv vj2, ... |,
ни одна из которых точкой сочленения не является.
Последнее множество может быть разбито на
подмножества, соответствующие классам эквивалентностп
отношения БЛОК, где и БЛОК v тогда и только тогда,
когда ц и v — вершины из одного блока. Если
исключить ограничение на расщепление вершип, то кластер
262
X может быть заменен множеством кластеров {Хи ...
,.., Хт}, каждый из которых обладает следующими
свойствами:
1. Каждый кластер содержит объединение
множества вершин из некоторого блока Ви порождаемого
отношением эквивалентности БЛОК, и множества точек
сочленения блока Bs.
2. 2 M*i] = £[*], Ь[ХЛ- 2 са9.
Заметим, что одна и та же точка сочленения может
встретиться в нескольких кластерах из множества
<Х„ . •., Хт).
Когда мы проведем описанный выше процесс над
каждым кластером в С, вершинное представление
разрезания popt преобразуется в
[()•••( ),) • • • [()••■()] [()■■■( )] • • • [()■.■( ),1
iVCj iVC^ Сх Cq '
где Ci — множество кластеров, вершины которых
принадлежат блоку В{ и которые содержат по крайней
мере одну точку сочленения блока Ви Величина
разрезания от этого не изменяется, а само разрезание papi
представляется теперь множествами кластеров (iVC<, С(),
соответствующих разрезаниям блока Bt. Благодаря
расщеплению точек сочленения не существует ребер из
кластера из множества (N&, С<) в кластер из
множества (NCj, Cj) для i¥=j.
Заметим, что можно обратить процесс перехода от
Popt к Popt и генерировать povU порождая вначале
разрезания блоков, а затем комбинируя их.
Наличие точек сочленения и, следовательно, блоков
в графе уменьшает число разрезаний, порождаемых на
каждом шаге, до числа, прямо пропорционального
числу разрезании, генерируемых в каждом блоке, если
блок разрезается независимо от других. Кратко
алгоритм разрезания графа с блоками может быть описал
следующим образом.
Предположим, что граф G имеет q блоков Ви...,Вя.
Пусть блок Вк имеет bh точек сочленения. Разрезаем
каждый блок независимо, выбрасывая точки
сочленения из каждого изолированного множества для вершин
263
в Вк и сохраняя оптимальные 1-смежностп, 2-смежно-
сти, ..., М-смежности для каждой точки сочленения н
блоке Bk. Поэтому для блока Bh нужно хранить не
более ЪкМ множеств.
Когда все блоки разрезаны, мы находим блок с
одной точкой сочленения и комбинируем его с блоком,
содержащим ту же точку сочленешш. Делаем это,
склеивая кластеры, содержащие точку сочленения, и
оставляя остальные кластеры неизменными. Эти операции
требуют не более чем МШ + 1)/2 шагов.
Склеивание двух блоков может уменьшить число
несклеенных точек сочленения в результирующем
подграфе, содержащем эти два блока, на единицу.
Находим далее другой блок с ,одной несклеенной точкой
сочленения и склеиваем его с блоком, содержащим их
общую точку сочленения. Продолжаем этот процесс,
пока не будет найдено оптимальное разрезание всего
графа. Так как граф блоков F(G) графа G есть дерево,
следовательно, метод склеивания блоков при
разрезании графов есть модификация описанного выше
метода разрезания деревьев.
Используя проведенный анализ, можно показать,
что оценка р. = | Р.\ < tj (tj\)M ' < /! для гс-вер-
шинного дерева превращается в р, = |Р,-| < М, где М —
константа весового ограничения, так как для дерева
Ь = I^OOmJ = 1 для всех 7 > 1.
Еще один граф, у которого величина tj не зависит
от /, показан па рис. 5.10. Для него /(/) = Wi </ — h\,
где h — параметр, определяющий
«ширину» графа. Таким образом,
имеем tj = h для всех j и рл =■
= \Pj\ <h(h\)Mh. Более
тонкий анализ дает оценку р, =
= |Р;|<М\
t.6. Для разрезания
встречающихся на практике графов с
сотнями и тысячами вершин
целесообразно использовать
приближенные методы, основанные на
идеях поэлементного построения
кластеров — последовательные алгоритмы — и на
идеях итерационной перекомпоновки кластеров по
некоторым критериям с целью минимизации суммарных
межкластерных связей — итерационные алгоритмы.
264
Рис. 5.10.
Один пз эвристических алгоритмов разрезания
произвольного графа можно построить па базе алгоритма
разрезания деревьев. В основе его лежит построение
каркаса наибольшего возможного веса, разрезание его
и дополнение разрезов каркаса до разрезов всего графа.
На рис. 5.11 приведен пример такого разрезания.
Рис. 5.11.
Рассмотрим более топкий алгоритм
субоптимального разрезания графа, основанный на
структурированном методе ветвей и границ. Алгоритм структурируется
в виде семерки А = (й, В, L, F, D, S, Е), где R —
правило представления разрезания, В — правило
ветвления, L — функция характеристики разрезания, F —
граничная функция, D — правило предпочтения
разрезания, S — правило выбора разрезания, Е — правило
исключения разрезаний. Как и в методе динамического
программирования, мы пепользуем имеющуюся
аналогию с задачей о рюкзаке п приближенный метод ее
решения.
Возьмем кластер Хк разрезания R(X) = (Хй ..., Л'г)
графа G = (X, U) в качестве рюкзака с исходной
емкостью тк, равной количеству вершин в кластере,
а вершины и ребра других кластеров — в качестве
предметов, подлежащих загрузке в рюкзак. По методу
приближенного решения задачи о рюкзаке определяем
вершины, загружающие кластер Хк с некоторым
избытком. В результате такой операции загрузки остальные
кластеры будут испытывать недостаток в вершинах.
Затем, считая вершины и ребра подграфа <ХА> пред-
265
метами, а кластеры с недостающими вершинами —
рюкзаками, решаем задачу о рюкзаке для каждого
кластера в порядке убывания дефицитов вершин (разгрузка).
В итоге операции загрузки и разгрузки (ДД-опера-
ции) получаем новое разрезание. ДД-операция
повторяется для кластеров Хк, &е[1:г!, в порядке,
определяемом некоторой дополнительной информацией о
разрезании. Исходное разрезание также выбирается
при помощи ДД-операции. Такой подход позволяет
выделить сложное комбинаторное ядро задачи разрезания
и применить к нему субоптнмальный алгоритм
ветвления, довольно простой по структуре и эффективный
по количеству перебираемых вариантов. Трудоемкость
алгоритма ~0(п') -т- 0(nk), что позволяет использовать
его для разрезания графов, содержащих до тысячи
вершин.
Уточним содержание компонент семерки,
описывающей алгоритм по схеме структурированного метода
ветвей и границ:
А - (Д, В, L, F, D, S, Е). (5.7)
Компоненты этой семерки определяются
следующим образам:
1°. Правило Д представления состояния из
множества возможных представлений разрезаний для задачи
определяет наиболее рациональное.
2°. Правило В ветвления определяет процесс
ветвления, целью которого является разбиение множества
состояний на непустые подмножества.
3°. Функция L характеристики состояния ставит в
соответствие каждому состоянию действительное число.
4°. Граничная функция F представляет собой
экстремальное значение для характеристики состояния.
5°. Правило D предпочтения состояний определяет
приоритет активных (т. е. подлежащих дальнейшему
рассмотрению) состояний при ветвлении.
6°. Правило S выбора состояния определяет из
множества активных состояний то, которое подлежит
ветвлению или является субоптимальным.
7 . Правило Е исключения состояний отбрасывает
неперспективные состояния в смысле их нахождения
на пути к субоптимальному решению или с точки
зрения объема памяти ЭВМ.
Компоненты семерки (5.7) являются этапами
неявного алгоритма по данной схеме, которые при постро-
266
ении алгоритма циклически повторяются, за
исключением правила R, до получения субоптимального
решения. Такое решение указывает правило S, используя
результаты вычисления функций L и F. Алгоритм
решает задачу (5.1) — (5.3). Для удобства изложения
введем следующие обозначения:
1-{Хь) = 2 си—связность кластера Хк;
xi,xj = Xh
1 {Щ — 2^ {Xh)— связность разрезания RLX).
h
Особенностью данного алгоритма является
построение в рассматриваемой схеме эффективной функции
ветвления В, которая использует ЯД-операцию. Это
позволяет надеяться на получение хорошего
приближения к оптимальному решению. Алгоритм строится
последовательным определением компонент в (5.7).
Шаг 1. Разрезание Rt(.X) графа G будем
представлять в виде R{ (X) = (Х\, . . ., Х'г). Исходное разрезание
R0(X) выбирается но указанной на шаге 2 процедуре.
Шаг 2. Правило ветвления В для алгоритма
указывает способ получения из R0{X) новых разрезаний
Ri(X), используя для ветвления /?/?-оиерацию.
Шаг 2.1. Загрузка ЯЛ-операции. Пусть имеется
некоторое исходное разрезание Ji0(X) = (Xl, ...,Х°Г),
причем /(А'й)>/(Х"+1) для всех к, ue[l, г—1].
Рассматриваем кластер Х(1 (к е |1, г]) как рюкзак о
исходной емкостью тк. Вершины н ребра (элементы)
подграфа Gh = (X \X°h, U\U°h), где U°h= {(uit v,) | vit
Vj e Xh}, считаем предметами, подлежащими"
загрузке в рюкзак. Среди них по методу приближенного
решения задачи о рюкзаке выбирается а вершин,
которые максимально, согласно предлагаемому критерию,
увеличат связность / {Х\) кластера X°h. Ясно, что
a i
i,(ix)-i
s Ф к. Будем изображать
элементы графа G вектором У = (уд ~ (г/,-, yv), 1 < I ==3
^ п(п +1)/2, где yi соответствует вершине v{, i e
е [1; п], уv соответствует ребру (vb Vj), 1 < ] < / < /г, и
(1, если элемент I подлежит загрузке;
IU в противном случае.
Вектору элементов графа, согласно задаче о рюкзаке,
267
поставим в соответствие вектор весов А = (а,) = (а„ а„),
где а,- — вес вершины vt при загрузке, а» — вес ребра
(v^, Vj) при загрузке, и вектор размерностей P — (pi) —
= (ри Pv\ где
(1, если 1^ Z^/г;
7,1 = 12, если п < г < п (п + 1)/2.
Покажем, как вычислять вектор 4. Пусть имеется
подграф {К, V) <=■ (X, £7), и пусть вершина vt
принадлежит множеству Х\К, а ребро (fT, t>j)— множеству
UW. Обозначим at = / (К [} {щ}) - / {К), aj= / (Я) -
-/(^-{у,}), ай = /(дик,^-})-/(*). «yW(#)-
— 7(A;\{i;T, yj-}). Тогда а-, = af — a{ , i <= [1 : и], avj =
= a^j — a^j, 1 ^ у < / ^ n, где a^' = av + at + ath
avi — av + a7 — avi> ^ = X°h, V = U\.
Теперь задача о рюкзаке для загрузки кластера Х\
до mh + а вершип будет иметь вид
ЛУ'-тах, 1
PY' = mk + a, I
где векторы Р и А вычисляются по приведенным
выше формулам при К — Х\ и V — U\- Загружаемый
элемент определяется по первому неравенству в
формуле
ajpi>ajpi>...>ai/pl, K/<it(nTl)/2. (5.9)
В зависимости от вида загружаемого элемента емкость
кластера увеличивается на единицу (в случае
вершины) н на два (в случае ребра). Если кластер не
заполнен, то недостающие элементы определяются
применением (5.9) для оставшихся элементов. Если кластеру
требуется лишь вершина, то соотношения (5.9)
достаточно получить для вершин.
Результатом решения задачи (5.8) (пли
результатом загрузки ДД-операщш) будет некоторое
промежуточное разрезание
Д«пр) (X) = (XI (Дх), . . ., Хкшр) Xhr (Дг)),
где Xs (As) —кластер X) без Л3 вершин, загруженных
в кластер ХНпр) (кфв), Х£(пр) — кластер Х\ без уве-
личенной емкости mk+ а, 2 As = ее (зфк).
268
Шаг 2.2. Разгрузка ftff-операции. Пусть
Д,>Да>...>Д,. (5.10)
Считаем элементы подграфов с вершинами Na =
d
= ^(пр)\2Х',(Д8)(где deli: r], d¥=k, X'(AJ = 0 и
8=1
У(Д.) — множество вершин, загруженных .в кластер
Xj(A»)) предметами для загрузки соответственно в
кластеры Х$ (As), se[l:r], s^/c, требующие по А,
вершин. Аналогичным образом для каждого кластера
Xs(Ajs), se[l:r], s¥=k, в порядке, указываемом
соотношением (5.10), решаем задачу о рюкзаке
AY' -+■ max,
PY' = т,
при /£ = N,. В результате разгрузки получим новое
разрезание Rh (X) = (^i, Х2 Хг).
Повторим ЯЯ-операцию для 4е[1:г] и для а,
выбираемого из промежутка
2>s)
зфк, с не-
1.1 2X1-1
которым шагом h. Исходное разрезание выбирается
процедурой, которая представляет собой
последовательное решение следующих задач о рюкзаке:
AY'
PY
'-►-max, |
' =mh 7 = 1, .,., г —1, J
1
при Лг! = X, Nj = X\2, Xu /е[2:г- 1], а рюкзака-
г=2
ми являются первоначально пустые кластеры X,,
требующие для загрузки т} вершип. В результате
получим разрезание R0 (X) = {Х°х, ..., X").
Ш а г 3. Функция характеристики разрезания L
определяется следующим образом: LiRiiX)) = I{R<).
Шаг 4. Граничная функция F есть функция
F(Ri(X)) = maxI(Ri).
Шаг 5. Правило предпочтения D говорит о том,
что ветвление исходит от R0(X).
269
Шаг 6. Правило выбора S очередного разрезания:
разрезание Rcy6 является субоптимальным, если
Д^сус) = max I(Ri)% где Я — множество индексов
i~n
всех полученных с помощью. RR-
операции разрезаний.
Шаг 7. Правило исключения
разрезаний Е для алгоритма
говорит о том, что исключаются все
разрезания /?ДХ), для которых
HR,) < 7(Дсув).
Пример. Рассмотрим
применение алгоритма па примере
разрезания графа, показанного на
рис. 5.12. Пусть г = 2 и то, = то2 =
•= 3. Положим а = 1, h = 0.
Результаты последовательных вы-
Рис. 5.12.
числений приведены в табл. 5.1.
Таблица 5.1
Номер
разрезания R.(X)
г
0
1
2
КН.)
г
13
15
15
R . '(X)
Кпр)
У1
Л Ипр)
Х'(Д2)
Х](Ад
X2
л2 ир)
Результат
загрузки ftR one; a-
ции
К. ">2. у3. у4>
0>5i Уб)
("1, "2. "б. Уб)
Результат разгрузки
КЯ-операции
X,
К> "з. у4)
("l.">2> Уэ)
("l, ^2> Уз)
*2
("l> Ь'51 Ув)
("«. у5> «-'«)
("*. ^51 Ув)
Субоптимальное решение есть разрезание
Rcyn^RiiX) = R2(X) = {{vt, v2, v3), {vt, vs, v6)),
которое, кстати, является и оптимальным.
1.7. Разрезание бесконтурного орграфа на
минимальное число кластеров. Метод основан на сведении
задачи о разрезании к задаче целочисленного
программирования. Сложность задачи существенно зависит от
ограничения на размер кластера. Занумеруем вершины
орграфа G •= {X, Г) произвольным способом хи xt, ...
..., хп и построим матрицу смежности AiG).
270
Теорема 4. Минимальное число рм (G) кластеров,
на которое можно разбить вершины орграфа G с
соблюдением условий:
а) ГХ, = иХ„/ = 1, ..., Л,Хл+, = 0;
б) \Xt\^M, ^
равно рм (G) =» 2 Xq I 2 £«» . где |„ — ^елые числа,
9=1 \t=l '
минимизирующие линейную форму
L = 2 2 regel, (5.11)
9=1 j=l
r,-l, r,+1 = r, + '(n-g-l)(r,-l) + l, (5.12)
u удовлетворяющие линейным неравенствам и
равенствам:
а) £fli>0;
б) 2 E3i " 1;
?7 (5.13)
в) 2?9i<^;
(=i
п 9-1
г) 2 aiblqh<M 2Esi, i, <7 = 1 "•
ft=l «=1
Кластер- Xq при этом определяется как множество
Х,-{ж,еХ|&*=1>. (5.14)
Доказательство. Пусть целые числа |,<
(9, ietl:n]) удовлетворяют системе (5,13) и
минимизируют линейную форму (5.11). В силу неравенства
а) и равенства б) из (5.13) каждое число |,< будет
либо 0, либо 1. Определим множества Xq, q&[l:n],
формулой (5.14) и выберем среди них непустые. Если
число их равно h, то это обязательно будут кластеры
•^1, ..., ХЛ, /je[l;nj, так как иначе |„ не
минимизировали бы форму (5.11), поскольку из (5.12)
следует, ЧТО fq+i '> Г{, О е Ll:n-U.
Покажем, что кластеры Х{, ..., ХЛ образуют
минимальное разрезание орграфа, удовлетворяющее
условиям теоремы. В силу равенства .6) для каждого t,
t&ll'.n], существует одно и только одно </e[l:fe]
такое, что £г< •=» 1. Следовательно, каждая вершина х<
попадает в единственный кластер Хя. Из неравенства
271
в) вытекает, что число вершин в каждом кластере Хя
не превышает М.
Пусть г,еГд:,, a xt^Xk. Покажем, что i,sl„ где
q > к. Для этого предположим, что х} gX„ q «S к.
Имеем 1ш=1, l«j=l. Возьмем в совокупности нера-
п 9-1
венств г) неравенство 2 aihlqh ^M 2 lsj-При g «S &
Л=1 8=1
правая часть этого неравенства будет равна 0. Левая
же часть его будет больше нуля, так как ati — 1 и
|„ = 1. Следовательно, при нашем допущении числа %qi
не удовлетворяют системе (5.13), и мы заключаем, что
X; el„ q > к, т. е. что TXh E (J Xj.
)>h
Остается показать, что разрезание, определяемое
кластерами X,, ..., Xh) будет минимальным
разрезанием, удовлетворяющим условиям теоремы.
Пусть Xi, ..., Хр (р = pM(G)) — кластеры
некоторого минимального разрезания орграфа G,
удовлетворяющего условиям теоремы. Построим по данному
разрезанию систему из п2 чисел %,lh) q, к <= ll:n),
определяемых равенствами:
Sqk
1, если id e I„ l^.q^.p;
0, если хкфХд, l^.q^.p;
0, если р <q^.n.
Легко увидеть, что неравенства а)—в)
справедливы для чисел £,,,. Покажем справедливость неравенства
г). В самом деле, для любых фиксированных i и q,
i, q «s Ц : ?г!, существуют две возможности:
1) 21ч=0; 2) 2|1( = 1.
Первая из них означает, что 1,-еХ,, / > <?. Отсюда
следует, что если !„а = 1, то olft = 0. Следовательно,
п
2 aifct<?A = 0' т- е- в случае 1) неравенство г) выпол-
*=1
няется. Выполняется оно и в случае 2), так как, оче-
п
видно, 2 aiklqk < М.
Покажем, что предположение h > p ведет к
противоречию. Если h>p, то числа |,< доставляют форме
(5.11) меньшее значение, нежели система чисел %я!.
т
Действительно, в силу (5.12) имеем
2 2ГА«<Г> + r2+ ...+ гр_1 + (п-р + \)гр<
< г, (га — р) + г2 + ... + гр+1 <
п п
< г, (га - h + 1) + гг + ... + rft < S S '"eSei-
9=1 i=l
Это неравенство противоречит тому, что числа |,(
минимизируют форму (5.11). Следовательно, разрезание,
определяемое формулой (5.14), будет минимальным.
Теорема доказана.
Покажем теперь, что для класса
прогрессивно-конечных графов данная задача решается эффективно.
Граф G называется прогрессивно-конечным в
вершине va, если в графе нет путей бесконечной длины,
начинающихся в v„. Граф называется прогрессивно-
конечным, если он прогрессивно-конечен в каждой
своей вершине.
Пусть из каждой вершины графа G = (X, Г), \Х\ =
= га, исходит не более т дуг. Построим множества Xh
i'e|l:;i], пспользуя следующую процедуру. Построим
последовательность множеств вершин орграфа:
1, = ЫхеХ, Г* = 0},
12 = {г|хеХ, Гт <=£,},
(5.15)
Хр = {х\хеХ, Г* s *,_,}.
Это будет возрастающая последовательность мпожеств
X, а Х2<=.. .a XjCz. . ., стабилизирующаяся при
некотором ) = р. Так как в графе G каждый путь имеет
конечную длину, то Хр — Х.
Построим теперь множества:
Л] = Хр\Хр-1, л2 = Xp-^Xp-t' • • •
..., Хр-х = X2\Xi, Xp = Xj. (5.16)
Множества Х} образуют разрезание графа на
кластеры, удовлетворяющие условиям TXj с; |J Хх. Действи-
тельно, Хз = ХР-1+1\Хр-1 и TXp-]+l s A%-j. следователь-
~ р
но, TA';-sXj)_j= U Xjj'e [1 : р]%Более того, можно
i=i+i
*8 В. А. Евстигнеев 273
показать, что это раэрезание содержит минимально
возможное число кластеров.
Предположим теперь, что можно указать такое
число &е= [1 :р + 1], что -Хр+1 = 0 и
\Х;\>т\М-\) + {, / = 2, 3, ..., fc-1, (5.17)
|Х,| <Л/, /-Л, fc+1, .... р. (5.18)
- Докажем, что при этих предположениях
рЛ1(£)
и 21Xi
+ p-k + i.
(5.19)
t ^ (J> - к + 1) >
ж ге- 2
Обозначим правую часть равенства (5.19) через Я.
Покажем вначале, что каков бы ни был граф G,
удовлетворяющий условию (5.18) при наименьшем к,
для него справедливо неравенство pM(G) > Я. В самом
деле, пусть <ji, ..., ot — кластеры некоторого
разрезания графа G, удовлетворяющего условиям теоремы 4,
t p
Воспользовавшись неравенством 2 I а<1 ^ 2 I ^4 К
легко доказываемым по индукции, получаем
ы) >
\ i=h /L J i=l
Отсюда t>H} следовательно, п рьЛО^Н. Отметим,
что рм (G) < р - А + 1 + 2 ]| Xi УМ[.
Для доказательства формулы (5.19) достаточно
теперь показать, что граф G можно разрезать на Я
кластеров с соблюдением условия теоремы 4. Для этого
достаточно, в свою очередь, доказать, что
1 fc-i
-ir2l*il
Pm(G*-i)
м
i»l
(5.20)
где Gk-i — подграф, порожденный множествами Х{< ...
..., АА_,.
Формула (5.20) справедлива, если &=1 или А —2.
Пусть к 2* 3. Рассмотрим последовательность
подграфов Gif .,., Gh-i, где G, — подграф, порожденный мяо-
274
жествами Х„ ..., Хт. Так как X, — внутренне
устойчивое множество, т. е. такое множество, никакие две
вершины которого не смежны, то
Пусть справедлива формула
РМ №
irZlXi
l<r<ft —1. (5.21)
Покажем, что формула (5.21) остается верной при за-
г
мене г на г+1. Это очевидно, если 21^ч1 делится
на М. Пусть деление происходит с остатком, равным d,
i*£=d<M — 1. Можно считать, что для кластеров
Хи ..., Xhr, hr = pM{Gr), разрезания графа
G,"выполняются равенства
|ft|-il/, i = l, ...,u,-l, \fhr\ = d.
Далее, из условия (5.17) имеем \Xr+i\ > m(M — 1) + 1 =»
= (т-1)Ш-1) + Л/ = (т-Ш+#, т.е. |Хг+1|-
— md &* М — d. Последнее неравенство показывает, что
в множестве Хг+1 найдутся М — d вершин, которые,
соблюдая условия теоремы 4, можно поместить в
кластер Хь^- Следовательно, удовлетворяя условиям
теоремы 4, подграф G>+i можно разрезать на
-. 1 г+1
hr+1 = hr+ \±(\Xr+1\ + d-M) = ^21**1
кластеров. Ясно, что это разрезание будет
минимальным, т. е. hr+i = pM(G>+i). Формула (5.20), а вместе
с ней и формула (5.19) доказаны.
1.8. Метод ветвей и границ для разрезания
бесконтурного орграфа. В применении к задаче о разрезании
на минимальное число кластеров метод ветвей и
границ заключается в пошаговом построении некоторого
дерева Щ), по которому получается оптимальное
разрезание. Каждый шаг построения дерева 2) сводится
к операции разветвления над множеством разрезаний.
Опишем эту операцию. Пусть Q — множество
разрезаний графа G и к > 0 — такое число, что для любых
Двух разрезаний (Хи ..., Х„) и (Х'и ...xX'n)i
входящих в Q, Xi = Xl для всех i< к,
18* 275
Построим подграф U графа G, удалив из G все
вершины, входящие в кластеры Xif ..., Xh, и
инцидентные им дуги. Пусть 2 — множество выходпых вершин
подграфа G. Для любого разрезания из множества Q
его к + 1-й кластер является подмножеством
множества 2. Обозначим через со наименьшее из чисел М
и |2|, со = min Ш, 12|}. Определим теперь систему
Wit ..., W, подмножеств множества 2:
а) если 121 «S М, то г = 1, Wt = 2;
б) если 121 >М, то г = C|s,;
Wu ..., Wr — всевозможные подмножества множества
2 из М элементов. Очевидно, что \Wt\ = со, i<=[l:r].
Обозначим через Qi множество всех разрезаний из Q
с к + 1-м кластером Wit i s Ц ; г]. Тогда
i=l
Qif\Qj = 0, <?,П<?* = 0, i, / = l, .... г, 1Ф],
где Q* — множество всех тех разрезаний из Q, у
которых к + 1-й кластер не совпадает ни с одним из мпо-
жеств Wlt ..., Wr.
Очевидно, что для любого оптимального разрезания
из Q* можпо указать по крайней мере одно разрезание
с равным числом кластеров, принадлежащее одному из
множеств Q{, ie[l:r]. Вследствие этого множество
Q* при поиске оптимального разрезания можно не
рассматривать.
Исходя из полученного множества разрезаний Q,
построим дерево, состоящее из одной звезды, которую
будем обозначать через Z{Q). Пусть Z(Q) =
= {(Q, Qi), ..., (Q, Qr)). Операцию, сопоставляющую
множеству разрезаний Q звезду Z(Q), будем называть
разветвлением Q.
Для множеств Qu ..., Qr нижняя граница числа
кластеров разрезаний одинакова и зависит только
от Q:
PM(Q) = \(\G\-(*)/M{ + k+\.
Рассмотрим набор Qi, ..., Qh пепересекающихся
множеств разрезаний графа G и набор целых чисел Rif ...
..., Rk, Rj 32 0, таких, что если два разрезания
принадлежат одному множеству Q], то i-е кластеры этих
разрезаний совпадают для всех i, i^[l:Rji. Предполо-
276
жим что для множеств (?,, i<^[l:k], определена
нижняя 'граница числа кластеров разрезаний рм(.0().
Будем говорить, что Qn^Qg, если либо pAQJ <pM(Qg),
либо Rn>Rq в случае равенства чисел рлД<?п) и
рм(&).
Рассмотрим процесс построения дерева 20.
1°. Базис построения. Пусть О0 — множество всех
возможных разрезаний графа G с числом элементов
в кластерах, не превосходящим М. В качестве базиса
построения возьмем дерево 2)0, состоящее из
единственной вершины Q). Это дерево будет наращиваться
на следующих шагах процесса. Нижняя граница числа
кластеров в разрезашш из О0 будет
ры(О0) = ]\Х\/М[.
2°. /+1-й шаг построения. Пусть на /-м шаге
построено дерево SDj. Каждая его вершина Q есть
множество разрезаний графа G. Если вершина Q
находится на расстоянии к > 0 от корня дерева, то у
любых двух разрезаний, принадлежащих Q, совпадают
их кластеры Х{ для i^il:k]. Для каждой вершины
Q определена нижняя граница числа кластеров
разрезаний, входящих в вершину Q. Упорядочим множество
всех висячих вершин дерева 2Di с помощью функции
предпочтения. Пусть теперь Q* — наименьшая из
висячих вершин дерева 2D,. При этом определяется
нижняя граница числа кластеров разрезаний для множеств
Qi, ..., QT, полученных при разветвлении вемнины Q*.
Дерево 2Dj+l получается из дерева 2Dj присоединением
звезды Z{Q*).
3°. Окончание процесса. Процесс обрывается тогда,
когда построена висячая вершина Q, разветвление
которой невозможно, т. е. при выполнении шага, на
котором S = G. Полученное в результате дерево 2) есть
искомое дерево. Очевидно, множество Q состоит из
единственного разрезания, которое и представляет
собой оптимальное разрезание.
Несколько слов о представлении деревьев 2Dj.
Каждая вершина Q, находящаяся на расстоянии R от
корня дерева 2DU представляет собой множество
разрезаний с зафиксированными первыми R кластерами.
Обозначим эти зафиксированные кластеры через Хи ...
..., XR. Будем идентифицировать вершину Q в £D}
списком вершин кластера Хя и порядковым номером
277
появления Q в процессе построения. Порядковый
номер необходим, так как XR может быть кластером
разрезания, не входящего в Q. При таком способе
задания вершин по набору дуг дерева 2Dj однозначно
восстанавливаются вершины дерева, как множества
разрезаний. При представлении 2D) целесообразно делить
его на каждом шаге процесса на две части. Первая
часть — это дерево 2Dj, состоящее из множества звезд
2)), за исключением висячих звезд, т. е. звезд, дуги
которых инцидентны висячим вершинам. Вторая
часть — это множество висячих звезд вместе с
информацией о границах и о расстоянии от вершин до
корня, упорядоченное с помощью функции предпочтения.
Такой способ представления дерева приводит к
сокращению объема информации и к сокращению времени
поиска разветвляемой вершины.
§ 2. Раскраска графов
2.1. Правильная раскраска. Определение
хроматического числа. Правильной к-раскраской графа G =
= {X, Е) в к цветов называется такое разбиение
множества X его вершин на к непересекающихся
подмножеств Xiy ..., Хк, что никакие две вершины из одного
и того же подмножества не смежны.
Множество вершин одного цвета, а ото в точности
вершины одного из подмножеств Хь ..., Xh,
называется одноцветным классом. Итак, при правильной А--рас-
краске множество вершин графа разбивается на к
одноцветных классов.
Хроматическим числом %(G) графа G называется
наименьшее к, при котором G имеет правильную к-
раскраску.
Будем говорить, что граф G к-раскрашиваем, если
%{G) «S k, и k-хроматичен, если %(G) = к. Если п есть
число вершин графа, то граф, очевидно, имеет гс-рас-
краску и х^)"РаскРаскУ И1 кроме того, имеет А-рас-
краску для любого к, удовлетворяющего неравенству
%(G) iik ^n. Легко убедиться, что хроматическое
число полного /г-вершинника равно п, пустого графа, т. е.
графа, не содержащего ни одного ребра, равно
единице, четного цикла равно двум,' нечетного цикла — трем.
Очевидно, что граф является 1-хроматическим тогда и
только тогда, когда он пуст.
278
Теорема 5. Граф бихроматичен (2-хроматичен)
тогда и только тогда, когда он не содержит нечетных
простых циклов.
Следствие 1. Любое дерево бихроматично.
Следствие 2. Любой двудольный граф
бихроматичен.
Характеризация /с-хроматических графов для к > 3
не известна. Поэтому в теории раскрасок графов
наибольший интерес представляют оценки
хроматического числа и приближенные методы раскраски.
2.2. Некоторые оценки хроматического числа
графов. Очевидно, что если граф G содержит в качестве
своего подграфа полный i-вершииник, то его
хроматическое число удовлетворяет неравенству t < %(G) < п,
где п — число вершин. Большую информацию можно
получить, если привлечь дополнительные
характеристики графа.
Л е м м а 5. Если наибольшая из степеней вершин
графа G равна р, то этот граф р + {-раскрашиваем.
Доказательство проводится индукцией по числу
вершип.
Теорема 6. Пусть наибольшая из степеней
вершин графа G равна р. Тогда G является р-раскраши-
ваемым, за исключением тех случаев, когда граф G
содержит в качестве компоненты полный р +
{-вершинник или когда р = 2 и одна из компонент графа G
является нечетным циклом.
Лемму 5 и теорему 6 удобно применять тогда,
когда степени вершин примерно одинаковы. Если же граф
имеет вершины с резко отличающимися степенями,
в особенности если вершин с большой степенью
немного, они дают чрезвычайно завышенные оценки;
так, звездный граф, имеющий одну вершину степени р,
а остальные вершины степени 1, по теореме 6
является р-раскрашиваемым, а на самом деле он
бихроматичен.
Теорема 7. Для любого графа G
% (G) ^ 1 -f max min degH v,
где максимум берется по веем собственным подграфам
Н графа G.
Доказательство. Утверждение очевидно для
пустых графов. Пусть G — произвольный /i-хромати-
ческий граф, h>2, H — любой наименьший подграф,
279
у которого %(H) — h. Тогда %(H\v)=*h — l для всех
вершин v графа Н. Следовательно, Aogv^h — 1, так
что min deg v ^ h — 1, и потому
h — 1 <[ min deg v ^ max min deg v ^ max min deg v,
vSH W CSH' д v&H
где первый максимум берется по всем_подграфам Н'
графа Н, второй — по всем подграфам Н графа G.
Отсюда вытекает, что
X (G) = h ^ 1 + max min deg v.
я ген
Теорема 8. Для любого графа G справедлива
оценка
n/$0^x(GXn-$0 + 1,
где п — число- вершин в G, р,- вершинное число
независимости.
Доказательство. Если %{G) — k, то множество
X вершин можно разбить на к одноцветных классов
Xh ..., Xh, каждый из которых является независимым
множеством, т. е. множеством, в котором никакие две
вершины не смежны. Если \X{\=rit, то п, < р0 для
всех г, так что п = 2 ni ^ ^'fV
г
Для проверки верхней оценки рассмотрим
максимальное независимое множество 5, содержащее §,
вершин. Ясно, что %(G\S) >%(G) — 1. Так как G\S имеет
и — Ро вершин, то x(G\S) <ira — p\,. Отсюда jc(^) **
Теорема 9. Для любого графа G справедлива
оценка
{(п2 - Ъп)1п)
\п*-2т\ У
1 + [(„* _ 2m)/n] ' ^
< 1 (G) < Гз_+У9 + 8(т-п)
гЗе /г — число вершин, т — число ребер.
(Скобки [ ] обозначают целую часть, а скобки
{ } — дробную часть числа.)
Доказательство теоремы будет дано ниже.
Приведем еще оценку, вывод которой будет
рассмотрен при изучении приближенных методов
раскраски графа.
280
Теорема 10. Пусть в графе G вершины
упорядочены по убыванию степеней. Тогда х (С) =£*
^ max min{i, l + elegit}.
2.3. Говорят, что граф укладывается на
поверхности S, если его можно так нарисовать на S, что
никакие два ребра не пересекаются в точках, отличных от
концов. Граф называется планарным или
топологически плоским графом, если его можно уложить на
плоскости; плоский граф — это граф, уже уложенный на
плоскости.
Плоскость, на которую уложен граф, разбивается
на ряд областей; области, ограниченные со всех
сторон ребрами графа, называются его внутренними
гранями или просто гранями; неограниченную область
называют внешней гранью. Важнейшим результатом,
касающимся плоских графов и лежащим в основе многих
исследований, является следующая теорема (или
формула) Эйлера.
Теорема 11. Пусть G — связный плоский граф,
и пусть п, m и f обозначают соответственно число
вершин, ребер и граней графа G (включая внешнюю
грань). Тогда п + / == m + 2.
Следствие 1. Если G — связный простой, т. е.
без петель и кратных ребер, планарный граф с п
вершинами, ге > 3, и m ребрами, то m^3n — Q.
Так как каждая грань ограничена при наших
предположениях по крайней мере тремя ребрами, то при
подсчете числа ребер вокруг каждой грани имеем 3/<
< 2т; применяя формулу Эйлера, получаем требуемое.
Следствие 2. В любом планарном графе без
петель и кратных ребер существует вершина, степень
которой не больше пяти.
В самом деле, пусть в графе по меньшей мере три
вершины. Если степень каждой вершины не меньше
шести, то имеет место неравенство бге ^ 2т, или 3re^S
^ т. Из следствия 1 сразу же вытекает, что Зге ^
< Зге — 6 — очевидное противоречие.
Теорема 12. Каждый планарный граф Ъ-раскра-
шиваем.
Доказательство теоремы ведется индукцией по
числу вершин. Для любого пленарного графа с re ^ 5
вершинами результат тривиален, так как любой граф п-
раскрашиваем. Допустим, что все пленарные графы
с ге вершинами, ге ^ 5, 5-раскрашиваемы. Пусть G —
281
пленарный граф с п + 1 вершинами. В силу следствия
2 из теоремы 11 >з графе G найдется вершина v
степени пять или менее. По индуктивному
предположению пленарный граф G\v 5-раскрашиваем.
Рассмотрим некоторую 5-раскраску графа G\v цветами с,, ...
..., с5. Ясно, что если некоторый цвет, скажем с,, но
используется в раскраске вершин, смежных с
вершиной v, то, приписав цвет ct вершине и, получим 5-
раскраску графа G.
Осталось рассмотреть случай, когда степень
вершины v равна пяти и для вершин графа G, смежных
с вершиной и, используются все пять цветов. Без
ограничения общности можно считать граф G плоским,
так что мы"можем говорить о циклической
упорядоченности смежных с v вершин. Переставим номера
цветов, если это необходимо, так, чтобы цвета вершин,
о) "—J)" 6)
Рис. 5.13.
смежных с v, при обходе их по часовой стрелке были
Си с2, cs, c4, с5. Обозначим теперь вершину, смежную
с вершиной v и окрашенную в цвет с(,. через vt, 1 sS
^i^5 (рис. 5.13, а). Обозначим через Gap подграф
графа G\v, порожденный всеми вершинами,
окрашенными в цвета ее и р. Возьмем теперь пару не
расположенных рядом вершин, смежных с вершиной v,
например vt и v3. Если эти вершины принадлежат
различным компонентам связности подграфа G,3
(рис. 5.13, б), то 5-раскраску графа G\v, при которой
вершина и не имеет смежных вершин, окрашенных
в цвет с3, можно получить, поменяв в той
компоненте подграфа G!3, которая содержит вершину v3, цвета
вершин с с3 на Ci и обратно (перекраска вершин).
После этого, окрасив вершину v в цвет с3, образуем
5-раскраску графа G.
Если же вершины i>s и v3 принадлежат одной и той
же компоненте связности подграфа G13, то в графе
W
G\v между вершинами vt и ра существует простая
цепь, все вершины которой окрашены в цвета с£ и с,
(рис. 5.13, в). Эта цепь вместе с цепью [v%, v%, vs],
образует простой цикл, который окружает либо
вершину v2, либо вершины у4 и v5. В любом из этих
случаев ih и vt нельзя соединить простой цепью, все
вершины которой окрашены в цвета сг и с4.
Следовательно, рассматривая подграф G2i графа G\v, заключаем,
что вершины i>2 и vt принадлежат различным его
компонентам связности. Таким образом, если поменять
между собой цвета вершин в компоненте подграфа Gu,
содержащей вершину v%, то получится 5-раскраска
графа G\v, в которой нп одна из вершин, смежных с
вершиной v, не будет окрашена в цвет сг. Поэтому,
окрасив вершину v в цвет сг, образуем 5-раскраску
исходного графа.
2.4. Приближенные методы раскраски графов. Для
упорядоченного множества вершин Vi, ..., v„ графа G
последовательной раскраской, отвечающей этому
порядку, называется раскраска, использующая каждый из
цветов Cj, ..., ск и определяемая следующим образом:
а) вершине vt приписан цвет Cij
б) если подграф л^,,,,,,,^^, порожденный
вершинами Vi, ,.., Vi-i, /«'-раскрашен, A'<i —1, то вершина
у< получает цвет ст, где т<,к' + 1, т. е. цвет с
наименьшим номером, не встречающийся на смежных с
вершиной V{ вершинах.
Заметим, что число к при таком способе раскраски
заранее не фиксируется. Выбор данного способа
раскраски в качестве приближенного метода основан на
том, что этот простой способ дает точную А:-раскраску
для одного частного вида графов — полных &-дольных
графов. Применение его к графам произвольного вида
дает,- естественно, приближенную к оптимальной
раскраску.
к-долъным называется граф, множество вершин
которого можно разбить на к непересекающихся
подмножеств Xt, ..., Хк так, что никакие две вершины из
подмножества Хи 1&11:к), не смежны, ^-дольный
граф есть обобщение двудольного графа. Л-дольный
граф называется полным к-долъным, если каждая
вершина из множества Xt, Is И: к], см'ежна с каждой
вершиной из множества Xs, / <¥• I.
Лемма 6. Любая последовательная раскраска
полного k-дольного графа есть к-раскраска.
283
Пусть G — (V, Ё) — полный /сдельный граф. Если
»еГ(в we Vj, i Ф/, то вершины v и w должны быть
окрашены в разные цвета при любой
последовательной раскраске, поскольку вершины v и w смежны в
графе G. Пусть vu ..., vn — фиксированное
упорядочение множества вершин V, и пусть vt, i>, e Ур, г.</;
тогда у вершины v, в подграфе Н^ v.y те же
соседи, что и у вершины v{. Поэтому наименьший номер
цвета, отсутствующего на смежных с v} вершинах в
подграфе Н^ „. ^, должен бытыюмером цвета
вершины v(. Следовательно, вершины vt и Vj будут
окрашены алгоритмом, отвечающим этому упорядочению,
одинаково. В итоге все вершины каждого из множеств
Vs, ie[l:i], имеют один цвет, и граф G
^-раскрашен. Поскольку упорядочение вершин произвольно, то
лемма доказана.
Последовательные раскраски^ в общем случае не
обеспечивают раскраску графа в минимальное число
цветов.
Перейдем к рассмотрению разлпчпых стратегий
при организации последовательных раскрасок.
Теорема 6, давая оценку хроматического числа ;через
наибольшую степень, приводит к мысли начать
раскрашивать с вершин большой степени. Если таких
вершин мало, то можно обойтись меньшим числом
цветов. Упорядочим вершины графа в порядке убывания
их степеней и применим описанную выше
последовательную раскраску. После того как будет окрашено
i вершин, будет израсходовано самое большее i
цветов, а потребуется для окраски оставшихся не более
1 + max deg vt цветов (лемма 5), откуда и получаем
i
оценку, даваемую теоремой 10:
X(G)<; max min {{, 1 + degi^}.
Эта оценка называется оценкой хроматического числа
через усеченную максимальную степень.
Упорядочение вершин в соответствии с убыванием
их степеней назовем НП-упорядочением
(«наибольшие— первыми»), а алгоритмы, основанные на таком
упорядочении, назовем НП-алгоритмами. Заметим, что
требуемое НП-алгоритмом число цветов может
варьироваться из-за неоднозначности НП-упорядочения,
но никогда не превосходит числа, определяемого
оценкой через усеченную максимальную степень.
284
Более детальное рассмотрение процедуры
последовательной раскраски показывает, что для заданного
упорядочения vt, ..., v„ вершин графа G
соответствующий алгоритм последовательной раскраски требует не
более к красок, где
/с= max (1 + degfl<rii...>r.>i;i]. (5.22)
Здесь degH^j,...,^) v{ обозначает степень вершины v(
в подграфе Н^ чу
Упорядочение вершин, минимизирующее к в (5.22),
строится следующим образом:
а) для га = | V\ в качестве vn выбирается вершина
минимальной степени в графе G;
б) для i = га — 1, га — 2, ..., 2, 1 в качестве У<
выбирается вершина минимальной степени в подграфе
Я<^\{"П 4+i}>-
Упорядочение вершин такого вида будем называть
ПН-упорядочением («последними — наименьшие»).
Следует отметить, что, во-первых, произвольное ПН-
упорядочение минимизирует к в (5.22) по всем га!
возможным упорядочениям, во-вторых, определение
ПН-упорядочения носит характер рекурсивности, не
присутствующей в процедуре НП-упорядочения. Дело
в том, что степени вершин, вычисляемые при ПН-
упорядочении, относятся к подграфам, тогда как при
НП-упорядочении степени вершин вычисляются в
самом графе. Таким образом, эти упорядочения не
эквивалентны.
Процедура определения ПН-упорядочения вершин
и нахождения по нему раскраски будет называться
ПН-алгоритмом. По своему строению ПН-алгоритм
приводит к раскраске не более чем 1 + max min degH v
HCG vSH
цветами, что в точности совпадает с оценкой,
даваемой теоремой 7. Эта оценка называется максимальной
по подграфам через минимальную степень оценкой
хроматического числа. Очевидно, что она или точнее,
или совпадает с оценкой через усеченную
максимальную степень.
Для улучшения качества раскраски, даваемой ПН-
алгоритмом, к /с-раскраске может быть применена
дополнительная процедура перекраски. В самом деле,
когда вершина v( присоединяется к к — 1-раскрашен-
ному подграфу ^<»1,...,ri_1>) то /с-й цвет требуется
285
лишь в том случае, если вершина vt смежна с
вершинами, окрашенными в цвета ct, ..., c„_i. Если эти
вершины образуют полный к — 1-вершинник, то
необходим цвет ск. В противном случае возможна такая
перекраска некоторых смежных с у( вершин, что подграф
Я^х Г{-1^ будет по-прежнему окрашен к—1
цветами, но на вершины, смежные с вершиной vt, будет
потрачено не более к — 2 цветов.
2.5. Алгоритм с перекраской
двуцветных подграфов — ПНП-алгоритм.
Вход: Граф G с ПН-упорядоченными вершинами.
Выход: Субоптимальная раскраска вершин.
начало
1./:=1;
2. для i от 1 до п шаг 1 цикл
3. начало
4. т := наименьший номер цвета, отсутствующего
на вершинах, смежных с вершиной vt;
5. если т < j то
6. окрасить вершину vt в цвет ст;
7. иначе начало
8. К:= множество цветов, представленных ровно
один раз на вершинах, смежных с вершиной vt;
9. если найдется пара а, р fe К, такая, что
вершины va и Ур, смежные с v{ и окрашенные в цвета аир,
не соединены двуцветной цепью то
10. начало
11. перекрасить ту компоненту двуцветного графа
G<xi, которая содержит вершину va;
12. окрасить вершину vt в цвет а;
13. конец
14. иначе начало
15. /:-/ + 1;
16. окрасить вершину vt в цвет Cj;
17. конец
18. конец
19. конец цикла;
конец
Теорема 13. Алгоритм последовательной
раскраски вершин, основанный на ПН-упорядочении вершин
с пошаговой перекраской, требует не более 5 цветов
для раскраски любого планарного графа.
Доказательство будем вести индукцией по числу
вершин i. Пусть вершины планарного или даже пло-
283
екого (для определенности) графа G ПН-упорядочены,
т. е. вершина vt имеет минимальную степень в графе
Я^,..,-,»£, fe[l: л]. Для J — 1 граф Я^ 1-рас-
крашен. Предположим, что для некоторого t граф
Я/^,...,»{_!> 5-раскрашен ПНП-алгоритмом.
Поскольку граф Я/В1 Viy плоский, то степень
вершины v{ в графе Я^ Tiy не превосходи! пяти.
Если на вершинах, смежных с вершиной vt в
подграфе Н (vx Г(\,, встречаются не все пять цветов, то
вершина vt будет окрашена ПНП-алгоритмом без
обращения к шестому цвету. Если, напротив, каждый
цвет представлен по одному разу, то существует
некоторая перекраска, приводящая к уменьшению числа
цветов на вершинах, смежных с вершиной vt.
Поскольку ПНП-алгоритм просматривает все возможные
перекраски, то подходящая перекраска будет найдена и
подграф Я^,...,,,^ будет раскрашен пятью
цветами. Теорема доказана.
Если граф G не содержит подграфа с минимальной
степенью 5 или более, то для ПН-упорядочения
вершин
deg<r- , ч vi - min deg/„ (>^<4Г
и. можно показать, что ПНП-алгоритм в этом случав
раскрашивает граф в четыре цвета.
2.6. Алгоритм Д. Рассмотрим более эффективный
алгоритм последовательной раскраски. Назовем
степенью насыщения вершины v в частично
раскрашенном графе число различных цветов на смежных с v
вершинах. В алгоритме Д последовательно
окрашиваются вершины с наибольшей степенью насыщения.
Алгоритм:
начало
1. упорядочить вершины в порядке невозрастания
их степеней (НП-упорядочение);
2. вершину Vi окрасить в цвет cf;
3. для г от 1 до п — 1 шаг 1 цикл
4. начало
примечание в графе окрашено I вершин конец
дримечания
5. сформировать множество К вершин с
наибольшей степенью насыщения;
6. выбрать из К вершину vi+i с наибольшей
степенью в нераскрашенном подграфе;
287
7. окрасить v{+i в цвет с наименьшим возможным
номером;
8. конец цикла;
конец
2.7. Алгоритм Ершова — Кожухина. В основе этого
алгоритма лежит принцип склеивания вершин и
сведение исходного графа с помощью такого склеивания
к графу с меньшим числом вершин.
Назовем окрестностью 1-го порядка Rt(v)
вершины v множество вершин, смежных с вершиной v.
Склеивание вершин v{ и v2 с окрестностями Д^Р,)
и R2(v2) соответственно есть преобразование,
состоящее в удалении вершин Vi и v2 и добавлении новой
вершины v, смежной со всеми теми вершинами, с
которыми были смежны Vi и v2, так что R^v) = RiivJ U
U Riiv2). Это не приводит к появлению параллельных
ребер, так как вершины удаляются вместе с
инцидентными ребрами. В результате склеивания пары вершин
получается граф с числом вершин, на единицу
меньшим, а также, возможно, с меньшим числом ребер.
Две вершины графа называются соцветными, если
существует минимальная раскраска вершин графа,
в которой они раскрашены в один цвет.
Лемма 7. В любом графе, отличном от полного,
существует по крайней мере одна пара соцветпых
вершин.
Доказательство. Пусть граф G имеет п
вершин. Если ни в одной минимальной раскраске нет
двух вершин, окрашенных в один цвет, то %(G) = п.
Так как G — неполный граф, то в нем - есть хотя бы
одна пара несмежных вершин vt и vz. Склеим эти
две вершины. Получившийся граф G' будет иметь
п — 1 вершин, а, стало быть, %{G)<n— \. Взяв
любую раскраску графа G' в п— 1 нвет (или менее),
найдем в ней вершину, в которую были склеены вериш-
ды Vi и и2. Расклеив эти вершины и сохранив их цвет
в данной раскраске графа G', получим раскраску
графа G в п — 1 или менее цветов, что противоречит
предположению x(G) = га-
Лемма 8. Если граф G' получается из
графа G склеиванием пары соцветпых вершин, то
X(G')=x(G).
Теорема 14. Для всякого графа с хроматическим
числом х существует последовательность попарных
288
склеиваний вершин, приводящая к полному %-вер-
шиннику.
Доказательство. Указанная
последовательность склеиваний строится следующим образом. В
исходном графе ищем пару соцветных вершин и
склеиваем. В силу леммы 8 хроматическое число при этом
остается неизменным. В силу леммы 7 такое
склеивание можно делать до тех пор, пока не будет
получен полный граф, в котором по лемме 8 не может
быть более %(G) вершин. Теорема доказана.
Практически в доказательстве теоремы 14
содержится алгоритм раскраски, исключая момент выбора
соцветных вершин. Так как вся сложность решения
задачи о раскраске указанным методом заключается
в построении последовательности соцветных вершин,
то необходима подходящая эвристика для этого шага.
Теорема 15. Для любой вершины v, у которой
окрестность 1-го порядка ЯДу) не совпадает со всем
множеством Х\{иУ, в окрестности 2-го порядка R2(v)
имеется по крайней мере одна соцветная вершина.
Доказательство. Рассмотрим некоторую
минимальную раскраску графа G, в которой вершина v
получает цвет а. Если в этой раскраске некоторая
вершина w из Rz(v) будет также окрашена в цвет а,
то все доказано (рис. 5.14, а).
Рис. 5.14.
Рассмотрим теперь случай, когда ни одна вершина
из й2(у) не окрашена в цвет а (рис. 5.14, б). Возьмем
в этом случае любую вершину w из /?2(у),
окрашенную в цвет [J, и рассмотрим окрестность Rt(v)
вершины v. Возможны два случая: в йДу) нет вершин,
окрашенных в цвет р, и в Riiv) имеются вершины,
окрашенные в цвет {$. В первом случае перекрасим
вершину v в цвет р, и теорема в этом случае доказана.
Во втором случае обозначим множество вершин в ок-
*" В, А. Евстигнеев
289
рестности Ri(v), окрашенных в цвет р, через R'. Так
как для любой вершины u^Rt(v) справедливо
включение Ri(u) = Ы U Rt(.v) U R,(v) (рис. 5.14, в), то ясно,
что для любой вершины из R' вершина v является ее
единственной смежной вершиной, окрашенной в цвет
а. Перекрасив теперь вершины из R' в цвет ее, убрав
предварительно его с вершины v, получим, что цвет (J
исчез из окрестности 7?,(у). Приписав вершине v цвет
р\ докажем справедливость теоремы и в этом случае.
Хотя алгоритм Ершова — Кожухнна, основанный
на склеивании соцветных вершин, несколько уступает
по затратам времени алгоритмам последовательной
раскраски, он обладает одним значительным
преимуществом — он дает возможность работать с большими
графами. Эвристика, определяемая теоремой 15, может
быть усложнена выбором в качестве кандидатов на
склейку той пары вершин, у которых наибольшее
число общих смежных вершин.
2.8. Доказательство теоремы 9. Докажем верхнюю
оценку, т. е. неравенство
x(G)<[(3 + V9 + 8(m-n))/2].
Пусть граф G имеет п вершин и т ребер. Если
граф G не полный, то в нем найдется пара соцветных
вершин, склеивая которые мы получаем граф с тем
же хроматическим числом, но в котором вершин на
единицу меньше и по крайней мере на одно ребро
меньше, чем в исходном. Пусть после s склеек (s < п)
мы получили полный п — s-вершннник G„ для которого
x(C.) = x(G) = n-«. (5.23)
Граф G, будет иметь %(G)(%(G) — 1)/2 ребер, т. е.
будет иметь на т — %(G)(%(G) — 1)/2 ребер меньше,
чем граф G. Но поскольку на каждом i-м шаге, i e
s[l;s], граф d содержал по крайней мере на одно
ребро меньше, чем граф G,-, (G0 = G), то
m-%(G)(x(G)-i)/2>s
или, в силу (5.23),
т- (X(G)(x(G) - 1))/2 >п- -/(G). (5.24)
Решая это неравенство относительно %(G), получим
%(G) ^ (3 + У9 + 8(ш-п))/2 (5.25)
для любого графа G. Найдем теперь граф G' с п вер-
290
шинами и т ребрами, для которого %(G')**x, где
x-l(3 + V9 + 8(m-n))/2l. (5.26)
Нетрудно увидеть, что число ребер в связном графе
удовлетворяет неравенствам
n-l^m*Z п(п-1)/2.
Отсюда и из (5.26) вытекает, что
х^п, х(х-1)/2^т, п-х^т-хЫ-1)/2. (5.27)
Граф G' строится следующим образом: вначале
строится полный х-вершинник, к некоторой
произвольной его вершине присоединяется цепь, содержащая
п — х вершин и п — к ребер, а оставшиеся ш —
— х(х — 1)/2 — (п — х) ребер расставляются
произвольным образом. Поскольку граф G' содержит в качестве
подграфа полный х-вершинник, то %{G')>x, откуда,
в силу (5.25), следует оценка
X(G') = [(3 + V9 + 8(m-n))/2].
Доказательство нижней оценки. Пусть для графа
Gen вершинами и m ребрами %(G) — к. Назовем
отсутствующим ребром {vq, vr) в графе G любую пару
несмежных вершин vq и vr, а также все пары вида
(ия, vq). Очевидно, что количество отсутствующих
ребер в графе G равно пг — 2т. Рассмотрим любую
минимальную раскраску графа G. Пусть Xt — множество
вершин, окрашенных в цвет си 1&[1:к], и \Xi\=]ii.
Поскольку все вершины из Xt попарно несмежны, то
общее количество отсутствующих ребер, образованных
только вершинами из Xh равно пг Отсюда сразу же
вытекает неравенство
h
2 и? < и2-2m (5.28)
1=1
при условии, что
2 »» = п. (5.29)
л
Найдем минимум р функции F = 2 ni ПРИ усло-
вии (5.29) на множестве целых чисел. Положим
и, = In/к] +2/,, I = п - [п/к]к, (5.30)
19*
291
где п/к — значения п(, минимизирующие F при
условии (5.29) на множестве рациональных чисел.
Очевидно, что
Spi-*, 0</</c. (5.31)
Легко показать, что нахождение минимума функции
k
F сводится к нахождению минимума 2 J/t при усло-
вии (5.31). Этот минимум достигается, например, при
J/i =... = Vh-i = 0, ук-i+t ==... = i/4 = 1. Отсюда
следует, что
р = пг/к + к(п/к - [п/к])(1 + ln/к] - п/к), (5.32)
где пг/к — минимум F на множестве рациональных
чисел. Теперь (5.28) можно переписать в виде
к\п/к - [n/AJ )(1 + [п/к] - п/к) ^ (п2 - 2т)к - п\ (5.33)
Из этого неравенства следует, что
%(G) > v - -1-х,] (5.34)
для любого графа Gen вершинами и т ребрами, где
х0 — корень уравнения
хЧп/х.- [л/ж] XI + [п/х] - п/х) = (пг - 2т)х- п\ (5.35)
лежащий в отрезке от 1 до п.
Исследуя поведение левой и правой частей
уравнения (5.35), легко показать, что [п/х0] — [nArJ, где
xi есть корень уравнения W — 2т)х — га2»=0.
Вычислив [n/xi] и подставив его в (5.35), получим линейное
уравнение относительно х, из которого находим х„:
/гаа — 2ml
в I »
Ь° = Г и2 — 2т
га'—2т
Отсюда непосредственно следует справедливость
нижней оценки.
Библиографический комментарий
Постановка задач о разрезании графов дана в соответствии
с работами [15, 68]. Разрезания деревьев и графов методом
динамического программирования исследовались в работах
Дж. Лукеса [127, 128]. Алгоритм субоптимального разрезания
292
графов принадлежит А. С. Никитину и В. Н. Венгврову [82].
Лтетод разрезания бесконтурных орграфов на минимальное
число кластеров принадлежит Г. А. Бекишеву и излагается по
работе [8]. Метод ветвей и границ для разрезания бесконтурных
орграфов принадлежит Т. А. Тушкиной и К. В. Шахбазян [74].
С правильными раскрасками графов можно познакомиться
в книгах [33, 75, 80] и др., там же можно найти ссылки на
соответствующую литературу. Заметим, что теорема 5 носит
название теоремы Кёнига, теорема 6 — теоремы Брукса,
теорема 7 — теоремы Секереши — Вилфа, теорема 9 — теоремы
Ершова — Кожухина, теорема 10 — теоремы Уэлша — Пауэла,
теорема 12 — теоремы Хпвуда. Приближенные методы раскраски
излагаются по обзору [130] (см. также [25]), алгоритм Д описан
в работе [104] (алгоритм DSATUR), описание алгоритма
Ершова — Кожухина дано по книге А. П. Ершова [30],
доказательство теоремы 9 — по работе [31]. В алгоритме А. А. Бульонко-
вой [12] сочетаются преимущества алгоритма Ершова —
Кожухина с быстродействием алгоритма Д; алгоритм Д дополняется
процедурой склеивания одинаково окрашенных вершин на
каждом шаге приписывания цвета вершине. В отличие от ее
алгоритма, в работе [109] предлагается вычислять для всех пар
несмежных вершин число общих смежных вершин и выбирать
для склейки пару с наибольшим таким числом. Хорошие
обзоры приближенных методов раскраски даны также в [1-24, 126].
Интерес к этим методам вызывается весьма вероятным
отсутствием полиномиального алгоритма (подробнее об этом
см. [115]).
ГЛАВА 6
ПРИМЕНЕНИЕ ТЕОРИИ ГРАФОВ
В ПРОГРАММИРОВАНИИ
§ 1. Анализ и тестирование программ.
Вычисление характеристик программ
При конструировании и отладке программ
возникают задачи, либо сводящиеся к задачам теории графов,
либо использующие таковые в качестве основы для
решения. К ним в первую очередь относятся задачи
анализа потока управления в программе, задачи
тестирования и проверки правильности программы,
оценки сложности и времени исполнения. Связь
между такими задачами и задачами теории графов
показана в виде таблицы.
1.1. Пути г-го уровня в управляющих графах и
оценка времени исполнения программ. Пути £-го
уровня отражают глубину вложенности оператора; чем
больше уровень вложенности, тем труднее достичь
этого оператора и, значит, тем сложнее проверка
правильности его работы. Путь уровня 0 есть простой
s — <-путь; путь уровня 1 есть простой путь или
контур, который начинается или заканчивается в
вершинах путей уровня 0. Аналогично, путь уровня i есть
простой путь или контур, который начинается или
заканчивается в вершинах путей меньшего уровня и у
которого ни одна другая вершина или дуга не входит
в путь меньшего уровня. Путь уровня i
сопоставляется самому меньшему из возможных уровней.
294
Задача системного
программирования
Соответствующая задача теории графов
Оптимизация программ,
в том числе
выделение фрагментов
(структуризация) и
декомпозиция
Проверка
правильности программ
Определение порядка
обработки операторов
при потоковом
анализе
Тестирование программ
Нахождение домпнаторов
Перечисление бикомпонент
Перечисление контуров
Перечисление интервалов
Перечисление гамаков
Перечисление линейных компонент
Нахождение вложенных зон
Нахождение вложенных контуров
Интервальное представление графа
Нахождение транзитивного и
обратного транзитивного замыкания
Нахождение замыкания
относительно множества вершин
Перечисление путей
Перечисление контуров
Нумерации вершин
Построение длинных
последовательностей вершин
Нахождение покрытия вершин
путями
Нахождение покрытия дуг путями
Нахождение покрытия требуемых
путей путями
Нахождение кратчайшего пути при
наличии дополнительных
ограничений
Нахождение множества
фундаментальных циклов
Определение цпкломатического
числа
В качестве примера приведем полный список
путей г'-го уровня управляющего графа программы из
п. 2.1 главы 1:
Уровень
0
1
2
3
Пути
\i[v3, vs] = [с, e, f, и, w)
P[v3, v3] = [c, e, g, h, /, u, w]
[Фз> «-'si = fc. e< S, h, k, m,.u, v)
1ф;8> ''•;] = I". P' 5> r, s, t]
нет
295
Для оценки времени исполнения рассмотрим
марковскую граф-модель программы. Будем считать, что
с каждой вершиной v граф-модели связан параметр т<,
задающий время исполнения соответствующего
оператора. Время исполнения программы есть случайная
величина, определяемая параметрами граф-модели и
ее структурой. Ее можно интерпретировать как время
блуждания точки по графу с заданными временами
задержек точки в вершинах и с заданными
вероятностями переходов. Траектория движения такой точки
есть путь из входа s в выход t графа. Поэтому
вычисление оценки сводится к генерированию
всевозможных путей из s в t. Введем понятие пути m-го ранга.
Простой s — f-путь есть путь ранга 0. Простые
контуры, имеющие общие вершины или дуги с путями
нулевого ранга, образуют s — f-пути первого ранга.
Аналогично определяются пути произвольного ранга.
С каждым таким путем связывается случайная
величина — время его прохождения блуждающей точкой.
Несмотря на бесконечность множества путей., для
программ небольшого размера можно найти ожидаемое
время блуждания и распределение этой случайной
величины. Если же время исполнения оператора есть,
в свою очередь, случайная величина, то мы имеем
дело с полумарковской моделью. Процедура расчета
среднего значения и дисперсии времени исполнения
такой программы может быть сведена к пошаговой
упрощающей замене фрагментов графа с
последовательно и параллельно соединенными дугами (а также
с петлями) новыми фрагментами с соответствующим
рекуррентным пересчетом вероятности попадания па
дугу q, среднего значения р. и дисперсии о2 времени
для дуги (время исполнения операторов переносится
на выходящие из соответствующей вершины дуги, что
в общем все равно). На последнем шаге получается
граф, состоящий из двух вершин и одной
соединяющей их дуги, параметры р. и о2 которой дают искомые
характеристики графа в целом. Этот же способ
расчета можно применять и для марковской модели, если
положить все о2 = 0, р, — равными фиксированным
значениям времени исполнения операторов.
1.2. Операции над управляющими графами.
Объединением управляющих графов G = (Х{, Ut) с входом
s( и выходом ti и d — (Хг, Uг) с входом s2 и выходом
U называется управляющий граф G = (X, V) = Gj U G%
298
с входом * и выходом t, у которого X = Xi U Хи U =
= Ui U Uг, а вход s и выход t получаются
отождествлением входов Si и s2 и выходов ti и U соответственно.
Лемма 1. Для любых двух управляющих графов
G4 и Ga
CuG^CuG,.
Лемма 2. Для любого управляющего графа G
G U G - G.
Лемма 3. Для любых управляющих графов G,,
G2 м G,
(G, U G2) U G3 = G, U (G, U G,).
Пусть С есть множество s — f-путей в графе G.
Л е м м а 4. Для любых управляющих графов Gu
G2, Gj из G3 = G, U G2 следует G3 э S", и <72.
'Лемма 5. Для каждого управляющего графа G
существует такое п и такие управляющие графы
Gu ..., G„, что
G = (...(G1UG2) U...)UGn.
Более того, для каждого llt ..., ?(е{1( .. 1( п) имеет,
место соотношение
{•. .{Gtl\i Git) V . •-)U вц = Gh и ... и 5Ч (6.1)
(е частности, U — G\ 1).. .11 5J.
Доказательство. Пусть управляющий граф
G = (X, С/) имеет вход s и выходы д, ,,, ,j g. . Оп-
ределим для каждого I е [у1! : д] простой управляющий
граф следующим образом: G( = (X,, С/;, s, qi), что
означает, наличие входа s и выхода д(, и Xi есть
множество всех тех вершин графа G, из которых достижима
вершина g,, a Ui*={(x, y)e=U\x, i/el,}, Очевидно,
что (...(G1UG1)U...)UGX = G. ■
Докажем теперь соотношение (6.1). Пусть h, ...
..., /(^[1:и]. Достаточно показать, что имеет место
включение
(...(£/! U^2)U-..) \}Git S^u,.. u'fyi
так как обратное включение следует из леммы 4. Но
требуемое включение следует из того, что любой путь
из входа s в какой-нибудь выход д.. принадлежит
целиком графу G(,t а следовательно, и множеству Qx.t
297
Композицией G, • G, управляющих графов G, =>
= (Хи Uu sh ti) и G2 ■= (X2, £/2, s2, ti.) называется
управляющий граф G — '{X, U, s, t), у которого X —
= Xi U X2, U = t/i U £/2, s = Si, £ = t2, а выход £t
отождествлен с входом s4.
Лемма 6. Для любых управляющих графов G,,
G2, G3 справедливы соотношения:
а) (Gi • G2) • G3 = G,»(G2« G3);
б) Gl.(G2UG3) = (G1oG2)U(G1.G3);
в) (G, U G2) = G3 = (G, • G3) U (G2 = G3).
Лемма 7. Для любых управляющих графов G,,
G2, Gs из G3 = G, о G2 следует G,3ff,' G~2.
Представим теперь введенные операции в виде
синтезирующих графов (графов-операций) с
формальными параметрами tt, t2, ..., вместо которых
подставляются управляющие графы (в простейшем случае
это—элементарные графы е„ и е, (рис. 6.1, в, г). При
подстановке вместо параметра Л некоторого
управляющего графа из него удаляются начальная и конечная
6) г)
Рис. 6.!.
вершины; если подставляемый управляющий граф
изоморфен е0, то tt исчезает. Операции объединения
(рис. 6.1, о) и композиции (рис. 6.1,6) не
исчерпывают всех допустимых операций. Весьма продуктивными
являются четыре типа итерации:
— итерация 7Д^) типа while-do (рис. 6.2, а);
— итерация /2(Л) типа repeat-until (рис. 6.2,6);
— итерация Is(tu t2) типа for-while-do (рис. 6.2, в);
— итерация /4U,, ..., tn), n>l (рис. 6.2, г).
Графы, синтезируемые с помощью операций
объединения, композиции и одной из четырех операций
итерации /4 — /t, соответствуют одному из четырех
классов структурированных управляющих графов.
1.3. Эквивалентные преобразования управляющих
графов. Существует несколько преобразований
управляющих графов, при которых исходный граф стано-
298
вится управляющим графом программы,
функционально эквивалентной данной. В предлагаемых описаниях
преобразований и описание, и иллюстрации будут
касаться только той части графа, которая
непосредственно затрагивается преобразованием. Особенно это
касается вершины, обозначенной буквой N. Мы будем
предполагать, что ни одна дуга не входит в нее и ни
одна дуга не исходит из нее, кроме тех, которые
изображены на рисунках.
Рис. 6.2.
Преобразование Т1: расщепление вершины
N. Пусть_(? — некоторое подмножество множества ГЛ7,
Q s YN, Q Ф 0. Удалим из графа все дуги, ведущие
из N в Q, добавим новую вершину Nu дугу (N, NJ
и дуги из Nt в Q, Заметим, что случай N е IW не
исключается. _
В примере на рис. 6,3 Q — {N, D, Е},
Преобразование Т2: расщепление вершины N.
Пусть / — некоторое подмножество множества Г-1^,
/ s r~'iV, / Ф 0. Удалим все дуги, ведущие из / в N,
добавим новую вершину N\, дугу (Nu N) и дуги,
ведущие из всех вершин множества / в N,.
В примере на рис. 6.4 / —{Л, В).
Преобразование ТЗ: дублирование вершины
N. Пусть I^T-'N, N&I, 1Ф0. Удалим все дуги,
299
ведущие из множества / в вершину N, добавим новую
вершину Ni, дуги из N{ во все вершины из множества
TN, исключая N, если есть петля (N, N), и дуги из
каждой вершины из множества / в Nt. Если есть
петля {N, N), то добавим петлю (Ni, Ni).
На рис. 6.5 7-=U, В).
Рис. 6.4.
Рис, 6.5. Рис. 6.6.
Преобразование Т4: удаление дуги (A, N).
Это преобразование можно провести только в том
случае, когда нет петли {N, N). Удалим дугу (A, N) и
добавим дуги, ведущие из вершины А во все вершины
множества ГЛ7. Если Г_17У =» {А}, то удаляем также
вершину N и все дуги, исходящие из N.
Схема данного преобразования дана на рис. 6.6.
Преобразт>вание Т5: удаление вершины N.
Это преобразование может быть проведено только
тогда, когда нет петли (N, N); оно представляет собой
последовательность преобразований Т4, примененных
в произвольном порядке к дугам, идущим в вершину
- -р N. Состоит оно в удале-
ДЧ УС нии всех дуг, заходящих
^ J><C в веРшинУ N и исходя-
$^У*^~\ Щих из ^i Удалении
вершины N и добавлении
ас- 6-7- дуг, ведущих из каждой
вершины множества T~lN
в каждую вершину множества N.
Схема данного преобразования дана на рис. 6.7.
Из данных преобразований наиболее сильные
изменения в граф вносят преобразования Т4 и Т5.
Остановимся подробнее на их свойствах.
800
Поскольку вершина может быть удалена только
в том случае, когда в ней нет петли, то удаление
вершин следует проводить так, чтобы получить петлевой
граф (см. п. 5.9 главы 2). Возникают два вопроса:
каким псобходимым и достаточпыл условиям должен
удовлетворять граф, чтобы его можно было бы
преобразовать путем последовательного удаления вершин
в петлевой граф, и в каком порядке следует удалять
вершины?
Теорема 1. Если орграф является KLC-графом,
то его нельзя преобразовать в петлевой граф.
Утверждение теоремы очевидно, так как по
определению А-контурно-связного графа последний
обязательно содержит контур, отличный от петли.
Будем говорить, что вершина N может быть
безопасно удалена из графа G, давая в результате граф
G', тогда и только тогда, когда она может быть
удалена с помощью преобразования Т5 и в графе G
найдется вершина А, отличная от TV и обладающая тем
свойством, что все простые контуры в графе G,
содержащие N, содержат и А.
Укажем некоторые частные случаи, когда
вершина N может быть безопасно удалена:
— если не существует контура, содержащего
вершину N;
— если только один простой контур содержит
вершину N;
— если из вершины Л: исходит только одна дуга
(отличная от петли);
— если в вершину N заходит единственная дуга.
Пусть теперь в произвольном графе
осуществляются в произвольном (!) порядке безопасные удаления
вершин, пока не получится граф, в котором данную
операцию выполнить нельзя.
Теорема 2. Если граф G не является к-контур-
но-связным и граф G' получается из G безопасным
удалением вершины N, то граф G' также не является
k-контурно-связным ни для какого к.
Теорема 3. Если граф G не является к-контур-
но-связным ни для какого к и если ни одна вершила
G не может быть безопасно удалена, то граф G
является петлевым.
Теорема 4. Если из графа G удалена вершина Л^
и удаление не является безопасным, то получившийся
граф G' является к-контурно-связным для некоторого Л}
801
Доказательства теорем мы опускаем из-за их
громоздкости.
Теорема 4 показывает, что безопасные удаления
представляют собой самый широкий класс удалений,
которые можно использовать в описанном процессе.
Введенное в главе 2 понятие контурного ранга
дает возможность по-новому определить безопасное
удаление вершины. Чтобы отличить этот вариант
безопасного удаления от введенного, будем говорить о С-уда-
лении; вершину же, которую можно безопасно
удалить С-удалением, будем, называть безопасной. ■
Удаление вершины N из графа G называется
(безопасным) С-удалением, если существует минимальный
разрез в графе G, не содержащий вершины N.
Теорема 5. Если граф G' получается из графа G
С-удалением вершины, то ка = kG>, где kG — контурный
ранг G.
Теорема 6. Если граф G' получается из графа G
удалением небезопасной вершины, то kg> > kg.
Утверждения лемм очевидны.
Лемма 8. Если минимальное сечение в графе G
содержит все вершины графа, то тогда каждая
вершина имеет петлю.
Лемма 9. Если в графе невозможно ни одно
С-удаление верш.ины, то граф имеет петлю в каждой
вершине.
Теорема 7. Если G — сильно связный граф и G
имеет петлю в каждой вершине, то граф G может
быть преобразован в полный орграф с п вершинами
с помощью преобразования Т4 удаления дуг.
Доказательство. Пусть Ai{ и А^ —две
вершины графа G = (X, U) такие, что (Aiv ^*2)е U. Так как
граф G сильно связен, то существует путь \А1х, ...
..., Air] из Л;х в Л;г Если теперь удалить дугу
(^ij, -^ij+i) из графа G, то тогда, по определению
преобразования Т4, добавятся дуги (A;.v At Л и
(Aip Aij+2)- Продолжая процесс, мы получим в итоге,
что в дополнение к пути \Aiv ..., Alr]появится дуга
(^ir Air}, откуда и следует утверждение теоремы.
Дуга и графа G называется безопасной, если и
есть дуга простого контура в графе G и конец дуги- и
есть безопасная вершина. Удаление дуги есть
безопасное удаление, если удаляемая дуга безопасна.
302
Теорема 8. Если граф G' получается из графа G
безопасным удалением дуги, то ка, = к0.
Следствие. Если граф G' получается из графа
G удалением дуги, не содержащейся ни в одном
контуре в G, то kG = kc.
Теорема 9. Если граф G' получается из графа G
удалением дуги {А, В), которая принадлежит простому
контуру в G, но ее конец В не является безопасной
вершиной, то А'с > кв.
1.4. Связь контурной связности с контурным
рангом. Легко увидеть, что если вершина допускает
безопасное удаление, то она допускает и С-удаление,
хотя обратное не-обязательно верно. Предположим
теперь, что G — сильно связный граф с ка > 2. Пусть
граф G' получается из графа G применением
безопасных удалений вершин, пока это возможно. Тогда по
теореме 8 kai — ko^2. Следовательно, граф G' также
сильно связен. Предположим теперь, что граф G не
контурно-связный граф. Тогда по теореме 3 граф G'
является петлевым. По граф G' имеет по крайней
мере две вершины и сильно связен, поэтому он не может
быть петлевым, следовательно, он должен быть
контурно-связным. Обратно, если G контурно-связен,
то существуют вершины А, В в G и контуры СА, Cs
и С, которые удовлетворяют определению контурно-
связного графа. В частности, в графе не имеется ни
одной общей для С а, Св и С вершины, что влечет
kG Э= 2. Таким образом, если граф G сильно' связен,
то он контурно-связен тогда и только тогда, когда
А-„ > 2.
Предположим, что G — произвольный орграф.
Рассмотрим его бикомпоненты. Если каждая из них
имеет контурный ранг 1, то последовательным
применением безопасных удалений вершин граф редуцируется
к петлевому графу; в противном случае он будет
редуцирован к графу, являющемуся LC-графом, и,
следовательно, граф G не преобразуется в петлевой граф.
Пусть теперь граф G' есть петлевой граф. Ясно,
что контурный ранг каждой его бикомпоненты равен
1, и отсюда следует, что то же верно для каждой
бикомпоненты графа G. Таким образом, граф G
преобразуется в петлевой граф с помощью безопасных
удалений тогда и только тогда, когда ранг каждой
бикомпоненты графа G равен 1. По сказанному выше
это верно только тогда, когда каждая бикомпонента
303
графа G не является контурно-связной, что справед*
ливо, если сам граф не является контурно-связным.
Следовательно, мы доказали, что граф G
преобразуется к петлевому графу, если он не LG-граф.
1.5. Дипломатическая мера сложности программ.
Определим цикломатическое число орграфа как
цикломатнческое число неориентированного графа,
получающегося ваменой всех дуг исходного орграфа
ребрами.
Теорема 10. В сильно связном орграфе
цикломатическое число равно числу линейно независимых
контуров.
Применяется эта теорема так. Пусть програм.ма
представлена своим управляющим графом с входом s
и выходом t. Если соединить t с s дугой, то
получится сильно связный граф, и, следовательно, по
теореме 10 можно вычислить число линейно независимых
контуров. Это дает возможность выразить любой
s — f-путь как линейную комбинацию независимых
контуров.
Пример. Пусть управляющий граф некоторой
программы имеет вид, показанный на рис. 6.8
(штриховая линия — добавленная дуга). Цикломатическое
число этого графа равно 5, т. е. в графе существует
пять независимых контуров. В качестве их можно
выбрать, например, контуры [$, vt, vit t, $], lvt, i?4, v,],
is, vt, v2, s], is, Vi, t, s], is, vs, Vi, t, $]. Тогда путь
is, Vi, i>4, s, vh i>4, Vi, vt, Vi, vk, t] выражается в виде
линейной комбинации [s, vit vit s)+2ivt, vit vj +
+ is, vit vit t, s].
Ясно, что основная идея ■ оценки сложности
программы через цикломатическое число состоит в изме-
s рении сложности программы путем вы-
f4 числения числа линейно независимых пу-
Д тей v(G) и в контроле «размера» програм-
*} мы наложением ограничения сверху на
J v(G) (вместо использования чисто физп-
'' ческого размера).
**£"' Дипломатической сложностью про-
Рис. 6.8. граммы называется величина v(G) =
= Я(С) + 2, где K(G) есть
цикломатическое число соответствующего управляющего графа.
Укажем на некоторые важные свойства циклома-
тической сложности:
1) v(G)>l.
304
2) v(G) равно максимальному числу линейно не-
зависимых путей в графе G.
3) Изменение ч"исла функциональных операторов в
программе не изменяет v(G).
4) Граф G имеет единственный s — f-путь тогда и
только тогда, когда v(G) = 1.
5). Добавление одной дуги увеличивает v(G) на
единицу.
6) v(G) зависит только от логической структуры
управляющего графа программы.
В общем случае существует корреляция между
относительными дипломатическими сложностями
программ и интуитивным ощущением их сложности.
Однако когда «неструктурированная» программа
сравнивается с некоторой хорошо структурированной
версией программы, функционально эквивалентной
исходной, то оказывается, что цпкломатпческая сложность
неструктурированной версии меньше, чем
структурированной.
Цпкломатпческая сложность есть только одна
компонента в измерении общей сложности программы.
Хорошо структурированная программа более ясно
выражена, ее легче читать, она более понятна, более
легка для проверки п отладки. С другой стороны, ясно,
что программа с цпкломатическим числом ^олее 10
создает впечатление ненадежной. Совершенно ясно, что
цикломатпческую сложность опасно использовать для
прямого сравнения программ, поэтому имеет смысл
использовать ее как базу для получения более общих
результатов.
1.6. Тестирование — это проверка правильности
программы с помощью множества контрольных
примеров — тестов,
Тестом, проверяющим программу, называется
тройка х~(х, u(G), у), где х <= % — подмножество
значений входных данных; u(G) — s — f-путь в
управляющем графе G, соответствующий входным данным х,
у с У — подмножество значении выходных данных при
прохождении программой пути у.
Из определения вытекает, что для полного
тестирования программы желательно проверить все s — t-uy-
ти. Но так как это невоможно даже для небольших
программ, то возможны различные стратегии
тестирования.
20 в. д. Евстигнеев 8Q5
В простейшем случае эадача тестирования
сводится к проверке предписанного числа операторов в
программе. Это требует построения пути в управляющем
графе, который проходит через предписанное
множество вершин, если таковой существует. Естественно
искать при этом не просто путь, а кратчайший путь.
В общем случае следует предполагать, что каждой
вершине сопоставлен вес w > 0, который можно
интерпретировать как сложность оператора (или
отдельного блока) программы, изображаемого данной
вершиной. Можно ожидать, что отыскание тестирующих
данных для тестирующего пути будет проще, если в нем
будет содержаться как можно меньше вершин из
множества L вершин, не подлежащих проверке. Это
соответствует задаче отыскания s — i-пути с наибольшим
весом при условии, что вершинам из множества L
приписан небольшой отрицательный вес. Решение этих
задач было рассмотрено в главе 3. Более общий
случай требует построения тестирующих путей,
покрывающих или все требуемые пути (заданные отрезки
путей в управляющем графе), или все дуги, или все
вершины управляющего графа. Эти задачи сводятся
к построению различного вида покрытий графа
путями.
Рассмотрим метод тестирования, основанный на
цикломатической сложности и сводящийся к
построению множества s — f-путей, каждый из которых
содержит дугу, не входящую ни в какой другой путь.
Предположим, что программа 5я уже написана,
вычислена ее цикломатическая сложность v и определено
число путей п для тестирования (фактическая
сложность). Если «>v, то должно выполняться одно из
следующих условий:
а) должно быть протестировано большее число
путей;
б) управляющий граф программы может быть
редуцирован к графу со сложностью v — п (т. е. может
быть удалено v —Я логических операторов);
в) части программы могут быть редуцированы в
линейный код (т. е. сложность увеличивается для
сохранения объема занятой памяти).
Приведем несколько простых примеров, поясняю»
щих сказанное. Предположим, что имеется
управляющий граф (рис. 6.9) с цикломатической сложностью
v(G), равной 3, Предположим, что Я = 2 и в качестве
806
тестирующих путей взяты пути [s, у,, v„ y5, t] и
Is, v2, v3, Vi, t]. При этом не проверяются еще два
возможных пути, имеем п < v, т. е. реализуется случай
б), и граф G может быть редуцирован к графу С,
удалением оператора (рис. 6.10). Заметим, что для С,
имеет место равенство v = n и сложность графа Gt
Рис. 6.9.
Рис. 6.10.
меньше сложности G. На практике этот подход
полезен тогда, когда программистам требуется
документировать свои управляющие графы и показывать точно
различные тестирующие пути. Часто случается, что
при сравнении числа тестируемых путей с
дипломатической сложностью выявляются новые тестирующие
пути, которые при другом подходе были бы не
замечены. Хотя есть смысл считать, что цикломатическая
сложность v равна минимальному числу путей,
подлежащих тестированию, на практике используются
методы тестирования как с большим, так и с меньшим
числом путей.
В качестве примера укажем на способ
тестирования, при котором число тестирующих путей не
превосходит дипломатической сложности, но который
гарантирует:
а) прохождение каждой вершины по крайней мере
один раз;
б) прохождение каждой вершины с двумя
исходящими дугами (логический оператор) по крайней мере
один раз по каждой исходящей дуге, хотя и не во всех
возможных комбнпациях.
Используемые на практике подходы часто
учитывают информационные связи в программе и излагаются
в специальной литературе.
1.7. Задача о контрольных точках. Задача
возникает при отладке больших программ и состоит в
нахождении наименьшего числа точек программы, в которые
5* 807
нужно поместить операторы выдачи контрольны^
распечаток для обнаружения ошибок в функционировании
циклических частей программы. В теории графов э'яа
задача соответствует задаче отыскания наименьшего
по мощности множества дуг, удаление которых
разрывает все контуры и тем самым превращает орграф
в бесконтурный. Нахождение точного, решения
представляет собой NP-поляую проблему, и для ее решения
неизвестен эффективный алгоритм. Рассмотрим,
приближенное решение, при котором отыскивается
множество дуг, принадлежащих как можно большему
числу контуров.
Вход: Множество простых контуров управляющего
графа, заданных перечислением дуг, входящих в
контуры.
Выход! Множество К дуг, разрывающих все
контуры.
начало
1. построить матрицу #=» ЯАцИ; контуры-дуги
которой
(1, если дуга Uj принадлежит контуру С^
(О в противном случае;
2. включить в множество К те дуги, которым в
матрице Н соответствуют строки, содержащие только одну
единицу;
примечание тем самым в множество К
включаются все петли, графа конец примечания
3. удалить из // строки и столбцы, соответствующие
этим петлям;
4. пока Н не пусто цикл
5. исключить из Н все мажорируемые столбцы, т. е.
те, для которых найдется хотя бы один столбец,
имеющий 1 в тех же строках, что и рассматриваемые;
6. включить в множество К дугу ит,
соответствующую столбцу с наибольшим числом единиц;
7. вычеркнуть из Н строки, соответствующие
единицам в г-м столбце, и сам r-й столбец;
конец
Алгоритм основан на принципе поиска локального
оптимума, его трудоемкость составляет О(сгп), где с —
число контуров, a m — число дуг.
308
I 2. Применение методов теории графов
к организации вычислительного процесса
2.1. Размещение блоков программы в оперативной
памяти ЭВМ: сведение к задаче коммивояжера. Пусть
Xi, ..., Хп — отдельпые блоки программы, и пусть
ptj _ вероятность исполнения блока Xt после Х(. Если
Xi — первый блок, а Хп — последний, то положим
^п1»=1 и />„j = 0. Если марковский процесс,
описываемый матрицей переходов р — Нр(,-11, является эргодиче-
ским, т. е. для него существует предельное
распределение и оно не зависит от начального состояния
процесса, то частоты исполнения отдельных блоков TV!, ..., N„
даются решением N—(NU ..., Nn) матричного
уравнения NP = N, нормализованного так, что сумма частот
исполнения равна 1. Пусть величины Nt найдены.
Тогда, если т; — время исполнения блока Х{, то
ожидаемое время . исполнения всей программы равно
п
•2 TiiVi- Если ptj и Ni известны, то можно рассмотреть
задачу оптимизации: минимизировать ожидаемое число
передач управления, производимых при выполнении
программы. Если 6aok*Xj следует в памяти за блоком
Xt, то передача управления пужна всякий раз, когда
после блока Х( будет выполняться блок Хк, отличный
от X]. Ожидаемое число таких передач равно ctj =
= NM-Pli).
Пусть х„ = 1, если блок X) непосредственно следует
за блоком Xj в памяти, п xtj = 0 в противном случае.
Иуйть Х„+1 — блок, состоящий из кодов начальных
данных и кодов, которые не выполняются в виде
команд. Тогда для всех i имеем cit „+1 = с„+1?( = 0.
Полагаем Ж(>п+1 = 1, если Х( — последний блок в памяти,
и xn+iii= 1, если Xj — первый блок в памяти, в
остальных случаях полагаем xit „+1 — xa'+li t = 0. Тогда
рассматриваемая задача сводится к минимизации ожидае-
П + 1 П+1
мого числа выполнения передач управления 2 2 cij,a:ij
— i=i i=i
при условии, что lix<jll есть матрица циклической
перестановки, а это и есть задача коммивояжера. Для
решения задачи коммивояжера не существует
эффективных алгоритмов, она является ЛФ-полной проблемой.
Она также является эталонной при исследовании
трудоемкости в том смысле, что многие задачи легко
сводятся к ней (эа полиномиальное время).
809
2.2. Рассмотрим ситуацию, когда на входе ЭВМ
лмеетея некоторое множество задач, имеющих общие
страницы в памяти. Требуется определить такую
последовательность пропуска этих задач, чтобы
минимизировать пересылки страниц памяти. Для решения
построим граф, вершинами которого будут служить
задачи, а две вершины будут соединены ребром тогда
и только тогда, когда они соответствуют задачам,
имеющим общие страницы памяти. Каждому ребру
сопоставляется вес, зависящий от числа общих страниц.
Тогда проблема активизации задач сводится к
отысканию оптимального каркаса графа активизации.
Особенность этой проблемы состоит в том, что чаще всего
стоимость каркаса есть нелинейная функция от весов
ребер.
2.3. Минимизация памяти при вычислении
арифметических выражений. Арифметические выражения
могут быть изображены корневыми ордеревьями, в
каждую вершину которых заходит не более двух дуг.
Начальные данные соответствуют висячим вершинам
дерева, а промежуточные результаты — внутренним
вершинам. Каждая внутренняя вершина изображает
бинарную операцию над аргументами,
соответствующими ее предшественникам. Порядок, в котором нужно
брать аргументы, в простейших моделях не
учитывается, в более сложных моделях он может играть
важную роль.
II р и м е р. Процесс вычисления арифметического
o£l__ ^ выражения ((а + Ь) —
— с * d)/{e * (/ — #))
изображается деревом на
>£ рис. 6.11.
Выбрать возможный
порядок операций —
значит топологически
упорядочить дерево,
т. е. расположить его
Рис- 6.11. вершины в
целочисленных точках прямой в
такой последовательности, что вершина v предшествует
вершине v, если существует дуга из v в v. Это условие
эквивалентно требованию, чтобы каждый
промежуточный результат был вычислен раньше, чем использован.
Пример топологического упорядочения,дерева,
изображенного на рис, 6.11, показан на рис. 6.12.
810
Предположим, что мы сделали «моментальный
снимок» вычисления в момент выполнения операции,
изображаемой вершиной v. Легко увидеть, что
величины, не использующиеся в качестве аргументов в
операции v, должны храниться в памяти; на рис. 6.12
Ц Oz Vj V* »s Щ Vj Vt V, Vv В,, »r В,,
Рис. 6.12.
этим величинам соответствуют дуги, проходящие над
вершиной v. Если число этих дуг равно w{v), то мы
должны иметь не менее w + 1 ячеек памяти в нашем
распоряжении в момент выполнения операции v: w
ячеек памяти для хранения промежуточных
результатов (тех, которые уже находятся в памяти) и одну для
результата операции v. Таким образом, возникает
оптимизационная задача: минимизировать количество
ячеек памяти при организации вычисления
арифметического выражения. Эта задача сводится к построению
укладки ордерева с минимальной шириной.
2.4. Оптимальная укладка дерева модулей. В
модульном программировании задача есть определяющий
объект, которому подчиняются остальные, логически
связанные между собой объекты, называемые
разделами. Разделы являются результатом сборки отдельных
оттранслированных программ. Таким образом, задача
представляется в виде иерархической структуры,
имеющей форму дерева. Вершины дерева суть модули —
разделы и программы, .а дуги определяют их
взаимосвязь. С помощью специальной управляющей
программы производится загрузка разделов в оперативную
память. Оптимальное размещение информации — это
такой порядок следования модулей в задаче, при
котором наиболее экономно расходуется оперативная
память ЭВМ.
Пусть Т есть дерево, изображающее иерархическую
структуру задачи, и пусть каждой дуге* и или, что
то же самое, вершине v, являющейся концом дуги и,
приписан вес RU(RJ &* 0. Кроме того, будем считать,
что каждой вершине v дерева приписана
дополнительно некоторая числовая характеристика Pv > 0, называе-
311
мая дополнительным весом вершины. С
содержательной точки зрения вес R» может обозначать размер
памяти, требуемой для хранения результата операции,
выполняемой в вершине v, а дополнительный вес Pv —
размер памяти для хранения команд или размер
дополнительной части рабочего поля. Проблема
оптимального использования оперативной памяти при решении
иерархически организованной задачи сводится к
нахождению оптимальной по ширине укладки
взвешенного ордерева. Заметим, что рассмотренная в главе 3
оптимальная по длине укладка соответствует такому
порядку выполнения операций, при котором
минимизируется суммарное время хранения промежуточных
результатов. Возможен вариант этой проблемы, при
котором минимизируется наибольшее время хранения
промежуточного результата. Оптимальная по числу
соседней связности укладка соответствует порядку
выполнения программы, при котором увеличивается
интенсивность использования регистровой памяти, что
ведет к уменьшению, потерь времени, затрачиваемого
в процессе выполнения программы на обращения
к оперативной памяти.
2.5. Генерация оптимального кода для
арифметических выражений. Пусть имеется машина с
неограниченной памятью и N общими регистрами, и пусть
допустимыми являются команды следующих типов:
1. Пересылка: память -*■ регистр.
2. Пересылка: регистр -*■ память.
3. Операция: (регистр, память) -> регистр.
4. Операция: (регистр, регистр) -*■ регистр.
Заметим, что команда типа
Операция: (память, регистр) -*■ регистр
недопустима. Это. ограничение согласуется с системой
команд многих ЭВМ.
Будем понимать под программой последовательность
операторов, вычисляющих данное выражение для
начальных данных, хранящихся в выделенных ячейках
памяти. Под стоимостью вычислений удобно понимать
количество программных шагов, требуемых для
полного завершения процесса вычисления.
Чтобы определить минимальное число требуемых
регистров, а также оптимальную последовательность
операций, будем использовать разметку вершин,
считая вначале, что все операции некоммутативные.
Расстановку меток будем производить следующим образом!
312
1. Если вершина v висячая и является левым
потомком некоторой другой вершины, то полагаем l(v) «= 1;
если она является правым потомком, то полагаем
Замечание. Мы предполагаем, что дерево
изображено на плоскости так, что относительно любой
пары дуг, исходящих из вершины дерева, можно сказать,
какая дуга левая, а какая правая.
2. Если вершина v имеет потомков с метками h и
llt то при /, =И= Z, полагаем l(v) =max ilit lz), а при lt ■=
= 1г = l полагаем l(v) =f I + 1.
При описании алгоритма будем говорить о значении
вершины, подразумевая под этим величину (данные,
промежуточный результат), которую она изображает,
и о вычислении вершины, подразумевая под этим
исполнение операции, приписанной этой вершине.
Вход: Ордерево арифметического выражения, ва-
данное списками смежности, с размеченными
вершинами; регистры Ьц ..., Ьк.
В ы х о д: Программа вычисления выражения с
оптимальным использованием регистров.
начало
1. процедура Tiv);
2. начало
3. если l(v) = 1 то
4. если v — висячая вершина то
5. заслать значение вершины v в доступный
регистр Ът с наименьшим номером;
примечание в этом случае вершина v является
левым потомком своего предка конец примечания
6. иначе T(aiv));
7. иначе если min Ша(и)), l($(v))) >N то
примечание мы используем обозначение ($Ы для
идентификации правого потомка и обозначение a(v)
для идентификации левого потомка конец примечания
8. ГфЫ);
9. иначе если l{a(v)) Ф l{$iv)l то
10. начало
И. и>:= потомок вершины v с большей меткой;
12. T(w);
13. конец
14. иначе T($(v));
15. если l(v) — \/\v не есть висячая вершина то
16. начало
813
17. вычислить вершину и, взяв значение левого
потомка из регистра Ьт, а значение правого потомка
из памяти;
18. заслать значение вершины v в регистр ftm;
19. конец
20. иначе начало
21. Г(ссЫ);
22. выполнить операцию, соответствующую
вершине v, беря значение левого потомка из регистра ftm>
а значение правого потомка из регистра bm+l;
примечание на этом шаге доступными
являются регистры Ь„ и ftm+t конец примечания
23. если l{v)~^ N /\v— правый потомок своего
предка то
24. начало
25. значение вершины v заслать в память;
26. освободить регистры Ьт и &,„+,;
27. конец
28. конец
29. конец процедуры T(v);
30. v .•= корень дерева Т;
конец
Алгоритм состоит из двух частей: первая дает
оптимальную укладку,
вторая — организует
вычисления с регистрами.
При м е р. Рассмотрим
выражение
Uab-c)/(d + e))/(g +
+ t)/(.(j + k)*l-m)),
дерево для которого
показано на рис. 6.13. Числа,
расставленные возле
вершин, суть метки l(v).
Для Л7 = 2 алгоритм
генерлрует код:
Рис. 6.13.
1. / -* РЕГИСТР ft,
2. РЕГИСТР Ь, + к - РЕГИСТР ft,
3. РЕГИСТР bi*l-> РЕГИСТР Ь,
4. РЕГИСТР ft, - те - РЕГИСТР ft,
5. g - РЕГИСТР Ь2
6. РЕГИСТР ft, + i -*• РЕГИСТР ft2
7. РЕГИСТР ft/РЕГИСТР ft2 -> (память)
314
8. d-+ РЕГИСТР bt
9. РЕГИСТР bt + e ■* РЕГИСТР bt
10. a ■* РЕГИСТР b2
11. РЕГИСТР Ьг * b -*■ РЕГИСТР Ъ2
12. РЕГИСТР Ъг - с -*■ РЕГИСТР Ъ2
13. РЕГИСТР Ь./РЕГИСТР Ь2 -* РЕГИСТР Ь»
14. РЕГИСТР Мпамять) ■* РЕГИСТР Ь,
Покажем, что описанный алгоритм генерирует
программу наименьшей длины, если все операпии
считаются некоммутативными.
Лемма 10. Пусть алгоритм начинает работу с N
доступными регистрами, и пусть г есть число
регистров, которые доступны в момент, когда
рассматривается вершина v. Тогда r = N, если l(v)>N, и N>r>
>l{v), если KvXN.
Лемма доказывается индукцией по числу вершин,
рассматривавшихся алгоритмом.
Лемма 11. Алгоритм строит программу без
пересылок результатов из регистра в память (т. е. без
обращения к памяти), если доступно столько регистров,
какова метка корня.
Лемма 12. Для дерева с корнем, помеченным
меткой 2, метка корня есть нижняя оценка минимального
числа регистров, необходимых для построения
программы без обращения к памяти.
Лемма 13. Метка вершины есть нижняя граница
для наименьшего числа регистров, требуемых для
вычисления вершины без обращения к памяти.
Из лемм 11 и 13 непосредственно вытекает
Теорема 11. При условии отсутствия
нетривиальных отношений между операторами и данными
алгоритм использует минимальное число регистров для
построения программы без обращения к памяти.
Для числа регистров N будем называть вершину v
старшей, если оба ее потомка имеют метки не меньше
N, и младшей, если она висячая и является левым
потомком.
Л е м м а 14. Минимальное число обращений к
памяти при вычислении арифметического выражения без
нетривиальных отношений между операторами и
данными не меньше числа старших вершин в дереве этого
выражения.
Доказательство леммы проводится индукцией по
числу вершин.
315
Лемма 15. Число обращений к памяти при по*
строении программы равно числу старших вершин
в дереве.
Утверждение леммы следует из того, что обращение
к памяти происходит только при вычислении старшей
вершины.
Лемма 16. Число засылок в регистры при по-
строении- программы для данного дерева равно по
крайней мере числу младших вершин в дереве.
Доказательство леммы проводится индукцией по
числу младших вершин.
Лемма 17. Алгоритм строит программу, используя
столько аасылок в регистр, сколько в дереве имеется
младших вершин.
Теорема 12. Для выражений с
некоммутативными операциями и без нетривиальных отношений между
операторами и данными алгоритм генерирует
программу с минимальным числом шагов.
В самом деле, минимальность обращений к памяти
следует из лемм 14 и 15. Минимальность числа
засылок в регистры следует из лемм 16 и 17. Каждая
специфицированная операция исполняется один раз;
следовательно, число программных шагов
минимально.
2.6. Модифицированный алгоритм генерации
оптимального кода. Если допустить коммутативность
операций, то исходное дерево можно модифицировать,
добиваясь уменыпепия числа младших вершин и
величины метки корня. Алгоритм изменяется следующим
образом:
если у вершины v с меткой l(v) > 1 левый потомок
ейть висячая вершина и соответствующая операция
коммутативна, то поменяем потомков местами так,
чтобы висячая вершина стала правым потомком,
причем ограничение l(v) > 1 сохраняется, если обе
вершины висячие.
Алгоритм, в который внесены соответствующие
изменения, будем называть коммутативным алгоритмом
или К-алгоритмом.
Теорема 13. Коммутативный алгоритм порождает
оптимальную последовательность операций при
вычислении арифметического выражения, если только в
выражение входят коммутативные и некоммутативные
операции и не существует других нетривиальных
отношений между операторами и данными.
316
Дальнейшее уменьшение числа требуемых регистров
и времени вычислений может быть достигнуто, если
наряду со свойством коммутативности учитывать также
и свойство ассоциативности.
'Для простоты будем рассматривать только те
операции, которые одновременно коммутативны и
ассоциативны (АК-операции).
Назовем фрагментом множество вершин дерева,
такое, что:
1) каждая вершина в множестве сопоставлена
некоторой операции;
2) ребра, соединяющие вершины множества,
образуют дерево;
3) если вершине сопоставлена операция, не
являющаяся АК-операцией, то эта вершина образует
отдельное множество.
Корень фрагмента — это вершина в фрагменте,
которая предшествует всем другим вершинам фрагмента.
Предок фрагмента — это предок корня фрагмента.
Потомки фрагмента — это потомки его висячих вершин.
Поддеревья-потомки фрагмента — это поддеревья,
которым предшествуют висячие вершины фрагмента.
Наконец, максимальный фрагмент — это фрагмент,
никакое собственное подмножество которого фрагментом не
является. Охарактеризуем максимальные фрагменты
данного бинарного дерева. Пусть максимальный
фрагмент С имеет m потомков б(, ..., бт, и пусть корень
фрагмента С является потомком максимального
фрагмента А. Очевидно, что 6i, ..., 6m — корни фрагментов;
пусть это будут фрагменты Du ..., Dm. Стянем
каждый максимальный фрагмент в отдельную
вершину. Получившееся дерево назовем ассоциативным
деревом.
Приведенные определения имеют следующую
основу. Пусть Т — бинарное дерево и А — соответствующее
ему ассоциативное дерево. Пусть Т' образуется из Т
с помощью одного ассоциативного или коммутативного
преобразования. Тогда ассоциативное дерево А',
соответствующее дереву Т', может быть получено из
дерева А перестановкой потомков одной вершины.
Такая вершина соответствует максимальному
фрагменту в дереве Т. Обратно, любая перестановка потомков
вершины в дереве А может быть отражена в виде
применения последовательности АК-преобразований в
некотором фрагменте дерева Т.
817
Пусть F — семейство деревьев, порождаемых из
дерева Т АК-преобразованиями. Благодаря такому
подходу задача нахождеппя члена семейства F,
генерирующего лучшую программу с помощью алгоритма
п. 2.5, разбивается на две части. Вначале, используя
перестановки потомков ассоциативных вершин, мы
находим «лучшее» упорядочение для потомков. Потом из
полученного ассоциативного дерева строим бинарное
дерево, которое порождает минимальную программу.
Правила расстановки меток в ассоциативном дереве:
1. Если v — висячая вершппа н самый левый
потомок ее предка, то l(v) = 1. Для всех других висячих
вершин l(v) = 0.
2. Если вершина v имеет пг потомков с метками
/,, ..., lm, причем l{> lt> .. .> lm, то liv) = li, если
U > h, и l(v) — U + 1, если U — U.
Схема алгоритма с учетом ассоциативности:
1. Свернуть дерево в ассоциативное дерево.
2. Расставить метки согласно правилам для
ассоциативных деревьев и перейти к выполнению шагов
3 и 4 снизу вверх.
3. Для каждой ассоциативной вершины v
упорядочить ее потомков б0, б(, ..., бт так, что К60) Э*
Э» Z(6i) S»... > l(8m). Если возможно, то сделать б0
невисячей вершиной. Заменить ассоциативную
вершину v вершинами v(, i^ll:m], так что vi+i становится
потомком вершины v(, i s [ 1 : m]. Тогда левый
потомок вершины vt+i есть vt, а правый потомок — вершина
6г, ie[l:mJ. Левым и правым потомками вершины
Vi являются б0 и 6i соответственно. Предок вершины v
есть теперь предок вершины vm.
4. Если вершина v неассоциативная, то действовать,
как предписано в К-алгоритме.
Лемма 18. Пусть N — число доступных регистров.
Тогда для данного бинарного дерева, содерокащего
фрагмент с m поддеревьями-потомками, г из которых
имеют корни с метками, большими или равными N,
фрагмент содержит по крайней мере г—1 старших
вершин.
Лемма доказывается индукцией по длине
максимального пути Р поддерева, доминируемого
фрагментом, т. е. дерева, образованного рассматриваемым
фрагментом и его поддеревьями-потомками.
Лемма 19. Алгоритм с учетом ассоциативности
порождает дерево Т, вычисляющее тот же самый ре-
818
зультаг, что и данное дерево, но имеющее минимальное
число старших вершин и требующее минимальное
число регистров без обращения к памяти.
Лемма доказывается индукцией по длине
максимального пути- в дереве Т.
Теорема 14. Алгоритм с учетом ассоциативности
порождает оптимальную последовательность операций,
вычисляющую данное выражение, если в выражении
встречаются только коммутативные, некоммутативные
и АК-операторы и никаких других нетривиальных
отношений между операторами не допускается.
В самом деле, минимальность обращений к иамятн
вытекает из леммы 19. Минимальность засылок в
регистры вытекает из теоремы 13. Число бинарных
операций, специфицированных в выражении, не
изменяется от применения ассоциативных и коммутативных
преобразований, поэтому последовательность операций
.оптимальна.
2.7. Сведение задачи распределения памяти при
составлении программ к задаче раскраски вершин графа.
Рассмотрим некоторую операторную схему. Каждый
оператор может иметь некоторое количество входов и
выходов. Входам и выходам сопоставляются величины,
называемые аргументами, если они сопоставлены
входам, и результатами, если они сопоставлены выходам.
Величина характеризуется весом, который
представляет собой целое положительное число, указывающее на
объем памяти, требуемой для хранения этой величины.
Одна и та же величина может быть сопоставлена
нескольким выходам одного оператора. Оператор S
вырабатывает величину х, если х является результатом
оператора S, и воспринимает, х, если х является
аргументом оператора S. Величина с весом- р, большим
единицы, рассматривается как массив, состоящий из
р компонент. Для каждого оператора,
вырабатывающего некоторую величину-массив х, известно,
вырабатывается ли данная величина в целом, т. е. все ее
компоненты, или же частично, т. е. отдельная компонента
или частичная их совокупность. Появление х в
качестве аргумента или результата» некоторого оператора
называется вхождением Е(х) величины х в операторную
схему. Для любого вхождения Е(х) величины х с
весом р может быть задано разбиение Е(х) на v, v <=
s[l:p], подвелпчни, состоящее в разбиении р на v
слагаемых pi, £e[l:vJ, и во введении v величин х.
319
с весом р( с указанием их принадлежности к
вхождению Е(х). Сумму весов различных величин, входящих
в схему, назовем весом схемы. Следовательно, вес
схемы есть объем требуемой для реализации схема
оперативной памяти. При условии ее ограниченности
возникает задача минимизации занимаемого объема или,
что то же, веса схемы.
Назовем маршрутом Mix) величины х путь
в управляющем графе операторной схемы из
оператора S, вырабатывающего величину х, в оператор St,
воспринимающий величину х, причем пи один из
промежуточных операторов маршрута пе вырабатывает
величину х в целом. Для фиксированных операторов
St и St (начального и конечного) в управляющем
графе в общем случае существует множество маршрутов.
Так как понятие маршрута включает в себя не только
путь в управляющем графе, но и информационную
связь, которую этот путь реализует, то каждому
множеству маршрутов некоторой величины с
фиксированными началом и концом соответствует дуга
информационного графа KG) операторной схемы.
Информационный граф есть ориентированный двудольный граф,
состоящий из нескольких компонент (односторонней)
связности. Каждая такая компонента есть
совокупность маршрутов одной и той же величины и носит
название области действия этой величины. Две области
действия несовместимы, если в каждой из них найдется
информационная связь, причем начальный оператор
некоторого маршрута одной связи окажется начальным
или внутренним оператором нектОрого маршрута
другой связи.
Пусть d — некоторая область действия в
информационном графе схемы G, R(d) — множество всех
операторов схемы, имеющих своими результатами вершины
из d, ТЫ) — множество всех операторов, каждый из
которых является внутренним хотя бы для одного из
маршрутов информационных связей из d.
Теорема 15. Две области действия di и d2
информационного графа схемы G несовместимы тогда и
только тогда, когда не пусто множество RidJ П Rid^) U
U RW (\ ТШ U R(d2) (\ ТЫг).
Сопоставим схеме G некоторый граф, называемый
графом несовместимости, построение которого
проводится по следующему правилу. Для каждой области
действия d величины с весом р строится полный р-вер-
820
шинник Кр. Затем для любой пары несовместимых
областей действия все вершины соответствующих полных
графов соединяются друг с другом.
Правильная раскраска графа несовместимости в
минимальное число цветов дает возможность самого
экономного распределения памяти. Число использованных
цветов дает минимальное необходимое для реализации
схемы количество ячеек памяти; при этом всем
вершинам графа несовместимости, окрашенным в один цвет,
сопоставляется одна и та же величина.
2.8. Сведение задачи о распределении регистров к
задаче о раскраске графов. Для системного
программиста удобно считать, что в его распоряжении находится
неограниченное число регистров, но, прежде чем
осуществлять генерацию окончательного кода, необходимо
отобразить это неограниченное множество виртуальных
регистров на конечное множество регистров реальной
машины. Первым шагом в распределении регистров
является подготовка графа несовместимости. Каждый
виртуальный регистр, так же как и реальный,'
представляется вершиной графа. Два виртуальных
регистра, которые не могут сосуществовать в одном реальном,
называются несовместимыми; соответствующие
вершины в графе несовместимости соединяются ребром.
Затем отыскивается минимальная раскраска графа
несовместимости. Если потребовавшееся число цветов не
превышает числа реальных регистров, то распределение
регистров осуществляется закреплением за каждым
виртуальным регистром реального регистра того же
цвета.
Построение графа несовместимости в данном случае
отличается от построения в п. 2.7 отсутствием
требования минимальности числа цветов. .Будем говорить, что
величина х живет в точке программы, если в
управляющем графе существует путь из входа в вершину,
соответствующую оператору, вырабатывающему
величину х, далее в вершину Р и, наконец, в вершину St,
где величина х используется, причем нигде па этом
пути величина х не перевычнсляется. Очевидно, что
две величины, живущие одновременно в одной точке
программы, несовместимы. Если в некоторой точке
программы живут одновременно к величин, то мы должны
были бы эту точку программы изобразить полным
/с-вершинником, что сделало бы хроматическое число
графа несовместимости не меньше к, Это не обязатель-
*' В. А. Евстигнеев 321
но, и достаточно кал-сдой точке программы, в которой
живут одновременно к величин Х{ и определяется еще
одна величина х, сопоставить звезду из к ребер вида
(х(, х). Если хроматическое число графа
несовместимости больше, чем число реальных регистров, требуется
перестройка программы для получения нужного
хроматического числа.
2.9. Контроль записей в файлах. Пусть в файле
хранится некоторая информация в виде записей.
Построим граф файловой структуры, взяв в качестве
вершин записи, а в качестве дуг — пары (и, v) такие, что
запись и содержит указатель на адрес записи v. При
этом возникает задача об определении наименьшего
числа записей, позволяющих проследить все записи
в файле, т. е. все дуги графа файловой структуры.
В терминах теории графов эта задача сводится к
задаче отыскания наименьшего числа путей, пе имеющих
общих дуг и покрывающих все дуги орграфа.
2.10. Разбиение программы па участки,
удовлетворяющие тому или иному критерию оптимальности,
носит название сегментации программы, а сами участки
называются сегментами. Необходимость в сегментации
возникает в основном по двум причинам: в связи с
использованием многоуровневой памяти и в связи с
организацией некоторых оптимизирующих
преобразований логической или информационной структуры
программы.
Сегментация первого типа проводится тогда, когда
программа не помещается в выделенную ей память
высокого уровня. Тогда приходится хранить в ней лишь
активный в данный момент фрагмент программы и
вызывать другие фрагменты из памяти низкого уровня по
мере обращения к ним. На такого рода обмены между
оперативной и внешней памятью и сопутствующие
прерывания тратится немалое машинное время, поэтому,
даже если есть возможность совмещения их с
основным счетом, пользователь заинтересован в том, чтобы
они производились как можно реже. Отсюда вытекает
специфическое для этого вида сегментации требование:
минимизация числа обращений между сегментами.
Необходимость в сегментации второго рода
возникает .тогда, когда имеется некоторая система
оптимизирующих преобразований логпко-ипформациониой
структуры программы, для применения которой нужно
представление программы в более простом и уннфнцн-
323
рованном виде. Эта система может быть набором
формальных преобразований, приводящих к экономии
памяти или операторов программы, уменьшению
избыточности вычисления, либо состоять из алгоритмов
статистического, или динамического распараллеливания.
Рассмотрим один подход к сегментации первого
рода. Главным принципом сегментации программ
с учетом информационных связей является
объединение в сегменты операторов естественных частей
программы, т. е. линейных участков и правильных циклов;
если такое разрезание не удовлетворяет ограничениям
на объем, производится дальнейшая сегментация, при
которой могут минимизироваться связи между
сегментами.
Если выделенные естественные части программы
удовлетворяют заданным ограничениям на объем
информации (командной и числовой), то процесс
разбиения на этом заканчивается. Если же некоторая
естественная часть, выделенная при просмотре исходной
программы, окажется недопустимой по объему, то
необходимо разрезать ее на части. Это разрезание можно
производить на основе алгоритма выделения цепочек
в схеме программы, относящейся к данной
естественной части. Под цепочкой здесь подразумевается
последовательность функционально связанных операторов,
начинающаяся с оператора, функционально не
зависящего ни от какого оператора естественной части,
и заканчивающаяся в операторе, который
функционально не управляет никакими другими операторами
естественной части. Выделение цепочек основано на
анализе матрицы F = 11/^11 функциональной зависимости:
1, если i < / и результат оператора с
номером i используется в качестве
" аргумента в операторе с номером /;
,0 в противном случае.
Способ перечисления цепочек аналогичен
построению всех путей между заданными вершинами в графе,
матрица смежности которого есть F.
2.11. Крупноблочная сегментация и
распараллеливание схем программ. С увеличением быстродействия
вычислительных средств стала необходимой разработка
новых методов группировки операторов программы.
Дело в том, что в современных многопроцессорных вы-
21* 323
числительных системах скорость обработки данных
становится сравнимой со скоростью анализа структуры
программы. Назначение оператора на работу или
выделение отдельной параллельной ветви, равно как и
некоторое формальное преобразование, требующее для
своего выполнения определенной подготовительной
работы, становятся сравнительно медленными и
дорогостоящими актами. Поэтому желательно, чтобы каждый
оператор анализируемой схемы представлял достаточно
крупное задание, например вычисление процедуры или
подпрограммы. Такое естественное разбиение
программы ое всегда возможно, приходится разбивать
программу на некоторые произвольные части. Учитывая то,
что разветвленная программа с трудом поддается
распараллеливанию, кроме требования минимизации
информационной взаимосвязи сегментов к этому
разбиению предъявляется свое специфическое требование:
результирующая структура, элементарным объектом
которой является сегмент, должна иметь минимальное
число разветвлении.
Пусть дана операторная схема над общей памятью
с управляющим графом G, множеством операторов А,
причем для каждого оператора а <= А определены
конечное множество входных переменных 1п(а) и
конечное множество выходных переменных Out(a). Пусть
дано некоторое разбиение множества операторов на
непересекающиеся сегменты — сегментация а. Фактор-
схемой S по сегментации о называется операторная
схема, операторами которой являются элементы
множества сегментов А, для каждого из которых
определены множества In (а) и Out(a), aei; весом сегмента
ivia) является сумма весов входящих в него исходных
операторов. В этих обозначениях величина
2 |/и(а)ПОы*(Р)|
определяет сумму межсегментных информационных
связей. Величина
f(S)^-~ 2 \ In (a} f] Out ф)),
где иср — средняя длина естественной части схемы S,
называется коэффициентом информационности схемы S.
324
Назовем полугамаком сегмент, все выходящие дуги
которого ведут в одну вершину. Ясно, что любой гамак
является полугамаком. Если в схеме выделен
полугамак, то путем дублирования его для каждой
входящей дуги можно получить эквивалентную схему, в
которой выделенными сегментами являются уже гамаки.
Основная цель алгоритма крупноблочной
сегментации состоит в уменьшении коэффициента
информационности f(S) путем «съедания» при объединении в
сегменты информационных связей и увеличения средней
длины естественной части схемы /гср.
Вход: Управляющий граф G, ограничения па
размер сегмента сверху М и снизу т.
Выход: Множество допустимых сегментов {)}.
начало
1. выделить^ линейные компоненты а в G;
2. для всех линейных компонент а цикл
3. начало
4. если т(а) > М то
5. начало
6. выделить в а гамаки j$ с w{$) ^M;
7. если w($) < m то
8. достроить гамак [3 до полугамака,
удовлетворяющего условиям m*Zw($)^M;'
9. конец
10. конец цикла;
11. сегментировать оставшуюся часть путем
попарного слияния вершин графа G;
конец
§ 3. Применение деревьев для организации
больших массивов информации
Если таблица ключей (словарь) динамически
изменяется, т. е. ключи постоянно добавляются и
удаляются, то экономия от применения бинарного поиска
(поиск методом деления пополам) не покроет расходов на
поддержание упорядоченного расположения ключей.
Выход из этой ситуации состоит в использовании
вместо таблицы структуры бинарного или яг-арного дерева,
которая позволяет быстро вставлять и удалять ключи
и производить эффективный поиск нужного ключа.
3.1. Балансированные по высоте бинарные деревья
(АВЛ-деревья). При определении дерева сортировки в
гл. 1 говорилось, что для произвольно взятого множест-
325
ва слов дерево может расти крайне неравномерно й
легко представить себе ситуацию, когда* дерево
вырождается в линейный список. Это объясняется тем, что
структура дерева практически полностью
определяется порядком, в котором слова подаются на вход
алгоритма.
Пример. На рис. 6. 14, а показано бинарное
дерево над множеством названий дней недели, взятых
в их естественном порядке. Для- сравнения на
рис. 6.14, б показано дерево над тем же множеством
слов, но взятых в алфавитном порядке.
понедельник.
у^ \
вторник - среда
/ / N
воскресенье пятницз четверг
суббота
«)
Рис.
аоск
;ресеньз
\
вторник
6.14.
\
понедельна
\
пятница,
\
среда
суббота
4) четверг
Основными операциями при работе с динамическим
словарем являются поиск, включение и удаление слова.
В отличие от линейно упорядоченного массива, где эти
операции имеют трудоемкость, пропорциональную
длине массива, в словаре, организованном "в виде АВЛ-
дерева, указанные операции имеют логарифмическую
трудоемкость. Для сохранения ее при добавлении или
удалении слова требуются специальные усилия.
В АВЛ-дереве, где критерием оптимальности
служит степень балансированное™ дерева по высоте,
трудоемкость поиска пропорциональна высоте дерева.
Таким образом, трудоемкость поиска в худшем случае
не превосходит (3/2) log п, где п — количество слов
в словаре или, что то же, вершин в АВЛ-дереве.
Восстановление структуры АВД-дерева при включении
нового слова или удалении производится операциями
вращения и двойного вращения. Последовательность
построения АВЛ-дерева для множества названий дней
недели, взятых в лексикографическом порядке,
показана на рис. 6.15.
Включение и удаление слов в АВЛ-дереве требуют
движения по дереву от корня до искомой вершины
326
(в случае включения — до места, где может быть
подвешена новая вершина) и обратного движения по
тому же пути, что требует стекового механизма. Кроме
того, требуется два бита памяти для каждой вершины
для указания, какое из трех возможных соотношений
между высотами ее двух поддеревьев имеет место.
'В ОС Втрц Втпц
\ —S / \ —N У \ —S
ВтрН —V 60СК. ПНД —V 8CI4 ПНД, —v
\ \
"ИД ПТИ
BfpH |трц втри
г=£>вси пнд гг> век птк гг> век. пти г±
\ ^ /\ ^ /\ ^
лтн пнд ерд пнд ерд
ерд cytf
Г1ТИ
r>T» / ерд птн
"^ ртрн ерд —/ втрн суб —у втрк суб .
/ \ \, / \ /- \ / \ /\
еск. пнд суО век. пнд ерд J4TB Bttt пнд ерд чт«
Рже. 6.15.
Можно обобщить понятие ABJI-дерева, допустив,
чтобы высоты правого и левого поддеревьев любой
вершины не отличались больше чем на А > 1. Рост
дисбаланса вызывает увеличение среднего времени поиска
по сравнению со случаем А = 1, причем это увеличение
не зависит асимптотически от размера дерева и
приблизительно равно 0,28А. Но эта тенденция становится
заметной только для больших А. Аналогичные
исследования относительно среднего числа перестроек дерева
показали, что число перестроек падает с ростом А и
похоже, что А == 5 минимизирует полное время
процедур перестройки в АВЛ-дереве. Корректный выбор
А зависит от относительной частоты включения, удале-.
ния или чистого поиска, так как дерево,
преимущественно используемое для поиска, должно быть АВЛ-
деревом, т. е. иметь А = 1.
3.2. Балансированные по 'весу бинарные деревья
(ВВ-деревья). BS-деревья не получили столь широкого
распространения, как АВЛ-деревья. Их преимущества
327
перед АВЛ-деревьямп состоят в реализации включения
и удаления слов однократным движением вниз от
корня и в возможности установления желательных
соотношений между временами поиска и включения/удаления
подходящим выбором баланса а.
Однократное движение вниз от корня при
включении/удалении и даже второй спуск в случае, когда
слово уже есть в дереве п его не нужно включать пли
когда слова нет в дереве и его не нужно удалять, не
требуют наличия стека или аналогичного механизма.
Правда, 55-деревья требуют большую память для
каждой вершины для хранения числа вершин поддерева
с данной вершиной в'качестве корня, но это
компенсируется возможностью решения таких задач, как
отыскание к-го элемента данных или определение множеств
ва слов между словами Wt и W2 при
лексикографическом упорядочении за время Odogn), тогда как
требуется О(п) времени, если информация о размере деревьев
вскУ^А, втрн i/z-1/1 втри1Д-?/5
-трн1/0 >П~v бек. пнд —v век. пил,!"3 У4 —J
ВТ]
П'нд
ПТН
4 ^МЪ р\ >ТНГ2*1/3
/ерд/
век. пнД'/4~*',/3 век. птн1/3*2/5 БСКр птн^/5
fUHl/3-1/4 „ид \а</3~Ж пнд' "ерд/4
Рис. 6.16.
суб чтв ■ чтв'7'-
не хранится. Пример построения BS-дерева (а = 1/4)
над множеством названий дней недели, взятых в
лексикографическом порядке, дан на рис. 6.16.
3.3. Оптимальные и почти оптимальные деревья,
самоорганизующиеся деревья. В тех случаях, когда для
слов из множества W известны вероятности или
частоты j3j обращения к ним при поиске, а также
вероятности или частоты а( неудачного поиска, множество W
как информационный массив организуется в виде
оптимального (точнее, в виде почти оптимального)
дерева, если все множество слов известно заранее, илц
328
в виде какого-лпоо варианта самооргаипзующегося
дерева, если множество слов заранее не известно и
речь, следовательно, идет о динамическом словаре.
3.4. .Выровненные деревья. В отличие от АВЛ- и
ВВ-деревъев, где информация хранится во внутренних
вершинах, в выровненных бинарных деревьях
информация хранится в висячих вершинах, а во всех
остальных вершинах хранится вспомогательная информация,
необходимая для работы с деревьями. Чаще всего во
внутренней вершине хранится наибольшее слово из
имеющихся в этом поддереве слов. При такой
организации вспомогательной информации процедура
построения выровненного дерева также основывается на
движении к левому потомку, если включаемое слово
меньше слова в левом потомке рассматриваемой вершины,
и к правому потомку в противном случае. Получаемое
при этом выровненное дерево является упорядоченным
в том смысле, что информация в листьях упорядочена
слева направо.
БТрН ПНД ПТН
БСИ. BTDH ПНД в С К, ЛНД В три ПТН,
/\ /ч /Ч
BTpH ЛИД В(Д 8трн [1НД ПТН
Втр» СРД ВТрЙ Суб
==> I /\ =ф I /\ ц>
втрн. пнд срд втрн г.тн суб
вен етрн пнд птн срд Век втрн пнд срд суо
BCK.
ЧТВ.
лтн. чтв
втрн птн срд чт,
втрн пнд птн срд суб
Рпс. 6.17.
чтв
Пример построения Я-дерева над множеством
названий дней недели показан на рис. 6.17, а пример
построения Я5-дерева над тем же множеством показан
на рис. -6.18.
329
3.5. В-деревья. В случае очепь больших массивов
информации наиболее реалистичным является
предположение, что большая часть поискового дерева
должна распрлагаться во внешней памяти, откуда части
дерева пересылаются по мере необходимости в
основную память. Устройства внешней памяти (барабаны,
диски и т. д.) имеют более затрудненный доступ и
большее время ожидания, но высокую скорость пересылки
данных после начала пересылки. Таким образом, если
дерево размещено правильно, то достаточно большие
его части будут пересылаться в основную память
блоками, и скорость работы с деревом будет определяться
не числом сравнений, необходимых для поиска слова,
а средним числом пересылаемых блоков.
.i'lpi пнд птн
ECU ГГ9Н втрн ПНД" . ВТВН ЛТН к
^>/\ I =>/\ /4=^
век. втрн лнд вен втрн пнд птн
втрн ерд втрн
*ф I / ч => I ^ \i>
втрн птн ерд втрн птн суо
/\ /\ I /\ /\ /V
сх втрн Лнд птн ерд е&к, втрн пнд птн ерд _ с>5
птн'
=ф / \
втрн птн
/\ /\ , -
вен втрн лнд птн ерд суб
Рже. 6.18.
Наибольшее значение для работы с двухуровневой
памятью имеют ^-деревья и их модификации.
В-деревом порядка т называется m-арное
выровненное дерево, у которого:
а) ни одна из висячих вершин не содержит
информации;
б) каждая невисячая вершина с к потомками
содержит к — \ слов, т/2^к^т (для корня к <2);
330
в) каждая невисячая вершина содержит к
указателей на своих потомков.
Замечание. При графическом изображении
висячие вершины 5-дерева обычно не рисуют.
Из определения видно, что вершину, содержащую
} слов и j + 1 указателей, можно представить в виде
I
ft>. wn plt W2., . . ., pj_[t Wj, Pj ,
} I \ T~
где Wt < W2 < ... <Wh а указатель pt указывает на
поддерево, в котором хранятся слова, больше Wt п
меньше Wi+i.
На рис. 6.19 показано 5-дерево порядка 5 над
множеством слов {А, В, ..., У}.
Е
К
р
и
L
м
N
0
V
W
X
Y
F
в
Н
I
а
R
S
т
Рис. 6.19.
В-дерево порядка 3 носит отдельное название
2-Ъ-дерева.
Поиск в 5-дереве организуется следующим образом.
Вначале в оперативную память засылается корень
дерева и в нем ищется требуемое слово; если его там нет,
то в оперативную память вызывается вершина, на
которую указывает указатель р> такой, что Wi < W <
<Wi+i \W—искомое слово). Указатель р0
используется, если требуемое слово меньше Wu а указатель р-,
используется, если- требуемое слово больше Wj. Если
соответствующий указатель на некотором шаге поиска
указывает на висячую вершину, то поиск неудачен.
Включение нового слова производится так. Вначале
производится поиск включаемого слова W. Если
слово W уже находится в дереве, то поиск заканчивается
удачно и алгоритм заканчивается. В противном случае
поиск неудачен и заканчивается в вершине, у которой
все потомки — висячие вершины, новое слово W вклю-
331
чают в эту вершину, соблюдая лексикографический
порядок и добавляя еще один указатель и висячую
вершину. Если общее число слов в вершине после
этого не превосходит то — 1 для дерева порядка т, то
процедура включения слова заканчивается. Если же
в вершине стало т слов, то ее расщепляют на две
вершины:
Ро. Wl.Pl . • • •> W\m/2]-V P[m,21-1 ,
Р\т/2]
> Wfm/21 + 1'-
■'Wm>Pm
I
а слово W]m/2] помещают в вершину-предка. Таким
образом, указатель р в вершине-предке заменяется на
последовательность р, Wrm/2I, р , что в свою очередь
может привести к расщеплению. Если нужно
расщепить корень дерева, который не имеет предка, то
просто создают новый корень и помещают в него
единственное слово W[m,z\, в таком случае дерево
становится на единицу выше. Данная процедура включения
слов сохраняет все свойства ^-дерева.
р\и
v w х у г
А
В
С
D
/
а
R
5
Т
F
'
R
\
У
г
V
W
Рис, 6.20.
Пример включения слова Z в дерево, изображенное
па рис. 6.19, показан на рис. 6.20.
332
Для удаления слова W вначале проведем поиск.
Если слово W находится в вершине самого нижнего
уровня и после его исключения вершина будет
содержать не меньше допустимого числа слов, то слово W
просто исключается из соответствующей вершины.
Если при этом в вершине остается слов меньше
допустимого числа, то вершина сливается с одним из
своих братьев (либо с ближайшим слева, либо с
ближайшим справа) по правилу
P,Wk+2, Р'
Р0- 1171 • • •> Wh+2<Ph+2<
\
1
Р0, WU • • ;Ph> Wk + i< Pk+i
■\
I
Pk+2< Wk+, Wt< Pt
I
*
*
Если получившаяся после слияния вершина
оказывается переполненной, то она снова расщепляется так, как
это делается при включении нового слова. Так как при'
слиянии двух вершин слово-разделитель из вершины-
предка удаляется, то может возникнуть ситуация не-
дозаполненности вершины. В этом случае поступаем
так, как это было описано выше.
У
а
R
s
/
г
и
к,
1
W
Q
R
S
Т
W
У
Z
Р Е К Р Y
*/ ^ ^у
Е К V
-^ \
4Г ^N^v
\Х.
V4 W X Y Z
\
Q R S Т
Q R S T WXYZ \l М Н О
Рпс. 6.21.
Пример удаления слова U из дерева, показанного
на рис. 6.20, приведен на рис. 6.21.
333
3.6. Плотные m-арные деревья. Недостатком 5-де-
ревьев является слабая заполняемость их вершин
словами. Увеличить заполняемость можно как с помощью
перехода к деревьям, у которых каждая невисячая
вершина, отличная от корня, имеет не менее Г (27тг — D/31
потомков, а корень — не менее двух и не более т
потомков (5*-деревья), так и за счет использования
плотных лг-арпых деревьев.
Способ хранения информации в плотном лг-арном
дереве аналогичен способу хранения.ее в 5-деревьях.
Каждое плотное яг-арное дерево над множеством из
п слов имеет п +1 висячих вершин. Индукцией по
высоте дерева h легко показать с использованием
рекуррентной формулы (4.34), что для каждого г-плотного
m-арногп дерева высоты h имеет место оценка
Lma(r, m, Ю>а„> тит.
Следовательно, каждое r-плотное ?гг-арное дерево над
множеством из п слов есть дерево высоты Л =S
^ 21ogm (тг + 1). Отсюда следует, что r-плотное яг-арное
дерево не может выродиться в линейный список.
(Заметим, что приведенная оценка очень груба).
Чтобы включить новое слово W в плотное лг-арное
дерево Т, вначале осуществим поиск слова W в
дереве Т. Поскольку он неудачен (слова W в дереве нет),
то поиск заканчивается в висячей вершине. Если ее
предок не насыщен, то слово W включается в вершину-
предка v, в противном случае требуется применение
громоздких процедур восстановления структуры дерева.
3.7. Организация поиска слов внутри вершин
В-дерева. Так как порядок m 5-дерева и тем самым
количество слов, хранимых в одной вершине, не
ограничивается сверху, можно представить себе ситуацию, когда
количество слов будет составлять несколько сотен.
В таких случаях нужна организация эффективного
поиска слов внутри вершин. Для этого массив слов в
вершине можно организовать в виде списков, списков
с двойными связями или в виде балансированного
дерева. Соответствующие 5-деревья будем называть B-S-,
B-L- или 5-Г-деревьями. Последний тип допускает
обобщение на случай, когда структура данных в виде
5-Г-дерева используется одновременно несколькими
пользователями.
Мы знаем, что когда вершина в 5-дереве
порядка m становится переполненной (в пей оказывается
334
тп слов), она распадается на две, каждая из которых
имеет не менее [тп/21 — 1 слов. В б-^-дереве с
последовательным расположением слов в вершине
разбиение может быть произведено с трудоемкостью О(пг)
обычными способами. Когда же вершина организована
как балансированное дерево, процесс разделения
вершины уже не так прост, как бы хотелось, хотя и имеет
ту же трудоемкость. Это приводит к необходимости
обобщить понятие б-дерева, ослабпв требование
относительно минимального числа слов в вершине и
добившись этим облегчения разделения вершины на две.
Пусть /: N- -*■ N — функция, заданная на множестве
натуральных чисел, такая, что для всех m > 3
справедливо неравенство 2 < f{m) < lm/2\. ](т)-деревом
называется страничное дерево (т. е. дерево, у которого
каждая вершина соответствует странице памяти),
обладающее следующими свойствами:
1. Каждая вершина имеет не более пг потомков.
2. Каждая вершина, исключая корень и висячие
вершины, имеет по крайней мере f(m) потомков.
3. Корень имеет не менее двух потомков.
4. Все висячие вершины располагаются на одном
и том же уровне и не несут информации.
5. Невисячая вершина с / + 1 потомками содержит
/ слов и может быть изображена в виде, аналогичном
виду вершины в б-дереве.
Как видно из этого определения, в отличие от б-де-
рева в /(то)-дереве минимальное число потомков у
вершины может изменяться от двух.до [т/2) в
зависимости от функции /. Если функция / такова, что f(m) =
= (то/21, мы получаем обычное б-дерево порядка т.
Для монотонно возрастающей функции / класс
/(то)-деревьев ведет себя очень хорошо: минимальное
число слов в невисячей вершине растет вместе с ростом
параметра т.
Поиск, включение и удаление слов в /(то)-деревьях
практически не отличаются от аналогичных алгоритмов
для 5-деревьев.
Для включения слова W, как обычно, начинаем
с поиска вводимого слова W в /(то)-дереве. Если поиск
успешен, то слово W уже в дереве и процесс
заканчивается. В противном случае слово W включается
в соответствующую вершину — предка висячей
вершины, где закончился неуспешный поиск. Если в этой
вершине содержится менее т слов, включение нового
335
слова завершено. Если она становится насыщенной
с т словами и имеет форму
v. Р0, IV,, Pi, • • -,WS-V /V_i, Ws, Ps, W,+v Ps+t. • • •- Wm, pm ,
I I I I I Г
то она распадается на две вершины: вершину v',
имеющую вид
/)0, IFj, /J,, . . ., №,_,, /?,_, ,
п вершину у , имеющую вид
4р,
Р3. !*;S+1-PS+1 ,Fffl-Pm -
соответственно с s—1 и m — s словами, где ss[/(m):
: Гто/213. Слово W, включается с указателем р' в
вершину — предка вершины v. Может случиться, что
предок вершины v сам станет насыщенным, тогда процесс
распада вершин продолжается далее. Так как 2 =S
«£/(то) «Ss^ [то/21, то мы имеем f(m) «S то — s -f- 1 «S то
и число слов в вершппе i/, появившейся в результате
распада вершин, находится внутри интервала (/(то) — 1,
m — D." Ясно, что все свойства /(то)-деревьев при
включении слова сохраняются.
При удалении слова мы также начинаем с поиска
удаляемого слова, W. Если оно не найдено, то процесс
заканчивается. Если оно расположено в вершине —
предке висячей вершины, то мы просто удаляем его.
В противном случае оно заменяется наименьшим
словом из поддерева, на которое указывает указатель /?,,
соответствующий удаляемому слову W = W{. Слово,
заменившее слово И7,-, в свою очередь удаляется из
вершины, в которой оно было первоначально
расположено. В любом случае мы приходим к удалению слова
из вершины — предка висячей вершины. Если после
удаления она содержит не менее /(то) слов, то процесс
заканчивается. В противном случае мы должны
применить либо перестановку слов, либо слияние вершин.
Если смежный брат вершины имеет не менее /(то)
слов, то слова в этих двух вершинах вместе с разделя-
336
ющпм словом в пх предке могут быть переставлены
так, что каждая вершина будет иметь не менее
/Ы) — 1 слов. Если не имеет, то тогда
Qi
... wt, Pi, iy.+1, р.+1,...
р'(Р и"р р'],...,
• • • 'И''д7п)-2' Р/Хт)-Ч
В этой ситуации мы просто сливаем вершины vt и Ot+i
вместе с разделяющим словом Wi+i в вершине —
предке Q и удаляем пару (Wi+U pi+i) из вершины Q; при
этом получаем
0}
••• W7;-P;. »'i + 2,...
I"*
Pd
Wi'.p',,.
• •' ™/(m)-l> P)(m)-V "i + l>
Рй, W],-.
. , И'"
H /(m)
-2' P/(m)
-2
При удалении пары (I'F(+i, pi+i) из вершины (? может
случиться так, что вершина Q теперь имеет меньше
'f(m) — 1 слов, и этот процесс должен быть продолжен.
Заметим, что число слов в вершине vt после слияния
равно 2f(m)—2 и неравенство /(m)<2/(m)-l<m
непосредственно следует из неравенства 2«5/(яг)^
<Гт/21. Очевидно, что удаление слова преобразует
/(га)-деревья в /(т)-деревья с сохранением всех их
свойств.
Теорема 16. Пусть /: N-»N есть функция, для
которой при тп^З выполнено неравенство 2 =s5 f{m) ^
<[m/2). Тогда:
1) поиск в f(m)-depeee, содержащем п слов, имеет
трудоемкость самое большее (9(log/(m) n);
2) включение и удаление слов в f{m)-depeee,
содержащем п слов, при которых получающееся в
результате дерево сохраняет структуру f{m)-depeea, имеют
трудоемкость 0(logHn)n).
" В. А. Евстигнеев 337
г V
о, И'^Ри
■'^/{rn-D'PyXmi-l
Следует заметить, что эти алгоритмы сводятся к
алгоритмам для 5-деревьев порядка т, когда f(m) =
^ [яг/21. Однако они работают для любой функции /,
удовлетворяющей условию 2 < jim) < Гяг/21. Важным
свойством, /(яг)-деревьев является то, что при
расщеплении вершины нет необходимости делить ее точно
посредине, как это делается в 5-деревьях. Вместо этого
мы выбираем точку раздела между flm) и [т/2],
причем fim) может быть равной двум.
В рассмотренных алгоритмах использовались
элементарные операции:
а) ИСКАТЬ слово в вершине.
б) ВКЛЮЧИТЬ слово в вершину после выявления
его места в ней.
в) УДАЛИТЬ слово из вершины после выявления
его места в ней.
г) РАСЩЕПИТЬ насыщенную вершину на две.
д) СЛИТЬ 1 слова в двух смежных вер-
|шинах вместе с разделяю-
е) ПЕРЕСТАВИТЬ 1щим словом в их предке.
Для поиска слова используется операция а), для
включения слова — операции а), б) и г), для
удаления— операции а), в), д) и е). Заметим, что первые
три операции относятся к внутривершинным
операциям, а остальные — к межвершинным. Оценим
различные способы организации вершинных массивов слов
с точки зрения этих элементарных операций.
S-деревом (^-деревом) порядка т называется f(m)-
дерево, в котором все вершинные массивы слов
организованы как последовательный список (список с
двойными связями). Аналогично определяются B-S- и
S-L-деревья.
В 5-деревьях операция ИСКАТЬ может быть
осуществлена за время Oilogm), тогда как операции
ВКЛЮЧИТЬ и УДАЛИТЬ требуют времени ОЫ). Для
1-деревьев операции ВКЛЮЧИТЬ и УДАЛИТЬ
требуют времени, равного константе, тогда как операция
ИСКАТЬ требует 0{т) времени. В любом случае
внутривершинные операции требуют О(т) времени,
так как, прежде чем включить или удалить слово, мы
применяем операцию ИСКАТЬ. Операция
ПЕРЕСТАВИТЬ—более простая операция и требует О(т)
времени в 5-деревьях и постоянного времени в L-деревьях.
Операции СЛИТЬ и РАСЩЕПИТЬ не содержат ни-
338
чего, кроме простой пересылки слов из одной вершины
в другую, и поэтому требуют О(т) времени и для S-
н для L-деревьев.
Трудоемкость О(т) для виутривершинных
операций является серьезным недостатком для S- и Z-де-
ревьев. Это приводит к мысли использовать для
внутренней организации массива слов в вершинах деревья
(АВЛ-деревья, 2-3-деревья и т. д.), что приводит к
понятию Г-дерева.
Т-деревом порядка m называется~/(яг)-дерево, в
котором все вершины представляют собой
балансированные деревья частного типа. (Аналогично определяется
5-Г-дерево.)
Очевидно, что поиск, включение и удаление слов
в Г-дереве те же самые, что и для /(яг)-деревьев, за
исключением того, что мы должны точно объяснить,
как работают элементарные операции а) — е).
Для операций ИСКАТЬ, ВКЛЮЧИТЬ и УДАЛИТЬ
могут быть использованы стандартные алгоритмы для
выбранного типа балансированных деревьев. Они
требуют в худшем случае Oilog m) времени. Операции
ПЕРЕСТАВИТЬ и СЛИТЬ —более простые операции:
операция ПЕРЕСТАВИТЬ может быть сделана за
время Oilogm); при выполнении операции СЛИТЬ мы
вначале пересылаем слова из вершины в ее смежного
брата, что требует О(т) времени, а потом производим
слияние двух балансированных деревьев и включение
разделительного слова из вершины, являющейся
предком обоих деревьев, за время О (log m). Все это дает
оценку О(т).
РАСЩЕПИТЬ — самая трудная из этих
элементарных операций. Одним из способов выполнить эту
операцию является следующий:
1. Выделить разделяющее слово W, (медиану в
случае 5-Г-дерева). Это можно сделать за
время 0{т).
2. Расщепить балансированное дерево на два
балансированных дерева слева и справа от W,. Это требует
CKlog m) времени.
3. Скопировать одно поддерево в новую вершину за
время О(т).
И хотя с помощью более совершенной техпики
нахождение разделяющего слова можно довести до
операции с трудоемкостью Oilog т), полная трудоемкость
операции РАСЩЕПИТЬ остается равной О(т),
22* 339
Основываясь на анализе элементарных операций,
можно заключить, что Г-деревья лучше подходят для
организации больших массивов информации, нежели
S-, L- и, в частности, 5-деревья.
Библиографический комментарий
Большинство примеров применения перечисленных в
таблице теоретико-графовых задач дано в тех же статьях, где эти
задачи были описаны. Ссылки па эти статьи даны в
соответствующих главах. Таблицу, естественно, можно было бы
продолжить. Например, можно было бы указать на сведение
Задачи о проверке правильности программ к задаче построения
усиленной базы орграфов [23].
Пути !-го уровня рассматривались в работе М. Пэйджа [143],
методы вычисления времени исполнения программ — в работе
В. И. Знака [32]; ссылки на другие работы можно найти в
обзоре [19]. Операции над управляющими графами изучались
в работе [101], структурированные классы D,. — DA — в работах
В. Э. Иткина [37, 38], эквивалентные преобразования
управляющих графов — в работах [98, 107].
Цикломатическая сложность программ была введена Т. Мак-
Кэйбом в работе [133], в настоящее время известен ряд ее
модификаций. О двух из них см. [111, 137]. С различными
стратегиями тестирования, в том числе основанными на
дипломатической сложности, можно познакомиться в работах школы
В. В. Липаева, например в [56, 57, 65]. Там же можно найти
ссылки на другую литературу. Задача о контрольных точках
излагается по работе [77].
Сведение задачи о размещении блоков программы в
памяти к задаче о коммивояжере рассматривалось в заметке Р.
Карпа [40], проблема очередности активизации задач
рассматривалась в работе [59], задача о минимизации памяти при
вычислении арифметических выражений — в работах [28, 71] (см.
также [25]). Р. Сети и Дж. Ульман в работе [148] в 1970 г.
рассмотрели задачу минимизации числа программных шагов и/или
числа обращений к памяти при вычислении арифметических
выражений, если доступно фиксированное число регистров.
Предложенные ими алгоритмы существенно используют
коммутативные и ассоциативные свойства операций. Они доказали
оптимальность алгоритмов, используя различные критерии
стоимости, включая длину получаемого на выходе кода. Эти
результаты были усилены в 1975 г. А. Ахо и С. Джонсоном [89],
которые показали, что, используя динамическое
программирование, можно получить оптимальный код за линейное время для
более широкого класса машин. Позднее подход Сети и Ульмана
получил свое развитие в целом ряде работ.
Сведение задачи об экономии памяти к аадаче о раскраске
вершин графа рассматривали С. С. Лавров [54] и А. П. Ершов
[29]. Подробно эта проблема исследовапа в работе [30]. Там же
описан метод построения информационного графа с помощью
транзитивного замыкания относительно множества вершин.
Описанный в работе [29] подход был реализован при разработке
системы программирования альфа [3]. Сведение к раскраске
340
графов задачи о распределении регистров рассматривалось в
работе [106].
Подход к сегментации программ, изложенный в п. 2.10,
принадлежит Д. А. Поспелову [68]. К сожалению, данный алгоритм
применим только для разрезания линейных участков. Проблема
разрезания естественных частей, представляющих собой
циклические участки, более сложна. Для решения ее в [68] указан
точный метод, а в [51] — приближенный, являющийся частью
общего метода сегментации, который может быть полезен,
если программа допускает эффективное разделение по циклам.
Укажем еще на метод С. Н. Бушева [13], который основан на
методе Д. А. Поспелова п имеет трудоемкость,
пропорциональную числу вершин в управляющем графе сегментируемой
программы. В методе Бушева на первом этапе производится
разрезание на уровне операторов. На следующих этапах операторы
склеиваются согласно требованиям, предъявляемым к
сегментированию, которые преследуют цель получения оптимального в
некотором смысле разрезания. Вопросы крупноблочной
сегментации и распараллеливания программ рассматривались в
работе [14].
В-деревья были введены Р. Байером и К. Мак-Крэйтом в
1972 г. [100] и подробно исследовались в [48]. Подробнее с 2-3-
деревьями можно познакомиться в [7]. В*-деревья были введены
Д. Кнутом в [48], они позволяют использовать до 2/3
имеющегося в каждой вершине пространства. Плотные m-арные деревья
основаны на понятии братского дерева и позволяют строить
деревья с наперед заданной плотностью заполнения вершин.
Этот тип деревьев был предложен в 1979 г. К. Чуликом, Т. От-
тманом и Д. Вудом [108]. Организация поиска слов внутри
вершин В-дерева изучалась в работе [125].
СПИСОК ЛИТЕРАТУРЫ
1. А д е л ь с о н - В е л ь с к и й Г. М., Д и н и ц Е. А., К а р з а-
н о в А. В. Потоковые алгоритмы.— М.: Наука, 1975.
2. Адельсон-Вельский Г. М., Л а н д и с Е. М. Один
алгоритм организации информации.— ДАН СССР, 1962, £46,
№ 2, с. 263—266.
3. АЛЬФА — система автоматизации программирования: Сб.
трудов/Под ред. А. П. Ершова.— Новосибирск: Наука, 1967.
4. А н и с и м о в А. В. Об оптимальной упаковке деревьев.—
Кибернетика, 1976, № 3. с. 89—91.
5. А р л а з а р о в В. Л., Д и и и ц Е. А., Кронрод М. А.,
Фара джо в И. А. Об экономном построении
транзитивного замыкания ориентированного графа.— ДАН СССР, 1970,
194, № 3, с, 487-488.
6. Арлазаров В. Л., У сков А. В., Фарад ж ев И. А.
Алгоритм нахождения всех простых циклов в
ориентированном графе.— В/ кн.: Исследования по дискретной
математике. М.: Наука, 1973, с. 184—188.
'7. Ахо А., Хопкрофт Дж., Ульман Дж. Построение и
анализ вычислительных алгоритмов.— М.: Мир, 1979.
8. Б е к и ш е в Г. А. Об одной задаче разбиения вершин
ориентированного графа на классы.— В кн.: Дискретный анализ,
вып. 6. Новосибирск: Наука, 1966, с. 27—34.
9. Б е р ж К. Теория графов и ее применения,— М.: ИЛ, 1962.
10. Б е р з т и с с А. Т. Структуры данных.— М.: Статистика,
1974. .
11. Буда А. 0., Сабельфельд В. К. Анализ потока
данных п эквивалентность программных машин.— В кн.:
Математическая теория и практика систем программного
обеспечения. Новосибирск: ВЦ СО АН СССР, 1982, с. 45-СЗ.
12. Б у л ь о н к о в а А. А. Приближенный алгоритм раскраски
больших графов.— В кн.: Проблемы теоретического и
системного программирования. Новосибирск: Изд-во НГУ, 1982,
с. 81-86.
13. Буш ев С. Н. Об одном подходе к задаче разрезания
программ на функционально независимые части.— Изв. АН
СССР. Техническая кибернетика, 1970, № 5, с. 110—112.
14. Вальков с кий В. А., Касьянов В. Н. Крупноблочная
сегментация и распараллеливание схем программ.—
Программирование, 1976, № 1, с. 16—26.
15. Венгеров В. Н., Никитин А. С. Алгоритмы
разрезания взвешенных графов,— Минск, 1978. (Препрпнт/ИМ АН
БССР: 20 (52)).
342
16. Геолецяп Г. Г. О задаче оптимального размещения
вершин графа на отрезке.— ДАН Арм. ССР, 1973, 56, Л» 5,
с. 269—271.
17. Г е о л е ц я и Г. Г. Плоское размещение дерева с
минимизацией длины.— Вопросы радиоэлектроники. Сер. ЭВТ, 1975,
вып. 6, с. 87—91.
18. Геолецян Г. Г. Об оптимальных размещениях и их
свойствах.—ДАН Арм. ССР, 1975, 61, № 2, с. 65—69.
19. Головкин Б. А. Графовые модели программ с
вероятностными параметрами. (Современное -состояние).—
Вопросы радиоэлектроники. Сер. ЭВТ, 1976, вып. 6, с. 3—26.
20. Голубев-Новожилов 10. С. Многомашинные
комплексы вычислительных средств.— М.: Сов. радио, 1967.
21. Гольдберг М. К., Клинкер И. А. Алгоритм
минимальной нумерации вершин дерева.— Сообщ. АН ГССР,
1976, № 3, с. 553-556.
22. Г р у н с к и й II. С, С п е р а н с к и й Д. В. О покрытии
графа множеством путей, исходящих из одной вершины.—
Кибернетика, 1974. № 1, с. 29—34.
23. Д а м б и т Я. Я. Существование усиленной базы
направленного графа п некоторая задача программирования.—
Автоматика и вычислительная техника, 1963, № 4, с. 69—79.
24. Дин и ц Е. А., Зайцев М. А., К а р з а н о в А. В.
Экономный алгоритм выделения блоков в графе.— ЖВМ и МФ,
1974, 14, X» 5, с. 1309—1314.
25. Евстигнеев В. А. Теория графов и программирование.—
Новосибирск: Изд-во НГУ, 1978.
26. Е в с т и г н е е в В. А. Применение бинарных деревьев для
организации больших массивов информации (обзор).—
В кн.: Прикладная информатика. М.: Финансы и
статистика, 1981, вып. 1, с. 170—211.
27. Е р м о л ь е в Ю. М., Мельник И. М. Экстремальные
задачи на графах.— Киев: Наукова думка, 1968.
28. Ершов А. П. О программировании арифметических
операторов.—ДАН СССР, 1958, 118, № 3, С. 427—430.
29. Е р ш о в А. П. Сведение задачи распределении памяти при
составлении программ к задаче раскраски вершин графов.—
ДАН СССР, 1962, 142, № 4, с. 785-787.
30. Ершов А. П. Введение в теоретическое
программирование. Беседы о методе.— М.: Наука, 1977.
31. Е р ш о в А. П., К о ж у х и н Г. И. Об оценках
хроматического числа связных графов.— ДАН СССР, 1962, 142, № 2,
с. 270—273.
32. 3 н а к В. И. Алгоритм априорной оценки времени
машинной реализации программы.— Автометрия, 1972, № 1,
с. 101—110.
33. 3 ы к о в А. А. Теория конечных графов.— Новосибирск:
Наука, 1969.
34. Иорданский М. А. Минимальные нумерации вершин
деревьев.— В кн.: Проблемы кибернетики, вып. 31. М.:
Наука, 1976, с. 109-132.
35. Иорданский М. А. О плоских размещениях деревьев,—
Тезисы докл. IV Всесоюзн. конф. по пробл. теорет. киберн.
Новосибирск, 1977, с. 137—138.
36. Иорданский М. А. Минимальные плоские размещения
деревьев.— В кн.: Методы дискретного анализа в решении
343
экстремальных задач. Вып. 33. Новосибирск: ИМ СО АИ
СССР, 1979, с. 3-30.
37. Иткин В. Э. Характеризация структурированных графов
переходов программ.—ДАН СССР, 19S0, 250, № 5, с. 1077—
1080.
38. И т к и н В. Э. О природе композиционной
структурированности программ.— В кн.: Языки п системы
программирования. Новосибирск: ВЦ СО АН СССР, 1979, с. 5—20.
39. К а р з а н о в А. В. Экономный алгоритм нахождения биком-
понент графа.— В кн.: Тр. 3-й Зимней школы по матем. про-
граммир. и смежным вопросам, вып. 2. М., 1970, с. 343—347.
40. Карп Р. М. Заметка о приложении теории графов к
программированию для цифровых вычислительных машин.—
В кн.: Кибернетический сборник, вып. 4, М.: ПЛ, 1902,
с. 123-134.
41. Касьянов В. Н. Анализ управляющих графов
программ.— В кн.: Системное программирование, ч. 2.
Новосибирск: ВЦ СО АН СССР, 1973, с. 138—154.
42. К а с ь я и о в В. Н. Об одиом алгоритме выделения биком-
попент в ориентированном графе.— В кн.: Системное и
теоретическое программирование. Новосибирск: ВЦ СО АН
СССР, 1974, с. 235-243.
43. К а е ь я н о в В. II•. Выделение гамаков в. ориентированном
графе,-ДАН СССР, 1975, 221, № 5, с. 1020-1022.
44. Касьянов В. Н. Комбинаторные задачи анализа
программ в оптимизирующей трансляции: Автореф. дисс. канд.
фпз.-мат. наук.— Новосибирск, 1975.
45. Ка с ь я н о в В. Н. Практический подход к оптимизации
программ,—Новосибирск, 1978. (Препринт/ВЦ СО АН СССР:
135).
46. К а с ь я н о в В. Н. Анализ структур программ.—
Кибернетика, 1980, JV» 1, с, 48—61.
47. Касьянов В. Н. Методы анализа программ.—
Новосибирск: Изд-во ИГУ, 1982.
48. Кнут Д. Искусство программирования для ЭВМ. Т. 3:
Сортировка п поиск,— М.: Мир, 1978.
49. К о к Дж. Глобальная экономия команд.— В кн.: Тр. 2-й
Всесоюзн. коиф. по программир. Докл. участников.
Новосибирск, 1970.
50. К о р я ч к о В. П., Курчпдиб В. А. Об укладке графов
программ,— Изв. АН СССР. Техническая кибернетика, 1979,
№ 6, с. 129-136.
51. Косарев Ю. Г. Распараллеливание по циклам.— В кн.:
Вычислительные системы, вып. 24. Новосибирск: ИМ СО АН
СССР, 1967, с. 3—20.
52. Коф.ман А. Введение в прикладную комбинаторику.—М.:
Наука, 1975.
53. К р п с т о ф и д е с Н. Теория графов. Алгоритмический
подход.—М.: Мпр, 1978.
54. Л а в р о в С. С. Об экономии памяти в замкнутых
операторных схемах,— ЖВМ и МФ, 1961, 1, № 2, с. 309—342.
55. Л а в р о в С. С, Гончарова Л. И. Автоматическая
обработка данных. Хранение пнформацпп в памяти ЭВМ.—
М.: Наука, 1971.
56. Л я п а е в В. В. Надежность программного обеспечения
АСУ.— М.: Энергия, 1981.
344
57. Липа ев В. В., Позин Б. Л., Блау С. А. Анализ
стратегии тестирования программ.— Кибернетика, 1982, Ла 2,
с. 45-50.
58. Мазепа Е. Ю., Федюнькин Е. Д. Оптимальные
сети с квазнаддптпвной функцией качества.— Дубна, 1980.
(Препрннт/ОШШ: Р11-13059).
59. Мазепа Е. 10., С и л и и И. Н„ Ф е д ю п ь к п и Е. Д.
О перечислении частичных графов с заданным
дипломатическим числом,— Программирование, 19S1, As 4, с. 78—
80.
60. Мартынюк В. В. Об анализе графа переходов для
операторной схемы,— ЖВМ н МФ, 1905, 5, № 2, с. 293—310.
61. Нивергельт Ю., Фаррар Дж., Рейнголд Э.
Машинный подход к решению математических задач.— 51.:
Мир, 1977.
62. Н и к и т и н А. С. В е н г е р о в В. Н. Алгоритм
субоптимального разрезания взвешенных графов на заданное число
блоков.— В кн.: Дискретные преобразователи. Киев: ИК АН
УССР, 1976, с. 40—50.
63. О р е О. Теория графов.— М.: Наука, 1968.
64. П е т р о с я п А. В., А н а с т а с я н 10. Г. Об одной задаче
оптимального размещения.— Вопросы радиоэлектроники.
Сер. ЭВТ, 1971, вып. 8, с. 80—87.
65. П о з и и Б. А. Метод структурного построения тестов для
отладки управляющих программ.— Программирование, 1980,
№ 2, с. 62-68.
68. Попков В. К. Представление графов,— Новосибирск, 1980.
(Препринт/ВЦ СО АН СССР: 241).
67. П о и к о в В. К. Представление деревьев.— Новосибирск,
1981. (Препрннт/ВЦ СО АН СССР: 242).
68. Поспелов Д. А. Введение в теорию вычислительных
систем.— М.: Сов. радио, 1972.
69. Поттоспн И, В. О линеаризации программ и частичном
ее упорядочении.— В кн.: Системное и теоретическое
программирование. Новосибирск: ВЦ СО АН СССР, 1972, с. 278—
286.
70. Поттоспн И. В. Оптимизирующие преобразования и их
последовательность.— В кн.: Системное программирование,
ч. 2. Новосибирск: ВЦ СО АН СССР, 1973, с. 128—137.
71. Р е д ж е ё в с к и Р. Об арифметических выражениях и
деревьях.— В кн.: Кибернетический сборник, вып. 7. М.: Мир,
1970, с. 99—107.
72. Рейнголд Э., И и в е р г е л,ь т 10., Део II.
Комбинаторные алгоритмы. Теория и практика.— М.: Мир, 1980.
73. С и л п и II. II., Ф е д ю и ь к и н Е. Д. Итерационные методы
оптимизации сети.— Дубна, 1979. (Препрпнт/ОИЯН:
Р5-12995).
74. Т у ш к и н а Т. А., Ш а х б а з я н К. В. Метод ветвей и
границ для задачи параллельного упорядочивания — В кн.:
Записки науч. семинаров Ленингр. отд. МП АН СССР, Л» 35,
1973, с. 146—155.
75. У и л сон Р. Введение в теорию графов.— М.: Мир, 1977.
76. Ф а р а д ж е в II. А. Алгоритм выделения бикомпонент
ориентированного графа.— В кн.: Тр. 3-й Зимней школы по ма-
тем. программир. и смежным вопросам, вып. 3. М., 1970,
с. 650-654,
77. Филлипович В. В. Об одной задаче преобразования
направленного циклического графа в ациклический граф.—
Кибернетика, 1973, № 2, с. 138—НО.
78. Форд Л. Р., Фалкерсон Д. Р. Потоки в сетях.— М.:
Мир, 1965.
79. X а и к и н Н. М., 3 а к Е. II. Построение минимальной
укладки дерева в задаче оптимального распределения
памяти.— Кибернетика, 1976, Х« 3, с. 58—63.
80. X а р а р и Ф. Теория графов.— >!.: Мир, 1973.
81. Холл М. Комбинаторика.—М.: Мир. 1970.
82: Ч е б а к о в В. Л. Плоские укладки дерева.—ЖВМ п МФ,
1972, 12, № 2, с. 729—738.
83. Ш а х б а з я и К. В., Т у ш к и н а Т. А. О статистической
эффективности алгоритмов решения одной задачи
разбиения вершин графа.— Кибернетика, 1977, Л"» 5, с. 38—43.
84. Шейдвасеер М. А. Об оптимальной нумерации
вершин дерева.— В кн.: Дискретный анализ, вьАг. 17.
Новосибирск: ИМ СО АН СССР, 1970; с. 56—74.
85. Ш е и д в а с с е р М. А. Оптимальное упорядочение
вершин ориентированного дерева.— Кибернетика, 1972, К« 3,
с. 134-139.
86. Ш е н д в а с с о р М. Л. О длине и ширине размещения
графов в решетках.— В кн.: Проблемы кибернетики, вьш. 29.
М.: Наука, 197Д с. 63-102.
87. Щтенп М. Е., Штейн Б. Е. Методы машинного
проектирования цифровой' аппаратуры,— М.: Сов. радио, 1973.
88. Я с а к о в а В. П. Преобразование матрицы смежности
ориентированного графа к треугольному виду.—-В кн.:
Управляемые системы. Вып. 4—5. Новосибирск: Наука, 1970,
с. 44-46.
89. Alio A. V,, Johnson S. С. Optimal code generation for
expression trees,—J. ACM, 1976, 23,'Л» 3, p.'488—501.
90. Aho A. V., Ullman J. D. Node listings for reducible
flow graphs,—J. Com p. Syst. Sci., 1976, 13, p. 286—299.
91. Allen В., M u и г о J. Self-organizing binary search
trees - J. ACM, 1978, 25, K« 4, p. 526-535.
92. Allen F. E. Program optimization.— In: Annual Review
in Automatic Programming. V. 5, N. Y.: Pergarnon Press,
1969, p. 239—308.
93. Allen F. E. Control flow analysis,—SIGPLAN Notices,
1970, 5, № 7, p. 1—19.
94. Alspach B. R., Pullman N. J. Path decompositions
of digraphs.—Bull. Austral Math. Soc, 1974, 10, № 3,
p. 421-427.
95. Baer J. L. Weight-balanced trees —In: Proc. AFIPS 1975
NCC. N. J.: AFIPS Press, 1975, p. 467—472.
96. Baer J. L., Caugley R. Segmentation and optimization
of programs from cyclic structure analysis.— In: Proc. AFIPS
SJCC, v. 40, 1972, p. 23-36.
97. Baker J. J. A note on multiplying Boolean matrices,—
, Coram. ACM, 1962, 5, № 2, p. 102.
98. Basu S. K. Transformations on directed graphs.— J. Comb.
Th., 1970, 9, p. 244—256.
99. Bayer P. J. Improved bounds on the cost of optimum and
balanced binary search trees. Techn, Memo. 69. Project Mac.
Cambrige: M. I. T., 1975.
346
100. Bayer R., M с С r e i g h t С Organization and maitenan-
ce of large ordered indexes.— Acta inf., 1972, 1, Л» 3, p. 173.
101. Bien Z. Program graphs,—Bull. Acad. Pol. Sci. Ser. Sci.
math., Astron., Phys., 1971, 19, Лг 8.
102. Bitner J. R. Heuristics that dinamically organize data
structures.— SIAM J. Computing. 1979. 8, Л» l,.p. 82—110.
103. Bowie W. S. Applications of graph theory in computer
systems,— Intern. J. of Computer and Inform. Sci., 1976, 5,
№ 1, p. 9-31. "
104. В r e 1 a z D. New methods to color the vertices of a graph.—
Comm. ACM, 1979, 22, № 4. p. 251—256.
105. Bruno B. J., С о f f m a n E. G. Nearly optimal binary
search trees.— In: Proc. IFIP Congress 71. Amsterdam:
North Holland Publ. Co., 1972, p. 99—103.
106. Chaitin G. J., A u s 1 a n d e r M. A. el al. Register
allocation via coloring.— Computer Languages, 1981, 6, p. 47—51.
107. Cooper D. С Reduction of programs to a standard form
by grapli transformation.—Jn: Proc. Intern. Seminar on
Graph Th. and its Appl., Rome, 1966. p. 57—68.
108. С u lie K., Ottman Th., Wood D. Dense multiway
trees,—Сотр. Sci. Techn. Rep. 79-CS-5.—Ontario, 1979.
109. D u 11 о n R. D., Bingham R. C. A new graph coloring
algorithm.—The Computer J., 1981, 24, № 1, p. 87—91.
110. Earnest C. P., Balke K. G., Anderson J.
Analysis of graphs by ordering of nodes.— J. ACM, 1972, 19, Лг 1,
p. 23-42.
111. Elshoff J. L., Marcotty M. On use of the cycloma-
tic number to measure program complexity.— SIGPLAN
Notices, 1978, 13, № 12, p. 29-40.
112. Estrin G., Turn R. Automatic assignment of
computations in a • variable structure computer system.— IEEE
Trans. Electron. Comput., 1964, EC-12, № 6, p. 755—773.
113. Fredman M. L. Two applications of probabilistic search
technique: sorting x 4- у and building balanced search
trees.— In: 7th ACM Symp. on Th. of Comput. Albuquerque,
1975.
114. G a b о w H. N., M а с h e s h w a r i S. II., О s t e r w e i 1 L. J.
On two problems in the generation of program test paths.—
IEEE Trans, on Software Eng., 1976, SE-2, № 9, p. 61—64.
115. Garey M. N., Johnson D. S. The complexity of near-
optimal graph coloring,—J. ACM, 1976, 23, № 1, p. 43—49.
116. He с lit M. S., Ullman J. D. Characterizations of redu*
cible flow graph.—J. ACM, 1974, 21, № 3, p. 367—375.
117. He с lit M. S., Ullman J. D. A simple algorithm for
global data flow problems.— SIAM J. Computing, 1975, 4,
№ 4, p. 519-532.
118. Hopcroft J. E., Ullman J. D. An n log n algorithm for
detecting reducible graphs,— In: Proc. 6th Annual Princeton
Conf. on Inf. Sciences and Systems. Princeton, 1972, p. 119.
119. Johnson D. B. Finding all elementary circuits of a
directed graph.— SIAM J. Computing, 1975, 4, № 1, p. 77—84.
120. К am J. В., Ullman J. D. Global data flow analysis and
iterative algorithms.—J. ACM, 1976, 23, № 1, p. 158—171.
121. Karl ton P. L., Fuller S. H., Seroggs R. E„ К a-
e hi e r E. B. Performance of height-balanced trees.— Comm.
ACM, 1976, 19, № 1, p. 23-28.
347
122. Kildall G. A, An unified approach to global program
optimization In: Conf. Record of ACM Symp. on
Principles of Programming Languages. Boston, Massachusetts,
October 1-3, 1974, p. 194-206.
123. Krai J. One wav of estimating frequences of jumps in a
program.—Coram. "ACM, 1968, 11, № 7, p. 475—480.
124. Kubale M., D a b г о w s kj J. Empirical comparison of
efficiency of some graph coloring algorithms.— Arch,
automat, i telemech., 1978, 23, .V» 1—2.
125. Kwong Y. S., Wood D. Г-trees: a variant of S-trees.—
Сотр. Sci. Techn. Rep. 73-CS-1S.— Ontario, 1978.
126. Leigh ton F. T. A graph coloring algorithm for large
sheduling problems.—J. Res. Xat. Bur. Stand., 1979, 84, Л* 6,
p. 489.
127. Lukes J. A. Efficient algorithm for the partitioning of
trees.—IBM J. Res. and Developm.. 1974, 18, Д» 3, p. 217—224.
128. Lukes J. A. Combinatorial solution to the partitioning of
general graphs,— IBM J. Res. and Developm., 1975, 19, Л» 2,
p. 170—180.
129. M a r с о \v з к у G.. T a r j a n R. E. Lower ounds on the
lengths of node sequences in directed graphs.— Discrete
Math., 1976, 16, p. 329-337.
130. Ma tul a D., Marble G„ Isaacson J. Graph
coloring algorithms.— In. Graph Theory and Computing. N. Y.:
Acad. Press. 1972, p. 109.
131. Maurer IT. A.. Oilman T h., Six H.-W.
Implementing dictionaries using binarv trees of verv small height.—
Inf. Proc. Lett,, 1976. 5. Л"« 1, p, 11—14.
132. Maurer H. A., Wood D. Zur Manipulation von Zahlen-
mengoa.— Angewandte Informatik, 1976, 18. Л° 4. S. 143—149.
133. M с С a b e T. .1. A complexity measure.— IEEE Trans, on
Software Eng., 1976, SE-2, № 4.'p. 308—320.
134. M e h 1 h о r n K. Nearly optimal binary search trees,—Acta
Inf.,4975, 5. Л» 4, p. 287-295.
135. Mezyk S. О pewnej algebraicznej metodzie wyznaczania
drog w grafie zorientowanvm.— Arch, electrotechn. (PRL),
1973. 22, № 3, s. 701-705.
136. Munro I. Efficient determination of the transitive
closure of a directed graph.— Inf. Proc. Lett., 1971, 1 № 2,
p. 56-58.
137. Myers G. J. An extension to the cyclomatic measure of
program complexity.—SIGPLAN Notices, 1977, 12, № 10,
p. 61—64.
138. N i e v e r g e 11 J., R e i n g о 1 d E. M. Binary search trees
of bounded balance.—SIAM J. Computing. 1973, 2, № 1,
p. 33-43.
139. N i e v e г g e 11 J., Wong С. К. On binary search trees.—
In: Proc. IFIP Congress 71. Amsterdam: North Holland Publ.
Co., 1972, p. 91—98.
140. N ish ika w a Y., Yoshida Y., Fukumura T. Top-
down algorithms for constructing nearly optimal binary
search trees*— Itforrnation Processing in Japan, 1977, 17,
p. 32-38.
141. Ntafos S. C. Hakimi S. L. On path cover problems
in digraphs and applications to program testing.— IEEE
Trans, on Software Eng., 1979, SE-5, № 5, p. 520—529.
348
142. Oltman Th., Six T.-W. Einc noue Klasse von ausgegli-
chenen Binarbaumen,— Angewandte Informatik, 1976, 18,
№ 9, p. 395-400.
143. Paige M. R. On partitioning program graphs.— IEEE Trans,
on Software Eng., 1977, SE-3, № 6, p. 386—393.
144. Purdom P. A transitive closure algorithm,—BIT, 1970,
10, № 1, p. 76-94.
145. R,e a d R. C, Tarjan R. E. Bounds on backtrack
algorithms for listing cycles, paths and spanning trees.—
Networks, 1975, 5, Л1 3, p. 237—252.
146. Sattley K., Mills te in R. Comments on a paper by
Love.—Comm. ACM, 1970, 13, № 7, p. 450—451.
147. Schneck P. В.. Angel E. A FORTRAN to FORTRAN
optimizing compiler.— The Computer J., 1973, 16, №4,
p. 322-330.
148. Sethi R., U 11m an J. D. The generation of optimal
code for arithmetic expressions,—J. ACM, 1970, 17, Л1 4,
p. 715—728.
149. S z w а г с f i t e г J. L., L a u t e г P. E. A search strategy
for the elementary cycles of a directed graph.— BIT, 1976,
16, p. 192—204.
150. Tarjan R. E. Depth first search and linear graph
algorithms,—SIAM J. Computing, 1972, 1, № 2, p. 146—160.
151. Tarjan R. E. Enumeration of the elementary circuits of
a directed graph,— SIAM J. Computing, 1973, 2, № 3,
p. 211—216.
152. Tarjan R. E. Testing flow graph reducibility.— J. Сотр.
Syst. ScL 1974, 9, Л» 3, p. 355—305.
153. Tarjan R. Finding dominators in directed graphs.— SIAM
J. Computing, 1974. 3, № 1, p. 62—89.
154. Tarjan R. E. Complexity of combinatorial •algorithms.
Techn. Rep. STAN-CS-77-609,— Stanford, 1977.
155. Th о г e 11 i L. E. An algorithm for computing all paths
in a graph.—BIT, 1966. 6. p. 347—349.
156. Tiernan J. С An efficient search algorithm to find the
elementary circuits of a graph.— Com т. ACM, 1970, 13,
№ 12, p. 722-726.
157. T г a n D i n h Аш, Shuji Tsukiyama et al. An
algorithm for generating all the directed paths and its
application.— Information Processing in Japan, 1976, 16, p. 31—35.
158. U lima n J. D. Fast algorithms for elimination of common
subexpressions,—Acta Inf., 1973, 2, p. 191—213.
159. Unterauer K. Dynamic weighted binary search trees.—
Acta Inf., 1979, 11, № 4, p. 340—362.
160. Ver Hoef E. W. Automatic program segmentation based
on Boolean connectivity.— In: Proc. AFIPS SJCC, v. 38, 1971,
p. 491-495.
161. Warren H. S. A modification of Warshall's algorithm for
the transitive closure of binary relations,— Comm. ACM,
1975, 18, p. 218—220.
162. Warshall S. A theorem on Boolean matrices.—J. ACM,
1962, 9, № 1. p. 11—12.
163. Weinblatt H. A new search algorithm for finding the
simple cycles of a finite directed graph.—J. ACM, 1972, 19,
№ 1, p. 43-56.
349
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
АВЛ-дерево 214
Алгоритм волновой 132
Аранжировка 39
Ациклическое упорядочение
шин 97
Баланс корневой 221
Бивершина 48
Бикомпонента 11
Блок 17
— корневой 71
Брат вершины 227
Величина потока 143
— разреза 243
Вершина графа 9
— безопасная 302
— ведомая 98
— ведущая 98
— висячая 14
— входная подграфа 12
— выходная подграфа 12
— голая 10
— изолированная 10
— конечная 10
— начальная 10
подграфа 11
— отрицательная 146
— положительная 146
— разделяющая 17
— стека 37
— центральная 14
— центроидная 15
Вершины несравнимые 140
— смешные 9
— еоцветные 288
Вес вершины 15
Ветвь блоков 71
— к вершине 15
Втягивание вершины 89
Вход 10
Выход 10
Гамак 12
Грань внешняя 281
— внутренняя 281
Граф 12
— аранжируемый 39
— бесконтурный 39
— блоков 17
— Герца 40, 59
— двудольный 18
— двусвязный 17
Граф информационный 23
— конденсации 40, Ь9
— контурно-связный 118
вер- — неориентированный 12
— несенарабельный 17
— несовместимости 24, 320
— ориентированный 9
полный 9
— петлевой 118
— пленарный 281
— плоский 281
топологический 15
— полный 17
— правильный 145
— прогрессивно-конечный 273
— производный 84
— сводимы» 85
по Хехту и Ульману 87
— связный 13
— сильно связный 11
— симметричный 9
— спиральный 97
— управляющий 19
— частичный 11
— ft-дольный 283
полный 283
— ft-контурно-евязный 118
— ft-раскрашиваемый 278
— ft-хроматичеекий 278
Дерево 13
— ассоциативное in/
— балансированное по весу 221
-^ — по высоте 214
— бинарное 16, 192
— взвешенное корневое 193
— доминаторное 164
— минимаксное 207
— ориентированное корневое 15
— поиска в глубину 35
— сортировки 24
— упорядоченное 15
— т-арное 16, 285
— — г-плотное 236
Длина графа 167
— контура 11
— покрытия 145
— пути 11
— укладки 167
Доминатор 150
— непосредственный 150
Допустимое множество функций
121
Достижимая вершина 11
Дуга 9
350
Дуга безопасная 302
— древесная 36
— обратная 33
— отмеченная 34
— поперечная 36
— прямая 36
Зона 11
Замыкание 63
— обратное 63
— транзитивное 53
Иерархия зон 61
Изолированное множество 258
Интервал 83
Интервальное представление 84
Каркас 16
Клика 17
Код Пргофера 29
— Харари 28
Композиция управляющих
графов 298
Компонента линейная 12
— сильной связности 11
Конец дуги 9
Контур 11
— гамильтонов 11
— простой 11
— эйлеров 11
Кратность покрытия 145
Маршрут величины 320.
Матрица вложенности 113
— достижимости 19
— инцидентности 19
— смежности 18
—» фундаментальных циклов 117
— цикломатическап 113
Мультиграф 13
— ориентированный 9
Начало дуги 9
Носитель орграфа 88
Нумерация вершин 33
— базисная 34
— допустимая 166
— линейная 34
— оптимальная 166
— плоская 166
— прямая 41
Область действия величины 320
— с головной вершиной 96
Образующая разрезания 260
Объединение управляющих
графов 296
Обязательный преемник 82
Одноцветный класс 2-78
Окрестность вершин 288
Операторная схема 23
Орграф 9
— сильно связный 11
— симметричный 9
Оркаркас 17
Остов 16
Паросочетание 143
— максимальное 143
Петля 9
Подграф 11
Поиск в глубину 34
Покрытие, путевое 139
минимальное 140
приведенное 145
Полугамак 82
Полурешетка 121
— ограниченная 122
Полустепень захода 10
— исхода 10
Поток 142
— минимальный 142
Потомок вершины 10
Предок вершины 10
Предшественник вершины 10
Путь 10
— вырожденный 11
— гамильтонов 11
— кратчайший 130
— критический 133
— отмеченный 216
— простой 10
— текущий 34
— транслирующий 149
— тривиальный 11
— эйлеров 11
Радиус графа 14
Разметка вершин 123
Разрез 242
— минимальный 243
— собственный 243
Разрезание доминантное 259
— допустимое 254
— подобное 259
Ганг контурный графа 118
Раскраска последовательная 283
Растянутость укладки 166
Ребро 12
Редукционный порядок 94
Связное множество 254
Семндоминатор 154
Сечение 118
— минимальное 118
Сжатие укладки 166
Склеивание вершин 288
Склейка 134
Слабая последовательность
вершин 95
Смежные вершины 9, 13
Стек 37
Степень вершины 10, 13
Стоимость дерева 193
Строгая последовательность
вершин 95
Суграф 11
Тест 305
Топологическая сортировка
вершин 60
Точка сочленения 17, 70
Транзитивное замыкание 53
Трудоемкость алгоритма 31
351
Укладка 166
— оптимальная по длине 167
по числу соседней
связности 190
по ширине 167
Уровень вершины 193
Ширина укладки 1(57
Шлейф вершины 82
Эксцентриситет 14
Фактор-граф 53
Фокус вершины 82-
Хорда 116
Хроматическое число 27
Центр 14
Центроид 15.
Цепь 13
— полурешеткн 122
Цикл 13
— формальный 41
примитивный 41
самый внутренний 65
— фундаментальный 117
Цикломатическая сложность
программы 304
Цикломатическое число 116
Число соседней связности 190
Ширина графа 167
— плоской укладки 170
^4-нумерация 39
В-дерево 330
С-удаленпе вершины 302
^-достижимость 34
.F-линия 50
^-область 47
F-ранг 50
F-путь 34
/(т)-дерево 335
Н-дерево 226
ЯВ-дерево 227
HS-дерево 230
ft-дерево 231
К-нумеращш 49
ft-раскраска пр_авнльная 278
й-смежность 254
KLC-граф 118
£,-нумеращш 50
LC-граф 118
ДГ-нумерацпя 35
Л'-нумерация 33
Р-нумерация 41
s — <-путь 10
Т-дерево 338
Т-нумерация 48
?.-граф 213
2-3-деревО 331