Text
                    Б. Н. ИВАНОВ
дискретная
математика
АЛГОРИТМЫ
И ПРОГРАММЫ


ТЕХНИЧЕСКИЙ Л> УНИВЕРСИТЕТ Б. Н. ИВАНОВ дискретная математика АЛГОРИТМЫ И ПРОГРАММЫ Москва Лаборатория Базовых Знаний 2003
ББК 32.973.3 УДК 519@75.8)+681.142.2 И 20 Рецензенты: кафедра математического моделирования и информатики ДВГТУ (зав. кафед- кафедрой доктор физико-математических наук, профессор А. А. Буренин); доктор физико-математических наук, профессор В. В. Катрахов Иванов Б. Н. Дискретная математика. Алгоритмы и программы: Учеб. по- И20 собие/ Б. Н. Иванов. — М.: Лаборатория Базовых Знаний, 2003. — 288 с: ил. ISBN 5-93208-093-0 Книга посвящена современному курсу дискретной математики. Теоретиче- Теоретические основы курса сопровождаются практически значимыми алгоритмами, реа- реализованными в конкретных компьютерных программах. Книгу можно рассматри- рассматривать в качестве хорошего справочника методов и алгоритмов дискретной матема- математики, широко применяемых в практическом программировании. Пособие рассчитано на студентов специальностей, учебные планы которых предполагают изучение каких-либо разделов курса дискретной математики, в первую очередь на математиков-прикладников, а также программистов, занятых разработкой прикладного программного обеспечения. ББК 32.973.3 УДК 519@75.8)+681.142.2 Серия «Технический университет» Учебное издание Иванов Борис Николаевич ДИСКРЕТНАЯ МАТЕМАТИКА. АЛГОРИТМЫ И ПРОГРАММЫ Художник Н.Лозинская Компьютерная верстка В. Носенко Подписано в печать 22.04.01. Формат 60х90716. Гарнитура Ньютон. Бумага офсетная. Печать офсетная. Усл. печ. л. 18,0. Тираж 3000 экз. Заказ 2697 Издательство «Лаборатория Базовых Знаний» Телефон @95)955-0398. E-mail: lbz@aha.ru Лицензия на издательскую деятельность № 066140 от 12 октября 1998 г. Отпечатано с готовых диапозитивов в полиграфической фирме «Полиграфист». 160001, г. Вологда, ул. Челюскинцев, 3. © Б. Н. Иванов, 2002 ISBN 5-93208-093-0 © Лаборатория Базовых Знаний, 2003
Содержание Предисловие 6 Глава 1. Комбинаторные схемы 8 1.1. Правило суммы 8 1.2. Правило прямого произведения 9 1.3. Размещения с повторениями 9 1.4. Размещения без повторений 10 1.5. Перестановки 11 1.6. Сочетания 11 1.7. Сочетания с повторениями 12 1.8. Перестановки с повторениями, мультимножества 14 1.9. Упорядоченные разбиения множества 15 1.10. Неупорядоченные разбиения множества 16 1.11. Полиномиальная формула 18 1.12. Бином Ньютона 19 1.13. Инверсии 20 1.14. Обратные перестановки 21 Глава 2. Представление абстрактных объектов 24 2.1. Представление последовательностей 24 2.1.1. Смежное представление 24 2.1.2. Характеристические векторы 25 2.1.3. Связанное размещение 26 2.2. Представление деревьев 31 2.2.1. Представление деревьев на связанной памяти 32 2.2.2. Представление деревьев на смежной памяти 33 2.3. Представление множеств 37 Глава 3. Методы подсчета и оценивания 39 3.1. Производящие функции 39 3.1.1. Линейные операции 41 3.1.2. Сдвиг начала вправо 41 3.1.3. Сдвиг начала влево 42 3.1.4. Частичные суммы 42 3.1.5. Дополнительные частичные суммы 42 3.1.6. Изменение масштаба 43 3.1.7. Свертка 44 3.2. Линейные рекуррентные соотношения 49 3.3. Неоднородные линейные рекуррентные соотношения. ... 51 3.4. Обобщенное правило произведения 53 3.5. Принцип включения и исключения 56 3.6. Ладейные многочлены и многочлены попаданий 59 3.6.1. Ладейные многочлены 60 3.6.2. Многочлены попаданий 63
Содержание Глава 4. Генерация комбинаторных объектов 66 4.1. Поиск с возвращением 66 4.2. Перестановки различных элементов 68 4.3. Эффективное порождение перестановок 71 4.4. Порождение подмножеств множества 76 4.5. Генерация размещений с повторениями 79 4.6. Порождение сочетаний 80 4.7. Порождение композиций и разбиений 83 4.8. Генерация случайных перестановок 89 Глава 5. Сортировка и поиск 91 5.1. Сортировка вставками 92 5.2. Пузырьковая сортировка 93 5.3. Сортировка перечислением 94 5.4. Сортировка всплытием Флойда 95 5.5. Последовательный поиск 102 5.6. Логарифмический поиск 104 5.7. Сортировка с вычисляемыми адресами 106 Глава 6. Введение в теорию графов. Алгоритмы на графах ПО 6.1. Основные понятия и определения ПО 6.2. Представления графов 114 6.2.1. Матрица смежности графа 114 6.2.2. Матрица инцидентности графа .115 6.2.3. Матрица весов графа 116 6.2.4. Список ребер графа 116 6.2.5. Структура смежности графа 117 6.3. Метод поиска в глубину 117 6.4. Отношение эквивалентности 124 6.5. Связные компоненты. . 125 6.6. Выделение компонент связности 126 6.7. Эйлеровы графы 130 6.8. Остовные деревья 137 6.8.1. Жадный алгоритм построения минимального остовного дерева 139 6.8.2. Алгоритм ближайшего соседа построения остовного дерева 145 6.9. Кратчайшие пути на графе 151 6.10. Потоки в сетях 156 6.11. Клики, независимые множества 160 6.12. Циклы, фундаментальные множества циклов 172 6.13. Листы и блоки 177 6.13.1. Листы 178 6.13.2. Блоки 180 6.13.3. Поиск блоков в глубину 182
Содержание 6.14. Двудольные графы 185 6.14.1. Условия существования двудольных графов 185 6.14.2. Паросочетания 186 6.14.3. Алгоритм определения максимального паросочетания 186 6.14.4. Системы различных представителей 189 6.14.5. Связь системы различных представителей и двудольных графов 189 6.14.6. Задача о назначениях 190 6.15. Хроматические графы 194 6.16. Диаметр, радиус и центры графа 196 Глава 7. Введение в теорию групп. Приложения 197 7.1. Определение группы 197 7.2. Гомоморфизм групп 198 7.3. Смежные классы 199 7.4. Строение коммутативных (абелевых) групп 203 7.5. Строение некоммутативных групп 207 7.6. Симметрическая группа подстановок 208 7.7. Действие групп на множестве 212 7.8. Цикловой индекс группы 217 7.9. Теория перечисления Пойа 218 7.10. Цикловая структура групп подстановок 223 7.10.1. Цикловой индекс группы, действующей на себе . . . 224 7.10.2. Цикловой индекс циклической группы 224 7.10.3. Цикловой индекс симметрической группы 225 Глава 8. Элементы теории чисел 227 8.1. Наибольший общий делитель 227 8.2. Наименьшее общее кратное 228 8.3. Простые числа 228 8.4. Сравнения, свойства сравнений 232 8.5. Полная система вычетов 233 8.6. Приведенная система вычетов 234 8.7. Функция Эйлера 234 8.8. Функция Мёбиуса. Формула обращения Мёбиуса 238 Задачи и упражнения 240 Ответы 281 Литература 285 Предметный указатель 286
Предисловие I радиционно к дискретной математике относят такие облас- области математического знания, как комбинаторика, теория чисел, математическая логика, теория алгебраических систем, теория графов и сетей и т.д. Дискретная математика всегда оставалась наиболее динамичной областью знаний. Сегодня наиболее зна- значимой областью применения методов дискретной математики является область компьютерных технологий. Это объясняется не- необходимостью создания и эксплуатации электронных вычисли- вычислительных машин, средств передачи и обработки информации, автоматизированных систем управления и проектирования. На грани дискретной математики и программирования появляются новые дисциплины, такие как разработка и анализ вычислитель- вычислительных алгоритмов, нечисленное программирование, комбинатор- комбинаторные алгоритмы, алгоритмизация процессов. Дискретная математика и примыкающие к ней дисциплины изучаются во всех университетах и институтах, где осуществляется подготовка специалистов в области программирования, математики, а также по экономическим, техническим и гуманитарным направлениям. Цель написания учебного пособия — научить студентов не то- только основам дискретной математики, но и показать ее роль в со- современных компьютерных технологиях, вооружить читателя ме- методами, применяемыми для решения широкого круга задач. По- Пособие написано в доступной форме, достаточно полно и строго. Особое внимание в книге уделяется вопросу практической компьютерной реализации. В каждом конкретном случае содер- содержится достаточно информации для применения рассматривае- рассматриваемых методов на практике. В этом отношении много полезного найдет читатель, более склонный к программистской работе и интересующийся предлагаемыми алгоритмами в силу их практи- практического использования. Для любого заинтересованного читателя рассматриваемый в пособии набор приемов и правил алгоритми- алгоритмического характера может составить хорошую основу формирова- формирования культуры разработки, анализа и программной реализации ал- алгоритмов.
Предисловие Практическая компьютерная реализация большого количест- количества рассматриваемых задач потребовала включения в книгу специ- специальных разделов дискретной математики, таких как представле- представление абстрактных объектов, сортировка и поиск, порождение ком- комбинаторных объектов. Однако увеличение объема материала по- пособия только лишь усилило многие вопросы, позволило уточнить их суть, а также придать общее звучание разделам курса, которые на первый взгляд никоим образом не связаны. Книгу можно рас- рассматривать в качестве хорошего справочника методов и алгорит- алгоритмов дискретной математики, широко используемых в разработ- разработках прикладного программного обеспечения. Уровень математической подготовки, требующийся для пони- понимания материала книги, может меняться от главы к главе. Мини- Минимум необходимых познаний в программировании соответствует уровню первокурсника, уже научившегося писать довольно про- пространные программы. Необходимый уровень математического образования соответствует типичной подготовке студента, про- прослушавшего ряд основных математических курсов, таких как ма- математический анализ, аналитическая геометрия, линейная алгеб- алгебра. Учебное пособие ориентировано на семестровый лекционный курс, читаемый автором на механико-математическом факульте- факультете Дальневосточного государственного технического университе- университета. Без сомнения, книга может составить хорошую основу курсов, примыкающих к дискретной математике, таких как информати- информатика, алгоритмизация процессов, анализ вычислительных алгорит- алгоритмов. Учебное пособие предназначено прежде всего для студентов специальности «Прикладная математика», а также студентов дру- других специальностей, изучающих дискретную математику и про- программирование. Книга будет полезна преподавателям, аспиран- аспирантам и научным работникам, применяющим методы дискретной математики в прикладных задачах.
===== Глава 1 ========== Комбинаторные схемы В этой главе будет сделан обзор комбинаторных формул, наиболее важных для вычислительных задач. Мы не ставим себе целью сделать этот обзор всеобъемлющим, а хотим сосредоточить внимание читателя на таких формулах, которые он мог бы недо- недооценить или даже совсем не заметить. Заинтересованному чита- читателю рекомендуется обратиться к специальной литературе. Введем некоторые важные обозначения. Множества будем обозначать заглавными буквами. Множества состоят из элемен- элементов, которые будем обозначать малыми буквами. Так, запись а еА обозначает, что элемент а принадлежит множеству А. Такие мно- множества будем изображать перечислением элементов, заключая их в фигурные скобки. Например, {а, Ь, х, у}. Количество элементов в множестве называется мощностью и записывается как | А |. Пусть имеются два множества А и В. Рассмотрим все пары эле- элементов при условии, что первый элемент берется из множества^, а второй — из множества В. Полученное таким образом множест- множество называется прямым произведением АхВ множеств Аи В. На- Напомним некоторые операции над множествами, которыми время от времени будем пользоваться. АхВ= {(а,Ь)\ а еА, Ъ еВ} — прямое произведение множеств. A uJ? = {х | х еА v х еВ} — объединение множеств. А пВ = {х | х еА л х еВ} — пересечение множеств. А \В = {х | х еА л jc &B) — разность множеств. 0 — пустое множество. U— универсальное множество. A =U\ A = {х | х &А}— дополнение множества. 1.1. Правило суммы Пусть Аи В— конечные множества такие, что А с\В =0,\А\ = т и | В | = п. Тогда | A kjB \ = т + п.
1.3. Размещения с повторениями Интерпретация. Если элемент а еА можно выбрать т спосо- способами, а элемент Ъ еВ — п способами, то выбор элемента х еА иВ можно осуществить т + п способами. Пусть ХьХ2,...,Хк — попар- попарно непересекающиеся множества, Xt n Х} = 0, где / */ Тогда, оче- очевидно, выполняется равенство 1.2. Правило прямого произведения Пусть Аи В — конечные множества, | Л | = /и и \В\ = п, тогда \АхВ\ = тп. Интерпретация. Если элемент а еА можно выбрать т способа- способами и если после каждого такого выбора элемент Ь еВ можно вы- выбрать п способами, то выбор пары (a,b) e A х В в указанном поряд- порядке можно осуществить \А х В\ = т п способами. В этом случае гово- говорят, что выбор элементов множества А не зависит от способа вы- выбора элементов множества В. Пусть теперь Xl9X2,...,Xk — произвольные множества, \Xt | =/i,-, / =\,к. Тогда Задача. Найти число маршрутов из пункта М в пункт N через пункт К. Из Мв введут 5 дорог, из Къ N— 3 дороги. Решение. Введем два множества: S= {sb s2, sh sA, s5}— дороги из Mb К, T= {th t2, f3}— дороги из Kb N. Теперь дорогу из Мв ТУмож- но представить парой (st tj), где /= 1, 2, 3, 4, 5;j = 1, 2, 3. Значит, Sx Т — это множество всех дорог из М в N, количество которых равно \SxT\ =5-3 =15. 1.3. Размещения с повторениями Задача формулируется следующим образом. Имеются пред- предметы п различных видов аи а2,..., ап. Из них составляют всевоз- всевозможные расстановки длины к. Например, а2а{а3агаАа2а2а{ — рас- расстановка длины 8. Такие расстановки называются разхмещения- ми с повторениями из п по к (элементы одного вида могут повто- повторяться). Найдем общее число расстановок, среди которых две расстановки считаются различными, если они отличаются друг
10 Глава 1. Комбинаторные схемы от друга или видом входящих в них предметов, или порядком этих предметов. При составлении указанных расстановок длины к на каждое место можно поставить предмет любого вида. Рас- Рассмотрим множества ХЬХЪ...,Хк такие, что Х{ = Х2 = ... =Хк = {а{, аъ..., ап) . Тогда все размещения с повторениями составят мно- множество Хх хХ2 х...хXк. По правилу прямого произведения по- получаем, что общее число размещений с повторениями из п по к равно \Х{ хХ2х...хХк\=пк. Задача. Найти количество всех пятизначных чисел. Решение. Введем пять множеств: А2 = Аъ = А$ = А5 = {0, 1,..., 9}, А{ = {1, 2,..., 9}. Тогда все пятизначные числа составят прямое произведение указанных множеств А{ х А2 х Аг х А4 х А5. Соглас- Согласно правилу прямого произведения, количество элементов в мно- множестве Ах х А2 х Аъ х ЛЦ х А5 равно 9 10 10 10 10 =90000. 1.4. Размещения без повторений Имеются п различных предметов аь аъ..., ап. Сколько из них можно составить расстановок длины к? Две расстановки счита- считаются различными, если они отличаются видом входящих в них элементов или порядком их в расстановке. Такие расстановки называются размещениями без повторений, а их число обо- обозначают Д*. При составлении данных расстановок на первое место можно поставить любой из имеющихся п предметов. На второе место теперь можно поставить только любой из п — 1 оставшихся. И, наконец, на к-е место — любой из п - к + 1 оставшихся предметов. По правилу прямого произведения по- получаем, что общее число размещений без повторений из п по к равно Д* =п(п-\)...{п-к+\)=п\/(п-к)\. Напомним, что п\ = п(п-1)..Л и0! = 1. Задана. В хоккейном турнире участвуют 17 команд. Разыгры- Разыгрываются золотые, серебряные и бронзовые медали. Сколькими способами могут быть распределены медали? Решение. 17 команд претендуют на 3 места. Тогда тройку при- призеров можно выбрать способами АХ1 =171615 = 4080.
1.6. Сочетания 1.5. Перестановки При составлении размещений без повторений из я по Л мы по- получали расстановки, отличающиеся друг от друга либо составом, либо порядком элементов. Но если брать расстановки, которые включают все п элементов, то они могут отличаться друг от друга лишь порядком входящих в них элементов. Такие расстановки называются перестановками из п элементов, а их число обознача- обозначается Рп. Следовательно, число перестановок равно Рп =А% =п\. Перестановки я = (ях, я2,...,я„) элементов 1, 2,..., п записывают и в матричной форме я = '" п I, где верхняя строка — это по- \п{ п2 '" nnj рядковые номера 1, 2,..., п позиций элементов в перестановке; нижняя строка — тот же набор чисел 1,2,..., л, взятых в каком-ли- каком-либо порядке; я, — номер элемента нау-м месте перестановки. По- Порядок столбцов в перестановках, записанных в матричной форме, не является существенным, так как в этом случае номер позиции каждого элемента в перестановке указывается явно в верхней строке. Например, перестановка C,2,4,1) из четырех элементов может быть записана как(I 2 4 1 Г 14 3 1 2Г [2 3 1 д)*111' Задана о ладьях. Сколькими способами можно расположить на шахматной доске 8 ладей, чтобы они «не били» друг друга? Решение. Условие «не могли бить» означает, что на каждой го- горизонтали и вертикали может стоять лишь одна ладья. Ввиду это- этого, каждому расположению ладей на доске соответствует переста- перестановка я =( ¦¦" ). Верхняя строка перестановки — это но- мера горизонталей, нижняя — вертикалей, пересечение которых определяет положение ладей на доске. Следовательно, число рас- расстановок равно числу перестановок Р8 = 8! из 8 элементов. 1.6. Сочетания В тех случаях, когда нас не интересует порядок элементов в расстановке, а интересует лишь ее состав, то говорят о сочетани- сочетаниях. Сочетаниями из п различных элементов по к называют все возможные расстановки длины к, образованные из этих элемен- элементов и отличающиеся друг от друга составом, но не порядком эле-
12 Глава 1. Комбинаторные схемы ментов. Общее число сочетаний обозначают через С* или I ? 1 \KJ Определим это число. Составим все сочетания из п по к. Затем пе- переставим в каждом сочетании элементы всеми возможными спо- способами. Теперь мы получили расстановки, отличающиеся либо составом, либо порядком, т.е. это все размещения без повторений из п по к. Их число равно А%. Учитывая, что каждое сочетание дает к\ размещений, то по правилу произведения можно записать ()(к л к i i лк -г ^к С„хк\=А%. Тогда С* = n(n-l)...(n-k+l) k\ или n\ к\(п-к)\ и n-k 1 2 3 ... т 2 з ! - п Задана о прямоугольниках. Сколько различных прямоугольников можно вырезать из клеток доски, размер кото- которой т х л? Решение. Прямоугольник однознач- однозначно определяется положением его сто- сторон. Горизонтальные стороны могут за- занимать любое из т + 1 положения. Тогда число способов их выбо- выбора равно С^+1. Вертикальные стороны можно выбрать С^+1 спосо- способами. По правилу прямого произведения заключаем, что количество прямоугольников равно С^+1 -С^+1. 1.7. Сочетания с повторениями Имеются предметы п различных видов. Число элементов каж- каждого вида неограниченно. Сколько существует расстановок дли- длины к, если не принимать во внимание порядок элементов? Такие расстановки называют сочетаниями с повторениями, количество и обозначение которых следующее Спк =С^~1к_{ =С?+к_{. Выведем данную формулу. Пусть a, b,c,..., d— это исходные различные типы элементов, количество которых п. Рассмотрим произвольное сочетание с по- повторениями cbbcaccda...ddaccbbb из данных типов элементов. Так как порядок элементов в сочетаниях не учитывается, то расста- расстановку можно записать и так: аа...а | bb...b \ ее...с \ ... | dd...d, где элементы каждого из типов упорядочены и завершаются вертика-
1.7. Сочетания с повторениями 13 льной чертой, за исключением последней серии элементов. Дли- Длина такой расстановки с учетом вертикальных линий составляет к+ (п — 1) = п + к— 1, где к — количество элементов в расстанов- расстановке; п — 1 — число вертикальных линий. Очевидно, что любую та- такую расстановку можно задать выбором из п + к — 1 места п — 1 место для положений вертикальных линий. Это можно сделать Сп+к-\ способами. Промежуточные места между линиями запол- заполняются соответствующими типами элементов. Задана. Трое ребят собрали в саду 63 яблока. Сколькими спо- способами они могут их разделить между собой? Решение. Поставим в соответствие каждому делению яблок между ребятами сочетание с повторениями следующим спосо- способом. Типами элементов в нашем случае будут ребята. Таким обра- образом, имеем три типа элементов а, Ь,с(п = 3), из которых предстоит составить все различные расстановки длины к = 63. Наличие в расстановке какого-либо из элементов а, Ь, с отвечает принад- принадлежности данного яблока соответствующему мальчику. Порядок элементов в такой расстановке не играет роли. При делении яб- яблок между ребятами не важно, какое из них попадет тому или иному мальчику/Гогда число способов разделить яблоки между ребятами равно С363 =С33_1 = С3+6з-1 =Щ± =2080. Задана. Найти количество целочисленных решений системы х{ +х2 + ... + хп = к, к> 0, х,> 0, /= 1, 2,..., п\п>\. Решение. Рассмотрим следующую интерпретацию решения уравнения. Каждое значение xt= 1,+ 1;+ ... + 1; представим как сумму единиц, количество которых хг. Индекс у 1, отмечает ее принадлежность к разложению числа xt. Таким образом, мы вве- ввели п типов различных элементов {li9 12,..., 1Л}, значение каждого из них равно единице. Теперь любое решение исходного уравне- уравнения можно представить как сумму, составленную из к произволь- произвольных единиц множества {11? 12,..., 1Л}. Суммируя подобные едини- единицы 1, с одинаковыми индексами, можно составить соответствую- соответствующие слагаемые х, решения исходного уравнения. Данное соответ- соответствие является взаимно однозначным, откуда и следует, что число решений системы равно числу сочетаний с повторениями
114 Глава 1. Комбинаторные схемы 1.8. Перестановки с повторениями, мультимножества Задача формулируется следующим образом. Имеются предме- предметы к различных видов. Сколько существует перестановок из п{ элементов первого типа, п2 элементов второго типа и т. д., пк эле- элементов к-то типа? Рассмотрим, например, мультимножество М= {a, a, a, b, b, с, d, d, d, d}9 в котором содержатся 3 элемента а, 2 эле- элемента Ь, 1 элемент с и 4 элемента d. Мультимножество — это то же самое, что и множество, но в нем могут содержаться одинаковые элементы. Повторения элементов можно указать и другим спосо- способом: М ={3-я, 2 Ь, 1-е, 4-rf}. Таким образом, искомые перестановки с повторениями — это перестановки элементов мультимножест- мультимножества. Если бы мы рассматривали все элементы множества М как различные, обозначив их аь а2, а3, b{, Ь2, сь d{, d2, d$, dA, то полу- получили бы 10! перестановок, но после отбрасывания индексов мно- многие из них оказались бы одинаковыми. Фактически каждая пере- перестановка множества М встретилась бы ровно 3!-2!1!-4!раз, поско- поскольку в любой перестановке М индексы при буквах а можно рас- расставить 3! способами, при Ъ — 2! способами, при с — одним способом, а при d— соответственно 4! способами. Поэтому число перестановок множества Мравно ^ . В применении к обще- общему случаю те же рассуждения показывают, что число перестано- перестановок любого мультимножества (перестановки с повторениями) равно полиномиальному коэффициенту где п = пх + п2 + ... + пк — общее число элементов. Перестановки с повторениями имеют тесную связь с сочета- сочетаниями. Определим количество этих перестановок следующим об- образом. Из всех п мест перестановки п{ место занимают элементы первого типа. Выбор мест для них можно сделать С^1 способами. Из оставшихся п - п{ мест элементы второго типа занимают п2 места, которые можно выбрать Спп1п способами. Те же рассужде- рассуждения показывают, что элементы к-то типа можно расположить в перестановке С"к_п _п _п способами. Согласно правилу прямо-
1.9. Упорядоченные разбиения множества 15 го произведения, число перестановок с повторениями равно Задана. Сколько существует различных перестановок из букв слова «Уссури»? * Решение. РBу,1и,1р,2с) = 2! ^ ^ =180. 1.9. Упорядоченные разбиения множества Подсчитаем число разбиений конечного множества S, где | S \ = п, на к различных подмножеств S = S{ u S2 и ... и Sh попарно не пере- к секающихся, \%\ = пь /= 1, 2,..., к и ?л, =п . Последовательность различных S{, S2,..., Sk рассматривается как упорядоченная последо- последовательность подмножеств. При формировании упорядоченной Sh S2,...,Sk последовательности на первое место подмножество Sx мож- можно выбрать С способами, на второе место подмножество S2 можно выбрать из оставшихся п - п{ элементов Спп\ способами и т. д., на последнее место множество Sk можно выбрать из оставшихся п-п{-п2-..- пк_{ элементов Сппк_п _п _ _п способами. По правилу прямого произведения получаем, что общее число упорядоченных разбиений множества S на к подмножеств равно и? yyflI •I/It у?ЛL- '*'* что совпадает с числом Р(пь пъ...,пк) перестановок с повторениями. Замечание 1. Установим взаимно однозначное соответствие между упорядоченными разбиениями множества и перестанов- перестановками с повторениями. Каждой перестановке с повторениями можно поставить в соответствие упорядоченное разбиение мно- множества номеров элементов S= {1, 2,..., п) в перестановке на под- подмножества |У1э 52,..., Sk, где St — множество номеров элементов 1-го типа в перестановке. Очевидно, что данное соответствие между перестановками с повторениями и разбиениями является взаимно однозначным.
16 Глава 1. Комбинаторные схемы Замечание 2. Упорядоченные разбиения множества S на по- попарно непересекающиеся подмножества S{ и S2 u ... и Sk = Sдо- Sдопускают интерпретацию в терминах «корзин» и «шаров». Обозна- Обозначим элементы исходного множества | S \ = п «шарами». Под разби- разбиением исходного множества, теперь множества шаров, на различ- различные Sj упорядоченные подмножества будем понимать разложение шаров по к различным корзинам (упорядоченные 5\, S2,..., Sk подмножества): п{ шаров положить в корзину Su п2 шаров положить в корзину S2 и т. д., пк шаров положить в корзину Sh где п{ + п2 + ... + пк = п. Как установлено, число таких разложений равно Спп>С"\ ...С\ „ = , "; ,. Задана. В студенческой группе, состоящей из 25 человек, при выборе старосты за выдвинутую кандидатуру проголосовали 19 человек, против — 3, воздержались — 3. Сколькими способами может быть проведено такое голосование? Решение. Имеем три различные корзины: «за», «против», «воз- «воздержались», в которые необходимо разложить 25 шаров, соответ- соответственно 19 — в первую, 3 — во вторую, 3 — в третью. Количество таких разложений определяется выражением С125 -С^-С] = i9^lxV - 1.10. Неупорядоченные разбиения множества Подсчитаем, сколькими способами можно разбить множество S, где | S | = п, на подмножества, среди которых для каждого / = 1, 2,..., п имеется т1 > 0 подмножеств с / элементами. Тогда верно, п что ^i-ntj =n. Данное разбиение позволяет представить исход- /=1 ное множество следующим образом: п щ ии 7=1 7=1 7=1 /=17=1 где Sy попарно не пересекаются и 15^1 = \Sa\ =... = | Sim. \ = /для каж- каждого /=1,2,...,л. Порядок подмножеств в разбиении не является существенным. Так, например, разбиения множества S= {1, 2, 3, 4, 5} вида
1.10. Неупорядоченные разбиения множества {1, 3}, {4}, {25}; {1, 3}, {25}, {4}; {25}, {1, 3}, {4}; {4}, {1, 3}, {25}; считаются одинаковыми. Обозначим число неупорядоченных разбиений множества S через N{mb т2,..., тп). Рассмотрим схему формирования упорядо- упорядоченных разбиений для представления п =1т1 +2т2 +...+п-тп: С п-\т С?" С^ С^ Сп л-1/Wj-I * * /i—l/7i1—2m2 л—l/Wj—2m2—1" /1-1/и1-2 т2 Воспользуемся интерпретацией формирования упорядочен- упорядоченных разбиений как разложения п различных шаров по различным тх + т2 +... +тп корзинам так, что в каждую из т,корзину кладут / шаров. Теперь откажемся от упорядоченности подмножеств в разбиении. Пусть все корзины имеют различное число шаров, та- такие корзины можно рассматривать как различные (они отлича- отличаются числом шаров). В этом случае упорядоченные и неупорядо- неупорядоченные разложения шаров совпадают. Пусть теперь в разложении существуют /и, корзин с одинаковым количеством шаров. При упорядоченном разложении такие корзины рассматриваются как различные. Однако при неупорядоченном разложении обмен ша- шарами таких корзин можно рассматривать как соответствующую перестановку указанных корзин, что не приводит к новым разло- разложениям. Если количество корзин с одинаковым числом шаров равно mh то неупорядоченных разложений будет в т}. меньше, чем упорядоченных. Тогда общее число неупорядоченных разби- разбиений будет в mi\m2l...mn\ раз меньше, чем упорядоченных. Следо- Следовательно, '¦ . .(А1!Г" ml\m2l..mn\ Заметим еще раз, что если выполнено упорядоченное разбиение числа п на подмножества различной длины (мощности), то они сов- совпадают с неупорядоченными разбиениями. В этом случае все /и(е{ОД}.
18 Глава 1. Комбинаторные схемы Задана. Сколькими способами из группы в 17 человек можно сформировать 6 коалиций по 2 человека и 1 коалицию из 5 чело- человек? Решение. Требуется разбить множество из 17 человек на непере- непересекающиеся и неупорядоченные группы людей. Откуда искомое число равно ^@р62,03,04 Д5,06,07,...,017) = ^ Задана. Сколькими способами можно разделить колоду из 36 карт пополам так, чтобы в каждой пачке было по два туза? Решение. 4 туза можно разбить на 41 = 3 различные коалиции B!J2! по две карты в каждой (неупорядоченные разбиения), т.е. только 3 способами можно разделить тузы пополам. Далее, каждая полови- половина любого из этих трех разбиений тузов выполняет роль различных двух «корзин», куда необходимо разложить пополам оставшиеся 32 карты. Разложение 32 оставшихся карт уже будет упорядоченным, так как «корзины» различные, число разложений равно ttSU. Со- Согласно правилу прямого произведения, общее число вариантов разделить колоду пополам равно ^ ^ =1|3|. 1.11. Полиномиальная формула Формула (х1+Х2+...+Хк)"= ? П; tfX>...Xnk' A.11.1) nl+n2+.:+nk=nnl •---nk • называется полиномиальной, где суммирование выполняется по всем решениям уравнения пх + п2 + ... + пк = п в целых неотрицате- неотрицательных числах, щ > 0, / = 1, 2,..., к. Для доказательства выполним умножение Чтобы привести подобные в полученном выражении, необхо- необходимо подсчитать количество одночленов видах хп22 ...хпкк каждо- каждого разбиения пх + п2 + ... +пк = п. Для получения же одночлена х^х^1 ...х"кк необходимо выбрать х{ в качестве множителя в п{
1.12. Бином Ньютона 19 скобках при раскрытии выражения (х{ + х2 + ... + хк)п. Это можно сделать С способами. Из оставшихся п - пх не раскрытых ско- скобок необходимо выбрать х2 в качестве множителя в п2 скобках. Это можно сделать С2 способами и т. д. Тогда количество од- ночленов Xj'Xj2 ...x"kk при раскрытии выражения (Xj +x2+...+xA)(x, +jc2+•••+•** )•••(*! +х2+...+хк) * я! будет равно числу О CV''С,-...-„,_, % ы / „ г У^Р^0" ченных разбиений. 1.12. Бином Ньютона Частный вид полиномиальной формулы A.11.1): {а+Ь)п =YjCknakbn~k A.12.1) называется биномом Ньютона. Рассмотрим несколько задач, в основе решения которых ле- лежит бином Ньютона. п Задана 1. Доказать тождество ^С* =2*. Решение. Воспользуемся формулой A.12.1) бинома Ньютона, в которой положим а = 1 и Ъ = 1, тогда A+1)" = ]^С* Лк Лп~к. Задана 2. Доказать тождество ^Ск(т -\)п~к =тп. Решение. Воспользуемся формулой A.12.1), где положим а = 1 и Ь = т — 1. ш 1к щ 2,, . Задача J. Доказать тождество ХС/Г = Z с« =2 • Решение. Воспользуемся формулой A.12.1), в которой положим я=1и? = -1, тогда A-1)л = ^(-1)к Ск =0. Группируя положите- к=0 льные и отрицательные члены равенства, установим
20 Глава 1. Комбинаторные схемы ? J?c?~l. Так как ^С» Jj}c?~l = ?с* =2", то каж- к=0 к=1 к=0 к=1 к=0 дая из сумм составляет половину числа 2п. ^ Задана 4. Доказать тождество^]/: С^ =п2п~1. к=0 Решение. Воспользуемся формулой A.12.1), из которой, пола- — гая а = 1 и Ъ = х, получим A + х)п =2^С„х. Дифференцирование последнего равенства дает пA+х)п~1 = ^к-Скхк~1. Пусть х= 1 , тогда n(l+l)n~l = ]Г?-С* I*, что доказывает искомое тождество. 1.13. Инверсии Перестановки особенно важны при изучении алгоритмов сор- сортировки, так как они служат для представления неупорядоченных исходных данных. Чтобы исследовать эффективность различных методов сортировки, нужно уметь подсчитывать число переста- перестановок, которые вынуждают повторять некоторый шаг алгоритма определенное число раз. Пусть (а{,а2,...,ап) — перестановка элементов множества {1, 2,..., л}. Если / </ а я, > ар то пара (ah aj) называется инверсией перестановки. Например, перестановка 3142 имеет три инверсии C, 1), C, 2), D, 2). Каждая инверсия — это пара элементов, «нару- «нарушающих порядок»; следовательно, единственная перестановка, не содержащая инверсий, — это отсортированная перестановка A, 2,..., п). Таблицей инверсии перестановки (al,a2,...,an) называется по- последовательность d{d2...dn9 где dj — число элементов, больших у и расположенных левее/ Другими словами, dj — число инверсий, у которых второй элемент равен/ Например, таблица инверсий пе- перестановки 591826473 будет 2 3 6 4 0 2 2 10, поскольку 5 и 9 расположены левее 1; 5, 9, 8 — левее 2 и т. д. Всего 20 инверсий. По определению 0<d{<n- I, 0<d2<n- 2, ..., 0 <dn_{ < 1, dn = 0.
1.14. Обратные перестановки 21 М. Холл установил, что таблица инверсий единственным обра- образом определяет соответствующую перестановку. Из любой табли- таблицы инверсий d{d2...dn можно однозначно восстановить переста- перестановку, которая порождает данную таблицу, путем последователь- последовательного определения относительного расположения элементов п, п— 1,...,1 (в этом порядке). Например, перестановку, соответст- соответствующую таблице инверсий B,3,6,4,0,2,2,1,0) = d{d2d3d4d5ded7d^d9, можно построить следующим образом: выпишем число 9; так как */8 = 1, то 8 стоит правее 9. Поскольку af7 = 2, то 7 стоит правее 8 и 9. Так как d6 = 2, то 6 стоит правее двух уже выписанных чисел; та- таким образом, получили расположение 9,8,6,7. Припишем теперь 5 слева, потому что d5 = 0; помещаем 4 вслед за четырьмя из уже записанных чисел, 3 — после шести выписанных чисел (т. е. в правый конец) и получаем 5,9,8,6,4,7,3. Вставив аналогичным образом 2 и 1, придем к перестановке E,9,1,8,2,6,4,7,3). Такое соответствие между перестановками и таблицами ин- инверсий важно, потому что часто можно заменить задачу, сформу- сформулированную в терминах перестановок, эквивалентной ей задачей, сформулированной в терминах таблиц инверсий. Рассмотрим, например, еще раз вопрос: сколько существует перестановок множества {1,2,...,л}? Ответ должен быть равен числу всевозмож- всевозможных таблиц инверсий, а их легко пересчитать, так как dx можно выбрать п различными способами, d2 можно независимо от d{ вы- выбрать п - 1 способами и т.д., dn — одним способом. Тогда различ- различных таблиц инверсий п(п — 1)...1 = п\. Таблицы инверсий пере- пересчитать легко, потому что все dj независимые, в то время как эле- элементы Qj перестановки должны все быть различными. 1.14. Обратные перестановки Не следует путать «инверсии» перестановок с обратными пе- перестановками. Пусть аь а2,..., ап — различные шары, индексы которых свяжем с номерами шаров. Тогда исходное расположе- расположение шаров однозначно определяется тождественной переста- перестановкой е = A, 2,..., п). Пусть я = (я ьп2,...,пп)~ произвольная пе- перестановка номеров 1, 2,..., п, где nk — номер шара на к-м месте. Такая перестановка отвечает расположению шаров а ,ап ,...,ап . Вспомним (см. п.1.5), что перестановка 1 / -а 2 п ч я = п \ может быть записана в матричном виде. Данная
22 Глава 1. Комбинаторные схемы форма записи позволяет рассматривать перестановку в качест- качестве оператора, который заменяет старые номера шаров — верх- верхняя строка матрицы — на новые номера — нижняя строка мат- матрицы. Тогда результат двух последовательных изменений я = (яь 7i2,..., пп)и а = (аь а2>•••> °л) исходной последовательно - сти 1, 2,..., п номеров шаров можно рассматривать как операцию = яа = п \\ "' п ]. умножения перестановок р = яа Упорядочим столбцы перестановки от в соответствии с переста- перестановкой я = (Я1.Я1....ДЯ),Г -г ( 1 2 ••• П Л ( п\ п2 ••• пп 1 Тогда можно записать, что р=яа= Г i . Этой перестановке отвечает P2 расположение шаров ар , аР2,...,аРпгде значение р^ =ап — это номер шара на к-м месте. Обратной к перестановке я=( п } называется пере- становкая =\п} п* '" п" = _i _i _i L которая получает- U 2 ... п ) (я/ я/ ... я// ся, если в исходной перестановке поменять местами строки, а за- затем упорядочить столбцы в возрастающем порядке по верхним элементам, т.е. я =(я|, я2*,..., я). Ясно, что последовательное изменение порядка шаров согласно перестановкам я = (пь я2,..., ял) и обратной я = (яj, я21,..., я) приводит к исходному их рас- положению, т.е. к тождественной перестановке Ч)( 2::: )й перестановке E,9,1,8,2,6,4,7,3) будет перестановка C,5,9,7, 16842} таккакГ59 1 8 2 6 4 7 3Wl 2 3 4 5 6 7 8 9\ i,o,5,^,z;, таккак^ 2 3 4 5 6 7 8 9J""I,3 5 9 7 16 8 4 2/ Сортированную последовательность элементов перестановки я = (щ, я2,..., пп) можно получить, заполнив в цикле вектор еь еъ..., for k=l to n do en =пк или е[пк] = пк.
1.14. Обратные перестановки 23 Ясно, что результирующие значения еь е2,..., еп будут соответ- соответственно 1,2,...,л. В цикле каждый элемент пк встает на свое упоря- упорядоченное место еп (см. п.5.7). Подобным образом выполним за- заполнение элементов перестановки я = (яj, я2*,..., я'1), однако в упорядоченное место я элемента пк будем размещать его номер в исходной перестановке я = (я1? я2,..., ял): for k=\to n do я = к или п~1[пк]=к. Результирующий вектор я =(я],я21,...,ял1) будет обратной перестановкой к я = (я1? я2,..., я„). X. А. Роте впервые установил связь между обратными переста- перестановками и инверсиями: обратная перестановка содержит ровно столько же инверсий, сколько исходная.
— Глава 2 ==^^ Представление абстрактных объектов ¦ ассматривая решение задачи с абстрактной точки зрения, как правило, избегают каких бы то ни было предположений отно- относительно того, как мы намерены автоматизировать ее решение. В идеале структура вычислительной машины должна соответ- соответствовать естественной структуре задачи, однако это требование часто не выполняется, хотя приспособляемость современной вы- вычислительной техники такова, что она позволяет обойти эти огра- ограничения без труда. Языки высокого уровня при условии, что они должным образом сконструированы, предоставляют в распоря- распоряжение программиста, реализующего алгоритм, более удобную «машину», смягчая несоответствие основной машины требова- требованиям алгоритма. Будем считать, что читатель знаком с элементар- элементарными понятиями математики и основными типами данных: це- целыми и вещественными числами, массивами, строками и т. д. 2.1. Представление последовательностей Любой заданный класс абстрактных объектов может иметь не- несколько возможных представлений, и выбор наилучшего из них решающим образом зависит от того, каким образом объект будет использован, а также от типа производимых над ним операций. 2.1.1. Смежное представление В алгоритмах на дискретных структурах часто приходится встре- встречаться с представлением конечных последовательностей и операци- операциями с ними. С вычислительной точки зрения простейшим пред- представлением конечной последовательности s{, s2,..., sn является точ- точный список ее членов, расположенных по порядку в смежных ячей- ячейках памяти. В языках высокого уровня — это одномерные, двухмерные и т. д. массивы данных. Наряду с очевидными преиму- преимуществами последовательное представление имеет и некоторые зна- значительные недостатки. Смежное представление становится неудоб-
2.1. Представление последовательностей 25 ным, если требуется изменить последовательность путем включе- включения новых и исключения имеющихся там элементов. Включение между Sj и si+1 нового элемента требует сдвига si+ {, s&2>•• •,snвправо на одну позицию; аналогично исключение ^требует сдвига тех же эле- элементов на одну позицию влево, как показано в алгоритме 2.1. Алгоритм 2.1. Включение и исключение элементов при последовательном размещении {Включить элемент z на i-e место } п = л + 1; forj = п — 1 to i by -1 do sJ+l = sj, Si = Z. {Исключить элемент с i-го места } forj = ito n — 1 do Sj = sJ+l; n = n — 1. В обоих случаях включение или удаление элементов при смеж- смежном представлении требует перемещения многих элементов. С точки зрения времени обработки такое перемещение элементов может оказаться дорогостоящим из-за сложности операций включения и удаления О(п). 2.1.2. Характеристические векторы Важной разновидностью смежного размещения является слу- случай, когда такому представлению подвергается подпоследовате- подпоследовательность sk ,sk ,...,sk некоторой основной последовательности sb 52,..., sn- Ь этом случае подпоследовательность можно предста- представить более удобно, используя характеристический вектор — по- последовательность из нулей и единиц, где /-й разряд равен едини- единице, если Sj принадлежит рассматриваемой подпоследовательно- подпоследовательности. Например, для последовательности A,2,3,4,5,6,7,8,9) характе- характеристический вектор подпоследовательности чисел, кратных 3, имеет вид @,0,1,0,0,1,0,0,1). Характеристические векторы полезны в том случае, когда формирование нужной подпоследовательности выполняется пу- путем последовательного удаления из основной последовательно- последовательности элементов, которые не входят в подпоследовательность. Глав- Главное неудобство характеристических векторов состоит в том, что они не экономичны.
26 Глава 2. Представление абстрактных объектов 2.1.3. Связанное размещение Неудобство включения и исключения элементов при смежном представлении происходит из—за того, что порядок следования элементов задается неявно требованием, чтобы смежные элемен- элементы последовательности находились в смежных ячейках памяти. В результате многие элементы последовательности во время вклю- включения или исключения должны передвигаться. Если требование последовательного размещения элементов опущено, то операции включения и исключения можно выпол- выполнить без того, чтобы передвигать элементы. При любом размеще- размещении элементов необходимо сохранять информацию о способе их упо- упорядочения. При связанном размещении последовательности sb s2,..., sn каждому Sg ставится в соответствие указатель /,, который указывает на следующую подобную пару элементов si+l, li+l no списку. Вводится начальный указатель /0, который указывает на первый элемент s{ последовательности. Последний указатель 1п в списке является пустым или нулевым, это признак конца списка. Графическое представление связанного списка можно изобра- изобразить следующим образом: Здесь каждый элемент связанного списка состоит из двух по- полей. В поле DATA размещен сам элемент последовательности, а в поле NEXT — указатель на следующий за ним элемент. Связан- Связанное представление последовательностей облегчает операции включения и удаления элементов из списка. Например, для иск- исключения второго элемента достаточно переустановить указатели NEXT(/2) = NEXT(/2). Графически это изображается следующим образом: до исключения — после исключения — Чтобы в последовательность включить новый элемент sr после su необходимо установить указатели: NEXT(/r) = NEXT(/j) и NEXT(/j) = ln начальное значение указателя установлено на но- новый включаемый элемент. Графически включение нового эле- элемента изображается так: |/2" /3- /з-
2.1. Представление последовательностей 27 до включения — /0— после включения — —> Sr\Ir «1/,, * f~ —> н f.1'3" С помощью связанных распределений мы добились большей гибкости, но потеряли возможность работать с элементами по- последовательности как с массивами, когда по номеру i можно не- непосредственно обратиться к элементу Sj. В связанном размеще- размещении такой возможности не существует, и доступ к элементам по- последовательности не является прямым и эффективным. Напри- Например, при поиске среднего элемента последовательности, даже при известной ее длине, требуется просмотреть по связанному списку половину последовательности. В алгоритмах 2.2 и 2.3 при- приводятся программы, реализованные на языках Pascal и С, связан- связанного формирования списка элементов последовательности. В программы включены операции работы со списком: печать эле- элементов списка, включение новых элементов в список и удаление элементов из списка. Существуют различные модификации представления после- последовательностей в виде связанных списков. Следующие два при- примера позволят, при желании, читателю самостоятельно продол- продолжить получение и других модификаций связанных распределе- распределений, отличных от приводимых ниже. Циклическая форма представления позволяет эффективно возвращаться с последнего элемента списка к первому. Рис. 2.1. Циклический список Еше большая гибкость достигается, если использовать дважды связанный список, когда каждый элемент последовательности вместо одного имеет два связанных с ним указателя. В таком спи- списке для любого элемента имеется мгновенный прямой доступ к предыдущему и последующему элементам. Следует помнить, что
28 Глава 2. Представление абстрактных объектов выбор того или иного представления последовательности в зна- значительной степени зависит от типа операций, выполняемых с элементами последовательности. Рис. 2.2 Дважды , 0kl СПИСОК связанный /л ^|лн 1641 — i^_ii \sJ 0 Алгоритм 2.2. Программа на PascaVe включения и исключения элементов из списка Program Number_List; {Связанный список данных} uses CRT; type NodePointer=ANode; Node= RECORD {Элемент связанного списка} s :Integer; {Элемент последовательности} next :NodePointer; {Указатель на следующий элемент} END; const first :NodePointer=NIL; {Указатель начала списка} {Генерация нового элемента списка} function InitNode: NodePointer; var newNode :NodePointer; begin New(newNode); {Выделить память новому элементу} newNode A.s:=Random(9 9)+1; {Значение нового элемента} newNodeA.next:=NIL; InitNode:=newNode; end; {Включить новый элемент в начало списка} procedure IncludeNode( newNode: NodePointer ); begin newNodeA.next:=first; first:=newNode; end; {Удалить из списка k-й элемент}
2.1. Представление последовательностей 29 procedure DeleteNode( к: Integer ); var previos,current :NodePointer; i :Integer; begin i:=0; current:=first; while currentoNIL do begin if i=k then begin { к-й элемент найден} if first=current then first:=currentA.next else previosA.next:=currentA.next; {Удаление из списка} dispose(current) ; break; end; previos:=current; current:=currentA.next; end; end; procedure PrintNodeList; {Печать элементов списка} var p :NodePointer; begin WriteLn; p:=first; while ponil do begin Write(pA.s:3,' y); p:=pA.next end; end; Var {Main} i,m,n :Integer; begin {Main} ClrScr; Randomize; n:=17; {Список из п элементов} for i:=l to n do IncludeNode(InitNode); PrintNodeList; WriteLn; m:=17; {Удалить из списка ш-й элемент} DeleteNode(m); PrintNodeList; ReadKey; end. {Main}
30 Глава 2. Представление абстрактных объекте Алгоритм 2.3. Программа на Си включения и исключения элементов из списка #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef struct tagNode{ //Элемент связанного списка int s; //Элемент последовательности tagNode *next; //Указатель на следующий //элемент }Node; typedef Node *NodePointer; Node *first=NULL; //Указатель начала списка NodePointer InitNode( void ){//Генерация нового //элемента списка NodePointer newNode; newNode=new Node; //Выделение памяти //новому элементу newNode->s=random(99)+ 1; //Значение нового //элемента списка newNode->next=NULL; return newNode; } //Включить новый элемент в начало списка void IncludeNode( NodePointer newNode ){ newNode->next=first; first=newNode; } void DeleteNode( int k ){ //Удалить из списка //k-й элемент NodePointer previos,current; int i; i=0; current=first; while( current!=NULL ){ if( i==k ){ //k-й элемент найден if( first==current ) first=current->next; else previos->next=current->next; //Удалить //из списка delete current; break;
2.2. Представление деревьев 31 previos=current; current=current->next; void PrintNodeList( void ){ //Печать элементов // списка NodePointer p; p=first; while( p!=NULL ){ printf("%3d ",p->s); p=p->next; void main( void ){ int i,m,n; clrscr(); randomize (); n=17; //Список из п элементов for( i=0; i<n; i++ ) IncludeNode( InitNode() ) PrintNodeList(); printf ("W); m=17; //Удалить iti-й элемент DeleteNode(m) ; PrintNodeList (); getch(); Связанное представление предпочтительнее лишь в том слу- случае, если в значительной степени используются операции вклю- включения и исключения элементов. 2.2. Представление деревьев Конечное корневое дерево ^формально определяется как непу- непустое конечное множество упорядоченных узлов, таких, что суще- существует один выделенный узел, называемый корнем дерева, а оставшиеся узлы разбиты на т > О поддеревьев 7\, Г2,..., Тт. Корневое дерево на рис. 2.3 содержит 9 узлов, помеченных буквами от а до г. Узлы с метками e,f, с, g, h, r являются листьями, остальные узлы — внутренние. Узел с меткой а — корень. Поня- Понятие дерева используется в различных аспектах. Деревья — наибо- наиболее важные нелинейные объекты, используемые для представле- представления данных в алгоритмах на дискретных структурах.
32 Глава 2. Представление абстрактных объектов Рис. 2.3. Корневое дерево с тремя поддеревьями Важной разновидность корневых деревьев являются бинарные деревья. Бинарное дерево Глибо пустое, либо состоит из выделен- выделенного узла, называемого корнем, и двух бинарных поддеревьев: ле- левого Т{ и правого Т2. Лесом называют упорядоченное множество деревьев. Тогда де- дерево можно определить как непустое множество узлов, такое, что существует один выделенный узел, называемый корнем дерева, а оставшиеся узлы образуют лес с поддеревьями корня. 2.2.1. Представление деревьев на связанной памяти Почти все машинные представления деревьев основаны на связанных распределениях. Каждый узел состоит из поля данных и некоторых полей для указателей. В следующем примере пред- представления дерева каждый узел имеет по три поля указателей. first /\ g X X x\\h X X X I I Г I I X X X Рис. 2.4. Регулярная связанная структура представления дерева Произвольное дерево с переменным числом поддеревьев все- всегда можно представить с помощью односторонних списков с ис- использованием двухкомпонентных звеньев, в которых в первом поле находится либо указатель, либо данные, а во втором — все- всегда указатель.
2.2. Представление деревьев 33 ъ first ^——' е -л. / X .—-— .— —» \ X \ f \с\х X > d —*» h X -> г -> X Рис. 2.5. Универсальная связанная структура представления дерева Применение указателей и связанных списков придает памяти гибкость, необходимую для представления различных структур. Но при этом легко и перестараться; поэтому следует избегать слишком большого количества указателей; сложность програм- программной поддержки таких структур возрастает «экспоненциально», теряется четкость основной структуры, которую пытаются пред- представить в памяти (последний пример представления дерева это наглядно подтверждает). 2.2.2. Представление деревьев на смежной памяти Представление деревьев на смежной памяти (одномерный массив) предполагает неявное присутствие ребер, переход по ко- которым выполняется посредством арифметических операций над индексами элементов массива — смежной памяти. Формирова- Формирование таких деревьев с помощью адресной арифметики можно осу- осуществлять двумя способами. Идея первого способа применима при любом постоянном количестве ребер, выходящих из вершин (регулярное дерево). Рассмотрим данный способ формирования на примере двоичного (бинарного) дерева. Пусть имеется одномерный массив смежных элементов аь аъ...,ап. Неявная структура двоичного дерева определяется как на рис. 2.6. По дереву на рис. 2.6 легко перемещаться в обоих направлениях. Переход вниз на один уровень из вершины а[к] можно выполнить, удвоив индекс к (индекс левого поддерева) или удвоив и прибавив 1 (индекс правого поддерева). Переход вверх на один уровень из вер- вершины а[т] можно выполнить, разделив m пополам и отбросив дробную часть. Рассмотренная структура применима к любому де- дереву с постоянным количеством ребер, выходящих из вершин. 2—2697
34 Глава 2. Представление абстрактных объектов а[2к] а[2к+1] а[гп] . . . а[п] Рис. 2.6. Двоичное дерево на смежной памяти с последовательной нумерацией вершин Другой способ, основанный на индексной арифметике, при- применим только для двоичных деревьев. Пусть для представления де- дерева используется одномерный массив аь ai+b..., ay Корнем дере- дерева полагают элемент ат, где индекс элемента корня рассчитыва- рассчитывается по формуле т = |_(/ +у)/2_], т.е. середина массива. Левое под- поддерево располагается в массиве ah a/+1,..., ат_ь а правое поддерево — в массиве ат+{, ат+2,..., д7. Корни поддеревьев рас- рассчитываются подобным же образом, как и корень основного де- дерева. Второй способ формирования двоичных деревьев на смеж- смежной памяти имеет довольно ограниченное применение. Основ- Основное его использование — поиск данных в сортированных масси- массивах, таблицах и т.д. В качестве примера использования представления регулярных деревьев на смежной памяти рассмотрим решение следующей за- задачи. Задана. Написать программу поиска всех замкнутых маршрутов длины п<15 по ребрам треугольника abc. Длину ребра принять рав- равной 1. Начальная и конечная точка искомых маршрутов — вершина а. Длина маршрута п задается в текстовом файле исходных данных. Результаты расчетов всех маршрутов сохранить в выходном тек- текстовом файле. Каждый маршрут представить как последователь- последовательную комбинацию меток а,Ь,с посещаемых вершин треугольника при движении по нему. Каждый маршрут должен включать п+\ метку, где первой и последней меткой должна быть вершина а. Пример файла исходных данных: 4
2.2. Представление деревьев 35 Выходной файл для данного примера: abcba 1 ababa 2 acaba 3 abaca 4 acaca 5 acbca 6 В алгоритме 2.4 представлена программа расчета всех искомых маршрутов длины п. Алгоритм делится на две части. В первой час- части (процедура CreateTreeAbc) выполняется формирование двоич- двоичного регулярного дерева на смежной памяти рис. 2.7. Алгоритм 2.4. Программа на Pascal'е поиска замкнутых маршрутов по треугольнику Program Tree_Abc; {Движение по треугольнику Abe} uses CRT,DOS; const n_max=$fcOO; {Максимальная память для дерева} type Vector=array[1..n_max] of Char; var f :Text; {Текстовый файл} z :Vector; {Двоичное дерево движения по треугольнику} Procedure CreateTreeAbc( n:Integer ); {Формирование дерева} var k, level,111,1111,1112 :LongInt; begin z[l]:='af; {Вершина а} level:=1; {Номер уровня} ml:=l; {Индекс первой вешины уровня} ш2:=1; {Индекс последней вешины уровня} while level<=n do begin for k:=ml to m2 do begin {Заполнить следующий уровень дерева} m:=2*k; case z[k] of 'a': begin z[m]:='bf; z[m+l]:='c'; end; 'b': begin z[m]:='c'; z [m+1]:='a'; end; rc': begin z[m]:='a'; z[m+l]:='b'; end; end; end; level:=level+l;
36 Глава 2. Представление абстрактных объектов ml:=2*ml; m2:=2*m2+l; end; end; Procedure RouteTreeAbc( n:Integer ); {Формирование маршрутов} var ifk,ml,m2,r :LongInt; begin r:=0; {Количество маршрутов} k:=l; for i:=l to n do k:=2*k; ml:=k;{Индекс первой вершины на последнем уровне} m2:=2*k-l; {Индекс последней вершины на последнем уровне} for i:=ml to m2 do begin{Проход от листьев к вершинам дерева} k:=i; if z[k]='a' then begin r:=r+l; WriteLn(f); repeat Write(f,z[k]); k:=k div 2; until k=0; Write (f,' \r); end; end; end; Var {Main} n :Integer; {Длина маршрута} begin {Main} Assign(f,'treeabc.in' ); Reset(f); {Файл открыт для чтения} Read(f,n); {Ввод данных} Close(f); Assign(f,'treeabc.out'); Rewrite(f); {Файл открыт для записи} CreateTreeAbc(n); {Формировать дерево Abe сверху вниз} RouteTreeAbc(n); {Формировать маршруты от листьев к вершине} Close(f); end. {Main}
2.3. Представление множеств 37 При проходе вниз вершины дерева заполняются метками а, Ь, с, соответствующими вершинам треугольника при перемещении по нему. Два ребра, выходящих из каждой вершины, показывают возможные варианты выбора дальнейшего маршрута продвиже- продвижения по треугольнику. В каждом случае из вершин а, Ь, с можно попасть в любые две другие вершины. Индексы меток дерева про- прохода на рис. 2.7 показывают соответствующее их место в массиве данных (смежной памяти). Ь[16] с[17] с{18] а[19] с[20] а[21] а[22] b[23] c[24] a[25] a[26] b[27] a[28] b[29] b|30] с[31] Рис. 2.7. Двоичное дерево маршрутов по треугольнику на смежной памяти Во второй части алгоритма выполняется формирование иско- искомых маршрутов (процедура RouteTreeAbc), основой для построе- построения которых служит дерево прохода на рис. 2.7. Для формирова- формирования всех маршрутов теперь достаточно подняться по нему от ли- листьев с метками а вершины треугольника к корню, запоминая пройденные метки. Ясно, что число маршрутов будет равно числу вершин на последнем уровне (количество листьев) с меткой а. 2.3. Представление множеств Существуют два основных подхода к представлению множеств в памяти. 1. При первом подходе хранят описание каждого элемента, действительно присутствующего в множестве, как это дела- делается, когда выписываются все элементы множества и заклю- заключаются в фигурные скобки. 2. При втором подходе изначально определяются все потенци- потенциально возможные элементы множества, а затем для любого подмножества этого универсального множества для каждо- каждого возможного члена указывается, принадлежит ли он на са- самом деле данному подмножеству или нет.
38 Глава 2. Представление абстрактных объектов При первом подходе представления множеств используют как смежное, так и связанное размещение его элементов в памяти (рис. 2.8). Данные методы размещения подробно рассмотрены в п. 2.1 представления последовательностей. Рис. 2.8. Смежное и связанное представление множества в памяти Как и для последовательностей, наилучший метод представления множеств существенно зависит от операций, которые мы собира- собираемся выполнять над ними. Типичные операции над множествами: выяснить, имеется ли конкретный элемент в данном множестве; добавить в множество новые элементы; удалить элементы из мно- множества; выполнить обычные теоретико-множественные операции, такие как объединение или пересечение двух множеств. Как прави- правило, для представления множеств применяют связанную память. При втором методе множество представляется в виде вектора на смежной памяти. Пусть U — универсальное множество (т. е. все рассматриваемые множества являются его подмножествами), состоящее из п элементов. Любое подмножество S с U представ- представляется в виде характеристического вектора из п элементов. Эле- Элемент / в этом векторе равен 1 тогда и только тогда, когда /-й эле- элемент множества U принадлежит S, в противном случае он уста- устанавливается равным 0 (рис. 2.9). Представление в виде характеристического вектора удобнее тем, что можно определять принадлежность /-го элемента множеству за время, не зависящее от его размера. Основные операции над мно- множествами, такие как объединение и пересечение, можно осуществ- осуществлять как операции v и л над двоичными векторами. Недостаток это- этого представления заключается в том, что операции объединение и пересечение занимают время, пропорциональное мощности уни- универсального множества U, а не рассматриваемого множества S. Дан- Данное представление требует дополнительной памяти для хранения характеристического вектора, что для больших п (размер универса- универсального множества U) бывает практически невыполнимо. 1 О О Рис. 2.9. Представление множества характеристическим вектором
================== Глава 3 - Методы подсчета и оценивания ассмотренные в предыдущих разделах комбинаторные формулы подсчета означают вычисление или определение свойств некоторой последовательности чисел, соответствующие той или иной задаче. В этом разделе предлагается полезный инст- инструмент для работы с последовательностями. Идея состоит в том, чтобы каждой числовой последовательности сопоставить функ- функцию действительного или комплексного переменного, с тем, что- бы обычные операции над последовательностями соответствовали простым операциям над соответствующими функциями. Аналитические методы работы с функциями оказы- оказываются проще и эффективнее, чем непосредственные комбина- комбинаторные методы работы с последовательностями. 3.1. Производящие функции Пусть а0, аьаъ...~ произвольная последовательность. Сопо- Сопоставим последовательности функцию действительного или ком- комплексного переменного: А(х) = ^акхк. C.1.1) Функция А(х) называется производящей функцией последовате- последовательности а0, аь я2)... . Как правило, поиск функции А(х) по форму- формуле C.1.1) прямыми методами является сложной задачей. Однако заметим, что последовательность {ак} может быть восстановлена по А(х). Выражение C.1.1) является разложением А(х) в ряд Тей- Тейлора в окрестности точки х = 0. Воспользуемся этим замечанием и приведем некоторые наиболее распространенные производя- производящие функции и соответствующие им последовательности.
40 . Глава 3. Методы подсчета и оценивания Производящие функции А(х) 1 1-х 1 A-хJ ¦1 1-х 1пA + х) A + х)г ех е* 1 A-х)г к=0 ОО 1 -zf** оо / 1 \к+1 у(-1) к ^ 1с оо 1 = Y—-xk оо ..к k=ok* Последовательности {я*} ак = 1, А: > 0 д,-А:+1, А;>0 1 ,^>1 - любое ¦ любое >. 0, г — любое C.1.2) C.1.3) C.1.4) C.1.5) C.1.6) C.1.7) C.1.8) C.1.9) Задача. Найти число ^-мерных граней в я-мерном кубе. Решение. Обозначим через ак число ^-мерных граней в л-мер- ном кубе, где 0 < к < п. Тогда производящую функцию последова- п тельности {ак} можно записать как ДДх) = 2^акх . Индекс п для Ап(х) показывает размерность куба. Например, А0(х) = 1, А{(х) = 2 + jc, А2(х) = 4 + 4х + х2. Рассмотрим производящую функ- функцию 4j+i(x) последовательности {ак} для (л +1)-мерного куба. За- Заметим, что (п +1)-мерный куб можно получить из я-мерного куба сдвигом последнего по (п +1)-му измерению. На рисунке показан пример получения трехмерного куба сдвигом по тре- третьему измерению квадрата (двухмерного куба). От- Отсюда видно, что (п +1)-мерный куб включает два ста- старых л-мерных куба и каждая /:-мерная грань при сдвиге переходит в (к +1)-мерную грань. Из приведенных рассуж- рассуждений следует, что Ап+1(х) = 2Ап(х) + х • Ап(х), где Aq(x) = 1. Отсюда
3.1. Производящие функции 41[ Воспользуемся разложением бинома Ньютона: Ап(х) = B + х)п = ?с*х*2"-* =?акхк. Сравнивая коэффициенты при степенях^, получим, что число Л-мерных граней в л-мерном кубе равно ак =2"~*С*. Например, Простейшие производящие функции C.1.2)—C.1.9) будем ис- использовать как «строительные кирпичики» для получения произ- производящих функций более сложных последовательностей. С этой целью рассмотрим наиболее важные из операций над производя- производящими функциями, т.е. способы получения новых производящих функций и соответствующих им последовательностей. Обозна- Обозначим через {ak}, {bk}, {ск} последовательности, а соответствующие им производящие функции — как А(х), В(х), С(х). 3.1.1. Линейные операции Если аир константы, то последовательность ск = а - ак + р - Ьк имеет производящую функцию С(х) = а * А(х) + р • В(х). Например, последовательность {1} соответствует производя- 1 [1] щей функции , а последовательность < —} соответствует про- 1-х [к\] изводящей функции ^, тогда последовательность \ 100 н— I соот- I к\) ветствует производящей функции +5ех. 1-х 3.1.2. Сдвиг начала вправо Пусть последовательность {Ьк} определяется через последова- последовательность {ак} следующим образом: Ьк = 0 для к = 0, 1,..., /— 1 и Ък = ak_t для к = /, / + 1,..., тогда В(х) = х?А(х). Действительно B(x) = ±bkxk =±ak_txk =х*±аыхк-< =х> ±акхк =х к=0 k=i Ы к=0
42 3. Методы подсчета и оценивания 3.1.3. Сдвиг начала влево Пусть последовательность {Ьк} определяется через последова- последовательность {ак} следующим образом: Ък = ak+h к = 0, 1,..., тогда к=0 Действительно *=0 I к=0 к=0 k=i м \к=0 "I'**' 1-1 *=о 3.1.4. Частичные суммы Пусть последовательность {Ьк} определяется через последова- последовательность {ак} следующим образом: Ьк = 2>,, к = О, 1,..., тогда Д(*) =^^ . /=о *~х Действительно k=OVi=O 12 3 4 к I— Множество пар точек (к, /), по которым ведется суммирование, представлено на рисунке. Изме- Изменим порядок суммирования (сначала по /, затем по к). Выражение для В(х) примет вид /=о Z /=o =o 3.1.5. Дополнительные частичные суммы Пусть последовательность {Ьк} определяется через последова- последовательность {ак} следующим образом: Ьк = ъ, к = 0, 1,..., тогда В(х) = А{\)-хА{х) 1-х
3.1. Производящие функции 43 Действительно 00 / 00 *=0 Множество пар точек (к, i), по которым ведется суммирование, представлено на рисунке. Из- меним порядок суммирования (сначала по /, затем по к). Выражение для В(х) примет вид 12 3 4 к /=0 /=o U=o j+x /=о 0 /=0 3.1.6. Изменение масштаба 1. Пусть последовательность {Ьк} определяется через последо- последовательность {ак} следующим образом: Ьк = к- аь тогда В(х) = х • А' (х). Действительно и ,к-\ к=0 или 2. Пусть последовательность {Ьк} определяется через последо- последовательность {ак} следующим образом: Ьк =р к + l Поскольку А(х) = ^акх , то , тогда В(х)=~- \A{x)dx. х j *=о о =оЛ+1 *=о
44 Глава 3. Методы подсчета и оценивания 3.1.7. Свертка Последовательность ск = 00 00 Действительно, А(х) = Y,akx и <^(*)= Х**х ' тогда *=0 к=0 i=Ok=i /=o ы v/=o у U=o Далее обсудим наиболее общие приемы использования произ- производящих функций на примере решения следующих задач. Задана. Рассмотрим обобщенное биномиальное правило рас- раскрытия выражений. где обобщенный биномиальный коэффициент к\ Тогда к=0 Рассмотрим полученное выражение при г = -\. ?(x)* =1+?K-i)(-3)-B^3) k = ti k- fci 2kk\
3.1. Производящие функции 45 _uf ц_1Ы-3-5-7...B*-3) * _ f,l-3-5...B*-3) * = 2*Jt! fe 2**! к\-2-4-6...Bк-2) f _2_ B*-2)! fc = Й4*А (ЛЩЛ1)! f Таким образом, *=i 4 * Рассмотрим выражение = A-^) г при г = 1. где Следовательно, =(l-x)~1 k=0 Задача. Сколькими способами можно разбить выпуклый (п + 3)-угольник (п > 0) на треугольники диагоналями, не пересе- пересекающимися внутри многоугольника? Решение. Пусть ип+3 — искомое число способов разбить (п + 3)-угольник на треугольники. Перенумеруем вершины ис- исходного многоугольника числами от 1 до п + 3. Заметим, что при любом разбиении найдется треугольник, содержащий ребро мно- многоугольника с вершинами п + 2 и п + 3. Третья вершина этого тре- треугольника может быть любой из остальных 1,2,...,л+1. Пусть это будет вершина к. Если удалить треугольник с вершинами п + 2, п + 3, к, то получим два многоугольника с числом вершин к + 1 и
46 Глава 3. Методы подсчета и оценивания п + 3 — к, которые можно разбить на треугольники ик+{ и и„+з_* способами. Суммируя по к = 1, 2,..., п + 1, получим (согласно пра- правилам прямого произведения и суммы) искомое число разбиений исходного (п + 3)-угольника на треугольники: "л+3 = и2 ' "/,+2 + "з ' ЫпЛ + «4 ' «„-О + - w/i+l * «3 + w/i+2 ' «2> где л>0и положили м2 = 1. Получили нелинейное рекуррентное соотношение для после- последовательности {ип+2}, п>0, для поиска которой удобно ввести но- новую последовательность {vn}, n>0, такую, что vn = un+2, п>0. Тогда рекуррентное соотношение перепишется в виде v*+l = "О ' v*+0 + vl • v*-l + V2 * V-2 + - v*-l * vl + vai-0 * v0 Z Заметим, что правая часть является сверткой двух одинаковых последовательностей {vj и {vn} (см. п.3.1.7 операций с производя- производящими функциями). Ввиду этого, составим производящую функ- функцию правой части л=0 Пусть V(x) — производящая функция последовательности {vn}, п>0, тогда последнее соотношение запишем как -(V(x)-vo) = V(x)V(x) или х- V\x) - V(x) + 1 = 0. X Отсюда K(jc)=—(l±Vl-4x). 2х Ранее рассмотренное разложение обобщенного бинома со 9 Г* запишем для случая
3.1. Производящие функции 47 Поскольку результат V(x) должен быть рядом по неотрицатель- ным степеням**, то решение K(x)=(l/2x)(l + Vl-4x)является по- посторонним. Окончательно <у4 IX сп Отсюда ип+2 =vn= Ответ: число способов разбить выпуклый (п + 2)-угольник на треугольники непересекающимися диагоналями равно —^-, п > 0. п+1 к Задача. Найти сумму I2 +22 +...+ &2 =Х/2* /=1 Определим четыре последовательности и их производящие функции: ак =l,bk = каь ск = кЪь dk =?/2 и А(х), В(х)9 С(х), D(x). /=о Для решения задачи необходимо найти dk. С этой целью опреде- определим D(x), что позволит нам установить значения dk, D(x) = ^dkx . Последовательности bk и ак связаны «изменением масштаба», значит В(х) = х • А\х). Последовательности ски Ъктак- Ъктакже связаны «изменением масштаба», следовательно, С(х)=хВ'(х)=х(хА'(х)У=хА'(х)+х2А"(х). Последовательности dk и ск связаны «частичной суммой», тогда С(х)_хА'(х)+х2А"(х) Щх)_ 1-х 1-х Окончательно D(x) = Для получения коэффициентов dk воспользуемся разложением C.1.9): A-хL ='к
48 Глава 3. Методы подсчета и оценивания Теперь можно записать, что А;=0 к=0 к=0 к=2 *=0 Сравнивая коэффициенты при одинаковых степенях х, получим dQ=o, ах=с1 ак=с3к+1+с12, * =2,з,.... Таким образом, 1 +2 +...+А: =2^ =4+1+4+2= /=0 к Задача. Показать, что J]CJ.+/ =С^+Л+1 или 1 °о Заметим, что = X^v+*;c* является производящей A + X)r+1 А=0 функцией последовательности ак =С*+к. Следовательно, иско- к . к мая сумма равна ^C'r+i =Xa/ • /=о /=о к Рассмотрим последовательность Ьк =^лЛ.Таккак^и^ свя- /=о А(х) 1 заны частичной суммой, то В(х) = —— = т-. Разложение 1-х A-х)г+2 C.1.9) позволяет записать последнее выражение в следующем виде: 7гЛ^ +1^5 откуда ft, =c;+ft+1 =tfl/ = Задача. Пусть Хи Y— целочисленные случайные величины и определены их ряды распределений. Характеристической функ- функцией распределения случайной величины (св.) X называется функция
3.2. Линейные рекуррентные соотношения 49 Таким образом, gj^s) — это производящая функция последовате- последовательности чисел Р(Х = к), где к = О, 1,.... Будем полагать Хи Yнеза- Yнезависимыми случайными величинами (св.). Рассмотрим св. Z= X+ Y. Очевидно, что P(Z =k) = P(X + Y =k) = Y,P(X =i)P(Y =k-i). Ввиду свойства свертки для производящих функций характери- характеристическая функция св. Z может быть записана таким образом: gz(s) = fjP(Z=k)sk =gx(s)gY(s). 3.2. Линейные рекуррентные соотношения Рассмотрим последовательность {ип}, л = О, 1, 2,... . Будем го- говорить, что задано однородное линейное рекуррентное соотно- соотношение с постоянными коэффициентами порядка г, если для чле- членов последовательности {ип} выполняется равенство Un+r =clun+r-l +C2"n+r-2+'--+crUn> C.2.1) где q, c2,..., сг — постоянные величины. Выражение C.2.1) позво- позволяет вычислить очередной член последовательности по предыду- предыдущим гчленам. Ясно, что, задав начальные значения ы0, иь..., иг_ь можно последовательно определить все члены последовательно- последовательности. Мы рассмотрим общий метод решения (т.е. поиска ип как функции от п) рекуррентного соотношения C.2.1). Для решения задачи достаточно найти производящую функ- функцию Щх) = ^икхк C.2.2) *=о последовательности {ип}. Введем обозначение для полинома К(х) = 1 - с{х - с2^ - ... - сХ и рассмотрим произведение ЩхЩх) = С(х). Непосредственным умножением можно убедиться, что С(х) — это полином, степень которого не превышает г — 1, так как коэф- коэффициенты при х?+г (п = 0, 1,...) в U(x)K(x), согласно уравнению C.2.1), равны ип+г- (с^г^ + с2ип+г_2 +... + c,un) = 0 .
50 Глава 3. Методы подсчета и оценивания Характеристическим полиномом соотношения C.2.1) назы- называется F(x)=xr -c{xr-1 -c2xr-2-...-cr_[x-cr. C.2.3) Выполним разложение F(x) на линейные множители F(x)=(x-al)ei(x-a2)e>...(x-ar)e', где ei + е2 + ... + ег = г. Сравнивая К(х) и F(x), запишем К(х) =xrF\ — I Отсюда {xj Данное разложение на множители используем для представле- представления в виде суммы простых дробей: Таким образом, J7(x) является суммой функций вида Тогда выражение C.2.4) примет вид I+f1Ve*- C-2-5) Данное разложение является производящей функцией 00 U(x) = ^ипхп последовательности {ип}. Для определения ип необ- ходимо найти коэффициент при хп в разложении C.2.5). Задана. Найти члены последовательности {ип}, удовлетворяю- удовлетворяющие рекуррентному соотношению ип+2 = 5нЛ+1 - 6ип, ио = и{ = 1. Решение. К{х) = 1 - 5х + бх2,
3.3. Неоднородные линейные рекуррентные соотношения 51 Выполним данное умножение: A — 5jc + 6x2)(w0 + щх + и2^ + ...) = = и0 + (щ — 5ио)х + (и2 — 5и{ + 6и2)х1 +... = и0 + {их — 5ио)х = 1 — 4х. Таким образом, С(х) = 1 — 4х Характеристический полином f[x) =^ — 5х + 6 = (х — 2)(х — 3). Отсюда Щх)=^\= l-4* =-4-f-4-. Значения вели- АТ() A-2х)A-Зх) 1-2х 1-Зх чин А и В находим методом неопределенных коэффициентов: А = 2, В= -1. Наконец, принимая во внимание C.1.2), U(x) = -^- + ~=2.f42kxk -^Зкхк =^BШ -Ък)-хк. \-2х 1-Зх ^=0 к=0 к=0 00 С другой стороны, U(x) = ^ukx . Поэтому, сравнивая коэффи- циенты при одинаковых степенях^, заключаем, что ып = 2Л+1—3Л. 3.3. Неоднородные линейные рекуррентные соотношения Неоднородное линейное рекуррентное соотношение имеет вид »n+r =ClUn+r-l +C2Un+r-2+~>+CrUn +Ьп, C.3.1) где величина bn в общем случае является функцией от п. Общее решение соотношения C.3.1) представляет собой сумму частного решения неоднородного уравнения C.3.1) (т.е. любого решения, которое ему удовлетворяет) и общего решения соответствующего ему однородного соотношения C.2.1), которое находится рас- рассмотренным способом. Общих способов определения частного решения нет, однако для специальных значений Ъ существуют стандартные приемы определения ип. Рассмотрим на примере в некотором роде универсальную процедуру, которая позволяет сразу находить общее решение неоднородного уравнения C.3.1). Задана. Найти {ып}9 если известно, что un+l = un + (п + 1) и Умножив левую и правую части рекуррентного соотношения на лс", получим и^У1 = */,/ +(л
52 Глава 3. Методы подсчета и оценивания Суммирование последнего уравнения для всех п дает П=0 П=0 Л=0 Свойства операций с производящими функциями позволяют данное выражение привести к виду A-х) 2 Учитывая, что и0 = 1, запишем л=0 Сравнивая коэффициенты при У1, заключаем, что "n+l Задана. Найти число замкнутых маршру- маршрутов длины п по ребрам треугольника ABC. Длину ребра принять равной единице. Нача- Начальная и конечная точка маршрутов — верши- С на А Решение. Введем обозначения: ап — число замкнутых маршру- маршрутов длины п из вершины А в вершину А; Ъп — число маршрутов длины п из вершины А в вершину В\ сп — число маршрутов длины п из вершины А в вершину С. Очевидно, что из условия симметрии задачи Ъп = сп. Величины же аю Ьп, сп связаны системой рекуррентных соотношений: С учетом последнего равенства Ъп = сп (п = 0, 1,2,...) система при- приводится к виду
3.4. Обобщенное правило произведения 53 Выражая Ьп из первого уравнения и подставляя во второе, полу- получим однородное рекуррентное соотношение относительно по- следовательнбсти {ап}. Запишем его в принятых обозначениях, полагая ип = ап: ип+2 = ип+\ + 2ит ио = 1, «1 = 0> где п = 0, 1, 2,... . Решение данного соотношения получим согласно изложенной выше теории. Y(\\ 1 v Oy-2 TT(\\V(\\ Г(\Л — 1 v J\\X) — 1 — X — LX , U\X)rs\X) = \^\X) — 1 — X. Характеристический полином F(x) = x2 - x - 2 = (x - 2){x + 1). Отсюда U(x)= — =_Z3_ + ^1_ . ; A-2x)A+jc) 1-2jc 1 + x Перепишем Щх) в развернутом виде по степеням У1: Сравнивая коэффициенты при У1, заключаем, что число замкну- замкнутых маршрутов длины п равно ип = ^—^—. 3.4. Обобщенное правило произведения Пусть Si, S2,..., Sn — произвольные множества. Q = {©!, ю2, со3,.--} — множество весов, где под оэ, будем понимать любой из символов 1, х, у, z, x~l, у~{, z~l и их произведения. В от- отличие от элементов, вес — это число либо переменная, которая может принимать любые числовые значения. Назначим каждому элементу s е?,(/= 1,2,..., л) вес сф) е Q. Во многих задачах требу- требуется определить количество элементов с определенными свойст- свойствами, а не их вес. В этом случае полагают a(s) = 1. Пусть Сь — количество элементов множества Sf с весом со, тог- тогда A(Sj ) = ^Сьы— сумма весов элементов множества ?,. cogQ Рассмотрим прямое произведение множеств О — Oi*aJ2.*...a.vJjj — \с. — y<JiiJ2...o^^|Oj' fciJy,» — 1, A* f.
54 Глава 3. Методы подсчета и оценивания Положим вес элемента множества равным со(е) = с Пусть Е& — количество элементов s e S с весом ю, тогда Х^со03 ~" сумма весов элементов множества . соеП Теорема. A(S) =A(Sl)A(S2)...A(Sn). Доказательство. А А Л. А У А Задача. Найти количество замкну- замкнутых маршрутов длины 2л по ребрам трехмерного куба. Начальное и конеч- конечное положение — вершина Aq куба. Решение. Исходное положение — вершина Ао. Каждый шаг движения по кубу — это выбор одного из трех ребер. Пусть 1 обозначает выбор ребра вдоль оси ОХ, 2 — вдоль оси 07, 3 — вдоль оси 0Z. В соответствии с этим введем множества S{, S2,..., S2n такие, что Sx = S2 = ... = S2n = {1, 2, 3}. Тогда все маршруты длины 2л соста- составят множество S= S{ x S2 x ... х S2n. Например, маршрут 2113 означает, что из Aq пошли вА5, затем в А$, вернулись в А5 и подня- поднялись в А2. Назначим веса элементам множества: ©A) =х, юB) = у, соC) = z. По правилу обобщенного произведения сумма весов всех маршрутов длины 2л равна A(S) = A(Si)A(S2)...A(Sn) = (jc + у + zJn, т.к. A(S,) = х + у + z. После возведения в степень получим, что
3.4. Обобщенное правило произведения 55 где хУг* — вес маршрута, включающего / шагов вдоль оси OX, j — вдоль OYn к — вдоль OZ(i +j + к = 2л), aijk — количество маршру- маршрутов с весом х'У^. Заметим, что только маршрут, заканчивающийся в Д), имеет вес х'У^ с четными степенями i,j, к, т. к. в замкнутом маршруте, сде- сделав шаг вдоль оси, необходимо вернуться по этой оси. Для выде- выделения таких маршрутов положим х2 = у1 = г2 = 1 (х, у, z — произво- произвольные). Тогда выражение C.4.1) примет вид (х + у + zJn = Со + Cyz + C^xz + Qxy, C.4.2) где Со — число маршрутов, заканчивающихся в А$\ С2 — ъА2', С4 — в А^\ С6 — в А6. Учитывая симметрию точек А2, А4, А$ относительно Aq, можно за- заключить, что С2= С4= Св= С. Тогда из системы C.4.2) следует, что (х + у + zJn = Со + C(yz + xz + xy). C.4.3) Уравнение C.4.3) содержит два неизвестных Со и С при jc2 = у* = ? = 1. Для их определения составим систему уравнений из выражения C.4.3), полагая x = y = z=l и x = j>= I, z= 1. Это возможно, т.к. выполняется условие х2 = у1 = г2 = 1. Получим сис- систему fa+1+lJ" =С0 +C0L+1+1) или {З2" =С0 +ЗС llJ" ССA11) З2" +3 Отсюда Со = — число искомых маршрутов. Задача. Найти число решений р, q уравнения 2р + 3q = п, где п, р, q e{0, 1, 2,...}. Решение. Введем множества: S{ = {2р | р = 0, 1, 2,...}, S2 = {3q\q = = 0, 1, 2,...} и5=51х52 = {Bp93q) \p9 q = 0, 1, 2,...}. Назначим веса элементам данных множеств следующим образом: coBp)=^,coCq)=x3q, и ю(е) = ю(Bр, 3?)) = х2^3^ = х2^ • х39 = (oBp)(oCq). Веса элементов определены таким образом, что выполняется правило обобщенного произведения A(S) = A(Si)-A(S2)> Легко за- заметить, что степень веса х2^3^" любого элемента е = Bр, 3q) eS дает одно из решений исходного уравнения 2р + 3q = п.
56 Глава 3. Методы подсчета и оценивания Раскроем выражение A(S) = A(Si)-A(S2): и0 + wpc + и2л + ... + Uf?? + ... = = (X20 + X21 + X22 + ... + ^P + ...)(Х3° + X31 + X32 + ... + X3 « + ...) = ()()^Ц, 1-х2 l-xJ где «Л — число решений уравнения 2р + 3q = п. Фактически, сум- сумма весов A(S) элементов множества S является производящей функцией числа решений уравнения 2р + 3q = п. Таким образом, A(S) = г- г-. Разложим данное выражение на множители: \ — х 1 х A-хJ 1-х (\-хJ+ 1-х3 к=0 /Ы) *=0 где ип — число решений уравнения 2р + Зд= п. Сравнивая коэффициенты при одинаковых степенях , полу- получим: 3-i-lK"+2-Cn+l) + 7 2Л+3 + НK" «v, =—-— ^ —= —-—, *• 12 4 _3(-1Kя+1+2-(Зл+2)-12л+1-(-1Kя мз«+1 ~ 12 4 3-(-1Kя+2+2-(Зл+3) + 3 «w= 12 4 где яе{0, 1,2...}. 3.5. Принцип включения и исключения Пусть 5= {su s2, si;...} — произвольное множество элементов. С1 = {ю1,со2, со3,...} — множество весов, Q(ja) — вес элемента^ eS. Рь Р2, Р^,..., Р„ — свойства элементов или индикаторы свойств элементов.
3.5. Принцип включения и исключения 57 р ( \ _ Аесли элемент sk обладает свойством Рг , 1 к [О, если элемент sk не обладает свойством Р{. W{PX) = ^Pi(sk)-(o(sk)~ сумма весов элементов со свойством Рх. skeS W(PX Pi2 .Pjm ) — сумма весов элементов множества S, которые обладают каждым из свойств /• , Р1г,..., Р1т . W(m) = X^^I ^h'-^m )' сУммиРование выполняется по всем ('У 2-••'»») сочетаниям (ifa—im) Длины тизп свойств, количество сочетаний равноС^. Таким образом, в W(m) суммируются веса только тех элемен- элементов, которые имеют как минимум т свойств. Пусть элемент s обла- обладает к свойствами пк>т, тогда его вес a(s) в W(m) войдет С^ раз. Так, W{\) = YjV{Pi ) = W(Pl) + W(P2)+...+W(Pn) содержит С\ = = п членов и WB)= l содержит Сл2 =/7(/i+l)/2 членов. Распространим определение Ж(ш) на т = 0, положив ^ш^) — сумма весов элементов исходного множества S. Данное" определение W@) выполнено корректно, так как сумма W@) должна включать элементы, обладающие нуль свойствами и более. Действительно, любой из элементов множества Sудовлет- Sудовлетворяет этим условиям. Положим: Е(т) — сумма весов элементов, обладающих ровно т свойствами; ДО) — сумма весов элементов, которые не имеют ни одного из указанных свойств. Теорема. Сумма весов элементов, обладающих точно т свойст- свойствами из п свойств Р1з P2v5 Pm равна ВД = Ж(|и)-(?+1^(т+^ или п-т Е{т) = ?(-1У С^Щт +/). C.5.1) Доказательство. Для доказательства достаточно показать, что вклад веса со (л) произвольного элемента s e S в правую и левую
58 Глава 3. Методы подсчета и оценивания части C.5.1) одинаковый. Пусть.? eSобладает точно /свойствами. Возможны следующие соотношения между turn: 1) t < т9 тогда со(^) не входит в Е{т) и не входит в W{m + /) для / = 0, 1,..., п — т. Равенство C.5.1) примет вид 0 = 0. 2)t=m, тогда со (s) входит один раз в Е{т) и один раз в W{m). 3)t>m, тогда со (s) не входит в Е{т) и левая часть равна 0. Пока- Покажем, что в этом случае и правая часть выражения C.5.1) равна нулю. Вес со (s) в Щт + /) входит С"+| раз, m + i<t. Правая часть для веса со (л*) одного элемента s примет вид t-m /=0 Заметим, что nm nm+i {m+i)\ t\ t\ {t-m)\ m\i\ (m + /')!(/-{m + /))! m\(t-m)\ /!((/-m)-i)\ Следовательно, C%+iC™*1 =C™Ct_m, а исходная сумма составит t-m . . t-m /=0 /=0 ^1 Iт ф)?Aу-т =0. /=0 И в третьем случае выражение C.5.1) справедливо. Теорема дока- доказана. Следствие. ДО) = W@) - W{\) + W{2) - ЩЗ) + ... Ц-1)пЩп). Задача. В группе 23 студента. Из них 18 знают английский язык, 9 — немецкий и 6 — оба языка. Сколько студентов в группе не знают ни одного языка? Сколько студентов знают один язык? Решение. Пусть S— множество всех студентов, \S \ = 23. Назна- Назначим вес со С?) = 1 всем элементам s e S. Теперь под суммой весов будем понимать количество студентов. Назначим свойства элементам s e S: Р1 — знание английского языка, Р2 — знание немецкого языка. ДО) — студенты, не знающие языков (не обладают свойствами).
3.6. Ладейные многочлены и многочлены попаданий 59 ДО) = ЩО) - W{\) + Щ2). JF(P) = ?©(*) =23. seS W{\) = ЩР{) + W(P2) = 18 + 9 = 27. Тогда ДО) = 23 - 27 + 6 = 2. Д1) — студенты со знанием одного языка (обладают ровно одним свойством). Задана. Найти число перестановок т шаров, в которых ровно г шаров остаются на месте. Решение. Введем обозначения. Р{ — свойство, состоящее в том, что при перестановке шаров /-й шар остается на месте, /=1,2..., т. Е(г) — количество перестановок, обладающих ровно г свойст- свойствами, т.е. при перестановке шаров ровно г из них остаются на сво- своих местах. Тогда по формуле включений и исключений запишем: iy Рассмотрим W(r)= ^(P,^-,.../?,), 1=0 (/V2-»r) где суммирование выполняется по всем сочетаниям (i\ii—Q длины г из т свойств, количество сочетаний равно Сгт. W(Pt Pi2...Pir)=(m -r)! — количество перестановок из т-r ша- шаров, так как г шаров должны оставаться на месте. Тогда значение W(r) = Сгт (т -г)!. Следовательно, и Е(г) ^ИI' Сгг+/ С™ (т -г -/)! /=о т\»фAу m[e-i 3.6. Ладейные многочлены и многочлены попаданий Основная цель данного подраздела — показать возможности применения методов подсчета и оценивания при решении конк- конкретных задач. В то же время обсуждаемые здесь задачи сами по себе не лишены интереса, и в большей степени для тех, кто впер- впервые знакомится ними.
60 Глава 3. Методы подсчета и оценивания ¦А, Рис. 3.1 3.6.1. Ладейные многочлены • Определение. Доской запрещенных позиций назы- называется произвольный набор выделенных клеток шахматной доски, сохраняющих свое расположе- расположение относительно других клеток доски. Пример до- доски запрещенных позиций показан на рис. 3.1. • Определение. Пусть С — доска запрещенных пози- позиций. Введем обозначения: гк — количество способов расста- расставить владей на доске запрещенных позиций так, чтобы они не били друг друга; г0 = 1 — количество способов расстановки О ладей на доске запрещенных позиций, т.е. способов не ставить ладьи на доску. Ладьи считаются неразличимыми. Производя- Производящую функцию последовательности {гк} будем называть ладей- ладейным многочленом доски С п обозначать Д(*,О = |/***. C.6.1) с, ¦ Задана. Найти ладейный многочлен для доски С{ на рис. 3.2. Рис. 3.2 Решение. Непосредственным подсчетом можно установить, что г0 = 1, г{ = 1 и г{? = 0, / > 2. Тогда R(x, С{) = 1 + jc. Задана. Найти ладейный многочлен доски С2 на рис. 3.3. Решение. Непосредственным подсчетом можно установить, что г0 = 1, г{ = 2, г2 = 1 и г, = 0, / > 3. Тогда Рис. 3.3 Рис. 3.4 R(x, Задана. Найти ладейный многочлен доски С3 на рис. 3.4. Решение. Непосредственным подсчетом можно установить, что г0 = 1, гх = 3, г2 = 1 и г, = 0, / > 3. Тогда 2 Определение. Доски С{ и С2 называются неза- висимыми, если их клетки располагаются на различных горизонталях и вертикалях. При- Пример независимых досок показан на рис. 3.5. Cl ~~
3.6. Ладейные многочлены и многочлены попаданий 61 Свойства ладейных многочленов • Свойство 1. Правило произведения. Пусть R(x, Q) и R(x, C2) — ладейные многочлены независимых досок С{ и С2. Если доска С= С{ и С2, то R(x, Q = R(x, C{)R(x, C2). Доказательство. Пусть п{ — расстановка ладей на доске Сь п2 — расстановка ладей на доске С2. Тогда п = (п{, п2) — переста- перестановка ладей на доске C=Qu C2. Верно и обратное. Пусть Sn и Sn2 — множество расстановок ладей на доске, соответственно С{ и С2. Тогда прямое произведение Sn =SK x SK2 — множество рас- расстановок ладей на доске С. Обозначим веса расстановок: оз(тг1) = x*!, где к{ — число ладей в перестановке их; со(я2) =лс*2, где /:2 — число ладей в перестановке п2. Тогда вес перестановки я равен (ti(n)=xkl+k2 =xk[ -xkl =со(тг1)со(я2). В соответствии с тем, как введены веса перестановок, ладей- ладейные многочлены можно записать как сумму весов элементов мно- множеств: Многочлены R(x, C{),R(x, C2)nR(x, С) удовлетворяют всем усло- условиям правила обобщенного произведения (см. п.3.4), в соответст- соответствии с которым R(x, Q = R(x, C{)R(x, C2). Задача. Найти ладейный многочлен доски С на рис. 3.6. Пусть С{ — доска из одной клетки, R(x, Q) = 1 + х. Ясно, что доска С состоит из п независимых досок С{. Отсюда следует, что • Свойство 2. Правило суммы. Пусть С — доска РиСш 3.6 запрещенных позиций. Введем обозначения: С,- — доска с ладьей в клетке а (/ — index); Ce^ — доска с уда- удаленной клеткой а (е — erase). Тогда R(x,C) =xR(x,CiJ+R(x,CeJ илиR(xia +ea) =xR(ia)+R(ea). Для доказательства данного свойства вновь рассмотрим ладей- ладейный многочлен как сумму весов перестановок. Все расстановки множества разобьем на два подмножества 51 и Sn , Sn — пе- перестановки с ладьей на клетке a; SK — перестановки, которые не занимают клетку а.
62 Глава 3. Методы подсчета и оценивания Тогда Множитель х перед скобкой — это вес ладьи в перестановке л,а которая поставлена на выделенную клетку а. Задана. Найти R{x, С) для доски на рис. 3.7. Решение. Воспользуемся правилом суммы, по ко- которому J\\X9 Vs) = X J\\ ]f + J\\ I I ) = X\L + X) + \L + X) = 3 Рис. 3.7 Отметим, что по виду полученного ладейного многочлена (производящей функции) можно сказать, что число способов расставить две ладьи на доску С равно 4. • Свойство 3 для прямоугольных досок. Пусть С — прямоугольная доска запрещенных по- позиций размером тх п,т — число горизонта- горизонталей; п — число вертикалей (рис. 3.8). На квадратной доске размером k x А; можно к\ способами расставить владей. Различных досок к х к на доске тх п можно выбрать способами Рис- 3-8 С^Ск. Отсюда гк =С^Ск к\ —число способов расставить вла- владей на исходной прямоугольной доске. Тогда R(x, С) = тЫ/я/ к=0 СктСкпк\хк Задана. Найти R(x, Q для прямоугольной доски С размером 2x3. Решение. ]Г*** =C2°C300!x0 +Cl2C\V.xl +C|C|2!jc2 = Коэффициент при х2 показывает, что число способов поставить две ладьи на такую доску равно 6.
3.6. Ладейные многочлены и многочлены попаданий 63 3.6.2. Многочлены попаданий Определение. Пусть дана квадратная доска размером п х п с запрещенными позициями (рис. 3.9). Обозначим через Еп{к) количество перестановок на квадратной доске п ладей, к из которых занимают запрещенные позиции. Многочленом попадания называется произ- п водящая функция E(t) = YJEn(k)tk последо- Рис. 3.9 вательности {Еп(к)}. Установим связь между многочленом попаданий и ладейным многочленом. Введем обозначения: Sn = {пь ти2,..., пп]) — множество всех перестановок п ладей на до- доске пх п; Q = {«!, w2,...} ~ множество весов; со: Sn -> Q — весовая функция, со (я) е Q, — вес перестановки п е Sn; {1, 2,..., т) — номера запрещенных клеток на доске пх п; Рь Р2,..., Рт — свойства перестановок; п е Sn обладает свойством Pj, если ее ладья занимает запрещенную позицию/ D t ч fl, если 7i обладает свойством Т Fj (п) = I [О, в противном случае. W(Pj) = ^ Pj (тс)о)(я) — сумма весов перестановок со свойством Pj, neSn p)Yp()p^p^^ весов neSH перестановок со свойствами Pj Pj2 .-Pjk \ W(k) = ^W(Pj Pj2...Pj ), суммирование выполняется по всем сочетаниям (/Уг—Л) дайны к из т свойств, число сочетаний С*. Принцип включения и исключения позволяет определить En(k)=C*W(k)^Cl{W(k+l)+...H-l)m-kC^ Так как нас интересует лишь количество перестановок, то будем полагать ш(я) = 1. Нетрудно установить, что W{k) = гк{п — к)\, где гк — количество способов расставить владей на запрещенных по- позициях доски пх п. Тогда ?Л*)=С*г*(л-*)!-С^
64 Глава 3. Методы подсчета и оценивания Заметим, что гк = О для всех к > п. С другой стороны, если т < п, то гк = 0 для всех к > т. Поэтому последнее выражение примет вид ^Л^)=^(Л-^)!-с^+1(Л-^ + 1)!+---+(-1)^с>Л«-^)! или п-к Еп(к) = ^(-i) Ck+irk+i(п-(к + i))\. Найденное выражение позво- ляет записать многочлен попаданий в виде к=0 *=0/=0 Суммирование выполняется по координатам уз- узлов сетки на рис. 3.10. Замена переменных сумми- суммирования к'= к л- /и /'= /в последнем выражении по- позволяет упростить многочлен попаданий и приво- п к дит его к виду -1У Скгк(п-к)\Гы, где суммирование уже выполняется по узлам сетки на рис. 3.11. Таким образом, п ( к . . ь Л --J\rk\y(-iyCk-tk-1 \{п-к)\ или *=о 1/=о ) = ?rk(t-l)k(n-k)l. Рис. 3.11 Для более компактной записи последнего выражения введем оператор s, действие которого распространим на функции це- целочисленного аргумента: е^^)) =J{n — 1) и z~k(j{n)) =J{n — к). Например, е^!) = (п- 1)! и s~V) = (п - к)\. ) z~l]k ( kz~kn Заметим, что [{t - \)z~l]kn\ = {t- \)kz~kn\ = {t- \)k{n - k)\. Тог- Тогда многочлен попаданий перепишем в виде к=0 к=0 ?гЛа-1)Е-1]*1и! = Уг,хА:=Л(х)я! , ^а к^ Г Лшшл К \ / > U=0 У Л=0 где jc = (/ — lje. Таким образом, E{t) = R((t— l)z~l) • л!.
3.6. Ладейные многочлены и многочлены попаданий 65 Задана. Найти многочлен попаданий для доски 3 х 3 с запрещенными позициями на рис. 3.12. За- Запрещенные позиции отмечены темным цветом. Решение. Найдем ладейный многочлен доски за- запрещенных позиций, которая состоит из двух неза- независимых досок. Тогда R(x) = Д© '' Значит E{t) = R((t- i)s" V = (l+4(r-1; = l-3! + 4#-l)e~13! + 4[(f- Рис. 3.12 4Х2 + jc3. 4[(f-l)s~1]2 + [(/-l)e~ ]23U[(t-l)z-l]33\ = = 3! + 4(t- 1J! + 4(f- IJ Итак, 2 1! + (Г- IK0! . Анализ коэффициентов ?(/) при tk показывает, что число пе- перестановок, в которых ладьи не занимают запрещенных клеток, равно 1 (коэффициент при f °); перестановок с одной ладьей на запрещенных позициях — 3 (коэффициент при tl); перестановок с двумя ладьями на запрещенных позициях — 1 (коэффициент при t2); перестановок с тремя ладьями на запрещенных позициях —1 (коэффициент при г). 3—2697
— Глава 4 —— Генерация комбинаторных объектов комбинаторных алгоритмах часто необходимо порождать и исследовать все элементы некоторого класса комбинаторных объектов. Наиболее общие методы решения таких задач основы- основываются на поиске с возвращением, однако во многих случаях объ- екты настолько просты, что целесообразнее применять специализированные методы. Задачи, требующие генерации комбинаторных объектов, возникают при вычислении комбина- комбинаторных формул. Например, часто приходится вычислять суммы, имеющие вид где суммирование выполняется по всем последовательностям хь *2>—> хп> удовлетворяющим некоторым ограничениям. В алгоритмах порождения комбинаторных объектов нас преж- прежде всего будет интересовать сложность алгоритмов, т.е. общее ко- количество времени, требующегося для порождения всего множе- множества объектов. 4.1. Поиск с возвращением Использование компьютера для ответа на такие вопросы, как «сколько существует способов...», «перечислите все возмож- возможные...», или «есть ли способ...», обычно требует исчерпывающего поиска множества решений. Метод поиска с возвращением по- постоянно пытается расширить частичное решение. Если расшире- расширение текущего частичного решения невозможно, то возвращаются к более короткому частичному решению и пытаются снова его продолжить. Идею поиска с возвращением легче всего понять в связи с за- задачей прохода через лабиринт: цель — попасть из некоторого за- заданного квадрата Я в другой заданный квадрат К путем последо-
4.1. Поиск с возвращением 67 н к ->- вательного перемещения по квадратам. Трудность состоит в том, что существу- существующие преграды запрещают некоторые перемещения. Один из способов прохо- прохода через лабиринт — это двигаться из начального квадрата в соответствии с двумя правилами: • в каждом квадрате выбирать еще не исследованный путь; • если из исследуемого в данный момент квадрата не ведут не- неисследованные пути, то нужно вернуться на один квадрат назад по последнему пройденному пути, по которому при- пришли в данный квадрат. Первое правило говорит о том, как расширить исследуемый путь, если это возможно, а второе правило — о том, как выходить из тупика. В этом и состоит сущность поиска с возвращением: продолжать расширение исследуемого решения до тех пор, пока это возможно, и когда решение нельзя расширить, возвращаться по нему и пытаться сделать другой выбор на самом близком шаге, где имеется такая возможность. Общий алгоритм В самом общем случае полагаем, что решение задачи состоит из вектора (а{, а2, я3,...) конечной, но неопределенной длины, удовлетворяющего некоторым ограничениям. Каждое at e At, где Aj — конечное линейно упорядоченное множество. Таким обра- образом, при исчерпывающем поиске должны рассматриваться эле- элементы множества (аь а2, я3,..., ai) е М х ^2 х--х 4> Для' = 0> 1» 2,... в качестве возможных решений. В качестве исходного частичного решения примем пустой вектор () и на основании имеющихся ограничений выясним, какие элементы из Ах являются кандида- кандидатами в а{. Обозначим это подмножество кандидатов через SycA^ В результате имеем частичное решение (а{). В общем случае для расширения частичного решения от (аь а2,..., ак_{) до (аь аъ..., ак-ъ ак) кандидаты на роль ак выбираются из Sk с Ак. Если частич- частичное решение (аь аъ..., ак_{) не представляет возможности для вы- выбора элемента аь то Sk = 0; возвращаемся и выбираем новый эле- элемент ак_{. Если новый элемент ак_{ выбрать нельзя, возвращаем- возвращаемся еще дальше и выбираем новый элемент ак_2 и т.д. Этот процесс удобно представлять в терминах прохождения дерева поиска в
68 Глава 4. Генерация комбинаторных объектов глубину. Процедура поиска с возвращением для нахождения всех решений формально представлена в алгоритме 4.1. Алгоритм 4.1. Общий алгоритм поиска с возвращениями Si=Ai'9 {Выделить кандидатов} к = 1; {Длина частичного решения} while к > О do begin while Sk*0 do begin ak g Sk\ {Расширить частичное решение } Sk = Sk — {ak}; {Удалить выбранного кандидата} if(ab a2,..., ak) —решение then Сохранить решение; k= k+ 1; {Расширить частичное решение} Sk с: Ak. {Выделить кандидатов} end\ k = k— 1; {Вернуться, уменьшить частичное решение} end. Поиск с возвращением приводит к алгоритмам экспоненциа- экспоненциальной сложности, так как из предположения, что все решения имеют длину не более п, исследованию подлежат приблизительно Y[\ Ak\ элементов. В предположении, что все \Ак\= С — констан- п ты, получаем экспоненциальную сложность 1~[Ма1=^л- Нужно к=\ помнить, что поиск с возвращением представляет собой только общий метод. Непосредственное его применение обычно ведет к алгоритмам, время работы которых недопустимо велико. Поэто- Поэтому, чтобы метод был полезен, к нему нужно относиться как к схе- схеме, с которой следует подходить к задаче. Схема должна быть хо- хорошо приспособлена (часто это требует большой изобретательно- изобретательности) к конкретной задаче, так чтобы в результате алгоритм годил- годился для практического использования. 4.2. Перестановки различных элементов Перестановки множества {аь аъ..., ап} различных элементов относятся к часто порождаемым комбинаторным объектам. Без ограничения общности можно полагать, что элементами множе- множества являются целые числа от 1 до п, т.е. рассматриваются пере- перестановки целых чисел 1, 2,..., п.
4.2. Перестановки различных элементов 69 Порождение перестановок на основе метода поиска с возвра- возвращениями выполняется в алгоритме 4.2. Заметим, что в процессе приспосабливания общего алгоритма 4.1 поиска с возвращения- возвращениями к задаче порождения перестановок мы не вычисляли и не хра- хранили явно множества Sk. В этом случае легче и достаточно хра- хранить только наименьшее значение из Sh т.е. sk, и следующее зна- значение вычислять по мере необходимости. Проверка условия Sk ф 0 соответствует условию sk< п, поскольку алгоритм устроен так, что перебор значений элемента sk выполняется в порядке их возрастания. Поэтому неравенство sk > n соответствует пустому множеству кандидатов Sk = 0. Алгоритм 4.2. Порождение перестановок методом поиска с возвращением s{ = 1; {Первый кандидат} к = 1; {Длина частичного решения} while к > О do begin while sk<n do begin ak = sk\ {Расширить частичное решение } sk = sk+ 1; {Удалить выбранного кандидата} while sk<n and notflag(sk) do sk = sk+ 1; ifk^n then Перестановка (а{, а2,..., ап) —решение] else begin k = k+ 1; {Расширить частичное решение} while sk<n and notflag{sk) do sk = sk+ 1; end, end; k = k- 1; {Вернуться, уменьшить частичное решение} end] Functionflag(sk) {Поиск элемента ske перестановке (aha2,..., cik_i)} flag = TRUE] while i < k and flag do begin ifa^ sk then flag = FALSE; i= i+ 1; end.
70 Глава 4. Генерация комбинаторных объектов Программа на языке Pascal реализации рассмотренного мето- метода генерации перестановок приводится в алгоритме 4.3. Следует отметить, что в программе размерность (длина) п перестановок читается из файла и порождаемые перестановки также сохраня- ются в файле. Попутно программа вычисляет время порождения всех перестановок с точностью до сотых долей секунды, которое сохраняется в конце файла сгенерированных перестановок. Алгоритм 4.3. Программа на PascaVe порождения перестановок методом поиска с возвращением Program Start_BackTrack; {Порождение перестановок} uses CRT,DOS; Const max_n=20; Type Vector=array[1..max_n] of Longlnt; Function Flag(Var a:Vector; sk:Longlnt; k:Integer): Boolean; { Поиск элемента sk в перестановке а[1],a[2],...,a[k-1] } Var i :Integer; yes :Boolean; begin; yes:=TRUE; i:=l; while (i<k) and yes do begin if a[i]=sk then yes:=FALSE; end; Flag:=yes; end;{Flag} Procedure BackTrack(var f:Text; Var a:Vector; n:Integer) { Генерация перестановок а[1],a[2],...,a[n] } Const m :LongInt=0; {Количество перестановок} Var s :Vector; i,k :Integer; begin; for i:=l to n do s[i]:=0;; s[l]:=l; k:=l; while k>0 do begin while s[k]<=n do begin a[k]:=s[k]; repeat {Поиск следующего кандидата на место а[к]} s[k]:=s[k]+l; until (s[k]>n) or Flag(a,s[k], k); if k=n then begin {Перестановка найдена} m:=m+1;
4.3. Эффективное порождение перестановок 71 Write(f,m,' ) '); for i:=l to n do Write(f,a[i],' '); WriteLn(f); end else begin{noHCK первого кандидата на место a[k+l]} k:=k+l; s[k]:=1; while (s[k]<=n) and Not Flag(a,s[k],k) do s[k]:=s[k]+l; end; end; k:=k-l; end; end;{BackTrack} Var {Main} a :Vector; n :Integer; f :Text; {Текстовый файл} Hour,Minute,Second,SeclOO,rHour,rMinute,rSecond, rSeclOO :Word; delta :LongInt; begin{Main} Assign(fr'BkTrack.inf); Reset(f);{Файл открыт для чтения} ReadLn(f,n);{Ввод длины перестановки} Close(f); Assign(f,'BkTrack.out' ) ; Rewrite(f); {Файл открыт для записи} GetTime(Hour,Minute, Second, SeclOO) ; BackTrack (f,a,n); GetTime(rHour,rMinute,rSecond,rSeclOO); delta:=rHour-Hour; delta:=delta*60+rMinute-Minute; delta:=delta*60+rSecond-Second; delta:---delta* 100+rSeclOO-SeclOO; WriteLn(ff'Время счета=',delta div 100,'.', delta mod 100,' сек'); Close(f); end{Main}. 4.3. Эффективное порождение перестановок Последовательность п\ перестановок на множестве {1, 2,..., л}, в которой соседние перестановки различаются так мало, как только возможно, — лучшее, на что можно надеяться с точки зрения мини-
72 Глава 4. Генерация комбинаторных объектов мизации объема работы, необходимого для порождения перестано- перестановок. Для того чтобы такое различие было минимально возможным, любая перестановка в нашей последовательности должна отличать- отличаться от предшествующей ей транспозицией двух соседних элементов. Такую последовательность перестановок легко построить рекур- рекурсивно. Для п = 1 единственная перестановка {1} удовлетворяет на- нашим требованиям. Предположим, мы имеем последовательность перестановок пь п2, я3,... на множестве {1, 2,..., п}, в которой после- последовательные перестановки различаются только транспозицией смежных элементов. Расширим каждую из этих (п — 1)! перестано- перестановок, вставляя элемент п на каждое из п возможных мест. Порядок порождаемых таким образом перестановок будет следующим: [1234 12 14312 4321 3421 321 23,2341 [4231 Г4213 2413 [2134 Данную последовательность перестановок можно порождать итеративно, получая каждую перестановку из предшествующей ей и небольшого количества добавочной информации. Это дела- делается с помощью трех векторов: текущей перестановки л = (п{, 7i2,.-., О, обратной к ней перестановки р = (р\,Р2,-', Рп) и записи направления dh в котором сдвигается каждый элемент / (—1, если он сдвигается влево; +1, если вправо; и 0, если не сдвигается).
4.3. Эффективное порождение перестановок 73 Элемент сдвигается до тех пор, пока не достигнет элемента, боль- большего, чем он сам; в этом случае сдвиг прекращается. В этот мо- момент направление сдвига данного элемента изменяется на проти- противоположное и передвигается следующий меньший его элемент, который можно сдвинуть. Поскольку хранится перестановка, об- обратная к я, то в я легко найти место следующего меньшего эле- элемента. Алгоритм 4.4 представляет собой реализацию рассмотрен- рассмотренного метода. Корректность алгоритма доказывается индукцией по п. Алго- Алгоритм порождения всех п\ перестановок линеен, сложность его определяется как п\ + о{п\). Алгоритм 4.4 — один из наиболее эф- эффективных алгоритмов для порождения перестановок. Рабочая программа на языке Pascal реализации эффективного метода генерации перестановок приводится в алгоритме 4.5. В качестве примера в алгоритме 4.6 приводится программа ре- реализации эффективного метода генерации перестановок, напи- написанная на языке Си. Алгоритм 4.4. Метод эффективного порождения перестановок fori=\tondo\nj =P\ =/; по=п while n+l - m* ¦m-\ ldo< n+l', {Метки границы) Print n = ( m -n\ while nPm ч Pm P P. <^P nPm nvn2,...,nn); d >mdo\dm='dn\ Qm [m=m-l +dm; {Изменить п) m\ {Изменитьр = п Алгоритм 4.5. Программа на Pascal'e порождения перестановок эффективным методом Program Start_Effeet; {Эффективная генерация перестановок} uses CRT,DOS; ¦ Const max_n=20; { n<=iuax_n } Type Vector=array[0..max_n+l] of Integer; Var f :Text; { Генерация перестановок z[l], z[2], ..., z[n] }
74 Глава 4. Генерация комбинаторных объектов Procedure Effect( Var z:Vector; n:Integer ); Const k :LongInt=0; {Количество перестановок} Var p,d :Vector; pm, dm,zpm : Integer; i,m,w : Integer; begin; for i:=l to n do begin z[i]:=i; p[i]:=i; d[i]:=-l; end; d[l]:=0; m:=n+l; z[0]:=m; z[n+l]:=m; while mol do begin { Печать перестановки } k:=k+l; Write(f,k,' ) Л); for i:=l to n do Write(f,z[i],' л); WriteLn(f); m: =n ; while z [p [in] +d [m] ] >m do. begin d[m]:=-d[m]; m:=m-l; end; pm:=p[m]; dm:=pm+d[m]; w:=z[pm]; z [pm] : =z [dm] ; z[dm]:=w; zpm:=z[pm]; w:=p[zpm]; p[zpm]:=pm; p[m]:=w; end; end;{Effect} Var {Main} z :Vector; n :Integer; {Длина перестановки} Hour,Minute,Second,SeclOO :Word; rHour,rMinute,rSecond,rSeclOO :Word; delta :LongInt; begin Assign(f,'Effect.in' ) ; Reset(f); {Файл открыт для чтения} ReadLn(f,n); {Чтение длины перестановки} Close(f); Assign(f,'Effect.out' ) ; Rewrite(f); {Файл открыт для записи} GetTime(Hour,Minute,Second,SeclOO); Effect(z,n); GetTime(rHour,rMinute,rSecond,rSeclOO); delta:=rHour-Hour; delta:=delta*60+rMinute-Minute; delta:=delta*60+rSecond-Second; delta:=delta*100+rSeclOO-SeclOO; WriteLn(f,'Время счета=',delta div 100,'.', delta mod 100,' сек') ; Close(f); end.
4.3. Эффективное порождение перестановок 75 Алгоритм 4.6. Программа на Си порождения перестановок эффективным методом tinclude <stdio.h> #include <stdlib.h> #include <time.h> #include <dos.h> void main(){ //Генерация перестановок // z[l], z[2], ..., z[n] int n; int *z,*p,*d; FILE *f; struct dostime_t t,tnew; long delta; unsigned long k; int pm, dm, zpm; int i,m, w; _dos_gettime (&t) ; f=fopen("primer.in","rt"); fscanf(f,"%d",&n); z=(int*)malloc((n+2)*sizeof(int));//Перестановка p=(int*)malloc((n+2)*sizeof(int));//Обратная d=(int*)malloc((n+2)*sizeof(int));//Смещение fclose(f); f=fopen("primer.out","wt") ; for( i=l; i<=n; d[l]=0; z[O]=z[n+l]=m=n+l; k=0; while( m!=l ){ //Печать перестановки k++; fprintf (f,"\n%ld) If,k); for( i=l; i<=n; i++ )fprintf(f,"%d",z[i]); m=n; while ( z [p[m]+d[m] ]>m ){ d[m]=-d[m]; m—; } pm=p [m] ; dm=pm+d [m] ; w=z [pm] ; z [pm] =z [dm] ; z [dm] =w; zpm=z[pm]; w=p[zpm]; p[zpm]=pm; p[m]=w; free(z) ; free(p); free(d); _dos_gettime(&tnew); delta=tnew.hour; delta-=t.hour; delta*=60;
76 Глава 4. Генерация комбинаторных объектов delta+=tnew.minute; delta-=t.minute; delta*=60; delta+=tnew.second; delta-=t.second; delta*=100; delta+=tnew.hsecond; delta-=t.hsecond; fprintf(f,"ХпВремя счета %ld.%ld сек", (long)(delta/100), (long)(delta%100)); fclose(f) ; 4.4. Порождение подмножеств множества Порождение подмножеств множества {аь а2,..., ап} эквивалентно порождению «-разрядных двоичных наборов аь принадлежащих подмножеству, если и только если /-й разряд равен единице. Таким образом, задача порождения всех подмножеств множества сводится к задаче порождения всех возможных двоичных последовательно- последовательностей длины п. Очевидно, что наиболее прямым способом порожде- порождения всех двоичных наборов длины п является счет в системе счисле- счисления с основанием 2, как показано в алгоритме 4.7. Перевод этого алгоритма на язык подмножеств множества {аь а2,..., ап} осуществляется согласно алгоритму 4.8, где добавлен фиктивный элемент ап+1. Алгоритм 4.7. Счет в системе счисления с основанием 2 для порождения всех п-разрядных наборов for i = 0 to n do bj = 0; while bn ф 1 do < /=0; while Ь =lito j^T0; bt =1. Алгоритм 4.8. Порождение подмножеств счетом в двоичной системе счисления S=0; Print(S); while on+1 iS do • /=0; while a ile a: eSdo\S-S~{ai}]
4.4. Порождение подмножеств множества 77 Задана «Счастливый билет». Дано п (п>2) произвольных цифр: аь я2> •> я,,, где я, е {1, 2,..., 9}, и произвольное целое число т. Написать программу, которая расставляла бы между каждой парой цифр аь я2,..., аю записанных именно в таком порядке, знаки +,- так, чтобы значением получившегося выражения было число т. Например, если аь аъ..., ап соответственно равны 1, 2,..., 9 и т = 5, то подойдет следующая расстановка знаков: 1—2+3—4+5—6+7—8+9. Если требуемая расстановка невозмож- невозможна, то сообщить об этом. Исходные данные вводятся из текстового файла, имеющего сле- следующую структуру. Первая строка — целое число п. Вторая строка — целое число т. Третья строка — цифры аь аъ..., ап через пробелы. Результаты расчетов сохранить в текстовом файле. Пример файла исходных данных: 14 71 65884752345789 Пример файла выходных данных: 6+5+8+8+4+7+5+2+3+4-5+7+8+9 = 71 6+5+8+8+4+7+5-2-3+4+5+7+8+9 = 71 6+5+8+8+4+7-5+2+3+4+5+7+8+9 = 71 6-5+8+8+4+7+5+2+3+4+5+7+8+9 = 71 Время счета = 0.60 с. Ясно, что для решения данной задачи достаточно выполнить полный перебор всех возможных вариантов расстановки знаков «±» между каждой парой цифр аь аъ..., ап и выбрать те расстанов- расстановки знаков «±», которые удовлетворяют условию равенства суммы величине т. Всего позиций для расстановки «±» равно п — 1, а значит для полного перебора необходимо проверить 2п~1 двоич- двоичных наборов, если «+» будет соответствовать 1, а «—» — 0. Программа решения задачи «счастливый билет» представлена алгоритмом 4.9. Процедура SubSet (подмножество) этой програм- программы реализует рассмотренный выше алгоритм 4.7 счета в системе счисления с основанием 2 для порождения всех (п — 1)-разрядных наборов. Порожденные двоичные наборы используются в проце- процедуре Summa (сумма) для формирования суммы, соответствующей данному набору знаков «±», где «+» соответствует 1, а «—» — 0.
78 Глава 4. Генерация комбинаторных объектов Алгоритм 4.9. Программа на Pascal 'e решения задачи «Счастливый билет» Program Lucky__ticket; {Счастливый билет) uses CRT, DOS; Const max_n=20; Type Vector=array[1..max_n] of Longlnt; Procedure Summa( var f:Text; var a,b:Vector; n,m:Integer ); Var S :Longlnt; i :Integer; begin S:=a[l]; for i:=l to n-1 do S:=S+B*b[i]-1)*a[i+1]; if S=m then begin Write(f,a[l]); for i:=l to n-1 do begin if b[i]=l then Write(f,'+') else Write(f,'-'); Write(f,a[i+l]); end; WriteLn(f,' = \S:4,' - число найдено!'); end; end; Procedure SubSet( var f:Text; var a:Vector; n,m:Integer ); Var b: Vector; i :Integer; begin for i:=l to n do b[i]:=0; while b[n]ol do begin Summa (f, a,bf n,m) ; i:=l; while b[i]=l do begin :=0; end; end; end;
4.5. Генерация размещений с повторениями 79 Var {Main} a :Vector; n,m,i :Integer; f :Text; {Текстовый файл} Hour,Minute,Second,SeclOO :Word; rHour,rMinute,rSecond,rSeclOO :Word; delta :LongInt; begin{Main} Assign(f,'Number.in'); Reset(f);{Файл открыт для чтения} Read(f,n); {Ввод количества цифр} Read(f,m); {Ввод счастливой суммы} for i:=l to n do Read(f,a[i]); Close(f); Assign(f,'Number.out' ); Rewrite(f); {Файл открыт для записи} GetTime(Hour,Minute,Second, SeclOO) ; SubSet(f,a, n,m) ; GetTime(rHour,rMinute,rSecond, rSeclOO) ; delta:=rHour-Hour; delta:=delta*60+rMinute-Minute; delta:=delta*60+rSecond-Second; delta:=delta*100+rSeclOO-SeclOO; WriteLn(f); WriteLn(f,'Время счета=', delta div 100,'.', delta mod 100,' c') ; Close(f) ; end {Main} . 4.5. Генерация размещений с повторениями Порождение множества всех размещений с повторениями длины к из элементов {а0, а1?..., ап_{} эквивалентно генерации множества А;-разрядных чисел в системе счисления с основани- основанием п: на г-и месте в размещении будет располагаться элемент аь если цифра в r-м разряде соответствующего числа равна /. Всего размещений с повторениями пк. Например, для к= 2 и п = 3 все наборы длины два в системе счисления с основанием три можно записать: 00,01,02,10,11,12,20,21,22. Тогда эквивалентные раз- размещения примут вид (аоао), (аоа{), (а0а2), (а{а0)9 (а{а{), (аха2), (а2а0), (а2а{), (а2а2). Алгоритм 4.10 использует фиктивный элемент Ък при порож- порождении наборов длины к в системе счисления с основанием л, где
80 Глава 4. Генерация комбинаторных объектов Ъх е {0, 1,..., п — 1}, / = 0, 1,..., А:, т.е. Ьх¦ — это цифры генерируемого числа в системе счисления с основанием п. Алгоритм 4.10. Счет в системе счисления с основанием п для порождения всех к-разрядных наборов fori = 0 tokdobi = 0', Pnnt(bk_{,bk_2,...,b0); /=0; while Ьк * 1 do whilebg =n-\do\bi 7°; [/=/+1; b, =b> +L 4.6. Порождение сочетаний Обычно требуются не все подмножества множества {аь а2,..., ап}, а только те, которые удовлетворяют некоторым ограничени- ограничениям. Особый интерес представляют подмножества фиксирован- фиксированной длины к, С„ сочетаний из п предметов по к штук. Как обычно, предполагаем, что основным множеством является множество натуральных чисел {1, 2,..., п}\ таким образом, будем порождать все сочетания длины к из целых чисел {1, 2,..., п}. Так, например, С\ =20 сочетаний из шести предметов по три (т.е. трехэлементные подмножества множества {1,2,3,4,5,6}) записываются в лексиког- лексикографическом порядке следующим образом: 123 135 234 256 345 346 356 456 Сочетания в лексикографическом порядке можно порождать последовательно простым способом. Начиная с сочетания {1, 2,...,к} следующее сочетание находится просмотром текущего со- сочетания справа налево с тем, чтобы определить место самого пра- правого элемента, который еще не достиг своего максимального зна- значения. Этот элемент увеличивается на единицу, и всем элементам справа от него присваиваются новые возможные наименьшие значения, как показано в алгоритме 4.11. Алгоритм порождения всех С„ сочетаний линеен, его сложность С^ +о(С*). 124 125 126 134 136 145 146 156 235 236 245 246
4.6. Порождение сочетаний 81 Алгоритм 4.11. Порождение сочетаний for / = 0 to к do с, = /; Print(cvc2,.. .,ck)\ while j while Cj =n-k + j do j =j -1; С • =Г • 4-1* J J ' fori=j + ltokdoCj =c _, +L Задача. Выпуклый многоугольник. Дано множество пар целых чисел (*!, >>!), (х2, >>2),.•• j (*Л5 Ул) — координаты точек на плоскости. Написать программу выделения тех точек из заданного множест- множества, которые являются вершинами выпуклого многоугольника, содержащего все остальные точки. Исходные данные представле- представлены в текстовом файле, имеющем следующую структуру. Первым числом в файле является целое п — количество точек. Последую- Последующие числа определяют п пар целых (xifyt) — координаты точек. Ре- Результаты расчетов, признаки принадлежности исходных точек выпуклому многоугольнику: 0 — точка не принадлежит, 1 — точ- точка принадлежит, сохранить в текстовом файле. Пример файла исходных данных: 15 0099512327115467 15673457788764 Выходной файл для данного примера: 1110 10001000010 Решение. Если не применять специальных методов, то в каче- качестве решения можно использовать следующий алгоритм. Ясно, что точка (х( >>,) является вершиной выпуклого многоугольника, если она не лежит ни в одном треугольнике, вершинами которых являются исходные точки (хь у{), (х2, Уг),---, (хп> Уп)> без рассмат- рассматриваемой точки (xt yt). Всего треугольников из п точек можно со- составить СЛ3 + О(п3). Тогда сложность задачи полного перебора тре- треугольников ддя каждой точки (х, у{) составит 0(я4). Реализация данного подхода представлена программой на языке Pascal в ал- алгоритме 4.12.
82 Глава 4. Генерация комбинаторных объектов Алгоритм 4.12. Программа поиска точек выпуклой оболочки Program Start_Envelope; {Выпуклая оболочка} uses CRT,DOS; const n_max=100; type Vector=array[1..n_max] of Integer; Combine=array[0..3] of Integer; var f :Text; {Текстовый файл} x,y :Vector; {Координаты точек} z :Vector; {Характеристический вектор выпуклой обо- оболочки} Procedure Envelope( var с:Combine; n:Integer ); {Формирование оболочки} Const k :Integer=3; Var i,a :Integer; kl,k2,k3 :Integer; signl,sign2,sign3 :Integer; begin kl:=c[l]; k2:=c[2]; k3:=c[3]; for i:=l to n do begin if (i=kl) or (i=k2) or (i=k3) then continue; a:=(x[kl]-x[i])*(y[k2]-y[i])- =a div abs(a); if a=0 then continue; signl a:=(x[k2]-x[i])*(y[k3]-y[i])- (x[k3]-x[i])*(y[k2]-y[i]) if a=0 then continue; sign2 a:=(x[k3]-x[i])*(y[kl]-y[i])- if a=0 then continue; sign3 =a div abs (a); =a div abs(a); if (signl=sign2) and (sign2=sign3) then z[i]:=0; end; end; Procedure Print( var с:Combine; n:Integer ); Var i :Integer; begin WriteLn(f); for i:=l to n do Write(f,с [i],' '); end;
4.7. Порождение композиций и разбиений 83 Procedure Combination( n:Integer ); {Генерация сочетаний из п по 3} Const k :Integer=3; {Длина сочетания} Var с :Combine; {Сочетание} i,j :Integer; begin for i:=l to к do c[i]:=i; while j<>0 do begin {Print(c,k);} Envelope(c,n); j:=k; while c[j]=n-k+j do j:=j-l; for i:=j+l to к do с[i]:=c[i-1]+1; end; end; Var {Main} i,n :Integer; {Число исходных точек} begin {Main} Assign(f,'Envelope.in' ) ; Reset(f); {Файл открыт для чтения} Read(f,n); {Ввод данных} for i:=l to n do begin Read(f,x[i],у[i]); z[i]:=l;end; Close (f); Assign(f,'Envelope.out' ); Rewrite(f); {Файл открыт для записи} Combination(n); WriteLn(f); {Результаты: номера точек выпуклой оболочки} for i:=l to n do Write(f,z[i],' x); Close (f); end. {Main} 4.7. Порождение композиций и разбиений Рассмотрим задачу порождения разбиений положительного числа п в последовательность неотрицательных целых чисел {z\, г2,..., zd, так что ц + z2 + -. + Zk = п. Разбиение {^i, ^v, z^} называется композицией числа п, если учитывается порядок чисел zr Как правило, представляют инте- интерес композиции, в которых либо все z§ ^ 0, либо все ^ > 0.
84 Глава 4. Генерация комбинаторных объектов Разбиение {z\, ф>•••> z*} называется разбиением числа л, если все Zi > 0 и порядок чисел г,- не важен. По сути разбиение {z\, Zi,.-., z^i числа п является мультимножеством (см. п. 1.8). Рассмотрим примеры разбиения числа п = 3. A, 2), B, 1) — все композиции числа три из двух частей, zx > 0. A,1,1) — все композиции числа три из трех частей, Zj > 0. @, 3), A, 2), B, 1), C, 0) — все композиции числа три из двух час- частей, Zi > 0. C), A, 2), A, 1, 1) — все разбиения числа три. Композиции z, > 0 Композицию {z\, Z2>»; Zk\, гдец ? 0, числаZ\ + Zi +...+ z^ = n можно интерпретировать следующим образом. Каждое значение Zj= 1/+ 1/+ ... + 1, представим как сумму единиц, количество кото- которых Zj- Индекс у элемента 1, показывает его принадлежность разло- разложению числа Zj. Таким образом, мы ввели к типов различных эле- элементов {1Ь 12,.-} Ы, значение каждого из них равно единице. Те- Теперь любую композицию можно представить как сумму, составлен- составленную из п произвольных единиц множества {1Ь 12,..., 1*}. Суммируя подобные единицы 1, с одинаковыми индексами, получим соответ- соответствующие значения Zj композиции. Данное соответствие является взаимно однозначным, откуда и следует, что число композиций равно числу сочетаний с повторениями С^ = С^~\_{ = C^+k_{. Каждое из сочетаний С"+к_{ можно интерпретировать как расстановку 1 и 0 длины п + к - 1, в которой п единиц пк-1 нуль, т.е. каждому соче- сочетанию ставим в соответствие (п + к- 1)-разрядное число из единиц и нулей; верно и обратное. Суммируя в таком числе слева направо единицы между нулями (их к - 1), будем получать соответствующие значения членов z{ (их к) композиции. Например, одному из с"+к-\ =ci7+7-i сочетаний 11011100111101111111010 соответствует композиция B,3,0,4,7,1,0) числа 17. Ясно, что методы предыдущего раздела генерации подмно- подмножеств множества легко применить к последовательному порож- порождению рассмотренных композиций zi > 0. Композиции zt > 0 Удобное представление композиций получается из рассмотре- рассмотрения целого числа п как отрезка прямой, состоящего из отрезков единичной длины. Линия разделена п - 1 точками, и композиция
4.7. Порождение композиций и разбиений 85 —- 1- получается пометкой некоторых из них. Элементами компози- композиции являются просто расстояния между смежными точками. На рисунке показано графическое представление композиции B,1,2,2,1) для числа п = 8. Очевидно, что каждая композиция чис- числа п соответствует способу выбора подмножества из п - 1 точек. Каждой точке можно сопоставить двоичную цифру, и, таким об- образом, композиции п будет соответствовать (п - 1)-разрядное число. В этой интерпретации композиция из к частей соответст- соответствует (п - 1)-разрядному числу ровно с к - 1 единицами, и поэтому существует С*г/ таких композиций. Воспользуемся методами предыдущего раздела для генерации композиций Zj > 0. Учитывая, что в композиции Z\ + Zi +...+ Zk = п каждый из Zi > 0, тогда для новых переменных г,- = zx¦,- 1, (г,- > 0) со- соответствующая композиция (г1? r2,..., rk) будет для числа п- к = = г{ + г2 +...+ гь г, > 0. Генерация слагаемых г,- > 0 композиции (г1? г2,..., гА) подробно разобрана в предыдущем разделе, добавляя к каждому из г, по единице, получим слагаемые Z\ > 0 композиции {Z{, Z2,-»9 Zk}- Разбиения Разбиения п отличаются от композиций п тем, что порядок компонент не важен, так что, например, не делается различия между, скажем, 1+1+2,1+2+1, 2+1+1. Таким образом, разбиение п можно рассматривать как мультимножество, которое записы- записывается следующим способом: где имеется тх вхождений Z\, Щ вхождений ?2> Щ вхождений z3 к и т. д. и n=^mjZj. Каждое разбиение удовлетворяет условию /=1 Z\ > Zi > ... > Zk- Рассмотрим пример генерации разбиений для п = 7. Последовательность генерации разбиений данного примера далее будет положена в основу алгоритма порождения полного списка разбиений. Идея приведенного списка разбиений состоит в том, чтобы пе- переходить от одного разбиения к следующему, рассматривая са- самый правый элемент mkmzk разбиения. Если mkzk достаточно ве-
86 Глава 4. Генерация комбинаторных объектов лико (тк > 1), можно исключить два zk Для того, чтобы добавить еще одно ^ + 1 (или включить одно zk+ I, если в текущий момент его нет). Если тк = 1, то тк_\Х.к-\ + ^Л достаточно велико для того, чтобы добавить ^_i + 1. Все, что остается, превращается в соответствующее число единиц и формируется новое разбиение. {7*1} -{1, {1*2,5*1} {2-2,3-1} {3-2,1-1} {1-3,4-1} {1-3,1-2,2-1} {1-3,2-2} {2-3,1-1} {1*4,3-1} {1-4,1-2,1-1} {1-4,1-3} {1*5,2-1} {1*5,1-2} {1*6,1-1} {1*7} = {2,1,1,1,1, 1} ={2,2,1,1,1} ={2,2,2,1} = {3,1,1,1,1} = {3,2,1,1} ={3,2,2} ={3,3,1} = {4,1,1,1} ={4,2,1} ={4,3} ={5,1,1} ={5,2} = {6,1} = {7} Алгоритм 4.13 использует рассмотренный процесс для порож- порождения всех разбиений числа п. Алгоритм 4.13. Генерация разбиений числа п «-1 = 0; 0 while do\ Print{ml •zvm1 = mkzk', if zk i = zk)\ J else т. =1; k+i -1; if Summa >zk then I mk+l =Summa-zk\
4.7. Порождение композиций и разбиений 87 Алгоритм 4.13 линеен, так как число операций, необходимых для перехода от одного разбиения к другому, ограничено кон- константой, не зависящей от пи к. Программа на языке Pascal реализации рассмотренного мето- метода генерации разбиений чисел приводится в алгоритме 4.14. От- Отметим, что в программе число для разбиения п читается из файла, а порождаемые разбиения сохраняются в файле. Попутно про- программа вычисляет полное время генерации всех разбиений с точ- точностью до сотых долей секунды, которое сохраняется в конце файла сгенерированных разбиений. Алгоритм 4.14. Программа на Pascal'e генерации разбиений числа п Program Start_Divide; {Разбиение числа п} uses CRT,DOS; Const max_n=100; { n<=max_n } Type Vector=array[-1..max_n] of Integer; Var f :Text; z,m -.Vector; Procedure Print( var m,z:Vector; k:Integer ); (Печать разбиения} Var i :Integer; begin Write(f,'{M; for i:=l to k do begin Write(f,m[i],'*',z[i]); if iok then Write (f, ' , '); end; WriteLn(f,'}'); end;{Print} Procedure Divide( n:Integer );{Разбиение числа п} Var k,Sum :Integer; begin; k:=l; z[-l]:=0; m[-l]:=0;
88 Глава 4. Генерация комбинаторных объектов z[0]: т[0]:=0; =п; while k<>0 do begin Print (m, z, k) ; Sum:=m[k] *z [k] ; if m[k]=l then begin k:=k-l; Sum:=Sum+m[k] *z [k] ; end; if z[k-l]=z[k]+l then begin k:=k-l; m[k]:=m[k]+1; end else begin z[k]:=z[k]+1; m[k]:=l; end; if Sum>z[k] then begin :=Sum-z[k]; k:=k+l end; end; end;{Divide} Var {Main} n :Integer; {Число для разбиения} Hour,Minute,Second,SeclOO :Word; rHour,rMinute,rSecond,rSeclOO :Word; delta :LongInt; begin Assign(f,'Divide.in'); Reset(f); {Файл открыт для чтения} ReadLn(f,n); {Чтение числа п} Close(f); Assign(f,'Divide.out'); Rewrite(f); {Файл открыт для записи} GetTime(Hour,Minute,Second, SeclOO) ; Divide(n); GetTime(rHour,rMinute,rSecond, rSeclOO) ; delta:=rHour-Hour; delta:=delta*60+rMinute-Minute; delta:=delta*60+rSecond-Second; delta:=delta*l00+rSeclOO-Seel00; WriteLn(f,'Время счета=',delta div 100,'.', delta mod 100,' сек'); Close(f); end.
4.8. Генерация случайных перестановок 89 4.8. Генерация случайных перестановок Пусть я = (яь я2,..., пп) — произвольно выбранная перестанов- перестановка целых чисел 1, 2,..., л, например, я = A, 2,..., п) — тождествен- тождественная. Случайную перестановку можно получить за линейное время О(п) из выбранной перестановки я = (яь я2,..., я„), выполнив в ней п транспозиций (см. п.7.4). Для промежуточных перестановок введем верхний индекс, значение которого будет соответствовать количеству выполнен- выполненных транспозиций. Один из элементов в каждой транспозиции выбирается случайным образом. Индекс такого элемента уста- устанавливается функцией rand(k,l), которая порождает независимые случайные целые числа на отрезке [к, /] с равномерным распреде- распределением. Положим я( 0) = (я^, яB0),..., я^0)) равной исходной перестановке я = (я1? я2,..., я„). Каждая следующая перестановка я(Л) =(я^ ,п^,..., тг^)) получается из предыдущей перестановки я**"* = (п^к~1) ,п^2к~{), ...,п[к~1)) транспозицией элементов я^** и ^~]L )9тд&к= 1,2,..., п. Между элементами перестановок тг@), тгA),..., тх(л) выполняются ра- равенства 71(ЛЛ) =п{?-1} =... = п(*\ где к= 1, 2,..., л. Покажем, что после выполнения всех указанных п транспози- транспозиций равновероятно получение любой из п\ возможных перестано- перестановок а = (а1? а2,..., стл) исходных чисел я 1? я2,..., пп. Для этого доста- достаточно проверить, что Рг(я(л) = а) = \/п\. С этой целью введем со- события v4j, Л2,..., Лл. 1 rand(k/i) *' 1 12 ^ ^-1 {п[к) =ак\п\1) =а,&яB2) = Вероятности данных событий, согласно схеме формирования @) A),..., я(и), равны = 1/(л - ik+ 1), где А: = 1, 2..., «. перестановок п@), лA),..., я(п), равны
90 Глава 4. Генерация комбинаторных объектов Условие я^} =а1&7гB*-1) =а2&...&71(^1) =ак_{ в событии ЛА, к = 2,..., п, обеспечивает выбор элемента п{к~\], ч из множества 999 * rand{k/i) {n[k~l\n[k'l\...,n[k~l))y которое совпадает с множеством {ок, Л л + 1 аЛ+1,..., ап}. Индекс же rand{k, n) элемента ^~jL является неза- независимой случайной величиной с равномерным распределением на отрезке [к, п] целых чисел. Теперь заметим, что Рг(тг(л) =а)= Рассмотренный метод генерации случайной перестановки представлен в алгоритме 4.15. Алгоритм 4.15. Генерация случайной перестановки for k= I to n donk = k\ {Начальная перестановка) for k- 1 to n - 1 do nk<r> nrand(kny {Случайная перестановка) или, если генерацию перестановки вести с конца, for k- I to n do nk = к; {Начальная перестановка) for k = n to 2 donk<-> Krand(lk)\ {Случайная перестановка).
Сортировка и поиск ассматриваемые здесь вопросы можно отнести к наиболее часто встречающимся в задачах машинной обработки данных. Почти во всех компьютерных приложениях множество объектов должно быть переразмещено в соответствии с некоторым заранее определенным порядком. Очевидно, что с сортированными дан- данными легче работать, чем с произвольно расположенными. Сор- Сортировка больших объемов данных составляет значительную часть коммерческой обработки данных, эффективные алгоритмы для сортировки важны и с экономической точки зрения. Эффектив- Эффективность оценивается с точки зрения требуемых памяти и времени, а также простоты программирования. Простота программирова- программирования предполагает и простоту понимания используемого метода, поскольку для того, чтобы написать хорошую программу, важно хорошо понять соответствующий метод. В наших же оценках мы будем учитывать только число сравнений. Самые простые алго- алгоритмы сортировки, основанные на сравнении элементов, имеют сложность порядка О(п2), а лучшие из них обходятся количеством сравнений O(n\og2n). Задачу сортировки можно сформулировать так: дана последо- последовательность из п элементов аьаъ..., а„, выбранных из множества, на котором задан линейный порядок, т.е. для любых ai9 aj выпол- выполняется либо я, < ар либо я, < ар либо я, = ар либо я, > ар либо я,- > ар Требуется найти перестановку п = (пь я2,..., пп) этих п элементов, которая отобразит данную последовательность в неубывающую последовательность ап <аК2<...<аКп. Как правило, далее будем получать саму упорядоченную последовательность, а не упорядо- упорядочивающую перестановку п. Методы сортировки классифицируются на внутренние (когда данные размещаются в оперативной памяти) и внешние (когда данные размещаются на внешней памяти). Внешняя сортировка составляет часть таких приложений, в которых в работу вовлека- вовлекается гораздо больше элементов, чем можно сразу запомнить в оперативной памяти. Поэтому методы внешней сортировки при-
92 Глава 5. Сортировка и поиск менимы к данным, находящимся на внешних устройствах памя- памяти, и имеют огромное коммерческое значение. Внутренняя сортировка важна как для разработки алгоритмов, так и для коммерческих приложений. Сортируемые данные раз- размещаются в оперативной памяти. Здесь рассматриваются именно методы внутренней сортировки данных. Известно много алго- алгоритмов сортировки данных. Почему же так много методов сорти- сортировки? Ответ состоит в том, что каждый метод имеет свои преи- преимущества и недостатки, поэтому он оказывается эффективнее других при некоторых структурах данных и аппаратной части. Здесь же мы не пытаемся охватить даже те из них, которые счи- считаются важными; скорее, мы ограничимся методами, оказавши- оказавшимися полезными в разработке алгоритмов и в практической их ре- реализации. Рассматриваемые здесь методы сортировки активно используются при разработке алгоритмов во многих разделах данного пособия. Полезно изучить характеристики каждого ме- метода сортировки, чтобы можно было производить разумный вы- выбор для конкретных приложений. К счастью, задача изучения этих алгоритмов не столь уж громоздка. 5.1. Сортировка вставками Сортировка вставками элементов аъаъ...,ап относится к наи- наиболее очевидным методам (алгоритм 5.1). Для компактности ал- алгоритма вводится фиктивный элемент а0, значение которого устанавливается равным -оо. Сортировка проходит цикл дляу = 2, 3,..., п\ для каждого./ элемент я, вставляется в свое правильное место среди аь аъ..., а]Л. При вставке элемент я, временно разме- размещается в wn просматриваются имена aj_{, а^_ъ..., а{\ они сравни- сравниваются с w и сдвигаются вправо, если обнаруживается, что они больше w. Имеется фиктивный элемент я0, значение которого -оо служит для остановки просмотра слева. Алгоритм 5.1. Сортировка вставками а0 = -оо; forj= 2 to n do while w <я, do \ /+1
5.2. Пузырьковая сортировка 93 Сложность алгоритма определяется числом проверок условия w < я, в цикле. Сравнение w < я, для конкретного w = я, (/ > 2) вы- выполняется 1 + dj раз, где dj — число элементов, больших я7 и стоя- стоящих слева от него, т.е. dj — это число инверсий, у которых второй элемент я,. Числа dj составляют таблицу инверсий dxdv..dn, а так как 0 < ^ < л - 1, 0<d2<n- 2,..., 0 < dn_x < 1, dn = О, то в худшем п случае сортировка элементов яь я2,..., ап потребует ^A + ^7)< 7=2 n-j)=— -=0(n ) сравнений. Сложность сортировки 7=2 2 вставками является квадратичной. 5.2. Пузырьковая сортировка Рассматриваемый метод пузырьковой сортировки последова- последовательности аь я2,..., ап представляет собой наиболее очевидный метод систематического обмена местами слева направо смежных элементов, не отвечающих выбранному порядку, до тех пор пока каждый элемент не оказывается на правильном месте. Эта техни- техника получила название пузырьковой сортировки, так как большие элементы «пузырьками всплывают» вверх в конец списка. Реали- Реализация метода представлена алгоритмом 5.2. В алгоритме исполь- используется переменная Ь, значение которой при каждом проходе цик- цикла устанавливается равным наибольшему индексу t, такому, что все элементы я,+1, я/+2,..., ап уже находятся на своих окончатель- окончательных позициях. Ясно, что не имеет смысла продолжать просмотр для указанных элементов. Алгоритм 5.2. Пузырьковая сортировка while b*Odo< for j=\tob-\do ifa.>au, then\п] **"aJ+l' J [t=j; b=t. Сложность алгоритма определяется числом проверок условия aj > aj+\ B цикле и числом обменов а7 <-> а,+1, которое равно числу инверсий в исходной перестановке элементов ах, а2,..., ап. Опре- Определим число сравнений. В худшем случае верхняя граница Ь-\
94 Глава 5. Сортировка и поиск вложенного цикла for на каждом шаге внешнего цикла while будет 1 уменьшаться на 1, тогда число сравнений равно ^(Ь -1) = (п - 1) + Ь=п + (п - 2) +...+ 1 = — -=О(п2). Сложность пузырьковой сорти- сортировки является квадратичной. В алгоритме 5.3 представлена «полная» пузырьковая сортиров- сортировка. Это наиболее популярный и упрощенный вариант алгоритма 5.2. Ясно, что основным достоинством алгоритма полной пузы- пузырьковой сортировки является легкость программирования. Сложность же алгоритма 5.3 остается постоянной, равной -2)+...+ ! = — -=О(п2\ и не зависит от рас- 2 положения исходных данных. Алгоритм 5.3. Полная пузырьковая сортировка for i=l to n do begin forj = 1 to n - i do begin ifaj > aJ+l then aj <-> aJ+l end; end. 5.3. Сортировка перечислением Идея сортировки последовательности аь а2,..., ап данныхпере- числением состоит в том, чтобы сравнить попарно все элементы аь аъ..., ап и подсчитать, сколько из них меньше каждого отдель- отдельного элемента (алгоритм 5.4). Для подсчета числа элементов, ме- меньших данного, в алгоритме используется вспомогательный век- вектор с1? с2,..., сп. После завершения алгоритма значения с,- + l,y = 1, 2,..., п определяют окончательное положение элементов ду в сор- сортированной последовательности гъ г2,..., гп. Алгоритм 5.4. Сортировка перечислением for i=\ to n do Cj = 0 {Сбросить счетчики} for i = n to 2 by -1 do begin forj = / - 1 to 1 by -1 do begin ifat > aj then c, = c{¦+ 1 else Cj= Cj+ 1 end;
5.4. Сортировка всплытием Флойда 95 end, for i-\tondo begin; rc +{ =at { г,— сортированные элементы} end. Сложность алгоритма сортировки перечислением определяет- определяется парой вложенных циклов и составляет О(п2). Величина слож- сложности не зависит от расположения данных в исходной последова- последовательности аь д2,..., ап- Пусть перестановка п = (nl,n2,...,nn),rjiQni = ci,+ 1, /= 1, 2,..., п. Алгоритм 5.4 сортировки перечислением определяет перестанов- перестановку я, которая соответствует расположению а Л <а А <,..<а А исходных данных (см.п.1.14). 5.4. Сортировка всплытием Флойда Все ранее упомянутые методы сортировки последовательно- последовательности аь а2,..., ап требовали сравнений порядка О(п ), и «это никуда не годится». Рассмотрим один из наиболее элегантных и эффек- эффективных методов сортировки сложности O(nlogn), предложенный Флойдом. До сих пор он остается самым оптимальным из сущест- существующих методов. В алгоритме активно используется упорядочен- упорядоченное двоичное дерево, пример которого представлен на рис. 5.1. 96 _ 39 57 22 17 2 28 Рис. 5,1. Пример упорядоченного двоичного дерева Значение в каждой его вершине не меньше, чем значение в его дочерних вершинах. Двоичное дерево называется частично упоря- упорядоченным, если свойство упорядоченности выполняется для каж- каждой из его вершин, однако для корня это свойство нарушается. Пример частично упорядоченного дерева приведен на рис. 5.2. 57 _ 39 96 22 17 2 28 Рис- 5.2. Пример частично упорядоченного двоичного дерева
96 Глава 5. Сортировка и поиск Интересно отметить, что в ранее рассмотренных методах сор- сортировки сложности О(п2) при выборе наибольшего (наименьше- (наименьшего) элемента, «забывали» информацию о других, забракованных элементах на эту роль, хотя эта проверка и выполнялась. Структу- Структура же дерева позволяет сохранить состояние процесса сортировки последовательности аь а2,..., ап на каждом его шаге, с целью ис- использования этого состояния в дальнейших расчетах и уменьше- уменьшения числа операций сравнений при поиске наибольшего (наи- (наименьшего) из оставшихся элементов. Метод сортировки Флойда представлен в алгоритме 5.5, где исходная последовательность аъ аъ..,, я„ данных представляется в виде дерева на смежной памяти (одномерный массив а[1..п]). В таком дереве ребра присутствуют неявно и вычисляются с помо- помощью арифметических операций над индексами элементов масси- массива — смежной памяти. Пример двоичного дерева показан на рис. 5.3. Корень дерева — а[1], за каждой вершиной а [к] следуют вершины а[2к] и а[2к+1]. Использование смежной памяти для представления дерева имеет и другие преимущества, которые ста- становятся очевидными после анализа алгоритма 5.5. а[4] а[5] а[6] Рис. 5.3. Пример двоичного дерева на смежной памяти Основу алгоритма 5.5 составляет процедура SURFACE (a[i..k]) всплытия Флойда, которая за O(log2fl) сравнений преобразует почти упорядоченное поддерево в упорядоченное. Поддерево представляется на одномерном массиве a[i..k], рис.5.4, где a[i] — корень поддерева, а[к] — максимальный элемент массива, кото- который еще может принадлежать поддереву. a[k] Рис. 5.4. Двоичное поддерево на смежной памяти a[i..k]
5.4. Сортировка всплытием Флойда 97 Определим сложность процедуры SURFACE всплытия Флой- Флойда. Процедура заключается в том, что значение из корня (здесь может нарушаться условие упорядоченности) всплывает по на- направлению к листьям (последний уровень вершин в дереве) до тех пор, пока дерево не преобразуется в упорядоченное. Во время всплытия на каждом уровне выполняется конечное число С опе- операций сравнения элементов. Если положить, что высота дерева (число уровней в дереве) равна А, то сложность одного всплытия составит С • h = O(h). Высота h регулярного двоичного дерева из п вершин легко находится из соотношения п < 2° + 21 +...+ 2Л~\ где 2' — количество вершин на /-м уровне дерева, /= 1, 2,..., п. От- Отсюда высота дерева h = flog2(fl + 1I. Таким образом, сложность процедуры SURFACE всплытия Флойда составляет О(\о%2п). Рассмотренная процедура SURFACE всплытия Флойда позво- позволяет в почти упорядоченном дереве найти наибольший (наимень- (наименьший) элемент за число сравнений O(log2n), преобразуя дерево к упорядоченному виду. В результате найденный элемент будет располагаться в вершине дерева. Для сортировки же множества элементов аь аъ...,ап из них по алгоритму 5.5 сначала организует- организуется почти упорядоченное двоичное дерево при помощи повторно- повторного применения алгоритма SURFACE всплытия Флойда сначала к самым мелким его поддеревьям от листьев и затем ко все более крупным. Листья тривиально упорядочены, поэтому можно на- начать с минимальных поддеревьев, содержащих несколько вер- вершин, и укрупнять их, каждый раз полностью, применяя алгоритм всплытия до тех пор, пока таким образом не будет достигнут ко- корень дерева. Заметим, что каждое из поддеревьев, к которым при- применяется алгоритм всплытия, удовлетворяет условию почти упо- упорядоченности, поскольку упорядочивание проходит от листьев к корню. Именно таким способом в алгоритме 5.5 осуществляется формирование исходного почти упорядоченного дерева. После того как дерево упорядочено, наибольший (наимень- (наименьший) элемент оказывается в его корне. По алгоритму 5.5 найден- найденный элемент меняют местами с самым последним листом в дере- дереве (последний элемент рассматриваемого массива), дерево уме- уменьшается на одну вершину и все готово для определения нового наибольшего (наименьшего) элемента множества при помощи следующего применения процедуры SURFACE всплытия Флойда. На рис. 5.5 показана полная последовательность перестановок и всплытий, которые происходят после формирования из исходно- 4—2697
98 Глава 5. Сортировка и поиск го множества почти упорядоченного дерева и вплоть до того, как в этом дереве останется всего одна вершина, а исходное множест- множество окажется отсортированным. -> 18 -*- всплытие -> 66 -> перестановка-> 56 / \ / \ / \ 65 66 65 63 65 63 /\ /\ /\ /\ /\ / 4 37 63 56 4 37 18 56 4 37 18 66 почти упорядоченное дерево всплытие ->65 -> перестановка -> 18 -> всплытие -> 63 / \ / \ / \ 56 63 56 63 56 18 /\ /\ /\ /\ 4 37 18 66 4 37 65 66 4 37 65 66 перестановка ->37-* всплытие -> 56 -> перестановка -> 4 56 18 37 18 37 18 4 63 65 66 4 63 65 66 56 63 65 66 всплытие -> 4 56 63 перестановка -> 18 56 63 37 -> перестановка -> ч / \ 18 65 66 •4 37 65 66 4 56 63 56- ,18 -> 37 65 is 15 ^-— ->бз- всплытие 66 56 ^37 ->65—*66 -> 18 4 37 63 65 66 Рис. 5.5- Пример сортировки чисел 18,4,56,65,37,63,66 методом Флойда Алгоритм 5.5. Сортировка всплытием Флойда сложности Oinlog2n) Program Floid/ { Сортировка по возрастанию всплытием Флойда } uses CRT; const n = 1000; {Размер массива данных для сортировки} type Vector = array[l..n] of Integer; Var f .-Text; {Текстовый файл для результатов сортировки}
5.4. Сортировка всплытием Флойда 99 procedure Init( var a: vector; n: integer); { Заполнить вектор a[l..n] случайными числами } var i: integer; begin Randomize; for i:=l to n do a[i]:=RandomA00); end; procedure Surface( var a: Vector; i,k: integer); { Процедура всплытия Флойда по дереву a[i..k] } var j,m,copy :Integer; begin copy:=a[i]; m:=2*i; while m<=k do begin if m=k then j:=m else if a[m]>a[m+l] then j:=m else j:=m+l; if a[j]>copy then begin a[i]:=a[j]; i: =j ; m:=2*i; end else break; {выход из цикла} end; a[i]:=copy; end; procedure Sort( var a: Vector; n: integer); { Сортировка вектора a[l..n] методом Флойда } var i,k,w :Integer; begin {Формировать исходное частично упорядоченное дерево} for i:=n div 2 downto 2 do Surface(a,i,n); {Выполнить процедуру всплытия Флойда для каждого поддерева} for k:=n downto 2 do begin Surface(a,l,k); {Поместить найденный максимальный элемент в конец списка} w:=a[k]; a[k]:=a[l]; a[l]:=w; end end;
100 Глава 5. Сортировка и поиск Var {Main} а : Vector; {Вектор исходных данных для сортировки} i : Integer; begin; {Main} Assign(f,'sort.out'); Rewrite(f); {Файл открыт для записи} Init(a,n); {Сохранить исходные данные} for i:=l to n do WriteLn(f,'a[ \ i:1,']=',a[i] :3); Sort(a,n); {Сохранить сортированные данные} WriteLn(f); for i:=l to n do WriteLn(f, ' s[ \ i:1, ']=', a[i] :3) ; Close(f); end. {Main} Оценим общую сложность алгоритма сортировки данных рас- рассматриваемым методом. Процедура SURFACE всплытия Флойда выполняется п раз сначала для формирования исходного почти упорядоченного дерева (процедура применяется для каждой вер- вершины дерева) и затем п раз для всплытия каждого наибольшего (наименьшего) элемента в почти упорядоченном дереве. Так как сложность процедуры SURFACE всплытия Флойда составляет 0(log2fl), общая сложность алгоритма сортировки данных аь а2,..., ап равна O(nlog2n). Это лучшая оценка, на что вообще можно надеяться при сор- сортировках, в основу которых положены сравнения данных. Дейст- Действительно, число возможных перестановок из элементов аь я2,..., ап равно п\ и только одна из них удовлетворяет условию нашей сортировки. Двоичный же поиск перестановки среди множества п\ перестановок требует log2fl! числа сравнений. Для упрощения воспользуемся формулой Стирлинга п\~л12ппппе~п. Тогда log2fl! ~Лжпппе~п = O(nlog2n). Задана. Длина объединения отрезков. Текстовый файл содержит целые числа: а{, Ьь а2, Ь2,..., ат Ьп. Данная последовательность чи- чисел определяет на прямой п отрезков [aif 6J, /= 1, 2,..., л. Найти длину объединения указанных отрезков. Исходные данные пред- представлены в текстовом файле со следующей структурой. Первая строка файла: п — количество отрезков. Вторая, третья и т.д. стро- строки файла содержат целые числа аь Ъх — границы соответствующих отрезков. Результаты расчетов длины объединения отрезков со- сохранить в текстовом файле.
5.4. Сортировка всплытием Флойда 101 Пример файла исходных данных: з О 2 -1 1 О 1 Пример файла выходных данных: з Решение. Алгоритм 5.6 решения задачи основывается на пред- предварительной сортировке абсцисс аь Ьь а2, Ь2,...9 ап, Ьп в массиве ab[1..2n]. Создается вспомогательный массив #[1..2л], который поддерживает после сортировки массива ab[l..2n] отношение границ отрезков: g[i] = 1 — левая граница, g[i] = О — правая грани- граница. Вычисление завершается простым просмотром массива ab[\.2n] за линейное время. Общая сложность алгоритма опреде- определяется сложностью сортировки данных. В данном случае исполь- используется алгоритм пузырьковой сортировки сложности 0(п2). Алгоритм 5.6. Программа расчета длины объединения отрезков Program MeasureLength; {Длина объединения отрезков} uses CRT,DOS; const n_max=100; type Vector=array[0..2*n_max] of Integer; var f :Text; {Текстовый файл} ab :Vector; {Границы отрезков a[i], b[i]} g :Vector; {Признаки границ: 1-левая, 0-правая} Procedure Measure( Var m: Longlnt; n:Integer ); {Расчет объединения} Var i,c :Integer; begin ab[0]:=ab[1]; m:=0; {Длина объединения} c:=0; {Число перекрывающихся интервалов} for i:=l to n do begin if c<>0 then m:=m+ab[i]-ab[i-1]; if g[i]=l {-левая граница} then c:=c+l else c:=c-l; end; end;
102 Глава 5. Сортировка и поиск Procedure SortBubble( n:Integer ); {Сортировка границ a[i],b[i] и g[i]} Var i,j,w :Integer; begin for i:=l to n do begin for j:=l to n-i do begin if ab[j] > ab[j+l] then begin w:=ab[j]; ab[j]:=ab[j+l]; ab[j+1]:=w; w:=g[j]; g[j]:=g[j+l]; g[j+l]:=w; end; end; end; end; Var {Main} i,k :Integer; n :Integer; {Число исходных точек} m :LongInt; {Длина объединения отрезков} begin {Main} Assign(f,'Measure.in' ) ; Reset(f); {Файл открыт для чтения} Read(f,n); {Ввод данных} for i:=l to n do begin k:=2*i; Read(ffab[k-l],ab[k]); g[k-l]:=l; {Левая граница} g[k]:=O; {Правая граница} end; Close(f); Assign(f,'Measure.out' ); Rewrite(f); {Файл открыт для записи} SortBubbleB*n); Measure(m,2*n); WriteLn(f,m) ; {Длина объединения} Close(f) ; end. {Main} 5.5. Последовательный поиск Задача поиска является фундаментальной в алгоритмах на ди- дискретных структурах. Удивительно то, что, накладывая незначи- незначительные ограничения на структуру исходных данных, можно по- получить множество разнообразных стратегий поиска различной степени эффективности.
5.5. Последовательный поиск 103 При последовательном поиске подразумевается исследование элементов множества аь аъ..., ап в том порядке, в котором они встречаются. «Начни сначала и продвигайся, пока не найдешь нужный элемент; тогда остановись». Такая последовательная процедура является очевидным способом поиска. Алгоритм 5.7 выполняет последовательный поиск элемента z в множестве аь а2,..., ап. Несмотря на свою простоту, последовательный поиск содержит ряд очень интересных идей. Алгоритм 5.7. Последовательный поиск с = 0; {Признак поиска записи z } [с =1* for / = 1 to n do ifz = a* then {, ' J J ' [break; ifc=l then Запись найдена else Запись не найдена. Оценим среднюю сложность поиска элементов множества аь а2,..., ап. Для нахождения /-го элемента я, требуется / сравнений. Для вычисления же среднего времени поиска необходимо задать информацию о частоте обращения к каждому элементу множест- множества. Будем предполагать, что частота обращения распределена рав- равномерно, т.е. что ко всем элементам обращаются одинаково час- часто. Тогда средняя сложность поиска элемента множества являет- является -У1 / = = О(п) линейной. *ы\ 2 Рассмотрим распределение частот обращения к элементам в общем случае. Пусть р, обозначает частоту (распределение веро- п ятностей) обращения к элементу аь где р/^Ои^р,- =L В этом случае средняя сложность (математическое ожидание) поиска п элемента будет равна ^/р,. Хорошим приближением распределе- /=1 ния частот к действительности является закон Зипфа: р, =-, для / / = 1, 2,..., п. (Дж. К. Зипф заметил, что л-е наиболее употребите- употребительное в тексте на естественном языке слово встречается с часто- частотой, приблизительно обратно пропорциональной п.) Нормирую- п щая константа выбирается так, что ]Г р, = 1. Пусть элементы мно- жества аъ а2,..., ап упорядочены согласно указанным частотам.
104 Глава 5. Сортировка и поиск ~ 111 Тогда с = = « — и среднее время успешного поиска со- ? H» 1пп /1 ставит Уф/ =У/- =пс =п «—, что много меньше . Я ы\ ' Hn 1пл 2 Последний пример показывает, что даже простой последовате- последовательный поиск требует выбора разумной структуры данных множе- множества, который бы повышал эффективность работы алгоритма. Бо- Более того, это общепринятая стратегия, время от времени переупо- переупорядочивать данные, для большинства последовательных файлов во внешней памяти, когда последовательная природа файла диктует- диктуется техническими характеристиками носителя информации. Алгоритм последовательного поиска данных одинаково эф- эффективно выполняется при размещении множества аьа2,...,ап на смежной или связанной памяти. 5.6. Логарифмический поиск Логарифмический (бинарный или метод деления пополам) по- поиск данных применим к сортированному множеству элементов а{<а2< ... <ат размещение которого выполнено на смежной па- памяти. Для большей эффективности поиска элементов надо, чтобы пути доступа к ним стали более короткими, чем просто последова- последовательный перебор. Наиболее очевидный метод: начать поиск со среднего элемента, т.е. выполнить сравнение с элементом а, х •. Результат сравнения позволит определить, в какой половине по- последовательности аь аъ..., пх 1+я ,,..., ап продолжить поиск, применяя к ней ту же процедуру, и т.д. Основная идея бинарного поиска довольно проста, однако «для многих хороших програм- программистов не одна попытка написать правильную программу закон- закончилась неудачей». Чтобы досконально разобраться в алгоритме, лучше всего представить данные а{ < а2 < ... < ап в виде двоичного дерева сравнений, которое отвечает бинарному поиску. Двоичное дерево называется деревом сравнений , если для лю- любой его вершины (корня дерева или корня поддерева) выполняет- выполняется условие: {Вершины левого поддерева}<Вершина корня<{Вершины правого поддерева }.
5.6. Логарифмический поиск 105 Пусть на очередном шаге деления пополам оказалось, что необ- необходимо выполнить поиск среди элементов я, < я,+1 <...< aj. В каче- качестве корня принимается элемент а\ i+j \ , где I Ц1 1 — наибольшее целое, меньшее или равное (/ +j)/2. Левое поддерево располагает- располагается в векторе аь ai+i,..., а ,+, ¦ , а правое поддерево — в векторе tfi ,+, | ,..., а._и а.. На рис. 5.6 показан пример двоичного дерева сравнений, ребра которого неявно выражаются рассмотренными выше отношениями между индексами элементов аь а2,..., ап- 9 5^ ^19 27 44 Рис. 5-6. Пример дерева сравнений, отвечающего бинарному поиску среди сортированных эломенюв: 3,5,7,9,12,19,27,44 Поиск элемента z среди а{ < а2 <...< ап методом деления попо- пополам представлен в алгоритме 5.8. Алгоритм 5.8. Логарифмический поиск z в а{ < а2 <...< ап find = 0; {Признак поиска записи} / = 1; {Левая граница поддерева} j = n\ {Правая граница поддерева} while i <j do begin m = \ ill ; {Корень текущего поддерева} ifz=am then I **n ~ {Элемент найден} else ifz > am then i = m + 1 {Новая левая граница} elsej = m — 1 {Новая правая граница} end', if find = 1 then Запись найдена; else Запись отсутствует.
106 Глава 5. Сортировка и поиск Средняя сложность бинарного поиска среди элементов а{ < < а2 <...< ап сравнима с высотой двоичного дерева (рис 5.6). В худ- худшем случае искомый элемент может оказаться либо на последнем уровне, либо вообще не будет найден. На каждом уровне необхо- необходимо выполнить определенное число сравнений. В п.5.4 установ- установлено, что уровней в дереве [log2(/i + 1I. Значит, сложность поис- поиска является логарифмической 0(log2fl), что оправдывает и назва- название самого метода поиска. Необходимо отметить, что рассмотренный метод бинарного поиска предназначен главным образом для сортированных эле- элементов а{ < а2 <...< ап на смежной памяти фиксированного п раз- размера. Если же размерность вектора динамически меняется, то экономия от использования бинарного поиска не покроет затрат на поддержание упорядоченного расположения а{ < а2 <...< ап. 5.7. Сортировка с вычисляемыми адресами Пусть д1? а2,..., ап ~~~ исходная последовательность сортируе- сортируемых целых чисел и я = (пь п2,..., пп) — упорядочивающая переста- перестановка этих элементов ап <аП2<...<аПп. Принятое ограничение, что я, — целые числа, не ведет к потере общности рассматривае- рассматриваемых ниже алгоритмов. Сортированная последовательность я, подсказывает очевидный способ использования значений этих элементов в качестве индексов (адресов) их расположения в мас- массиве Ъп bf+i,..., bs, где ba. =at. Получим упорядоченную последо- последовательность Ъг< br+l <...< bs, а значит, и упорядоченную последо- последовательность исходных данных а{, а2,..., ап. В качестве примера рассмотрим частный случай сортировки элементов последовательности а[9 а2,..,, а7, равных соответствен- соответственно 6, 3, 5, 7, 2, 4, 1 — различные целые числа от 1 до 7. Значение каждого элемента я, показывает его место в сортированном спис- списке Ь{ < Ь2 <...< Ь7, где Ьх определяются в цикле for i=\ tol do ba. =я,. Сложность данного метода сортировки является линейной О(п), где п = 7. Фактически, значения я, определяют перестановку я = (п{, яг>—1 пп) =G,5,2,6,3,1,4), которая упорядочивает элементы ап <аП2 <...<аПп. Значения тг, устанавливаются в цикле for i = 1 to 7 do Яд. =/.
5.7. Сортировка с вычисляемыми адресами 107 Сортировка стала возможной благодаря тому, что значения исходных данных 6, 3, 5, 7, 2, 4, 1 заполняют сплошной интервал последовательности натуральных чисел. Рассмотрим обобщение идеи сортировки с вычисляемыми адресами на случай произволь- произвольных целых аь а2,..., ап. Алгоритм сортировки существенно упро- упрощается, если все значения аь а2,..., ап различные. Значения а„ a2,..., а„ — различные Реализация метода сортировки представлена в алгоритме 5.9. Временный массив Ъп ?,+!,..., bs, где r=min(a1, аъ..., ап) и s = max{au аъ..., ап), используется для сортированной упаковки элементов аь а2,..., ап. Свободные места в массиве Ьп Ь^ь..., bs инициализируются значением 5+1, отличным от значений эле- элементов а1? а2,..., ап- Алгоритм 5.9. Сортировка с вычисляемыми адресами для различных аь аь..., ап {Поиск min и max значений среди а{, а2,..., ап} r = s = a{', for i = 2 to n do begin ifr> at then r= я, else ifs < a{ then s = д, end\ {Инициализация bx значением s+l, отличным от at} for i = rto s do bt = s+ 1; {Сортированная упаковка элементов аь аъ..., ап } for / = 1 to n do ba. =af; {Выделение сортированных аъ а2,..., ап из Ъп Ь,+ь..., bs} k = 0; for i = rto s do begin ifbj*S+l then begin k = k+\\ ak = К end; end. Сортированный вектор а{ < a2 <...< an является результатом последовательного просмотра массива bn й^-j,..., 65при удалении из него оставшихся незанятыми элементов, равных значению
108 Глава 5. Сортировка и поиск s + I. Алгоритм не содержит вложенных циклов, а значит, слож- сложность его линейная О(п). Допускаются одинаковые значения среди av я2,..., ап Реализация метода представлена в алгоритме 5.10. Наличие одинаковых элементов среди аь я2,..., ап> например, at = ар при упаковке ba = я, nba =aj ведет к потере данных в исходном мно- множестве а{, а'2,..., ап. Ситуация, когда одновременно несколько эле- элементов претендуют на одно место, называется коллизией. Такие элементы необходимо переразмещать на свободные места, сохра- сохраняя свойства сортировки с вычисляемыми адресами. С этой це- целью на основании величин аъ а2,..., ап рассчитывается вектор ин- индексов dn d^j,..., ds сортированной упаковки данных аъ а2,..., ап в массиве Ьь Ь2,..., Ьп. В алгоритме 5.9 роль индексов упаковки могли выполнять непосредственно сами значения элементов аь а2,..., ап, так как они были различные. В данном случае значения dn d^i,..., ds настраиваются таким образом, что одинаковые по ве- величине элементы из аь а2,..., ап оказываются смежными при их упаковке в массиве Ьь Ьъ..., Ьп. Вектор сп с^ь..., cs используется для подсчета количества элементов каждого значения среди а{, а2,..., апп формирования индексов упаковки dn d^b..., ds. Алгоритм 5.10. Сортировка с вычисляемыми адресами для произвольных аи а2,..., ап {Поиск min и max значений среди аь а2,..., ап } r = s=a{; for / = 2 to n do begin ifr> #, then r= at else ifs < a{ then s = a( end; {Расчет количества элементов каждого значения ai} for i = r to s do Cj = 0; fori= 1 tondocQ =ca. +1; {Расчет индексов упаковки dn dh.b..., ds } dr=U for i = r + 1 to s do dt = dj_{ + cM; {Сортированная упаковка элементов аъа2,..., а п в Ь{, Ь2,...,Ьп} for / = 1 to n do begin k = af;
5.7. Сортировка с вычисляемыми адресами 109 Ч dk = dk+l; end. Результирующий сортированный вектор исходных данных аь а2,..., ап располагается в массиве by < b2 < ... < bn. Алгоритм не со- содержит вложенных циклов, а значит сложность его линейная 0{п). Сортировка с вычисляемыми адресами является очень быст- быстрым методом, но она может быть крайне неэффективной при бо- больших значениях s - г с точки зрения использования оперативной памяти, необходимой для хранения временных массивов данных сп cVh,..., csk dn */,+!,..., ds.
=========== Глава 6 ========== Введение в теорию графов. Алгоритмы на графах М I ножество самых разнообразных задач естественно форму- формулируется в терминах точек и связей между ними, т.е. в терминах графов. Так, например, могут быть сформулированы задачи со- составления расписания, анализа сетей в электротехнике, анализа цепей Маркова в теории вероятностей, в программировании, в проектировании электронных схем, в экономике, в социологии и т.д. Поэтому эффективные алгоритмы решения задач теории гра- графов имеют большое практическое значение. 6.1. Основные понятия и определения • Определение. Конечным графом называется тройка Г=(Х, U, Ф), где X— конечное множество вершин; U— конеч- конечное множество ребер (дуг); Ф — отношение инцидентности; Xr\U=0. Отношение инцидентности Ф является трехмест- трехместным отношением Ф(х, и, у), где х, у е X, и е С/, которое может либо выполняться (быть истинным), либо не выполняться (быть ложным) и удовлетворяет свойствам: 1) Vw e U Зх,у еХ Ф(х, и, у) — ребро всегда соединяет пару вершин. 2)(Ф(х, и,у)лФ(х', и,у))=>((х = х'лу = у)ч(х = у'лу = х)) - ребро и соответствует не более чем одной паре вершин х, у. • Графическое представление графов. Элементы графов 1. х е X— вершина. 2. Ф(х, и,у)л-1 Ф(у, и, х) — ориентированное ребро, дуга. 3. Ф(х, и, у) л Ф(у, и, х) — неориентированное ребро. 4. Ф(х, и, х) — петля. 1. 2. 3. 4. Геометрические элементы • — точка в пространстве. х—*у— направленный отрезок. *• ШУ — отрезок. х*^ — замкнутый отрезок.
6.1. Основные понятия и определения 111 Рис. 6.1. Графы с тремя вершинами и двумя ребрами • Определение. Гх = (Хи Ub Ф{) и Г2 = (Хъ U2, Ф2) называются изоморфными (Г{ = Г2), если существуют два взаимно одно- однозначных соответствия q>: Х{ -> Х2 и у : U{-> U2, сохраняющие отношение инцидентности: 02(y(xi)9y\i(ui)9y(yl)) = Фх(х^иъу{). Из определения следует, что изоморфные графы можно оди- одинаково изображать графически и отличаться они будут только метками вершин (рис. 6.2). J Ж2 ЛЗ 2у\ ^3 1 Рис. 6.2. Три изоморфных графа Определение. Граф называется ориентированным {орграф), если каждое его ребро ориентировано: Vx*у eXVu elf Ф(х, и, у) ^> -лФ(у, и, х). Иногда удобно преобразовать неори- неориентированный граф в ориентированный — заменой каждого неориентированного ребра парой ориентированных ребер с противоположной ориентацией. Определение. Подграфом графа Г= (X, U, Ф) называется такой граф Г= (Х\ U\ Ф), что 1ГсХ, U'cz U. Обозначают Гс Г. Определение. Граф называется псевдографом, если в нем допус- допускаются петли и кратные ребра, т. е. две вершины могут быть соединены более чем одним ребром. Псевдограф без петель называется мулътиграфом (рис. 6.3). Рис. 6.3. Псевдограф (слева) и мультиграф (справа)
112 Глава 6. Введение в теорию графов. Алгоритмы на графах Определение. Неориентированный граф называется простым, если он не имеет петель и любая пара вершин соединена не бо- более чем одним ребром. Определение. Простой граф называется полным, если каждая пара вершин соединена ребром. Такой граф с п вершинами со- содержит С„2 ребер (рис. 6.4). Рис. 6.4. Полные неориентированные графы Определение. Дополнением простого графа /называется граф Г, имеющий те же вершины, а его ребра являются дополнени- дополнением Г до полного графа (рис. 6.5). Рис. 6.5. Исходный граф Г и дополнительный Г Определение. Граф называется плоским (планарным), если он может быть изображен на плоскости так, что все пересечения ребер являются его вершинами. Рис. 6.6. Граф Г\ — плоский, а граф Г2 — неплоский Определение. Если вершины х и у соединены ребром и, то гово- говорят, что вершины х, у смежные, а ребро и инцидентно верши- вершинам хну. Два ребра называются смежными, если они имеют общую вершину. Определение. Степенью вершины графа называется количест- количество ребер, инцидентных данной вершине. Вершина графа, име- имеющая степень 0, называется изолированной, а если степень ее равна 1, то такая вершина называется висячей.
6.1. Основные понятия и определения 113 Определение. Граф называется помеченным (или перенумеро- перенумерованным), если его вершины отличаются друг от друга каки- какими-либо пометками (рис. 6.7). Рис. 6.7. Граф /~1 — помеченный, а граф Г2 — непомеченный Определение. Путь (маршрут) на графе Г= {X, U, Ф) определя- определяется последовательностью вершин и ребер х1и{х2и2х3...хпипхп+и где jc,- е X, ut e U. Ребро их соединяет вершину хх с вершиной jc/+1, т.е. выполняется отношение инцидентности Ф(хх, иь xi+l). • Маршрут называется цепью, если все его ребра различные. • Маршрут называется замкнутым, если л^ = хя+1. • Замкнутая цепь называется циклом. • Цепь называется простой, если не содержит одинаковых вершин. • Простая замкнутая цепь называется простым циклом. • Гамильтоновоп цепью называется простая цепь, содержащая все вершины графа. • Гамильтоновым циклом называется простой цикл, содержа- содержащий все вершины графа. Определение. Граф Г= (X, U, Ф) называется связным, если для всех х, у е Xсуществует путь из вершины х в вершину у (вер- (вершины jc и у связаны маршрутом). Связный ориентированный граф называется сильно связным. Орграф называется слабо связ- связным, если соответствующий ему неориентированный граф (иг- (игнорируется ориентация ребер) связный (рис. 6.8). Рис. 6.8. Гт — слабо связный, Г2 — сильно связный • Определение. Связный неориентированный ациклический граф называется деревом, множество деревьев называется лесом.
114 Глава 6. Введение в теорию графов. Алгоритмы на графах Рис. 6.9. /~1 — дерево, Г2 — не дерево Большинство задач на графах касается определения компо- компонент связности, поиска маршрутов, расстояний и т.п. Далее будут рассмотрены решения подобных вопросов. Однако при решении реальных задач соответствующие им графы весьма велики, и ана- анализ возможен лишь с привлечением современной вычислитель- вычислительной техники. Поэтому конечной целью рассмотрения каждой из задач будет являться описание и реализация практического алго- алгоритма решения данной задачи на ЭВМ. 6.2. Представления графов Наиболее известный и популярный способ представления гра- графов состоит в геометрическом изображении точек (вершин) и ли- линий (ребер) на бумаге. При численном решении задач на вычис- вычислительных машинах граф должен быть представлен дискретным способом. Существует довольно много способов такого рода представления графов. Однако простота использования пред- представления графа, как и эффективность алгоритма, в основе кото- которого он лежит, в полной мере зависит от конкретного выбора это- этого представления. Одно из направлений теории графов связано с их матричным представлением. Существуют различные виды матриц, ассоциированные с графами. Эти алгебраические формы используются для решения многих задач теории графов. Ниже рассматриваются две такие матричные формы и несколько не- нестандартных представлений, которые наиболее широко исполь- используются в алгоритмах на графах. 6.2.1. Матрица смежности графа • Определение. Матрицей смежности ориентированного поме- помеченного графа с п вершинами называется матрица А= [ау], i,j= 1, 2,..., п, в которой A, если существует ребро (jc, ,Xj), у [О, если вершины jc, ,Xj не связаны ребром (jc, ,Xj ).
6.2. Представления графов 115 Матрица смежности однозначно определяет структуру графа. Примеры орграфа и его матрицы смежности приведены соответ- соответственно на рис. 6.10 и рис. 6.11. Отметим, что петля в матрице смежности может быть представлена соответствующим единич- единичным диагональным элементом. Кратные ребра можно предста- представить, позволив элементу матрицы быть больше 1, но это не при- принято, обычно же представляют каждый элемент матрицы одним двоичным разрядом. 3 5 Рис. 6.10. Ориентированный граф 0 110 0 0 0 10 1110 1 0 0 0 0 10 0 10 0 0 10 1 0 0 0 0 0 0 0 0 0 0 0 0 0 110 1 110 0 Рис. 6-11- Матрица смежности ориентированного графа рис. 6.10 6.2.2. Матрица инцидентности графа • Определение. Матрицей инцидентности для неориентированно- неориентированного графа с п вершинами и т ребрами называется матрица В = [by], i = 1, 2,...,я, j = 1, 2,..., т, строки которой соответству- соответствуют вершинам, а столбцы — ребрам. Элементы [1, если вершина х, инцидентна ребру Uj, iJ " |0, если вершина х, не инцидентна ребру Uj. • Определение. Матрицей инцидентности для ориентированного графа с п вершинами и т ребрами называется матрица В[Ьу],
116 Глава 6. Введение в теорию графов. Алгоритмы на графах /= 1, 2,...,л, j = 1, 2,..., т, строки которой соответствуют вер- вершинам, а столбцы — ребрам. Элементы 1+1, если ребро Uj выходит из вершины х(, -1, если ребро Uj входит в вершину х,, О, если вершина xt не инцидентна ребру Uj. Матрица инцидентности однозначно определяет структуру графа. На рис. 6.12 представлена такая матрица для орграфа на рис. 6.10. 2313457515745745 +1+1-10 0 0 0 0-10000000" -1 0+1+1+1+1+10 0 0 0 0 0 0 0 0 0-10-1000+1000 00000 0 0 0 0-1 0 0 0+1+1+1-1 0 0-1 0 0 0 0 0 0-10-10-100-100-1 00000000 000+1+1+100 0 0 0 0 0 0-10 0 0-1 0 0-1+1+1 Рис. 6.12. Матрица инцидентности ориентированного графа 6.2.3. Матрица весов графа • Определение. Граф называется взвешенным, если каждому его ребру сопоставлено число. Простой взвешенный граф может быть представлен своей матрицей весов W= [и^-], где wtj — вес ребра, соединяющего вершины i,j = 1, 2,..., п. Веса несущест- несуществующих ребер полагают равными оо или 0 в зависимости от приложений. Заметим, что матрица весов является простым обобщением матрицы смежности. 6.2.4. Список ребер графа При описании графа списком его ребер каждое ребро пред- представляется парой инцидентных ему вершин. Это представление можно реализовать двумя массивами г = (гь r2,..., rm) nt= (tx, t2,..., tm)9 где т — количество ребер в графе. Каждый элемент в массиве есть метка вершины, а /-е ребро графа выходит из вершины г, и входит в вершину tt. Например, соответствующие массивы пред- представления графа на рис. 6.10 будут иметь вид: г=A, 1,2,2,2,2,2,3,4,4,4,6,6,6,7,7), f=B,3, 1,3,4,5,7,5, 1,5,7,4,5,7,4,5).
6.3. Метод поиска в глубину 117 • Интересно, что данное представление позволяет легко описать петли и кратные ребра. 6.2.5. Структура смежности графа Ориентированный или неориентированный граф может быть однозначно представлен структурой смежности своих вершин. Структура смежности состоит из списков Adj[x] вершин графа, смежных с вершиной х. Списки Adj[x] составляются для каждой вершины графа. В качестве примера опишем структуру смежно- смежности графа, представленного на рис. 6.10. X, 1 2 3 4 5 6 7 Adjlx] 2,3 1,3,4,5,7 5 1,5,7 — 4,5,7 4, 5 Структуры смежности могут быть удобно реализованы масси- массивом из п (число вершин в графе) линейно связанных списков. Каждый список содержит вершины, смежные с вершиной, для которой составляется список. Хранение же списков смежности на сцепленной памяти желательно в алгоритмах, в основе кото- которых лежат операции добавления и удаления вершин из списков. Следует отметить, что во многих задачах на графах выбор пред- представления является решающим для эффективности алгоритмов. 6.3. Метод поиска в глубину Один из наиболее естественных способов систематического исследования всех вершин графа исходит из процедуры прохож- прохождения графа методом поиска с возвращением, который исследует граф в глубину (см. п.4.1). На неориентированном графе Г= (X, U, Ф) поиск в глубину осуществляется следующим обра- образом. Когда посещаем вершину jc е X, то далее идем по одному из ребер (х, у), инцидентному вершине у е X. Если вершина у уже пройдена (посещалась ранее), то возвращаемся в jc и выбираем
118 Глава 6. Введение в теорию графов. Алгоритмы на графах другое ребро. Если вершина у не пройдена, то заходим в нее и применяем процесс прохождения рекурсивно уже с вершиной у. Если все ребра, инцидентные вершине х, просмотрены, то идем назад по ребру (s, х), по которому пришли в х, и продолжаем ис- исследование ребер, инцидентных вершине s e X. Процесс закан- заканчивается, когда попытаемся вернуться из вершины, с которой на- начали просмотр графа. Поиск в глубину можно также осуществлять и на ориентиро- ориентированном графе. Если граф ориентированный, то, находясь в узле jc, необходимо выбирать ребро (х, у), только выходящее из х. Иссле- Исследовав все ребра, выходящие из у, возвращаемся в х даже тогда, когда в у входят другие ребра, еще не рассмотренные. Данная тех- техника просмотра в глубину полезна в практических приложениях при определении различных свойств как ориентированных, так и неориентированных графов. Метод поиска в глубину на простом неориентированном гра- графе представлен в алгоритме 6.1. Рекурсивная процедура Depth{x, w) осуществляет поиск в глубину на графе Г= (X, U, Ф), содержащем х е X, и строит для графа дерево Г поиска, которое является ориентированным остовным деревом Го = (X, Т, Ф) (если исходный граф не связен, то Го будет лесом); w e Jfявляется отцом х е Хъ строящемся дереве, где х — исследуемая вершина. Граф задан структурой смежности Adj[x], где Adj[x] означает мно- множество вершин, смежных сх е X. Элементы Т— это ребра строя- строящегося дерева поиска, а элементы В — это обратные ребра, кото- которые не могут принадлежать Го, так как они ведут назад в пройден- пройденные ранее вершины. Заметим, что обратное ребро должно идти от потомка к предку по дереву поиска. Чтобы отличить уже прой- пройденные вершины от непройденных, вводится вектор Магк[х] ме- меток вершин, которые постепенно нумеруются от 1 до \Х\ по мере того, как попадаем в них. Сначала полагается Магк[х] = 0 для всех х е Хв знак того, что ни одна вершина не пройдена, и когда попа- попадаем в вершину х первый раз, Магк[х] получает ненулевое значе- значение. Ребро (jc, v) е Г, если метка вершины Mark[v] = 0. Если же Mark[v] ф 0, то условием того, что (х, v) e В будет обратным реб- ребром, являются соотношения Mark[v] < Mark[x] и v * w. Условие Mark[v] < Mark[x] означает, что вершина v была пройдена раньше вершины х. Поэтому ребро (х, v) e В будет обратным, если оно не является ребром дерева Г, пройденным от отца w к jc, т. е. v * w.
6.3. Метод поиска в глубину 119 • Сложность поиска в глубину. Поскольку для каждой вершины, которую проходим впервые, выполняется обращение к проце- процедуре Depth ровно один раз, то всего обращений будет \Х|. При каждом обращении количество производимых действий про- пропорционально числу ребер, инцидентных рассматриваемой вершине. Поэтому сложность поиска составляет О(\Х\ + \U\). Алгоритм 6.1. Поиск в глубину на простом неориентированном графе for v б X do Mark[v] = 0; count = 0; Г=0; 5=0; for veXdo ifMark[v] = 0 then Depth(v, 0); procedure Depth(x, w); count = count+ 1; Mark[x] - count] for v g Adj[x] do begin ifMark[v]=0then T= Ги {(x, v)}; { Включить ребро дерева } Depth(y,x)\ else if Mark[v] < Mark[x] and v^w then B= В и {(x, v)}; { Включить обратное ребро } end; end. Программная реализация алгоритма 6.1 представлена алгорит- алгоритмом 6.2. Реализация близко соответствует основному алгоритму 6.1. Программа представлена тремя процедурами Init, Depth, Way- Depth, где WayDepth — основная программа поиска в глубину; Depth — рекурсивная процедура поиска, один к одному соответст- соответствующая аналогичной процедуре в алгоритме 6.1; Init — процедура контроля исходных данных и изменения меток вершин. Измене- Изменение нумерации меток вершин является существенным для алго- алгоритма. Новые метки вершин — это натуральные числа от 1 до \Х\. Данная нумерация позволяет обращаться к элементам массивов, содержащих информацию о вершинах, по номерам соответству- соответствующих вершин. Такой прием позволяет очень близко подойти в программной реализацией структуры смежности Adj[x] к ее мно- множественному описанию. В этом случае множественное описание выражения for v e Adj[x] do ... в программной реализации пред-
120 Глава 6. Введение в теорию графов. Алгоритмы на графах ставляется как for i= I to Nbr[x] dov = Adj[Fst[x] + /]..., где Nbr[x] — количество вершин в структуре смежности для вершины х е Х\ Adj[x] — вектор, содержащий все вершины структуры смежности по строкам; Fst[x] + 1 — номер первой вершины в структуре смеж- смежности для соответствующей вершины х е X, тогда Fst[x] + i — но- номер /-й вершины в структуре смежности для х е X. Например, для следующей структуры смежности графа Adj[x]: X 1 2 3 4 5 6 7 Adj\x] 2,3,5 1,3,4 1, 2, 4, 5 2,3 1,3,6,7 5,7 5,6 соответствующие массивы в программной реализации принима- принимают вид Nbrjx] Fst[x] Adj[x) 3 3 4 2 4 2 2 О 3 6 10 12 16 18 235 134 1245 23 1367 57 56 Исходные данные для расчета по программе алгоритма 6.2 представляются в текстовом файле со следующей структурой смежности Adj[x\. • в первой строке файла содержится количество строк в структу- структуре смежности, которое равно числу вершин в графе; • далее для каждой вершины в отдельной строке указывается номер самой вершины, количество вершин, смежных с дан- данной, и список этих вершин. Рассмотрим пример расчета по программе алгоритма 6.2 обхо- обхода графа, представленного на рис. 6.13. Сплошными линиями от- отмечены ребра, которые были пройдены во время обхода графа в глубину, пунктирными — обратные ребра. 4 3 7 Рис. 6.13. Пример обхода графа в глубину
6.3. Метод поиска в глубину 121 Исходные данные структуры смежности графа рис. 6.13 зада- задаются в текстовом файле Depth.in: 7 13 2 3 5 2 3 13 4 3 4 12 4 5 4 2 2 3 5 4 13 6 7 6 2 5 7 7 2 5 6 Результаты расчетов сохраняются в выходном файле Depth.out со следующей структурой: 1233435567 2314251675 1101010110 TvB Каждая колонка таблицы выходного файла соответствует реб- ребру (Xj, yt) прохода графа, где последнее значение является призна- признаком 1 или 0, что отвечает при проходе либо основному ребру, либо обратному. Алгоритм 6.2. Программа поиска в глубину на простом неориентированном графе Program PgmWayDepth; {Проход графа в глубину} uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[I..nVertex] of Integer; TypeAdjacent=array[1..nAdjacent] of Integer; Var Текстовый файл } { Количество вершин } { Количество ребер прохода в глубину} { Список смежности графа } {Указатели вершин списка смежности } { Количество вершин в списке смежности} { Список вершин графа } { Номера компонент для вершин графа} { Последовательность ребер прохода в глубину } f п пТ Adj Fst Nbr Vtx Mark T :Text; { :Integer; { :Integer; { :TypeAdj acent; :TypeVertex; :TypeVertex; :TypeVertex; :TypeVertex; :TypeVertex;
122 Глава 6. Введение в теорию графов. Алгоритмы на графах В :TypeVertex; { Признаки основных и обратных ребер прохода в глубину } Procedure Init( Var yes :Boolean ); { Переназначение меток вершин } { их порядковыми номерами в списке смежности } { yes - признак правильной структуры списка смежности } Var i, j,m :Integer; begin for i:=l to n do for j:=l to Nbr[i] do begin yes:=FALSE; for m:=l to n do if Adj[Fst[i]+j]=Vtx[m] then begin yes:=TRUE; Adj[Fst[i]+j]:=m; break; end; if not yes then exit; end; end; Procedure Depth( x,u:Integer; var count :Integer) ; Var i,v :Integer; begin count:=count+l; Mark[x]:=count; for i:=l to Nbr[x] do begin v:=Adj[Fst[x]+i]; if Mark[v]=0 then begin nT:=nT+2; T[nT-l]:=x; T[nTJ:=v; B[nT div 2]:=1; {Прямое ребро} Depth(v,x,count); end else if (Mark[v]<Mark[x]) and (v<>u) then begin {Обратное ребро} nT:=nT+2; T[nT-l]:=x; T[nT]:=v; B[nT div 2]:=0; {Обратное ребро} end; end; end;
6.3. Метод поиска в глубину 123 Procedure WayDepth; {Проход в глубину) Var v,count :Integer; begin nT:=0; {T - пустое дерево} count:=0; for v:=l to n do Mark[v]:=0; for v:=l to n do if Mark[v]=0 then Depth(v,0,count); end; Var (Main) i,j :Integer; yes :Boolean; begin {Main) Ass ign(f,'Depth.in' ) ; Reset(f);{Файл открыт для чтения} { Ввод списка смежности } Read(f,n); {Количество строк в списке} Fst[l]:=0; {Указатель начала первой строки списка} for i:=l to n do begin Read(f,Vtx[i]); {Метка вершины} Read(f,Nbr[i]); {Количество вершин в списке} for j:=l to Nbr[i] do Read(f,Adj[Fst[i]+j]); {Список смежных вершин} Fst[i+1]:=Fst[i]+Nbr[i]; {Указатель начала следующей строки в списке} end; Close(f); Ass ign(f,' Depth.out'); Rewrite (f); {Файл открыт для записи} Init(yes); if not yes then begin WriteLn(f,'Плохая структура смежности графа!'); Close (f); exit; end; WayDepth; for i:=l to nT div 2 do Write(f,Vtx[T[2*i-l]]:3); Writeln(f); for i:=l to nT div 2 do Write(f,Vtx[T[2*i]]:3); Writeln(f); for i:=l to nT div 2 do Write(f,В[i]:3); Writeln(f); Close(f); end. {Main)
124 Глава 6. Введение в теорию графов. Алгоритмы на графах 6.4. Отношение эквивалентности Бинарное отношение ~, определенное на множестве S, назы- называется отношением эквивалентности, если оно удовлетворяет свойствам рефлексивности, симметричности и транзитивности: 1. \/s{ е S s{ ~ s{. 2. \/sl,s2 e S s{ ~ s2 -> s2 ~ s{. 3. \/sb s2, s3 e S s{ ~ s2 л s2 ~ 5*3 -» s{ ~ J3. Все элементы из множества S, эквивалентные данному эле- элементу sh образуют множество Sh которое называется классом эк- эквивалентности. Два различных класса эквивалентности не могут иметь какого-либо общего элемента, в противном случае такие классы совпадают, что следует из свойств 1—3. Таким образом, определенное на множестве S отношение эквивалентности вы- выполняет разложение его на непересекающиеся классы St эквива- эквивалентности, т.е. S =(J Si¦,, где St n Sj=0, i *j. i Пример. Пусть S— множество треугольников. Определим на S бинарное ~ отношение. Будем считать, что для треугольников Аа, Ab e S выполняется отношение Аа - Ab, если они подобные. Ясно, данное отношение является отношением эквивалентности, так как свойства 1—3 выполняются для подобных треугольников. Введенное отношение разбивает множество треугольников на классы эквивалентности подобных треугольников. Пример. Пусть S— множество л-мерных векторов. Определим на S бинарное ~ отношение. Будем полагать, что для a,b e S вы- выполняется отношение а - Ь, если они колинеарные. Данное отно- отношение является отношением эквивалентности, так как свойства 1-3 выполняются для колинеарных векторов. Множество векто- векторов под действием введенного отношения разбивается на классы эквивалентности колинеарных векторов. Пример. Пусть S= {1, 2,..., п}. Определим на ^бинарное ~ от- отношение. Будем полагать, что для/?, q e Sвыполняется отноше- отношение р ~ q, если они имеют одинаковые остатки от деления на це- целое положительное число т. Данное отношение является отно- отношением эквивалентности. Множество Sпод действием введенно- введенного отношения разбивается на классы эквивалентности чисел с одинаковыми остатками от деления на т.
6.5. Связные компоненты 125 Пример. Пусть S— множество треугольников. Определим на S бинарное ~ отношение. Будем считать, что для треугольников Аа, Ab e Sвыполняется отношение Аа ~ Ab, если их площади рав- равны. Данное отношение является отношением эквивалентности. 6.5. Связные компоненты Пусть псевдограф Г= {X, С/, Ф) является неориентированным. Две вершины хь х2 е X называются связанными, если существует маршрут из х{ в х2. Определим на множестве вершин Хбинарное ~ отношение. Для х{, х2 е X отношение ~ будет выполняться, т.е. х{ ~ х2, если эти вершины связанные. Введенное отношение яв- является отношением эквивалентности. Действительно, если вер- вершина х{ связана с х2, а вершина х2 связана с х3, то очевидно, что вершина х{ связана с х3. Следовательно, существует такое разло- разложение множества вершин x=[jxi на попарно непересекающиеся подмножества, что все вершины в каждом Х( связаны, а вершины из различных^ не связаны. Тогда можно записать разложение графа Г= {Х} Uf Ф) на непересекающиеся связные подграфы Г= (Xif Uif Ф). Вследствие попарного непересечения подграфов, разложение называется прямым, а сами подграфы называются компонентами связности графа Г. Таким образом, справедливо следующее утверждение. • Утверждение 6.5.1. Каждый неориентированный граф распа- распадается единственным образом в прямую сумму своих компо- компонент связности. Количество компонент связности находится в определенном отношении с основными параметрами графа — числом его вер- вершин и ребер. • Утверждение 6.5.2. Пусть Г= (X, U, Ф) является простым гра- графом с п вершинами и к компонентами связности. Число ребер в таком графе не может превосходить величины С*_к+1 = = {п-к+\){п-к)/2. Доказательство. Рассмотрим прямое разложение к г,,Ul ,Ф) исходного графа на компоненты связности.
126 Глава 6. Введение в теорию графов. Алгоритмы на графах Если положить, что число вершин в компоненте Xt связности рав- равно nh то число ребер в таком графе не превосходит J]C^ . Данная величина достигается в том случае, когда каждая из компонент связности является полным подграфом. Допустим, что среди компонент связности f(Xif Ц, Ф) найдутся хотя бы две, которые имеют более одной вершины, например п2 > пх > 1. Перенесем одну вершину из Г{ в Г2. Легко видеть, что это увеличивает число ребер в модифицируемом полном графе с к компонентами связ- связности. Отсюда следует, что максимальное число ребер должен иметь граф, состоящий из к — 1 изолированной вершины и одно- одного полного подграфа с п — к + 1 вершинами. • Следствие. Граф с п вершинами и числом ребер, большим чем (п-Щп-2)^ связен# 6.6. Выделение компонент связности Рассмотрим алгоритм нахождения числа компонент связно- связности, а также выделения этих компонент на неориентированном графе. Подобным образом решается задача и для ориентирован- ориентированного графа. В основу рассматриваемого алгоритма 6.3 выделения компонент связности положена описанная ранее техника поиска в глубину на графе Г{Х, U, Ф). Структура алгоритма 6.3 является модификацией в сторону упрощения основного алгоритма 6.1 поиска в глубину. Работа алгоритма 6.3 направлена на формиро- формирование вектора Магк[х] меток вершин х е X графа. Элементу Магк[х] присваивается общий номер той компоненты, которой принадлежит вершина х е X. Сложность алгоритма 6.3, как и ал- алгоритма 6.1, составляет О(\Х\ + \U\). Алгоритм 6.3. Выделение связных компонент неориентированного графа for v g X do Mark[v] = 0; {Начальная установка} count = 0; {Счетчик числа компонент} for v e Xdo ifMark[v] = 0 then begin counts count + 1; Component^, count)', end,
6.6. Выделение компонент связности 127 Procedure Component{x, count); Mark[x] = count, for v e Adj[x] do ifMark[v] = 0 then Component, count); end; Программная реализация выделения компонент связности представлена в алгоритме 6.4, который близко соотносится с со- соответствующим множественным описанием алгоритма 6.3. Рас- Рассмотрим пример расчета по программе алгоритма 6.4 выделения компонент связности графа, представленного на рис. 6.14. 2. - 12 •8 У — 9 Рис. 6.14. Пример выделения компонент связности графа Для программы алгоритма 6.4 исходные данные структуры смежности Adj[x] графа на рис. 6.14 задаются в текстовом файле Connect.in. Структура (правило) заполнения файла одинакова с той, которая описана в рассмотренном примере поиска в глубину при расчете по программе алгоритма 6.2. Данные файла Connect.in для примера на рис. 6.14: 11 1 3 2 2 9 1 8 1 12 3 14 2 3 3 4 2 7 2 15 2 21 1 2 3 4 3 1 7 7 14 15 21 12 15 2 14 1 3 9 8 14 12 12 Результаты расчетов сохраняются в выходном файле Соп- nect.out со следующей структурой: 1 2 9 8 12 14 з 4 7 15 21 — номера вершин графа; 11223311233 — номера компонент связности.
Var f n Adj Fst Nbr Vtx Mark :Text; :Integer; :TypeAdjacent :TypeVertex; :TypeVertex; :TypeVertex; :TypeVertex; 128 Глава 6. Введение в теорию графов. Алгоритмы на графах Алгоритм 6.4. Программа выделения связных компонент неориентированного графа Program ConnectComponent; {Выделение компонент связности графа} uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[I..nVertex] of Integer; TypeAdjacent=array[1..nAdjacent] of Integer; { Текстовый файл } { Количество вершин } { Список смежности графа } { Указатели вершин списка смежности} { Количество вершин в списке смежности} { Список вершин графа } { Номера компонент для вершин графа} Procedure Init( Var yes :Boolean ); { Переназначение меток вершин } { их порядковыми номерами в списке смежности } { yes - признак правильной структуры списка смежности } Var i, j ,m :Integer; begin for i:=l to n do for j:=l to Nbr[i] do begin yes:=FALSE; for m:=l to n do if Adj[Fst[i]+j]=Vtx[m] then begin yes:=TRUE; Adj[Fst[i]+j]:=m; break; end; if not yes then exit; end; end; Procedure Component( x,count :Integer); Var i,v :Integer; begin Mark[x]:=count;
6.6. Выделение компонент связности 129 for i:=l to Nbr[x] do begin v:=Adj[Fst[x]+i]; if Mark[v]=0 then Component(v,count); end end; Procedure Connect; {Выделение компонент связности) Var v,count :Integer; begin for v:=l to n do Mark[v]:=0; count:=0; {Номер компоненты связности} for v:=l to n do begin if Mark[v]=0 then begin count:=count+l; Component(v,count); end; end; end; Var {Main} i,j :Integer; yes :Boolean; begin {Main} Assign(f,'Connect.in' ) ; Reset(f);{Файл открыт для чтения} { Ввод списка смежности } Read(f,n); {Количество строк в списке} Fst[l]:=0; {Указатель начала первой строки списка} for i:=l to n do begin Read(f,Vtx[i]); { Метка вершины} Read(f,Nbr[i]); { Количество вершин в списке} for j:=l to Nbr[i] do Read(f,Adj[Fst[i]+j]); { Список смежных вершин} Fst[i+1]:=Fst[i]+Nbr[i];{ Указатель начала следующей строки в списке} end; Close(f); Assign(f,' Connect.out'); Rewrite(f); {Файл открыт для записи} Init(yes); if not yes then begin WriteLn(f,'Плохая структура смежности графа!'); Close(f); exit; end;
130 Глава 6. Введение в теорию графов. Алгоритмы на графах Connect; for i:=l to n do Write(f,Vtx[i]:3); Writeln(f); for i:=l to n do Write(f,Mark[i] :3) ; Close(f); end. {Main} 6.7. Эйлеровы графы Классической в теории графов является следующая задача. Имеются два острова, соединенных семью мостами с берегами реки и друг с другом, как показано на рис. 6.15. Задача состоит в следующем: осуществить прогулку по городу таким образом, чтобы, пройдя по каждому мосту один раз, вернуться обратно. Ре- Решение этой задачи сводится к нахождению некоторого специаль- специального маршрута на графе. Рис- 6.15. План расположения мостов и соответствующий ему мультиграф • Определение. Пусть Г= (X, U, Ф) — неориентированный псев- псевдограф. Цепь в /называется эйлеровой, если она проходит по одному разу через каждое ребро псевдографа /. Такой граф на- называется эйлеровым. Замкнутая эйлерова цепь называется эйлеровым циклом. Поставим в соответствие плану расположения суши и мостов, приведенному на рис. 6.15, мультиграф на рис. 6.15, в котором каждой части суши соответствует вершина, а каждому мосту — ребро, соединяющее соответствующие вершины. Теперь задача звучит так: найти эйлерову цепь (цикл) в мультиграфе. Решение этой задачи было дано Л. Эйлером. • Теорема Л. Эйлера. Эйлерова цепь в псевдографе Г= (X, U, Ф) существует тогда и только тогда, когда выполняются следую- следующие условия: 1. Граф связный; 2. Степени внутренних вершин четные (внутренние вершины не являются началом и концом цепи);
6.7. Эйлеровы графы 131 3. Если вершины а и b являются началом и концом цепи и а ф Ь, то степени их нечетные; 4. Если вершины а и b являются началом и концом цепи и а = Ь, то степени их четные. Доказательство. (=>) Дано, что существует эйлерова цепь au{x2U2...xnunb, где a, b, x, e X, ut e ?/, в которой содержатся все ребра по одному разу. Такая цепь включает все вершины графа, если граф не содержит изолированных вершин. Докажем условия 1—4: 1) по данной цепи из любой вершины можно попасть в лю- любую другую, значит, граф связный; 2) каждая тройка цепи и^^щ привносит вершине xt степень два, а так как все ребра м, в цепи различные, то степени внутренних вершин четные; 3) и 4) доказа- доказательства повторяют доказательство пункта 2. (с=) Даны условия 1—4. Построим эйлерову цепь. Предварите- Предварительно приведем условие 3 к условию 4 включением в граф фиктив- фиктивного ребра и*, которым свяжем вершины а и Ь. Теперь и в случае 3 все вершины будут иметь четную степень. Пусть А е X— произво- произвольная вершина (рис. 6.16). Из нее будем строить цепь, выбирая в качестве продолжения пути ребро, которое еще не пройдено. Эта цепь (цикл Г{) может закончиться только в вершине А, так как, при входе в любую другую вершину, всегда существует ребро, по кото- которому можно выйти из нее (степени вершин четные). Возможны два случая: 1) построенный цикл /\ содержит все ребра графа, тогда теорема доказана; 2) /\ содержит не все ребра графа. Во втором случае рассмотрим граф Г \ Гь полученный уда- удалением из Гвсех ребер, входящих в /\. Граф Г \ /\ вновь содержит вершины только с четными степенями (у каждой вершины удали- удалили по четному числу ребер). Так как Г— связный граф, то сущест- существует вершина в /\, инцидентная ребру из Г \ Г{. Пусть это верши- вершина В е X. Построим из нее цикл Г2 так же, как строили цикл /\. Построим общий Гп цикл из Гх и Г2 так, как это сделано на рис. 6.16. Для Гп вновь проверяем рассмотренные выше два слу- случая, как для H Рис. 6.16. Объединение двух циклов в один цикл
132 Глава 6. Введение в теорию графов. Алгоритмы на графах Процесс расширения продолжаем до тех пор, пока не будут включены все ребра графа в один цикл: Аи1х2...аи*Ь..мпА. Разры- Разрывая данный цикл по ребру и*, получим эйлерову цепь awit2...tnwnb, где tj e Xf w, e U. Конструктивный характер доказательства теоремы позволяет на формальном уровне в алгоритме 6.5 записать рассмотренный по- поиск эйлеровой цепи. Исходный граф представлен своей структурой смежности Adj[x], гдеАф[х] — множество вершин, смежных сх е X Результирующая эйлерова цепь формируется в множестве Z Алгоритм 6.5. Алгоритм поиска эйлеровой цепи графа 3v e X; {Вершина начала эйлеровой цепи} Z= {v}; {Начало строящейся эйлеровой цепи} R = 0; {Частный расширяющийся цикл эйлеровой цепи} repeat Cycled, R); Z=Zkj R\ {Объединение циклов в один цикл} until Not 3ve Z \Adj[v]\ > 0 Procedure Cycle(v, R) R= {v}; {Построение отдельного цикла эйлеровой цепи} repeat w = Adj[v]; R = Ru{w}; Adj[v] =Adj[v] \ {w}; {Удалить пройденное ребро (v, w) } ifv^w then Adj[w] = Adj[w] \ {v}; {Удалитьребро {v, w) } v =w; until Not \Adj[v]\ > 0; {Пока все ребра не пройдены} end; Частные же циклы, расширяющие Z, представляются множе- множеством R. Ребра, включенные в частный цикл R (а значит, и в 2), удаляются как пройденные из структуры смежности Adj[x] (из графа). Формирование расширяющих циклов R осуществляется до тех пор, пока структура смежности графа содержит хотя бы одно ребро. • Сложность алгоритма поиска эйлеровой цепи. Число обраще- обращений к процедуре Cycle не более, чем число вершин \Х\. При каждом обращении количество производимых действий про- пропорционально числу ребер, входящих в выделенный цикл. Сложность суммарной работы процедуры Cycle пропорциона-
6.7. Эйлеровы графы 133 льна количеству ребер \1/\в графе. Поэтому сложность выделе- выделения эйлеровой цепи составляет О(\Х\ + \U\). Программная реализация поиска эйлеровой цепи представле- представлена в алгоритме 6.6, который соответствует множественному опи- описанию соответствующего алгоритма 6.5. Алгоритм 6.6. Программа поиска эйлеровой цепи графа Program EilerWay; {Эйлерова цепь в псевдографе} uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[I..nVertex] of Integer; TypeAdjacent=array[1..nAdjacent] of Integer; Var f :Text; { Текстовый файл } ks :Integer; { Начальная вершина эйлеровой цепи } n :Integer; {Количество вершин } Adj :TypeAdjacent;{ Список смежности графа } Fst :TypeVertex; { Указатели вершин списка смежности} Nbr :TypeVertex; { Количество вершин в списке смежности } Vtx :TypeVertex; { Список вершин графа } Deg :TypeVertex; { Степени вершин графа } kz :Integer; { Количество вершин в эйлеровой цепи} z :TypeAdjacent;{ Последовательность вершин эйлеровой цепи } г :TypeAdjacent;{ Отдельный расширяющийся цикл } Procedure Init( Var yes :Boolean ); Var i,j,k,m :Integer; begin { Переназначение меток вершин } { их порядковыми номерами в списке смежности } { yes - признак правильной структуры списка смежности } for i:=l to n do for j:=l to Nbr[i] do begin yes:=FALSE; for m:=l to n do if Adj[Fst[i]+j]=Vtx[m] then begin yes:=TRUE; Adj[Fst[i]+j]:=m;
134 Глава 6. Введение в теорию графов. Алгоритмы на графах break; end; if not yes then exit; end; { Разместить петли в начале списка смежности } for i:=l to n do begin k:=l; for j:=l to Nbr[i] do if Adj[Fst[i]+j]=i then begin Adj[Fst[i]+j]:=Adj[Fst[i]+k]; Adj[Fst[i]+k]:=i; k:=k+l; end; end; { Степени вершин графа } for i:=l to n do begin Deg[i]:=0; for j:=l to Nbr[i] do begin Deg[i]:=Deg[i]+l; if Adj[Fst[i]+j]=i then Deg[i]:=Deg[i]+1; {Петля} end; end; { Поиск начальной вершины ks цепи } k:=0; ks:=l; for i:=l to n do if ( Deg[i] mod 2 ) > 0 then begin k:=k+l; ks:=i; end; if ( k<>2 ) and ( k<>0 ) then yes:=FALSE; { Граф не эйлеровый } end; Procedure Cycle( v :Integer; var count :Integer ); { Построение частной эйлеровой цепи г[] } Var w :Integer; i,j :Integer; begin count:=1; r[count]:=v; repeat w:=Adj[Fst[v]+1]; { Следующая вершина цепи } count:=count+l; r[count]:=w; { Удалить ребро (v,w) из списка смежности для вершины v } Fst[v]:=Fst[v]+l; Nbr[v]:=Nbr[v]-l;
6.7. Эйлеровы графы 135 { Если ребро (w,v) не петля, то удалить и его из списка для вершины w } if vow then for i:=l to Nbr[w] do if Adj[Fst[w]+i]=v then begin for j:=i+l to Nbr[w] do Adj[Fst[w]+j-l]:=Adj[Fst[w]+j]; Nbr[w]:=Nbr[w]-l; break; end; v: =w ; until Not( Nbr[v]>0 ); end; Procedure Eiler; { Построение эйлеровой цепи z[] ) Var v,w :Integer; i, j,kt : Integers- count :Integer; yes :Boolean; begin v:=ks; kz:=l; kt:=kz; z[kz]:=v; Write(ff'Z=');{До объединения} for i:=l to kz do Write(f,Vtx[z[i]]:3); WriteLn(f); repeat Cycle(v,count); Write(f,'R='); for i:=l to count do Write(f,Vtx[r[i]]:3); WriteLn(f) ; for i:=l to count-1 do begin z[kz+i]:=z[kt+i]; z[kt+i]:=r[i+1]; end; kz:=kz+count-l; Write(f,'Z=');{После объединения} for i:=l to kz do Write(f,Vtx[z[i]]:3); WriteLn(f); yes:=FALSE; for i:=kz downto 1 do if Nbr[z[i]]>0 then begin v:=z[i]; kt:=i; yes:=TRUE; break; end; until Not yes; end;
136 Глава 6. Введение в теорию графов. Алгоритмы на графах Var {Main} i,j :Integer; yes :Boolean; begin {Main} Assign(f, 'Eiler.in'); Reset(f);{Файл открыт для чтения} { Ввод списка смежности } Read(f,n); {Количество строк в списке} Fst[l]:=0; {Указатель начала первой строки списка} for i:=l to n do begin Read(f,Vtx[i]); {Метка вершины} Read(f,Nbr[i]); {Количество вершин в списке} for j:=l to Nbr[i] do Read(f,Adj[Fst[i]+j]); {Список смежных вершин} Fst[i+1]:=Fst[i]+Nbr[i];{Указатель начала следующей строки в списке} end; Close(f); Assign(f,' Eiler.out'); Rewrite(f); {Файл открыт для записи} Init(yes); if not yes then begin WriteLn(f,'Плохая структура смежности графа'); WriteLn(f, ' Close(f); exit; end; Eiler; Write(f,'0=' ) ; for i:=l to kz Close(f); end. {Main} или граф не эйлеровый!' ) ; do Write(f,Vtx[z[i]]:3); WriteLn(f) Рассмотрим пример расчета по программе алгоритма 6.6 поис- поиска эйлеровой цепи в графе, изображенного на рис. 6.17. Рис. 6.17. Пример расчета эйлеровой цепи графа
6.8. Остовные деревья 137 Для программы алгоритма 6.6 исходные данные структуры смежности Adj[x] графа на рис. 6.17 задаются в текстовом файле Eiler.in. Структура (правило) заполнения файла совпадает с той, которая описана в рассмотренном примере поиска в глубину при расчете по программе алгоритма 6.2. Данные файла Eiler.in для примера на рис. 6.17: Результаты расчетов сохраняются в выходном файле Eiler.out со следующей структурой: z= R= Z= R= Z= 0= 1 1 1 5 1 1 2 2 6 2 2 3 3 2 3 3 1 1 7 1 1 4 4 3 4 4 5 5 8 5 5 1 1 4 6 6 9 2 2 5 7 7 3 i 3 ? 3 4 I 4 9 9 5 5 1 1. На каждом шаге показана строящаяся эйлерова цепь Z, кото- которая расширяется выделенным R циклом. Результирующая эйле- эйлерова цепь графа отмечена признаком О в начале строки. 6.8. Остовные деревья • Определение. Остовным деревом связного неориентированно- неориентированного графа Г= (X, U, Ф) называется дерево Го = {X, Uo, Ф), явля- являющееся подграфом графа Г и содержащее все его вершины (рис. 6.18). Рис. 6.18. Связный граф и два остовных дерева
138 Глава 6. Введение в теорию графов. Алгоритмы на графах • Утверждение 6.8.1. Дерево с п вершинами содержит п - 1 ребро. Доказательство. Доказательство проведем по индукции числа вершин. Заметим, что в дереве найдется вершина, степень которой равна единице (висячая вершина). Действительно, в противном случае, если степени вершин > 2, можно построить цикл, что про- противоречило бы определению дерева. Цикл строится следующим образом. Выполним проход по ребрам графа, начиная с произво- произвольной вершины. Так как степени > 2, то, попав в вершину первый раз, можно всегда из нее выйти. Исходный граф — конечный и связный. Следовательно, наступит момент, когда вновь попадем в пройденную уже вершину, что доказывает существование цикла. Условие индукции для п = 2 выполняется, дерево с двумя вер- вершинами содержит одно ребро. Предположим теперь, что утверж- утверждение выполняется для деревьев, число вершин у которых меньше п. Рассмотрим дерево с п вершинами. Удалим из этого дерева ви- висячую вершину и инцидентное ей ребро. Очевидно, что остав- оставшийся граф будет связным и без циклов, т.е. будет деревом с п — 1 вершиной. Тогда по предположению индукции оставшаяся часть графа содержит п — 2 ребра, а значит, исходное дерево должно иметь их п — 1. Практическую значимость остовных деревьев дает популярная форма задачи Кэли. Необходимо соединить п городов железнодо- железнодорожными линиями так, чтобы не строить лишних дорог. Известна стоимость строительства для каждой пары городов. Какова должна быть сеть дорог, соединяющая все города и имеющая минималь- минимальную возможную стоимость? Аналогичные вопросы возникают при проектировании линий электропередач, сетей ЭВМ и др. В терминах теории графов задачу можно сформулировать сле- следующим образом. Рассмотрим граф Г= (Xf U, Ф), где X— города, U— дороги. Каждому ребру и е {/назначим вес co(w) — стоимость строительства дороги и. Задача состоит в том, чтобы построить связный граф Г о = (X, Uo, Ф), содержащий все вершины, с мини- минимальным весом W(ro)= ^(ф). Очевидно , что Го — дерево, в противном случае можно было бы удалить одно ребро, не нару- нарушая связности Го и уменьшая сумму весов его ребер. • Определение. Минимальным остовным деревом (лесом) назы- называется остовное дерево (лес) с минимальным общим весом его ребер.
6.8. Остовные деревья 139 6.8.1. Жадный алгоритм построения минимального остовного дерева Минимум остовных деревьев графа Г = (X, U, Ф) можно найти, применяя процедуру исследования ребер в порядке возрастания их весов. Другими словами, на каждом шаге выбирается новое ребро с наименьшим весом, не образующее циклов с уже выбран- выбранными ребрами. Процесс продолжается до тех пор, пока не будет выбрано \Х\ — 1 ребро. Рассмотренная процедура называется жадным алгоритмом. Реализация данной схемы может быть выполнена следующим образом. Для каждой вершины Х= {х{, х2,..., хп} графа Г= (X, U, Ф) формируются начальные тривиальные компоненты связности Tt=(Xh Ц, Ф), где ^. = {*,}, Ui = 0,XinXj = 0,i*j,X=\JXi,i=l, 2,..., \Х\. Компоненты ^являютсядеревьями, объединение Т =(J7} которых дает начальное приближение строящегося остовного де- дерева Г0 = {X, Uo, Ф). Включение в строящееся остовное дерево Го выбранного ребра на очередном шаге жадного алгоритма выполняется слиянием Tj = 7) uTj (Xt = Xj uXj и Ui',= Ц иф двух компонент 7] и 7J-, которым принадлежит по вершине нового ребра, и включением самого ребра в объединенное множество Ц= ЦиЦ ребер. Процесс роста объе- объединения Т ={JTj компонент к остовному дереву Го= (X, Uo, Ф) i продолжаем до тех пор, пока не будет включено \Х\ — 1ребро. Справедливость жадного алгоритма является следствием сле- следующих двух лемм. • Лемма 6.8.1. Пусть Г= (X, U, Ф) — связный неориентирован- неориентированный граф и Го = (X, Uo, Ф) — произвольное остовное дерево для него. Тогда: 1) V хь х2 € Jf существует единственная между ними цепь в Го; 2) если к Г0 добавить ребро из U \ Uo, то возникнет ровно один цикл. Доказательство. Утверждение 1 верно, т.к. в противном случае в Го существовал бы цикл, что противоречит дереву Го. Утвержде- Утверждение 2 верно, поскольку между вершинами добавляемого ребра уже есть одна цепь, а значит, возникнет один цикл.
140 Глава 6. Введение в теорию графов. Алгоритмы на графах • Лемма 6.8.2. Пусть Г= (Xf U, Ф) — связный неориентирован- неориентированный граф, для каждого ребра и е U определен вес со(м), и 7} = (Xif Uif Ф) — компоненты связности жадного алгоритма, объединение которых Т =[jTi9 согласно алгоритму, растет к остовномудереву Го ={Х, Uo, Ф), где / = 1,2,...,к и к > 1. Пусть следующим найденным для включения ребром является ребро ? = (х> У) наименьшего веса из оставшихся U \ (J Ut и пусть х е Х{ i и у <? Х{. Тогда найдется остовное дерево Годдя Г= (X, U, Ф), со- содержащее ребра {JUj u{e}, вес которого не больше любого другого остовного дерева, содержащего ребра (Jt/,. Доказательство. Допустим противное. Пусть существует ос- остовное дерево Го =(Х,и'0,Ф)ддя Г, содержащее (JC^ и не содер- жащее ребра б, вес которого меньше веса любого остовного дерева для Г, содержащего (J {/, l^{e}. По утверждению 1 леммы 6.8.1, при ^у \ у добавлении е к Г'о образуется цикл. Этот цикл / *'^Г\"~Л должен содержать такое ребро е'= (х\ у), от- х[ ) ) \ личное от б, что х' е Х{ и у' <? Хи т.к. цикл вхо- V х*~~у t^ дитв U{ по ребру (х, у) и у ? Хь то он должен и ^—' выйти из U{ (рис. 6.19). Из условия следует, что Рис. 6.19 вес©(е)-<©(е),таккакуС/|- сСА^иу^ qU'oh i i ребро б выбиралось с минимальным весом из оставшихся ребер ^jj без образования циклов, в противном же случае выбор должен был бы пасть на б ', т.к. оно тоже не образует циклов с (J С/,-. Рассмотрим граф Го = {X, Uo, Ф), образованный добавлением б к Г'о и удалением б 'из Г'о. В Го нет циклов, так как единственный цикл разорван удалением ребра б'. Го остался связным, так как осталась цепь междух'иу'. Таким образом, Го — остовное дерево. Учитывая, что со (б) < со (б ), то вес дерева Го не больше веса Го. Ос- Остовное дерево Го содержит (Jf/, и б, а это противоречит предпо- ложению минимальности Г'о, что доказывает справедливость жадного алгоритма.
6.8. Остовные деревья 141 Реализация «жадной» схемы формирования остовного дерева представлена в алгоритме 6.7. Используемые при его описании обозначения соответствуют тому, что вводилось при обоснова- обосновании жадной схемы. Вектор Магк[х] меток вершин х е X графа поддерживает их принадлежность компонентам связности Uh из которых формируется реберный список остовного дерева. Нача- Начальные величины Mark[Xj] устанавливаются равными порядковым номерам соответствующих вершин лс, е X. Далее значения Mark[Xj] корректируются по мере слияния компонент Uh сохра- сохраняя соответствие принадлежности им вершин. Исходный граф задается реберным списком U, выходное остовное дерево также формируется реберным списком Uo. Алгоритм 6.7. Жадный алгоритм минимального остовного дерева for Xj е Xdo Mark[Xj] = /; Sort(U); {Сортировка списка ребер по их весам} ио = 0- while \и^<\Х\- Ida begin (х, у) е U; {Ребро с min весом из оставшихся) ifMark[x] * Mark[y] then begin Uo= Uokj {(x, у)}; {Включить ребро в остовное дерево} z = Mark[y]; {Слияние Uxu Uy} for v e Xdo ifMark[v] = z then Mark[v] = Mark[x]; end; U= U\{(x, у)}] {Удалить ребро с min весом из списка} end; • Сложность жадного алгоритма. Жадный алгоритм требует предварительной сортировки ребер по их весам. Стандартные методы сортировки имеют сложность O(\U\2). Сложность ал- алгоритма 6.7 помимо сложности сортировки зависит от слож- сложности реализации слияния подмножеств Uxn Uy. Сложность данной операции при полном переборе вершин данных под- подмножеств (как представлено в алгоритме 6.7) составляет O(pSr|2). Значит, сложность жадного алгоритма О(|^Г|2) + | U\2). Программная реализация жадного алгоритма представлена в алгоритме 6.8, который близко соответствует множественному описанию соответствующего алгоритма 6.7.
142 Глава 6. Введение в теорию графов. Алгоритмы на графах Алгоритм 6.8. Программа жадного алгоритма Program HungryOstov; {Остовнов дерево. Жадный алгоритм} uses CRT,DOS; Const. nVertex=50; {Максимальное количество вершин} nRib=1000; {Максимальная количество ребер} Туре TypeVertex=array[I..nVertex] of Integer; TypeRib=array[1..nRib] of Integer; Var f :Text; { Текстовый файл } nX :Integer; { Количество вершин в графе } nU :Integer; { Количество ребер в графе } Mark :TypeVertex; { Метки принадлежности вершин } X :TypeVertex; { Список вершин графа } U :TypeRib; { Реберный список графа } nUo :Integer; { Количество ребер в остовном дереве} Uo :TypeRib; { Ребра остовного дерева } We :TypeRib; { Веса ребер графа } Wt :LongInt; { Вес минимального остовного дерева} Procedure Init; { Переназначение меток вершин } Var i,j,m :Integer; begin for i:=l to 2*nU do Uo[i]:=l; for i:=l to 2*nU do for j:=i+l to 2*nU do if Uo[j]=l then if U[j]=U[i] then Uo[j]:=0; nX:=0; for i:=l to 2*nU do if Uo[i]=l then begin nX:=nX+l; X[nX]:=U[i]; end; for i:=l to 2*nU do {Новые метки} for m:=l to nX do if U[i]=X[m] then begin U[i]:=m; break; end; end; Procedure Sort; { Сортировка списка ребер по их весам } var i,j,k :Integer; w :Integer; begin for i:=l to nU do for j:=l to nU-i do if We[j]>We[j+l] then begin
6.8. Остовные деревья 143 w:=We[j]; We[j]:=We[j+1]; We[j+1]:=w; w:=U[2*j-l]; U[2*j-1]:=U[2*(j+1)-1]; U[2*(j+l)-l]:=w; w:=U[2*j]; U[2*j]:=U[2*(j+1)]; U[2*(j+1)]:=w; end; end; Procedure Ostov; { Строим минимальное остовное дерево } Var i,x,y,z :Integer; sU :Integer; begin for i:=l to nX do Mark[i]:=i; Sort; {Сортировка ребер по весу} nUo:=0; {Пустое множество Uo} sU:=l; {Начальное ребро в сортированном U} while nUo<nX-l do begin x:=U[2*sU]; {Выбор нового ребра из списка} y:=U[2*sU-l]; if Mark[x]<>Mark[y] then begin nUo:=nUo+l; Uo[nUo]:=sU;{Добавить ребро в остовное дерево} z:=Mark[у]; {Слияние Ux и Uy} for i:=l to nX do if Mark[i]=z then Mark[i]:=Mark[x]; end; sU:=sU+l; {Удалить ребро (x,y) из списка U} end; end; Var {Main} i,j :Integer; begin {Main} Assign(f,'Hungry.in'); Reset(f);{Файл открыт для чтения} Read(f,nU); {Количество ребер з реберном списке графа} for i.-=l to nU do Read (f, U [2*i-lj ) ; { Первые вершины ребер } for i:=l to nU do Read(f,U[2*i]); { Вторые вершины ребер} for i:=l to nU do Read(f,We[i]); { Веса ребер } Close(f); Assign(f,'Hungry.out' ); Rewrite(f); {Файл открыт для записи} Init; Sort; WriteLn(f,'nU =',nU:3); WriteLn(fr 'nX =',nX:3);
144 Глава 6. Введение в теорию графов. Алгоритмы на графах Write(f,'X =');for i:=l to nX do Write(f,X[i]:3); WriteLn(f); Write(f,'ul =') ; for i:=l to nU do Write(f,X[U[2*i-l]]: 3) ; WriteLn(f); Write(f,'u2 =' ); for i:=l to nU do Write(f,X[U[2*i]]:3); WriteLn(f); Write(f,'We =' ) ; for i:=l to nU do Write(f,We[i]:3);WriteLn(f); Ostov; Write(f,'uol=f); for i:==l to nUo do Write (f,X [U [2*Uo [i] -1] ]: 3) ; WriteLn(f); Write(f,'uo2='); for i:=l to nUo do Write(f,X[U[2*Uo[i]]]:3); WriteLn(f); Write(f,'Woe=' ); for i:=l to nUo do Write(f,We[Uo[i]]:3); WriteLn(f); Wt:=0; for i:=l to nUo do Wt:=Wt+We[Uo[i]]; Write(f,'Bec='fWt:3); Close(f); end. {Main} Рассмотрим пример построения минимального остовного дере- дерева графа, изображенного на рис. 6.20, по программе алгоритма 6.8. xl 17 17 Рис. 6. 20. Пример расчета остовного дерева Для программы этого алгоритма исходные данные графа на рис. 6.20 задаются реберным списком в текстовом файле Hung- ry.in со следующей структурой: • в первой строке файла содержится количество ребер в списке A2); • во второй и третьей строках указываются ребра своими верши- вершинами: одна вершина во второй строке, другая вершина ребра в третьей строке;
6.8. Остовные деревья 145 • в четвертой строке располагаются значения весов соответству- соответствующих ребер. 12 777777123456 123456234561 1 4 9 16 25 36 20 15 3 17 28 23 Результаты расчетов сохраняются в выходном файле Hung- ry.out со следующей структурой: nU = 12 пХ = 7 Х = 7123456 ul =737727416757 u2 =142334521566 We = 1 3 4 9 15 16 17 20 23 25 28 36 uol= 7 3 7 7 4 6 uo2= 14 2 3 5 1 Woe= 1 3 4 9 17 23 Bec= 57. Обозначения данных в файле Hungry.out: nU — число ребер в графе; пХ — число вершин в графе; X — список вершин графа; (ul, u2) — сортированный список ребер графа; We — веса ребер согласно их сортировке; (uol, uo2) — ребра остовного дерева; Woe — веса ребер остовного дерева; Вес — сумма весов ребер остовного дерева. 6.8.2. Алгоритм ближайшего соседа построения остовного дерева Данный метод построения минимального остовного дерева не требует ни сортировки, ни проверки на цикличность на каждом шаге. 1. Построение остовного дерева Го начинается с произвольной вершины х{. 2. Затем среди ребер, инцидентных хь выбираем ребро (хь х2) с наименьшим весом и включаем его в дерево Го. 3. Повторяя процесс, выполняем поиск наименьшего по весу реб- ребра, соединяющего вершины х{ и х2 с некоторой другой верши- вершиной графа ху
146 Глава 6. Введение в теорию графов. Алгоритмы на графах 4. Процесс включения ребер продолжаем до тех пор, пока все вер- вершины исходного графа Г не будут включены в дерево Г о- По- Построенное дерево будет минимальным остовным. Доказательство того, что последовательность шагов 1-4 при- приводит к построению минимального остовного дерева, аналогично доказательству для жадного алгоритма. Реализация схемы бли- ближайшего соседа формирования остовного дерева выполнена в ал- алгоритме 6.9, где исходный граф Г= (X, U, Ф) представляется мат- матрицей весов We = [wy\, веса несуществующих ребер полагаются равными +оо. Под весами ребер понимаются их длины. Остовное дерево Го = (ХОу Uo, Ф) формируется посредством реберного спи- списка Uo и списка вершин Хо. В качестве меток вершин устанавли- устанавливаются их порядковые номера Х= {1, 2,..., п). Для каждой верши- вершины х g Хграфа, еще не включенной в остовное дерево, поддержи- поддерживается минимальное расстояние до множества ранее включенных вершин в Хо. Это осуществляется с помощью двух векторов dist[x] wpre\[x], где dist[x] равно минимальному расстоянию от х е Хдо вершины prev[x] е Хо. Обновление значений векторов dist[x] и prev[x] выполняется на каждом шаге алгоритма при пополнении Хо новой вершиной. • Сложность алгоритма ближайшего соседа. Сложность алгорит- алгоритма определяется двумя вложенными циклами по числу вер- вершин. В каждом из циклов выполняется константное число операций. Следовательно, сложность составляет 0([ЛГ |2). Алгоритм 6.9. Алгоритм ближайшего соседа для остовного дерева Х= {1, 2,..., п}\ {Метки вершин графа} пХ= \Х\; {Количество вершин в графе} v = rand(l9\X\y,. {Произвольная вершина v e X} Хо = {v}; {Вершины остовного дерева} X=X\{v}] {Удалить у из X} Uo = 0; {Ребра остовного дерева} JVT=Q; {Вес остовного дерева} for х е Xdo begin disfyc] = We[x, v]; {Минимальное расстояние от хдо у е Хо} prev[x] = v; {Ребро (v, x), длина которого dist[x]} end; while \Х0 \фпХ do begin dist[v] = min dist[x]\ { v e X— вершина для включения} xeX
6.8. Остовные деревья 147 Хо = Хои {v}; {Добавить вершину} X=X\{v}] {Удалить вершину) Uo= Uou {prev[v], v}; {Добавить ребро} WT= WT+ dist[v\\ {Поправить вес дерева} {Поправить dist[x] — вектор расстояний) forx e Xdo ifdist[x] > JVe[v, x] then begin dist[x] = We\v, x\\ prev[x] = v; end] end. Программная реализация алгоритма ближайшего соседа пред- представлена в алгоритме 6.10, который близко соответствует множе- множественному описанию соответствующего алгоритма 6.9. Алгоритм 6.10. Программа алгоритма ближайшего соседа Program NearOstov; {Остовное дерево. Метод ближайшего соседа} uses CRT,DOS; Const nVertex=50; {Максимальное количество вершин} nRib=1000; {Максимальное количество ребер} Туре TypeVertex=array[I..nVertex] of Integer; TypeRib=array[1..nRib] of Integer; TypeWeight=array[1..nVertex,1.,nVertex3 of Integer; Var { Текстовый файл } { Количество вершин в графе } { Количество вершин в остовном дереве} { Количество ребер в остовном дереве } { Список вершин графа } { Список вершин остовного дерева } { Ребра остовного дерева } { Список ближайших вершин } { Расстояния до ближайших вершин } { Матрица весов ребер графа } { Вес минимального остовного дерева } Procedure minDist( Var v :Integer );{Поиск v - ближайшего соседа} Var i,d :Integer; begin v:=X[l]; f nX nXo nUo X Xo Uo Prev Dist We Wt :Text; :Integer; :Integer; :Integer; :TypeVertex :TypeVertex :TypeRib; :TypeVertex :TypeRib; :TypeWeight :LongInt;
148 Глава 6. Введение в теорию графов. Алгоритмы на графах d:=Dist[v]; for i:=2 to nX do if d>Dist[X[i]] then begin v:=X[i]; d:=Dist[v]; end; end; Procedure newDist( v :Integer );{Обновить dist[] - минимальные расстояния} Var i :Integer; begin for i:=l to nX do if Dist[X[i]]>We[X[i],v] then begin Dist[X[i]]:=We[X[i],v]; Prev[X[i]]:=v; end; end; Procedure Ostov; {Построение остовного дерева) Var i,nStop,v :Integer; begin nStop:=nX; for i:=l to nX do X[i]:=i; v:=l; for i:=l to nX do begin Dist[i]:=We[i,v] ; Prev[i]:=v; end; nXo:=0; { Xo - пустое множество } nUo:=0; { Uo - пустое множество } nXo:=nXo+l; Xo[nXo]:=X[v] ; {Xo=Xo+v - добавить вершину v к остову} X[v]:=X[nX]; nX:=nX-l; { X=X\v - удалить v из X } Wt:=0; while nXoOnStop do begin minDist(v); nXo:=nXo+l; Xo[nXo]:=v; {Xo=Xo+v - добавить вершину v к остову} for i:=l to nX do { X=X\v - удалить v из X } if X[i]=v then begin X[i]:=X[nX]; break; end; nX:=nX-l; nUo:=nUo+l; Uo[2*nUo-l]:=Prev[v];{ Uo=Uo+(Prev[v],v) - добавить ребро к остову}
6.8. Остовные деревья 149 Uo[2*nUo]:=v; Wt:=Wt+Dist[v]; { Обновить вес остовного дерева } newDist(v); end; end; Var {Main} i,j :Integer; begin {Main} Assign(f,'Near.in' ); Reset(f);(Файл открыт для чтения} Read(f,nX); (Количество вершин в графе} for i:=l to nX do begin for j:=i to nX do begin Read(f,We[i,j]); { Ввод матрицы весов } if We[i,j]=0 then We[ifj]:=$7fff; (+бесконечность} We[j,i]:=We[i,j]; end; end; Close(f); Assign(f,'Near.out' ); Rewrite(f); (Файл открыт для записи} nUo:=0;(Выделение реберного списка графа для печати} for i:=l to nX do for j:=i+l to nX do begin if We[ifj]=$7fff then continue; nUo:=nUo+l; Uo[2*nUo-l]:=i; Uo[2*nUo]:=j; end; WriteLn(f,'nU =',nUo:3); WriteLn(f,'nX =',nX:3); Write(f,'X =');for i:=l to nX do Write(f,i:3); WriteLn(f); Write(f,'ul ='); for i:=l to nUo do Write(f,Uo[2*i-l]:3); WriteLn(f); Write(fr'u2 =' ); for i:=l to nUo do Write(f,Uo[2*i]:3); WriteLn(f); Write(f,'We ='); for i:=l to nUo do Write(frWe[Uo[2*i-l],Uo[2*i]]:3); WriteLn(f); Ostov; Write(f,'uol=' ) ; for i:=l to nUo do Write(f,Uo[2*i-l]:3); WriteLn(f); Write(f,'uo2='); for i:=l to nUo do Write(f,Uo[2*i]:3);WriteLn(f);
150 Глава 6. Введение в теорию графов. Алгоритмы на графах Write(f,'Woe='); for i:=l to nUo do Write(f,We[Uo[2*i-l],Uo[2*i]]:3); WriteLn(f); Wt:=O; for i:=l to nUo do Wt:=Wt+We[Uo[2*i-l],Uo[2*i]]; Write(f,'Bec=',Wt:3); Close(f) ; end.{Main} Рассмотрим пример расчета по программе алгоритма 6.10 по- построения минимального остовного дерева графа, изображенного на рис. 6.20. Исходные данные графа представляются матрицей весов его ребер в текстовом файле Near, in со следующей структу- структурой: • в первой строке содержится количество вершин в графе; • в следующих п строках задаются верхние диагональные элемен- элементы (нулевые диагональные элементы включаются) строк мат- матрицы весов. 7 0 20 0 0 15 0 0 0 3 0 0 0 0 17 0 23 0 0 0 28 0 1 4 9 16 25 36 0 Результаты расчетов сохраняются в выходном файле Near.out со следующей структурой: nU = 12 пХ = 7 Х = 1234567 ul =111223344556 u2 =267374757677 We = 20 23 1 15 4 3 9 17 16 28 25 36 uol= 17 7 3 4 1 uo2= 7 2 3 4 5 6 Woe= 1 4 9 3 17 23 Bec= 57. Обозначения данных в файле Near.out соответствуют приня- принятым обозначениям в файле Hungry.out при контрольном расчете остовного дерева по жадному алгоритму 6.8 (см. п.6.8.1).
6.9. Кратчайшие пути на графе 151 6.9. Кратчайшие пути на графе Рассматриваемый алгоритм определяет расстояния между вер- вершинами в простом орграфе с неотрицательными весами. К таким орграфам сводятся многие типы графов. Если граф не является простым, его можно сделать таковым, отбрасывая все петли и за- заменяя каждое множество параллельных ребер кратчайшим реб- ребром (ребром с наименьшим весом) из этого множества; каждое неориентированное ребро заменяется парой ориентированных ребер. Если граф не взвешен, то можно считать, что все ребра имеют один вес. Пусть Г= (X, U, Ф) — простой орграф, для каждого ребра и е U определен вес co(w) > 0. Найдем кратчайший путь между выделен- выделенными вершинами х$ и z (рис. 6.21). Несуществующие ребра будем считать ребрами с бесконечными весами. Сумму весов ребер в пути будем называть весом или длиной пути. Обозначим м?у = ы(и) — вес ребра и = (xif Xj). Алгоритм поиска кратчайшего пути, начиная из вершины х$, просматривает граф в ширину, по- помечая вершины Xj значениями—метками их расстояний от Xq. Мет- Метки могут быть временные и окончательные. Временная метка вер- вершины Xj — это минимальное расстояние от х$ до xj9 когда в опреде- определении пути на графе учитываются не все маршруты из х$ в ху. Окон- Окончательная метка Xj — это минимальное расстояние на графе от х$ до Xj. Таким образом, в каждый момент времени работы алгоритма некоторые вершины будут иметь окончательные метки, а осталь- остальная их часть — временные. Алгоритм заканчивается, когда верши- вершина z получает окончательную метку, т.е. расстояние от х$ до z. Вначале вершине х$ присваивается окончательная метка 0 (ну- (нулевое расстояние до самой себя), а каждой из остальных \Х\ — 1 вершин присваивается временная метка оо (бесконечность). На каждом шаге одной вершине с временной меткой присваивается окончательная и поиск продолжается дальше. На каждом шаге метки меняются следующим образом. 1. Каждой вершине xj9 не имеющей окончательной метки, присва- присваивается новая временная метка — наименьшая из ее временной и числа (wy + окончательная метка jc,), где х, — вершина, которой присвоена окончательная метка на предыдущем шаге. 2. Определяется наименьшая из всех временных меток, которая и становится окончательной меткой своей вершины. В случае равенства меток выбирается любая из них.
152 Глава 6. Введение в теорию графов. Алгоритмы на графах Циклический процесс п.1+п.2 продолжается до тех пор, пока вершина z не получит окончательной метки. Легко видеть, что окончательная метка каждой вершины — это кратчайшее рассто- расстояние от этой вершины до начала Xq. Рассмотрим пример поиска кратчайшего пути на графе, пред- представленном на рис. 6.21. хО 2 х2 5 хЗ 7 Рис. 6.21- Простой взвешенный орграф Процесс назначения меток вершинам графа на каждом шаге удобно представить в виде следующей таблицы. xl х2 хЗ х4 х5 10 15 13 15 5 12 Квадратами выделены окончательные метки, т.е. расстояния от них до Xq. По такой таблице легко восстановить путь перемеще- перемещения от zkxq, который отмечен ломаной кривой. Реализация рассмотренной схемы поиска кратчайшего пути представлена в алгоритме 6.11, где граф Г= (X, U, Ф) представля- представляется матрицей весов We = [wy\, веса несуществующих ребер пола- полагаются равными +оо. Вектор Магк[х] меток вершин устанавливает принадлежность вершины jc e ^постоянной (TRUE) или времен- временной {FALSE) метке. Вектор Dist[x] в алгоритме фиксирует теку- текущие значения меток вершин. Вектор Prev[x] позволяет восстано- восстановить в обратной последовательности вершины кратчайшего пути.
6.9. Кратчайшие пути на графе 153 Алгоритм 6.11. Алгоритм кратчайшего пути на орграфе for х е Xdo begin . Mark[x] = FALSE; Dist[x] = oo; end, Mark[xQ] = TRUE; Distlxo] = 0; while not Mark[z] do begin for x e Xdo if not Mark[x] and dist[x] > dist\y\ + w\y, z] then begin dist[x] = dist\y\ + w[y, x\; prev[x] = y; end; {Поиск новой вершины у е X с минимальной временной меткой} dist[y] = min distixX хеХand Mark[x]= FALSE Mark\y\ = TRUE; end. Prev[x] указывает на вершину с окончательной меткой, бли- ближайшую к вершине х. Последовательность вершин кратчайшего пути будет имеет следующий вид: z,prev[z], prev[prev[z\], prev[prev\prev[z]]], ... , х0, а значение Dist[z] составит длину пути из Xq в z. Очередная новая вершина, претендующая на постоянную метку, обозначается че- через у. • Сложность алгоритма. Алгоритм обращается к телу цикла whi- while не более \Х\ — 1 раз, и число операций, требующихся при каждом таком обращении, равно О(\Х |). Тогда сложность алго- алгоритма составит О(\Х\2). Интересно заметить, что если требуется найти длины кратчай- кратчайших путей от х0 до всех вершин графа, то в алгоритме 6.11 условие цикла while not Mark[z] do begin надо заменить на условие while v not Mark[x] do begin. При этом сложность алгоритма останется хеХ прежней. Программная реализация алгоритма поиска кратчайшего пути представлена в алгоритме 6.12 на Pascal'e, который близко соот- соответствует множественному описанию алгоритма 6.11.
f nX Mark Dist Prev We xO z У :Text; :Integer; :TypeMark; :TypeDist; :TypePrev; :TypeWeight :Integer; :Integer; :Integer; 154 Глава 6. Введение в теорию графов. Алгоритмы на графах Алгоритм 6.12. Программа кратчайшего пути на орграфе Program Short; {Кратчайшие пути на графе} uses CRT,DOS; Const nVertex=50; {Максимальное количество вершин} Type TypeMark=array[0..nVertex] of Boolean; TypeDist=array[0..nVertex] of Longlnt; TypePrev=array[0..nVertex] of Integer; TypeWeight=array[0..nVertex,0..nVertex] of Integer; Var { Текстовый файл } { Количество вершин в графе } :TypeMark; {Признаки временных и постоянных меток} { Значения текущих меток вершин (расстояния)} { Указатель на ближайшую вершину } { Матрица весов ребер графа } { Вершина начала пути } { Вершина конца пути } {Последняя вершина с постоянной меткой} Var i,j,x :Integer; weight :Longlnt; begin Assign(f, 'Short.in'); Reset(f);{Файл открыт для чтения} {Ввод исходных данных) Read(f,xO); {Начальная вершина пути} Read(ffz); {Конечная вершина пути} Read(ffnX); {Количество вершин в графе} пХ:=пХ-1; (* Х={0,1,2,...,пХ} - множество вершин *) for i:=0 to nX do begin for j:=0 to nX do begin Read(f,We[i,j]); { Ввод матрицы весов } if We[i,j]=0 then We[i,j]:=$7fff; {+бесконечность} end; end; Close(f); Assign(f,'Short.out'); Rewrite(f); {Файл открыт для записи} for x:=0 to nX do begin Mark[x]:=FALSE; Dist[x]:=$7fffffff; end;
6.9. Кратчайшие пути на графе Т55 у:=хО; {Последняя вершина с постоянной меткой} Mark[у]:=TRUE; Dist[y] :==0; while not Mark[z] do begin {Обновить временные метки} for x:=0 to nX do if not Mark[x] and ( Dist[x]>Dist[y]+We[y,x] ) then begin Dist[x]:=Dist[y}+We[y,x]; Prev[x]:=y; end; {Поиск вершины с минимальной временной меткой) weight:=$7fffffff; for x:=0 to nX do if not Mark[x] then if weight>Dist[x] then begin weight:=Dist[x]; y:=x; end; Mark[y]:=TRUE; end; Write(f, 'Вершины пути='); x:=z; while xOxO do begin Write(f,x:2); x:=Prev[x]; end; WriteLn(f,x:2); WriteLn(f,'Длина пути= \Dist[z]); Close(f); end. Рассмотрим пример расчета по программе алгоритма 6.12 по- поиска кратчайшего пути на графе, показанном на рис. 6.21. Исход- Исходные данные графа представляются матрицей весов его ребер в текстовом файле Short.in со следующей структурой: • в первой строке определяется номер начальной вершины пути л^; • во второй строке определяется номер конечной вершины пути z", • в третьей строке указывается количество пХвершин в графе; • в следующих л^Гстроках определяются строки матрицы весов [и^] графа.
156 Глава 6. Введение в теорию графов. Алгоритмы на графах 0 0 0 0 0 0 0 7 0 3 0 0 0 0 2 0 0 0 8 0 0 0 1 5 0 0 0 0 0 5 0 3 0 1 0 0 0 0 7 5 0 0 0 10 0 0 2 б 0 Результаты расчетов сохраняются в выходном файле Short.out со следующей структурой: Вершины пути= 6 4 3 12 0 Длина пути= 11. 6.10. Потоки в сетях • Определение. Транспортной сетью называется связный ориен- ориентированный граф без петель Г= (X, Uy Ф) с выделенной парой вершин Xq и z (рис. 6.22). Вершина х$ — начало транспортной сети, из которой дуги только выходят. Вершина z — конец транспортной сети, в которую дуги только входят. На множе- множестве дуг и е U задана целочисленная функция с(и) > 0, где с(и) — пропускная способность дуги. Рис. 6.22. Транспортная сеть • Определение. Потоком по транспортной сети называется цело- целочисленная функция ф(м) > 0 , заданная на множестве дуг и eU и обладающая следующими свойствами: \/иеиф)<С(и) и ]>>(*/)= ?>(w), F.10.1) ud/+x udJ; где x — внутренняя вершина графа, т.е. х * х0, х * z\ U* — множество дуг, заходящих в вершину jc; U~ — множество дуг, выходящих из вершины х (рис. 6.22).
6.10. Потоки в сетях 157 На рис. 6.22 напротив каждой дуги стоит дробь, числитель ко- которой — пропускная способность дуги, знаменатель — поток по дуге. Свойство F.10.1) утверждает, что поток, входящий в верши- вершину, равен выходящему потоку (поток в вершинах не скапливает- скапливается). Обозначим где ф(г)— поток, входящий в вершину z\ ф(*о) — поток, выходящий из вершины х0. • Утверждение 6.10.1. ф(^) = ф(х0). Действительно, сумма ]Г[ ]Гф(м)- ]>]ф(м)]=0, так как \/и е U величина ф(м) суммируется дважды — со знаками + и -. Здесь xeXueU* ueU; xeX\{xo,z) weC/J ueJ~ где первая часть выражения равна нулю вследствие 6.10.1. • Определение разреза. Пусть А с X— множество вершин транс- транспортной сети: х0 &А, z^A. Обозначим через U\ множество дуг, входящих в А. Это множество дуг будем называть разрезом транспортной сети. \с(и) c(u)* * C(U)/ C(U)- Рис. 6.23. Разрез транспортной сети С(А) = ^c(w) — называется мощностью разреза. Это максимально иеи+Л возможный поток, входящий в А по дугам разреза. ф(Л) = ^ф(м) — поток, входящий в А по дугам разреза. Ясно, что иеи+А ф(Л) < С(А), так как Vw eU ц(и) < с(и). • Утверждение 6.10.2. ф(^) < С(А). Действительно, из рис. 6.23 видно, что не весь поток, входя- входящий в А, скатывается в z. Часть потока может выходить из А. Зна- Значит, ф(г) < ф(Л), но ф(Л) < С(А), тогда и ф(г) < С(А).
158 Глава 6. Введение в теорию графов. Алгоритмы на графах Теорема 6. ЮЛ Форда и Фалкерсона. Максимальный поток по транспортной сети равен мощности минимального разреза, т.е. Доказательство теоремы — это алгоритм определения макси- максимального потока по сети. Алгоритм состоит из двух частей. 1. Насыщение потока. Поток называется насыщенным, если лю- любой путь из Xq в z содержит дугу и е U, для которой q>(«) = с{и). Задача первой части алгоритм состоит в насыщении потока. 1.1. Зададим произвольный начальный поток. Например, нуле- нулевой на всех дугах: Vw e Uy(u) = 0. 1.2. Поиск пути из Xq в z. Если путь найден, то переход к пункту 1.3. Если путь не найден, то переход к пункту 1.5. 1.3. Увеличиваем поток по найденному пути таким образом, что- чтобы одна из дуг стала насыщенной. 1.4. Условно разрываем насыщенную дугу и переходим к пункту 1.2, на поиск пути из Xq в ь 1.5. Сеть насыщена и «разорвана». 2. Перераспределение потока. Итак, поток насыщен, как в приме- примере на рис. 6.24. Пометим рекурсивным образом все возмож- возможные вершины л,- сети. -2 Xl х2 +о х2 Рис- 6.24. Насыщенная транспортная сеть и пометка вершин 2.1. Вершину jcq пометим —0. 2.2. Пусть х, — любая из уже помеченных вершин; у — произволь- произвольная непомеченная вершина, смежная xv Вершину у помечаем +/, если данные вершины соединены ненасыщенным ребром х,->>>(+/), и помечаем —/, если соединены непустым ребром xi<r-y{-i). После пометки вершин возможны два случая: вер- вершина z оказалась либо помеченной, либо непомеченной.
6.10. Потоки в сетях 159 2.3. Вершина z оказалась помеченной. Значит, существует после- последовательность помеченных вершин от jc0 к z. В этой последо- последовательности каждая последующая вершина помечена номе- номером предыдущей, как на рис. 6.25. Определим на дугах новый поток, увеличивая на единицу поток на дугах, ориентирован- ориентированных по направлению движения от jc0 к z, и уменьшая поток на единицу на дугах, направленных против этого движения, как на рис. 6.25. Ill 111 -О 1 +0 1 -2 1 +1 2 0 2 хО +0 ->•-< х2 xl хО х2 xl Рис. 6.25. Перераспределение потока на основе пометки вершин Заметим, что поток можно увеличивать (уменьшать) на пря- прямых (обратных) дугах настолько, пока одна из дуг не станет насыщенной (пустой). Далее вновь переходим к пометке вер- вершин (пункт 2.1). Выполненное перераспределение потока со- сохраняет все его свойства и увеличивает на единицу поток в вершину z. Таким образом, пометка вершины z позволяет увеличить поток как минимум на единицу, а значит, алго- алгоритм конечен, т.е. наступит момент, когда вершина z оста- останется непомеченной. 2.4. Вершина z осталась непомеченной. В рассматриваемом при- примере это показано на рис. 6.26. Пусть А* — множество всех не- непомеченных вершин. Тогда дуги, входящие в эти вершины, насыщенные, а выходящие — пустые. В примере А* = {хь z}- Множество А* определяет разрез, так как х$ <? A*, z e А*. Та- Таким образом, мы нашли поток ср* и разрез А*, для которых вы- выполняется ф*04*) = С(Л*). Учитывая, что выходящие дуги из А* пустые, то весь поток ц*(А*) скатывается в z, т.е. cp*(z) = С(А*). v / / 1 \° \ Л V \ т L / 3 \2 \ N / 7 • Z 1 S V -^ . xl i 1 1 Рис. 6.26. Максимальный поток
160 Глава 6. Введение в теорию графов. Алгоритмы на графах Покажем, что q>* — максимальный поток, а А* определяет ми- минимальный разрез. Так как для любого потока ф и любого разреза А справедливо cp(s) < С(А) , то выполняется соотношение Ф * (z) < max ф) < minC(A) < С(А*). Ф А Для найденного разреза и потока справедливо равенство Ф*(г) < С(Л*). Отсюда следует, что тахф(^)=1ШпС(Л). Рассмот- Ф А ренный алгоритм позволяет найти именно максимальный поток Ф* и множество А*, определяющее минимальный разрез. В рас- рассматриваемом примере ф*Сг) = 3 и С(А*) = с(х0, х{) + с(х2, х{) + + с(х2, z) =1 + 1 + 1 = 3. Для примера на рис. 6.22 найдем все разрезы рассмотренной транспортной сети. А{ = {z}, С(А{) = с{хь z) + c(x2, z) = 3 + 1 = 4. Л2 = {z, хх}> С(А2) = с(х0, хх) + с(х2, х{) + с(х2, z) = 1 + 1 + 1 = 3. Л3 = {Z, х2}, С(А3) = с(дсо, х2) + с(хь х2) + с{хь z) = 3 + 1 + 3 = 7. 4* = {z, хи х2}, С{А^) = фо, х{) + с(ло, х2) = 1 + 3 = 4. Сложность алгоритма. Если следовать утверждению теоремы, то значение максимального потока можно найти прямым перебо- перебором всех разрезов. Подсчитаем общее число разрезов. Обозначим через п = \Х\ — 2, п — количество узлов в сети без вершин х0 и & Число сочетаний С* равно числу разрезов, каждый из которых со- содержит к вершин xt и вершину z. Тогда число разрезов равно С„ +С^ +...+CJJ =2", из которых надо выбрать один разрез. Следо- Следовательно, сложность полного перебора всех разрезов является эк- экспоненциальной 0B^'). Оценим количество операций в алгоритме Форда и Фалкерсо- на. Часть алгоритма, относящаяся к пометке вершин, требует пе- перебора всех вершин, т.е. количества операций порядка 0(|Х|). Каждое увеличение потока приводит к появлению дуги с нулевым или насыщенным потоком по ней. Такая дуга далее не участвует в пометке вершин. Всего дуг \U\, а значит, для окончания алгорит- алгоритма требуется не более 0(\Х\ • \U\) операций приращения потока. Сложность алгоритма является степенной. 6.11. Клики, независимые множества • Определение доминирующего множества. Пусть Г= (X, U, Ф) — ориентированный или неориентированный граф. Подмноже-
6.11. Клики, независимые множества 161 ство D с U называется доминирующим множеством для гра- графа, если каждая не принадлежащая D вершина является ко- конечной вершиной некоторого ребра от вершины, принадлежа- принадлежащей D. Например, если рассмотреть Г как граф, представляю- представляющий игру, с вершинами, соответствующими позициям, и ребрами — ходами, то доминирующим множеством D будет та- такое множество позиций, что во все остальные позиции можно попасть из D за один ход. Минимальным доминирующим множеством называется такое доминирующее множество, что никакое его подмножество не об- обладает этим свойством. Числом доминирования 5G) графа называ- называется наименьшее число вершин, составляющих минимальное до- доминирующее множество. Число 5G) появляется в различных за- задачах. Например, требуется разместить на шахматной доске ми- минимальное число ферзей так, чтобы они держали под боем каждую клетку доски. Для решения задачи достаточно 5 ферзей; меньшего числа недостаточно. Тогда для графа этой игры число доминирования 5G) = 5, где клетки доски — это вершины графа; две клетки связаны неориентированным ребром, если ферзь, по- поставленный на одну из клеток, угрожает другой. В качестве примера рассмотрим вариант этой игры, когда рас- расстановка ферзей выполняется на доске 3x3 (рис. 6.27). На рис. 6.28 представлен граф данной игры. Вершины 1 и 9 соедине- соединены ребром, так как ферзь в клетке 1 держит под боем клетку с но- номером 9. Вершины 1 и 8 не соединены, так как ферзь в клетке 1 не может угрожать клетке 8 и т.д. Вершины 1 и 8 (рис. 6.29) составля- составляют доминирующее множество D = {1, 8}, так как из этих вершин по ребрам графа можно за один ход попасть в любую другую вер- вершину. Одна вершина с номером 5 (рис. 6.30) также составляет до- доминирующее множество D = {5} . Ясно, что для графа этой игры число доминирования равно 5G) = 1. 1 7 2 5 8 3 6 9 Рис. 6.27 6—2697 Рис. 6.28 7X879 Рис. 6.29 Рис. 6.30
162 Глава 6. Введение в теорию графов. Алгоритмы на графах • Определение независимого множества вершин. Пусть граф Г= (Ху U, Ф) — неориентированный и без петель. Множество / с U вершин называется независимым, если между любыми его вершинами нет соединяющих ребер. В зависимом множе- множестве хотя бы две вершины соединены ребром. Множество Q полностью зависимое, если каждая пара его вершин соединена. Вершины графа, составляющие Q, образуют полный подграф. • Определение. Максимальное независимое множество есть неза- независимое множество, которое становится зависимым после до- добавления к нему любой вершины. Заметим, что каждое неза- независимое множество содержится в некотором максимальном независимом множестве. Максимальное число р(/) вершин, составляющих независимое множество, называется числом (вершинной) независимости графа. • Определение независимого множества ребер. Подобно незави- независимым множествам вершин рассматриваются независимые множества ребер, состоящие из ребер, не имеющих общих вер- вершин. Каждое независимое множество ребер содержится в не- некотором максимальном независимом множестве. Число ребер в максимальном независимом множестве называется числом реберной независимости Р„(/)- При представлении игр графами независимые множества вер- вершин являются такими множествами позиций, что никакая из них не может быть достигнута из другой за один ход. Примером явля- является задача о расположении максимального числа ферзей на шах- шахматной доске так, чтобы ни один них не мог побить другого. Это максимальное число равно р(/) = 8. • Утверждение 6.11.1. Независимое множество максимально тогда и только тогда, когда оно доминирующее, а значит, р(/) > 5(/)— число (вершинной) независимости не может быть меньше числа доминирования. Доказательство. (==>) Если /с U— максимальное независимое множество, то не может быть вершин k el, не соединенных с ребром, так как в противном случае множество к и /также было бы независимым, но /— максимальное по условию. Отсюда / — доминирующее. (<=) Пусть /— независимое доминирующее мно- множество. Тогда никакое к нельзя перевести из 7 в /так, чтобы Ли/ осталось независимым, а значит, /— максимальное.
6.11. Клики, независимые множества 163 Определение. Клика есть полностью зависимое множество, ко- которое теряет это свойство после добавления любой вершины. Клики графа представляют «естественные» группировки вер- вершин в максимальные полные подграфы. Определение клик графа полезно в кластерном анализе в таких областях, как ин- информационный поиск, в социологии и др. В качестве примера на рис. 6.31 показан граф и его клики. 6 7 1 4 4 Рис. 6.31. Граф и его клики 7 7 • Замечание. Если предположить, что граф Г= (X, U, Ф) про- простой, то полностью зависимые множества (клики) в Г стано- становятся максимально независимыми множествами в дополните- дополнительном графе Г, верно и обратное. При алгоритмическом подходе к выделению клик в графе при- применяют метод поиска с возвращением по специальному дереву по- поиска, устроенному следующим образом. Каждый узел в дереве по- поиска соответствует полному подграфу исходного графа, и каждое ребро дерева поиска соответствует вершине исходного дерева. Вершины (множества) дерева поиска определим рекурсивно. Ко- Корень дерева поиска — пустое начальное множество S= 0. Пусть теперь S — произвольная вершина дерева поиска какого-либо уровня. Тогда вершиной следующего уровня дерева поиска будет вершина S u {*}, если л: е S и х смежна с каждой вершиной из S. В дереве поиска такие вершины S и Skj {х} соединяются ребром, которое соответствует вершине х. На рис. 6.32 показаны некото- некоторый граф Гп дерево поиска Т, которое исследуется в процессе по- поиска с возвращениями клик графа полным перебором. Заметим, что каждая клика порождается много раз: клика {1,2,3} порождается 3! раз, клики {3,4} {4,5} порождаются 2! раз. В общем случае клика размера к порождается к\ раз. Все тонкие реб- ребра на рис. 6.32 исследования дерева поиска можно оборвать, они не приводят к новым кликам. Следующие два утверждения по- позволяют обрывать такие «тонкие» ребра (не исследовать их), обес- обеспечивая целенаправленный проход по дереву поиска клик графа.
164 Глава 6. Введение в теорию графов. Алгоритмы на графах 3} {12} {21} {23} {31} {32} {34} {45} {43} {54} {132} {123} {213} {231} {312} {321} Рис. 6.32. Граф Г и полный перебор дерева Т поиска клик • Утверждение 6.11.2. Пусть Г- (X, U, Ф) — исходный граф, S — узел в дереве поиска T(S<^ X— подмножество вершин графа). Вершина Sдерева поиска уже обработана и первой вершиной, которую надо исследовать, является множество Su {x}, как на рис. 6.33, вершина х смежна с каждой вершиной из S. Пусть все поддеревья узла Su {x} в дереве Гуже исследованы и по- порождены все клики, включающие Su {x}. Тогда необходимо исследовать только те из вершин S u {v,}, для которых v e Adj[x] (рис. 6.33). Рис. 6.33 s Поддеревья с корнями 5и {v,) (эти вершины смежны с S) S^ • Утверждение 6.11.3. Пусть S — узел в дереве поиска Т, и пусть S с S — предок S в Т. Если все поддеревья узла S и{х} уже ис- исследованы, так что порождены все клики, включающие S u{x}, то все неисследованные поддеревья с корнями j'ujjc} можно игнорировать. Алгоритм 6.13 порождения клик графа представляет собой про- процедуру поиска с возвращением и является наиболее сложным из всех ранее рассмотренных алгоритмов. Рекурсивная процедура CLIQ UE имеет два параметра: Nw D. Для рассматриваемого узла S
6.11. Клики, независимые множества 165 поиска объединение N^jD представляет множество вершин, смежных с каждой вершиной из S, т.е. NuD — множество вершин, которые могут выступать в качестве продолжения поиска клик из вершины S. Множество Nсостоит только из новых вершин, кото- которые могут быть добавлены к S в процессе поиска клик, т.е. Л'= {х е A}|(x,s) е U V5 zSл\/$ с S ни одно из поддеревьев S и{х) не исследовано]. Алгоритм 6.13. Порождение клик графа S-0\ {Начальная вершина дерева поиска Т} Z=X; CLIQUE(N, D. Z); {Рекурсивный проход по дереву поиска Т) Procedure CLIQUE(N, D, 2) if N ^j D = 0 then вывести S, которое является кликой else ifN*0 then begin x e iV; {Исследовать первое поддерево} View(x)] {Исследовать поддеревья} {Исследовать оставшиеся поддеревья уровня} while Z*0 do begin veZ; View(v); {Исследовать поддеревья} z € Z\{v}; end] end; end, Procedure View(v) {Исследовать поддеревья} N=N\{v}; CLIQUE(NnAdj[v], DnAdj[vl Nn^[v]); S=S\{v}; D=Du{v}; end, Процедура CLIQUE выбирает произвольную вершину х е N, удаляет ее из N и исследует поддерево 5=5и{х}, обращаясь к процедуре View. Далее, согласно утверждениям 6.11.2 и 6.11.3, при помощи процедуры исследуются только поддеревья 5=5u{v}, где v g N, v ? Adj[x] что соответствует условию v e Z. Множество
166 Глава 6. Введение в теорию графов. Алгоритмы на графах Zсостоит из вершин одного уровня дерева, которые должны быть исследованы при рекурсивном проходе по дереву поиска, чтобы не потерять ни одной клики графа. Второй параметр D процедуры CLIQUE представляет собой множество вершин, смежных со всеми вершинами из S, но таких, которые не надо добавлять к S на предмет продолжения форми- формирования клик. D = {х е X\\(x,s) eUVs eSu поддерево S u {x} исследовалось для некоторыхS cS]. По алгоритму множество S^X является полным подграфом гра- графа Г = (X, U, Ф) и Nu D — множество всех вершин, смежных с каждой вершиной в S. • Множество S будет кликой тогда и только тогда, когда • Условие N= 0 и D * 0 обозначает, что все клики, включающие S, уже ранее порождались. • При N* 0 могут оставаться клики, включающие S, которые еще не порождались. Исследование таких поддеревьев Su {х}, х g 7V необходимо продолжить. Основные усилия алгоритма 6.13, порождения клик графа, на- направлены на поддержание множеств Nn D, текущее состояние которых, согласно перечисленным выше условиям, предопреде- предопределяет исследования по дереву поиска. Программная реализация алгоритма порождения клик графа представлена в алгоритме 6.14 на Pascal'e, который близко соот- соответствует множественному описанию алгоритма 6.13. Отметим, что в программной реализации передача множеств N, D, Zb каче- качестве параметров процедур выполнена посредством указателей kN9 nN, kD, nD, kZ, nZ, где kN, kD, kZ— указатели начала вершин в множествах, соответственно N, D, Z, a nN, nD, nZ — количество вершин в каждом из этих множеств. Алгоритм 6.14. Программа порождения клик графа Program PgmClique; {Выделение клик графа) uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[I..nVertex] of Integer;
6.11. Клики, независимые множества 167 TypeAdjacent=array[I..nAdjacent] of Integer; Var f :Text; { Текстовый файл } m :Integer; { Количество вершин в графе } Adj :TypeAdjacent;{ Список смежности графа } Fst :TypeVertex; { Указатели вершин списка смежности} Nbr :TypeVertex; { Количество вершин в списке смежности } Vtx :TypeVertex; { Список вершин графа } S :TypeVertex; { Список вершин формируемых клик } nS :Integer; { Количество вершин в списке S } N :TypeVertex; { Список включаемых вершин при поиске клик} {kN,nN - указатель начала и количества вершин в списке N} D :TypeVertex; {Список вершин с ранее найденными кликами} {kD,nD - указатель начала и количества вершин в списке D} Z :TypeVertex; { Список не исследованных вершин } {kZ,nZ - указатель начала и количества вершин в списке Z} Procedure PrintClique; FORWARD; Procedure Subtract( x:Integer; Var kZ,nZ:Integer ); FOR- FORWARD; Procedure Intersection( v,kM,nM:Integer; Var kMw,nMw:In- kMw,nMw:Integer; Var M:TypeVertex ); FORWARD; Procedure View( v:Integer; Var kN,nN, kD,nD, kZ,nZ:Inte- kZ,nZ:Integer ); FORWARD; Procedure Clique( kN,nN,kD,nD,kZ,nZ:Integer ); FORWARD; Procedure Init( Var yes :Boolean ); { Переназначение меток вершин их порядковыми номерами по списку смежности вершин графа } { yes - признак правильной структуры списка смежности графа} Var i,j,k :Integer; begin for i:=l to m do for j:=l to Nbr[i] do begin yes:=FALSE; for k:=l to m do if Adj[Fst[i]+j]=Vtx[k] then begin yes:=TRUE; Adj[Fst[i]+j]:=k; break; end;
168 Глава 6. Введение в теорию графов. Алгоритмы на графах if not yes then exit; end; end; Procedure PrintClique; { Печать вершин найденной клики } Var i :Integer; begin for i:=l to nS do Write(f,Vtx[S[i]]:3); WriteLn(f); end; Procedure Intersection( v,kM,nM:Integer; Var kMw,nMw:Integer; Var M:TypeVertex ); { Формирование пересечения M*Adj[v] множеств М и Adj[v] } Var i,j,k :Integer; yes :Boolean; begin {kMw - указатель начала вершин в множестве M*Adj[v]} {nMw - количество вершин в множестве M*Adj[v]} kMw:=kM+nM; nMw:=0; for i:=l to nM do for j:=l to Nbr[v] do if M[kM+i]=Adj[Fst[v]+j] then begin nMw:=nMw+1; M[kMw+nMw]:=M[kM+i]; break; end; end; Procedure Subtract( x:Integer; Var kZ,nZ:Integer ); (* Формирование разности множеств Z=Z\{x} и Z=Z\Adj[x] *) Var i,j,k :Integer; yes :Boolean; begin (* Формирование Z=Z\{x} *) for i:=l to nZ do if Z[kZ-i-i]=x then begin nZ:=nZ-l; for k:=i to nZ do Z[kZ+k]:=Z[kZ+k+1]; break; end; (* Формирование Z=Z\Adj[x] *)
6.11. Клики, независимые множества 169 for j:=1 to Nbr[x] do for i:=l to nZ do if Z[kZ+i]=Adj[Fst[x]+j] then begin nZ:=nZ-l; for k:=i to nZ do Z[kZ+k]:=Z[kZ+k+1]; break; end; end; Procedure Clique( kN,nN,kD,nD,kZ,nZ:Integer ); { Процедура рекурсивного поиска клик графа } Var i,j,x : Integers- begin if (nN=0) and (nD=0) then {Клика найдена} PrintClique {Печать клики} else if nN<>0 then begin {Продолжить исследование поддеревьев} x:=N[kN+nN]; {Перебор с конца вершин множества N} View(х,kN,nN,kD,nD,kZ,nZ); {Исследовать первое поддерево уровня} Subtract(x,kZ,nZ); (* Z=Z\{x} и Z=Z\Adj[x] *) while nZ<>0 do begin {Исследовать следующие поддеревья уровня} x:=Z[kZ+nZ]; View(x,kN,nN,kD,nD,kZ,nZ) ; nZ:=nZ-l; (* Z=Z\{x} *) end; end; end; Procedure View(v:Integer; Var kN,nN,kD,nD,kZ,nZ:Integer); { Исследование поддеревьев следующего уровня } Var i,k :Integer; kNw,nNw :Integer; kDw,nDw :Integer; kZw,nZw :Integer; begin (* Формирование N=N\{v} *) for i:=l to nN do if N[kN+i]=v then begin nN:=nN-l; for k:=i to nN do N[kN+k]:=N[kN+k+1]; break; end;
170 Глава 6. Введение в теорию графов. Алгоритмы на графах (* Формирование S-S+{v} *) nS:=nS+l; S[nS]:=v; (* Формирование пересечения множеств *) Intersection(v,kN,nN,kNw,nNw,N); {N и Adj[v]} Intersection(v,kD,nD,kDw,nDw,D); {D и Adj[v]} (* Формирование начального Z=N нового уровня *) kZw:=kZ+nZ; nZw:=nNw; for i:=l to nNw do Z[kZw+i]:=N[kNw+i]; (* Исследование поддеревьев нового уровня *) Clique(kNw,nNw,kDw,nDw,kZw,nZw); (* Формирование S=S\{v} *) nS:=nS-l; (* Формирование D=D+{v} *) nD:=nD+l; D[kD+nD]:=v; end; Var kN,nN, kD,nD, kZ,nZ :Integer; i,j :Integer; yes :Boolean; begin Assign(f, 'Clique.in' ) ; Reset(f); {Файл открыт для чтения} {Ввод списка смежности} Read(f,m); {Количество строк в списке} Fst[l]:=O; {Указатель начала первой строки списка} for i:=l to m do begin Read(f,Vtx[i]); {Метка вершины} Read(ffNbr[i]); {Количество вершин в списке} for j:=l to Nbr[i] do Read(f,Adj[Fst[i]+j]); {Список смежных вершин} Fst[i+1]:=Fst[i]+Nbr[i]; {Указатель начала следующей строки в списке} end; Close(f); Assign(f,'Clique.out'); Rewrite(f); {Файл открыт для записи} Init(yes); if not yes then begin WriteLn(f,'Плохая структура смежности графа!'); Close(f); exit; end;
6.11. Клики, независимые множества 171 {Формирование начальных множеств: S, nS:=0; {S - пустое} kD:=0; nD:=0; {D - пустое множество} D, N, Z} kN:=0; nN:=m; {N - все вершины графа} for i:=l to m do N[i]:=i; kZ:=0; nZ:=n\; {Z - для исследования доступны все вершины} for i:=l to m do Z[i]:=i; Clique (kN,nN,kD,nD,kZ,nZ) ; {Рекурсивное выделение клик графа} Close(f) ; end. Воспользуемся данной программой в качестве примера для ре- решения следующей задачи. Задана. Симпатичный прием. Генерал желает устроить свой юбилей с максимальным числом гостей из своих знакомых. Стре- Стремясь сделать юбилейный вечер приятным, он должен организо- организовать все так, чтобы на нем присутствовали люди, симпатизирую- симпатизирующие друг другу. Для достижения цели ему придется находить мак- максимальную клику графа своих знакомых. Этот граф устроен следу- следующим образом. Вершины его — знакомые юбиляра. Две вершины смежные, если соответствующие знакомые симпатизируют друг другу. Нетрудно понять, что клика этого графа с максимальным числом вершин и представляет тот самый максимальный контин- контингент приглашенных, который может позволить себе юбиляр. «Симпатичный» граф знакомьис генерала представлен на рис. 6.34. Рис. 6.34 L -2 Пример порождения клик графа Для программы алгоритма 6.14 исходные данные структуры смежности Adj[x] этого графа задаются в текстовом файле СН- que.in. Структура (правило) заполнения файла совпадает с той, которая описана в примере поиска в глубину при расчете по про- программе алгоритма 6.2. Данные файла Clique.in для примера на рис. 6.34: 7 3 3 1 4
172 Глава 6. Введение в теорию графов. Алгоритмы на графах 4 4 3 12 5 7 2 3 6 2 4 14 5 6 5 4 4 12 6 6 3 7 5 2 Результаты расчетов сохраняются в выходном файле Clique.out со следующей структурой: 6 5 2 6 7 4 5 2 1 4 3 1 3 7 Строки файла Clique.out — это номера вершин соответствую- соответствующих клик «симпатичного» графа на рис.6.34. Отсюда видно, что в данном случае на вечер могут быть приглашены лишь четыре близких друга генерала. 6.12. Циклы, фундаментальные множества циклов В данном разделе рассматриваются алгоритмы решения задач, имеющих отношение к структуре циклов графа. Подобного рода задачи возникают при изучении вычислительных программ, в си- системах контроля при размыкании обратных связей и т. п. Рас- Рассмотрим остовное дерево Го = (X, Uo, Ф) графа Г= (X, U, Ф). Лю- Любое ребро, не принадлежащее Uo, т. е. любое ребро из U\U0, по- порождает в точности один цикл при добавлении его к Uo. Такой цикл является элементом фундаментального множества циклов графа /относительно дерева Го. Так как каждое остовное дерево графа Г включает [ЛГ| — 1 ребро, в фундаментальном множестве циклов относительно любого остовного дерева графа Г имеется |*7|-|X| + 1 циклов. Полезность фундаментального множества циклов вытекает из того факта, что это множество полностью определяет цикличе- циклическую структуру графа: каждый цикл в графе может быть представ- представлен комбинацией циклов из фундаментального множества. Пусть F= {Сь С2,..., С|?/|_рг|+1} — фундаментальное множество циклов, где каждый цикл С, является подмножеством ребер С, с U. Тогда любой цикл графа Г можно записать в виде ((... (С, © С,- 2 )©...)© С,), где символ 0 обозначает операцию симметрической разности,
6.12. Циклы, фундаментальные множества циклов 173 Например, на рис. 6.35 показан граф и фундаментальное мно- множество циклов, получающихся из выделенного жирной линией остовного дерева графа. Цикл графа (х{, хъ х5, х3) есть С{ 8 С3 Ф С4 или цикл (хь х2, х4, х3) есть С{®С2. Отметим, что в общем случае не каждая сумма циклов будет являться циклом графа. Рис. 6.35. Граф, его остовное дерево и фундаментальное множество циклов При порождении фундаментального множества циклов удобно использовать метод поиска в глубину; он строит остовное дерево и каждое обратное ребро порождает цикл относительно этого дере- дерева. Для того чтобы следить за ребрами дерева, используется поиск в глубину со стеком, в котором хранятся все текущие вершины пройденного пути в данный момент. Когда попадаем на обратное ребро, обнаруженный цикл будет состоять из этого ребра и ребер, соединяющих вершины из верха стека. Реализация рассмотренно- рассмотренного подхода представлена в алгоритме 6.15, который строит фунда- фундаментальное множество циклов F= {Cl5 C2,..., C|c/|_pr|+i} графа Г= (X, U, Ф). Программная реализация поиска фундаментального множест- множества циклов представлена в алгоритме 6.16. Алгоритм 6.15. Фундаментальные циклы графа for v е Xdo Mark[y\ = 0; {Начальные метки вершин} count= 0; у'С=0; {Счетчик числа циклов} пС = 0; {Вершина стека циклов} for v g X do if Mark[v] = 0 then begin nC=nC+ 1;
174 Глава 6. Введение в теорию графов. Алгоритмы на графах C[nC\ = v; Cycled 0); пС=пС- 1; end; Procedure Cycle(x, у) count = count + 1; Mark[x] = count; {Вершина исследована} for v e Adj[x] do begin nC=nC+l; C[nC\ = v; {Вершину в стек) ifMark[v] = 0 then Cycle(v, x) else ifMark[v] < Mark[x] л v ф у then begin jC=jC+ 1; {Обратноеребро (х, v), найден цикл) WriteCycle(y, С, nQ; {Печать цикла} end; nC= nC — 1; {Удалить исследованную вершину из стека} end; end; Procedure Write Су cle{x, С, nQ print jC; {Печать номера цикла} repeat print C[nC\; {Печать вершины из стека} пС=пС- 1; until C[nC\ =x; end. Алгоритм 6.16. Программа поиска фундаментальных циклов графа Program GraphCycle; {Фундаментальные циклы графа} uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[I..nVertex] of Integer; TypeAdjacent=array[1..nAdjacent] of Integer; { Текстовый файл } { Количество вершин } { Количество вершин в стеке циклов} Var f n nC :Text; :Integer; :Integer;
6.12. Циклы, фундаментальные множества циклов 175 Adj :TypeAdjacent; { Список смежности графа } Fst :TypeVertex; { Указатели вершин списка смежности} Nbr :TypeVertex; { Количество вершин в списке смежности } Vtx :TypeVertex; { Список вершин графа } Mark :TypeVertex; { Номера компонент для вершин графа} С :TypeVertex; { Стек выделения циклов графа } В :TypeVertex; { Признаки основных и обратных ребер прохода в глубину } jC :Integer; { Счетчик числа циклов } count:Integer; { Счетчик меток вершин } Procedure Init( var yes :Boolean ); { Переназначение меток вершин } { их порядковыми номерами в списке смежности } { yes - признак правильной структуры списка смежности } Var i,j,m -.Integer; begin for i:=l to n do for j:=l to Nbr[i] do begin yes:=FALSE; for m:=l to n do if Adj[Fst[i]+j]=Vtx[m] then begin yes:=TRUE; Adj[Fst[i]+j]:=m; break; end; if not yes then exit; end; end; Procedure PrintCycle( x:Integer; var С:TypeVertex; nC:Integer); {Печать цикла из стека} begin Write(ffjC,')'); repeat Write(f,Vtx[C[nC]]:3); nC:=nC-l; until C[nC]=x; Writeln(f); end; Procedure Cycle( x,у:Integer ); Var i,v :Integer; begin
176 Глава 6. Введение в теорию графов. Алгоритмы на графах count:=count+l; Mark[x]:=count; for i:=l to Nbr[x] do begin v:=Adj[Fst[x]+i]; nC:=nC+l; C[nC]:=v; if Mark[v]=0 then Cycle(v,x) else if (Mark[v]<Mark[x]) and (v<>y) then begin (Обратное ребро в пройденную вершину - найден цикл} PrintCycle(v,C,nC); end; nC:=nC-l; end; end; Procedure DepthCycle; {Проход в глубину за циклами) Var v:Integer; begin jC:=O; {Счетчик числа циклов} nC:=0; {С - стек циклов пустой } count:=0; {Номер метки вершины} for v:=l to n do Mark[v]:=0; for v:=l to n do if Mark[v]=0 then begin nC:=nC+l; C[nC]:=v; Cycle(v,0); nC:=nC-l; end; end; Var {Main} i,j :Integer; yes .-Boolean; begin {Main} Assign(f,'Cycle.in' ) ; Reset(f);{Файл открыт для чтения} {Ввод списка смежности} Read(f,n); {Количество строк в списке} Fst[l]:=0; {Указатель начала первой строки списка} for i:=l to n do begin Read(f,Vtx[i]); {Метка вершины} Read(f,Nbr[i]); {Количество вершин в списке} for j:=l to Nbr[i] do Read(f,Adj[Fst[i]+j]); {Список смежных вершин} Fst[i+1]:=Fst[i]+Nbr[i]; {Указатель начала следующей строки в списке}
6.13. Листы и блоки 177 end; Close(f); Assign(f,'Cycle.out' ) ; Rewrite(f); {Файл открыт для записи} Init(yes); if not yes then begin WriteLn(f,'Плохая структура смежности графа!'); Close(f) ; exit; end; DepthCycle; Close(f); end. {Main} Рассмотрим пример расчета по программе алгоритма 6.16 фун- фундаментального множества циклов для графа, представленного на рис. 6.35. Исходные данные структуры смежности графа задаются в текстовом файле Cycle.in: 5 12 3 2 2 4 13 4 5 3 4 12 4 5 4 3 2 3 5 5 3 2 4 3 Результаты расчетов сохраняются в текстовом файле Cycle.out со следующей структурой: 1) 2) 3) 4) 1 3 2 3 2 4 5 5 3 2 4 4 2. Каждая строка в выходном файле — это найденный цикл, ко- который представляется последовательностью вершин. Начальный номер в строке — номер цикла по порядку. 6.13. Листы и блоки В данном разделе рассматриваются вопросы, позволяющие глубже проникнуть в структуру произвольных графов, понять их устройство. Важное место в этом будут занимать такие понятия, как цикличность и связность. В завершении будут приведены практические алгоритмы выделения рассматриваемых здесь структур графа.
178 Глава 6. Введение в теорию графов. Алгоритмы на графах 6.13.1. Листы • Определение. Пусть Г= (X, U, Ф) — неориентированный граф. Ребро и = (a, b) g [/называется циклическим ребром, если оно принадлежит некоторому циклу. Петля является циклическим ребром. Никакое концевое ребро (инцидентное висячей вер- вершине) не может быть циклическим. Например, дерево не име- имеет циклических ребер, и, обратно, связный граф без цикличе- циклических ребер является деревом. • Определение. Ребро и = (х, у) е UНазывается разделяющим реб- ребром (или мостом, или разрезающим ребром) в Г, если в графе /, получающемся после удаления ребра и, вершины х и у не свя- связаны. Тогда граф Т можно представить как объединение гра- графов Т = ГхиГ2, F.13.1) где Г{пГ2 = 0,и Г{ содержит х, Г2 содержит у. • Утверждение 6.13.1. Ребро и = (х, у) е Uявляется разделяющим тогда и только тогда, когда оно не является циклическим. Доказательство. (=>) Допустим, что разделяющее ребро и явля- является циклическим. Тогда после его удаления вершины х и у оста- останутся связанными, а значит, разложение F.13.1) невозможно, что противоречит условию: и — разделяющее ребро. (<=) Теперь и = (х, у) — не циклическое ребро, т.е. не существует цепей, соединяющих х и у и не содержащих и. Отсюда и — разделяющее ребро. • Определение. Будем говорить, что две вершины х0 и хп цикличе- ски-реберно связаны, если существует такая последователь- последовательность простых циклов Сь С2,..., Сь что х0 е Сь хп е Ck и каж- каждая пара соседних циклов имеет хотя бы одну общую вершину. Условно взаимное расположение вершин и циклов можно представлять так, как показано на рис. 6.36. Рис. 6.36. Вершины циклически-реберно связаны Утверждение 6.13.2. Циклически-реберная связность опреде- определяет отношение эквивалентности (см. п.6.4) на множестве вер- вершин графа Г= {X, U, Ф). На рис 6.37 показано разбиение Г на компоненты циклически—реберной связности.
6.13. Листы и блоки 179 Рис. 6-37. Компоненты Г(?,у) циклически-реберной связности графа. Компоненты Г(Ц) связности графа. Компоненты Г(Ц) с Г(Ц связаны мостами • Определение. Множество всех вершин, циклически—реберно связанных с данной вершиной х, называется листовым множе- множеством Цх), которому принадлежит х. Отметим, что листовое множество может состоять только из одной вершины х, тогда листовое множество называется особым. Далее будет показано, что это возможно тогда и только тогда, когда все ребра, инци- инцидентные вершине х, являются петлями или разделяющими ребрами. • Определение. Подграф Г(Ь), определяемый листовым множе- множеством L, называется листом. • Утверждение 6.13.3. Отметим следующие очевидные свойства листа Г{Ь). 1. Граф Г(Ь) циклически замкнут, т.е. если какой-нибудь простой цикл С в /имеет общую вершину с L, то весь про- простой цикл С содержится в Г(Ь). 2. Не может быть более одного ребра, связывающего два раз- различных листовых множества Ь{ и L2, так как иначе эти ребра оказались бы циклическими и множества Lx и L2 должны были бы совпадать. Связывающие одиночные ребра различ- различные листовые множества L{ и L2 являются мостами для гра- графа. Ниже показано, что они будут являться и блоками, со- состоящими из одного ребра. 3. Все ребра в Г{Ь) являются циклическими. Пусть ребро (х, у) лежит ъГЩ. Покажем, что оно циклическое. Действитель- Действительно, если, например, вершины х и у в L соединены ребром, тогда (х, у) циклическое по построению L. Если же х и у в L не соединены ребром, то, добавив данное ребро (х, у) к L,
180 Глава 6. Введение в теорию графов. Алгоритмы на графах получим цикл, так как вершины х, у связаны в L по построе- построению. Отсюда следует, что ребро (х, у) циклическое. 4. По определению граф Г{Ь) связный. Из предыдущего пунк- пункта следует, что маршрут в ГA), соединяющий произволь- произвольные две его вершины, будет состоять исключительно из циклических ребер. 6.13.2. Блоки • Определение. Пусть Г= (X, U, Ф) — неориентированный граф. Два ребра и, v e U называются сильно циклически связанными, если существует такая последовательность простых циклов С\, С2,..., Ск, что и е Сь v e Q, и любая пара соседних циклов Сь С/+1 имеет, по крайней мере, одно общее ребро. Условно вза- взаимное расположение ребер и циклов можно представлять так, как показано на рис. 6.38. Рис. 6.38. Сильно циклически связанные ребра и, v • Определение. Множество всех ребер, сильно циклически свя- связанных с ребром и е U, образует некоторую часть графа Г (Lb), называемую блоком, определяемым ребром и. Множество вер- вершин Lb этого графа называется блоковым множеством, опреде- определяемым ребром и. Блок является связным графом и может со- состоять из единственного ребра. • Лемма 6.13.1. Два ребра сильно циклически связаны тогда и только тогда, когда существует простой цикл, содержащий оба эти ребра. Справедливость данного утверждения следует непо- непосредственно из структуры сильно циклической связанности ребер (рис. 6.38). • Лемма 6.13.2. Если Р(х, у) — простая цепь, связывающая две различные вершины х,у е Lb блокового множества, то все реб- ребра цепи Р{х, у) принадлежат блоку Г{ЬЬ). Доказательство. Если предположить, что утверждение леммы не выполняется, то существует участок цепи Р{х, у), ребра кото- которого не принадлежат данному блоку Г (Lb). He уменьшая общнос-
6.13. Листы и блоки 181 ти, будем считать, что этим участком является исходная цепь Р(х, у). Так как*, у е Lb, то в блоке Г (Lb) существует простая цепь Q(x, у), связывающая х, у. Тогда объединение простых цепей Р(х, у) и Q(x, у) составит простой цикл. Согласно лемме 6.13.1, ребра этого цикла будут сильно циклически связаны, а значит, все ребра простой цепи Р{х, у) должны лежать в f(Lb), что проти- противоречит предположению. • Утверждение 6.13.4. Из леммы 6.13.2 следует, что блок Г{ЬЬ) является подграфом. Он циклически сильно замкнут, в том смысле, что если простой цикл Симеетхотя бы две вершины, общие с Lb, то все ребра цепи С принадлежат Г (Lb). Поэтому два различных блока могут иметь не более одной общей вершины (рис. 6.39). В противном слу- чае блоки должны совпадать, • Утверждение 6.13.5. Из определения блокового множества Lb следует, что все его вершины являются циклинески-реберно свя- связанными при условии, что число ребер в блоке Г (L ) более од- одного. Отсюда заключаем, что Lb с L, где L — листовое множе- множество вершин Lb, и каждый лист Г (L) имеет непересекающееся по ребрам разложение r(L)=\Jr(Lb) F.13.2) на семейство блоков. • Определение. В графе Г= {X, U, Ф) вершину х е Хназываютраз- Хназываютразделяющей вершиной (разрезающей или точкой сочленения), если имеет место прямое по ребрам разложение (рис. 6.40) Г=Г(Ух)иГ{У2), V=VXKjVb VxnV2 = x. F.13.3) Рис. 6.40 Прямое по ребрам разложение графа • Утверждение 6.13.6. Блок Г{ЬЬ) не имеет разделяющих вер- вершин, так как все его вершины циклически-реберно связаны. На основании разложения F.13.2) любого листа Г (L) на непе- непересекающееся по ребрам разложение на блоки F{Lb) и последне- последнего утверждения, составление листа Г(Ь) из блоков Г{ЬЬ) может быть представлено кактусообразной фигурой, как на рис. 6.41,
182 Глава 6. Введение в теорию графов. Алгоритмы на графах в которой различные блоки соприкасаются в своих соединяющих вершинах. Соединяющие вершины блоков являются разделяющими вершинами графа. Разложение F.13.2) листов на блоки Г(Ьу)=иГ(Цк) позволяет теперь к уточнить структуру графа (рис. 6.37): каждый лист Гц можно представить в виде кактусооб- разной'схемы (рис. 6.41) составляющих его блоков Г(ЬЬук). Рис. 6.41 6.13.3. Поиск блоков в глубину Разложение графа на блоки и выделение их имеет важное прак- практическое значение. Иногда недостаточно знать, что граф связен; может интересовать насколько «сильно связен» связный граф. Ф Рис. 6.42. Исходный граф (а); блоки графа (Ь); листы (с), (е) и один мост (d); точки сочленения: b, f, j, i Например, удаляя вершину сочленения двух блоков (рис. 6.40) и инцидентных ей ребер, нарушим связность графа. Связность графа не нарушится, если удалить внутреннюю вершину блока и инцидентные ей ребра. Про такие компоненты графа говорят, что они двусвязные. Отыскание точек сочленения и блоков графа важ- важно при изучении надежности коммуникационных и транспорт-
6.13. Листы и блоки 183 ных сетей. Это важно также и при изучении других свойств графа, таких, например, как планарность, так как часто полезно разло- разложить граф на его двусвязные компоненты (блоки) и изучать каж- каждую из них в отдельности. На рис. 6.42 в качестве примера изображен связный граф и его блоки (двусвязные компоненты). Здесь же показано разложение графа на листы. Для нахождения блоков и точек сочленения применим извест- известный метод поиска в глубину на неориентированном графе Г= (X, U, Ф). Основу алгоритма выделения блоков и точек их со- сочленения легче понять, рассмотрев пример на рис. 6.43, где схе- схематически изображен связный граф, состоящий из шести блоков Fif i = 1,6, и четырех точек сочленения xjf j = 1,4. Рис. 6.43. Схематическое изображение графа с шестью блоками и четырьмя точками сочленения Если начать поиск в глубину, скажем, из вершины s e Г2, то мо- можем перейти из Г2вГь проходя через вершину хх. Из свойства по- поиска в глубину, все ребра в /\ должны быть пройдены до того, как вернемся в х1# Поэтому Гх состоит в точности из ребер, которые проходятся между входом и выходом из вершины х{. Для других блоков дело обстоит несколько иначе. Так, например, если уйти из Г2 в Г5, а оттуда — в Г6 через х4, то окажемся в Г6, пройдя ребра из Тъ Г5 и Г6. Если хранить ребра в стеке, то во время прохождения назад из Гв в Г5 через вершину х4 все ребра Г6 будут на верху стека. После их удаления на верху стека останутся ребра Г5 и снова про- продолжим проход блока Г5. Таким образом, если можно распозна- распознавать точки сочленения во время обхода, то применяя поиск в глу- глубину и храня ребра в стеке в той очередности, в которой они про- проходятся, можно также определить и блоки (двусвязные компо- компоненты). Ребра, находящиеся на верху стека в момент обратного прохода через точку сочленения, составляют блок. Реализация рассмотренного подхода выделения блоков графа представлена в алгоритме 6.17. В векторе Магк[х] меток вершин х е X графа фиксируются порядковые номера обхода соответст-
184 Глава 6. Введение в теорию графов. Алгоритмы на графах вующих вершин. В этом случае метка вершины сочленения при входе в блок получит наименьший номер из всех остальных вер- вершин блока. Таким образом, для определения точки сочленения выхода из блока достаточно найти вершину этого блока с мини- минимальной меткой. Свойство циклической замкнутости блока по- позволяет это сделать лишь на основе вектора меток Магк[х], не привлекая дополнительной информации. На рис. 6.44 схематич- схематично представлен блок, где вершина w — точка входа в блок и точка сочленения. Вершина х — следующая обследованная вершина блока после w. Свойство циклической замкнутости блока позволяет утверждать, что существует по край- крайней мере еще одна вершина у, смежная w. Рекур- Рекурсивный характер алгоритма поиска в глубину на графе позволяет утверждать, что в этом случае ребро блока (у, w) будет пройдено как обратное, и, значит, метка Mark[w] точки со- сочленения блока будет доступна до выхода из блока по ребру входа (z, x). Поэтому, сохраняя минимальное значение меток обследо- обследованных вершин (включая и по обратным ребрам поиска в глуби- глубину), будем проверять при рекурсивном выходе из поиска в глуби- глубину совпадает ли это минимальное значение с меткой вершины выхода. Если ответ положительный, то найдена точка сочлене- сочленения. В алгоритме значения минимальных меток фиксируются в векторе Virtual[x] для каждой вершины х е X, как наименьшее значение из Магк[у], где у — вершины графа, которые достижимы из х при проходе графа в глубину. Алгоритм 6.17. Выделение блоков графа count = 0; Stack =0; for v e Xdo Mark[v] = 0; {Начальные метки вершин} for veXdo ifMark[v] = 0 then B!ock(v, 0); Procedure Block(x, w) counts count + 1; Mark[x] = count; {Вершина исследована} Virtual[x] = count; {Начальная минимальная метка} for v e Adj[x]X do ifMark[v] = 0 then begin Stack = Stack v (x, v);
6.14. Двудольные графы 185 Block{v, x); Virtual[x] =min(Virtual[x], Virtual[v]); if Virtual[v] > Virtual[x] then begin В этой точке х — либо корень дерева, либо точка сочленения. Образовать новый блок, состоящий из всех ребер стека, включая (х, v). end; end; else ifMark[v] < Mark[x] and v*w then begin { (x, v) — обратное ребро} Stack = Stack u (x, v); Virtual[x] =min(Virtual[x], Virtual[v]); end; end. 6.14. Двудольные графы • Определение. Граф Г= (X, U, Ф) называется двудольным, если множество его вершин можно разбить на два *^- —^ независимых подмножества Kj, V2 таких, что Х= V{ u V2 и V{ n V2 = 0. Такой граф будем обозначать как Г= (У{ u V2, U, Ф). На рис. 6.45 изображен типичный двудольный граф. Двудольные графы играют заметную роль в рис. 6.45 различных приложениях. 6.14.1. Условия существования двудольных графов • Теорема 6.14.1. Граф Г = (X, U, Ф) является двудольным тогда и только тогда, когда любой его простой цикл четной длины. Доказательство. (=>) Ясно, что данное условие для двудольно- двудольного графа всегда выполняется. (<=) Разобьем граф Гна компоненты связности Гь Г2,...,Гт. Пусть Гк = (Хк, Uk, Ф) одна из них и а е Хк — произвольная вершина. Разобьем множество вершин Хк на непе- непересекающиеся Vki и Vk2, где Vk[ — вершины, расстояние до кото- которых от а нечетно; Vk2 — вершины, расстояние до которых от а чет- четно, а е Vk2. Множества Vkl и Vk2 являются независимыми. Дейст- Действительно, если предположить, что вершины Ъ и с смежные и
186 Глава 6. Введение в теорию графов. Алгоритмы на графах Ь, с е Vki или Ь} с е Vk2, то существовал бы Уп уп цикл нечетной длины, соответственно «а нечетная длина Ь длина единица с нечетная z===: длина а» или «а четная длина b длина единица v2] zzzn v22 с четная длина а», что противоречит уело- вию. Рассмотренное разбиение вершин вы- полним для каждой компоненты Гь Г2,...,Гт v = Y ? связности. На рис. 6.46 показано объедине- " ние независимых компонент Vk[ и Vk2 в не- Рис. 6.46 зависимые компоненты V{ ={JVkl и kl 6.14.2. Паросочетания • Определение. Паросочетанием в двудольном графе Г= (Vi u V2, U, Ф) называется независимое подмножество ре- ребер 7г с U, ребра я не имеют общих вершин. . , Для графа, изображенного на рис. 6.47, в качест- *2*х^ *з ве паросочетания можно взять множество ребер s* п = {(sb 1), (^2, 2)}, я = {(s3, 1), (s2, 2)} и т.п. Рис. 6.47 • Определение максимального паросочетания. Па- Паросочетание называется максимальным, если любое другое паросочетание содержит меньшее число ребер. 6.14.3. Алгоритм определения максимального паросочетания Пусть Г=(У{и Vb Uу Ф) — двудольный граф и я — произволь- произвольное паросочетание. Множество вершин Ai^V[nA2^ V2 (рис. 6.48). Чередующейся цепью относительно паросочетания я назы- называется цепь С, в которой ребра пооче- редно принадлежат С/ияи которая на- начинается ребром, не принадлежащим я. Заметим, что ребра в цепи не повторя- повторяются. Пусть а{ е А{ — произвольная вершина и и{ = (аь v2n) — ребро, инци- инцидентное вершинам из Ах и V2n. Постро- Построим чередующуюся цепь С= («1я1м2я2... un-inn-\un) и допустим, что по такой цепи можно достичь вершины а2 е А2. рИСв е.48
6.14. Двудольные графы 187 Такую цепь С можно использовать для получения нового паросо- четания тс, которое содержит на одно ребро больше, чем исходное паросочетание тс. Действительно, в тс можно включить все ребра тс, удалив пь тс2,..., пп_{ и добавив иь и2,..., ип_ь ип. Полученное таким образом тс содержит несмежные ребра, а значит, п — паросочета- паросочетание. Говорят, что п получено из тс чередующимся расширением. Пример. Дан двудольный граф Г= (V{ u V2, U, Ф), где V{ = {s{, 52,..., se} и V2 = {1, 2,..., 6}. Соединение вершин V{ и V2 задано соот- соотношениями: s{ -> {4}, s2 ~> U» 6}, 53 -» {4, 5, 6}, $4 -> U, 3}, s5 -> {2}, s6 -> {1, 3}. Найти максимальное паросочетание. Выберем начальное паросочетание п таким образом, что вер- вершину s{ e V{ соединяем с вершиной j e V2 первой незанятой ра- ранее из списка соединений для s{. На рис. 6.49 изображено исход- исходное паросочетание тс = {(s{, 4), (s2, 1), (s3, 5), (j4, 3), (s5, 2)}, |тс| = 5. Вершины s6 и 6 не вошли в паросочетание. По- Попытаемся увеличить я, используя алгоритм че- чередующихся цепей. Обозначим > переход по ребрам графа из \\ в К2 и > переход по реб- ребрам паросочетания я из V2 в Vv Так, se >{1,3} означает, что из s6 можно перейти в вершины 1 и 3, и {1,3} >{^2^4} означает, что из вершин 1 и 3 можно "достичь по ребрам паросочетания вершин s2 и 54. По алгоритму исходной верши- вершиной цепи является s6. Тогда множество всех чередующихся цепей, начало которых в se, можно представить: s6—^{l,3} —j->{s2,s4} >{1Д6}. Переходы следует закончить, если вершина^б достиг- достигнута или подмножество вершин К2, доступных из ^6, повторилось в чередующейся цепи. В последнем случае вершина 6 не доступна из s6 и, значит, исходное паросочетание п максимальное. В нашем случае вершина 6 оказалась доступной. Для выделения исходной чередующейся цепи из всего множества расширяющихся цепей выполним обратный ход: 6 >s2 >l >s6. Теперь новое па- паросочетание строим из старого, исключая из него ребро (s2, 1) и включая ребра F, s2), A, s6). Процесс включения также показан на рис. 6.49. Максимальное паросочетание содержит ребра (s{, 4), ts3, 5), С?4, 3), С?5, 2), (s2, 6), (se, 1) и |тс| = 6.
188 Глава 6. Введение в теорию графов. Алгоритмы на графах Теорема 6.14.2 о максимальном паросочетании. Пусть Г= (V{u V2, U} Ф) — двудольный граф. Тогда количест- количество ребер в максимальном паросочетании равно (*) Рис. 6,50. максимальное паросочетание я где АА = {у е V2\3xe Vx л (х, у) е U) с V2. Доказательство. Пусть я — максима- максимальное паросочетание в исходном двудо- двудольном графе (рис. 6.50). Паросочетание я позволяет рассматривать его как ото- отображение я: V2 > Vx вершин множест- множества V2 в вершины множества V{ по ребрам паросочетания я. Аналогично, под А будем понимать ото- отображение A: V{—A—>V2 вершин множе- множества Fj в вершины множества V2 по реб- ребрам Gграфа. Вершины множеств со и Z (рис. 6.50) несмежные, так как паросочетание я является макси- максимальным. Рассмотрим процесс насыщения множества со. Под со ->дюя бу- будем понимать последовательное выполнение двух отображений я(А(со)) с Vi множества со. Далее применим отображения А и я к полученному множеству: дсоя ->д(да>я)я с V{ и т. д. Ясно, что каждая пара отображений приводит к расширению исходного множества дсо7Гсд(дсо7Г )тс. Учитывая конечные размеры исходного графа, наступит момент, когда отображаемое множество переста- перестанет расширяться. Таким образом, процесс насыщения отобража- отображаемого множества можно представить следующим образом: Для множества А выполняется условие ]\А\ = \АА\, в противном случае множество А можно было бы еще расширить. Следствием расширения множества Асо в процессе его отображения является включение Асо с АА. Обозначим множество ыиА = В. Покажем, что найденное множество В удовлетворяет условию (*) теоремы, т.е. п(Г) = \VX\ — - (\В | - \АВ |). Имеем \АВ \ = |Л(со и А)\ = |Асо и АА)\ = \АА\ , следова- следовательно, \VX\ -(\В\- \АВ\) = 1^1 - (|ш | + И ~ М) = l^il - 1« I = п(Г).
6.14. Двудольные графы 189 Покажем теперь, что \/А с V{ условие (*) теоремы записывается в следующем виде: п(Г) <\V{\- (\A\ - \АА\). Тогда ранее найденное множество В, для которого данное неравенство обращается в равен- ство, будет доказательством условия (*) теоремы. Пусть А{ =А\(и> г\А), тогда А = (со п А) иА{. Отметим, что V^ с КД(со пА{) выполняется неравенство \А{\ < \АА{\, так как вершины множества КД(со п V{) составляют паросочетание. Тогда верно, что \А\ = |со п А\ + \А{\< |со | + Hil ^ Ы + Mil ^ Iе0 I + Ml или И ~ Ml ^ М- Теперь количество ребер в максимальном паросочетании можно оценить: п(Г) = \VX\ — |со| < \V{\ — (\А\ — \АА\). Теорема доказана. 6.14.4. Системы различных представителей Рассмотрим пять множеств: S{ = {2, 3}, *У2 = {1, 2, 4}, S3 = {1, 2, 5}5 S4 = {3, 4, 5}, ?5 = {3, 4, 5}. Требуется выбрать такие различные чис- лах{,х2, x3,x4,x5,4JOXj e Sh i = 1,2,..., 5. Для данного примера^ = 2, jc2 = 1, х3 = 5, х4 = 3, ^5 = 4. Однако если взять множества Тх = {1, 2}, Г2 = {1, 2}, Г3 = {1, 2}, Г4 = {3,4, 5}, Т5 = {3,4, 5}, то такой выбор ока- оказывается невозможным. Рассмотрим данную задачу в общем случае. Пусть S= {1, 2,..., п). M(S) — система подмножеств Sb Sb..., Sn множества S. Будем го- говорить, что M(S) имеет систему различных представителей, если для всех / = 1, 2,..., п существуют различные х, е St. 6.14.5. Связь системы различных представителей и двудольных графов Определим двудольный граф sx» Г= (Vу иК2, U, Ф), соответствующий системе Si подмножеств. Пусть M{S) = {Sh S2,..., Sn} — сие- s[ тема подмножеств Sb Sb..., Sn множества S. По- Положим Si9 S2,..., Sn вершинами Vl графа, которые s-1 соединены ребрами со своими элементами — смежными им вершинами из V2 (рис. 6.51). Рис- 6-51 • Лемма 6.14.1. Двудольный граф Г= (V{ uV2, U, Ф), отвечаю- отвечающий системе подмножеств M(S) = {Sb S2,..., Sn}, имеет макси- максимальное паросочетание из п ребер тогда и только тогда, когда M(S) имеет систему различных представителей. (Доказатель- (Доказательство вытекает из определения построения двудольного графа, отвечающего системе различных представителей).
190 Глава 6. Введение в теорию графов. Алгоритмы на графах • Теорема 6.14.3 Ф. Холла о существовании системы различных представителей. Система M{S) = {Su S2,..., Sn} имеет систему различных представителей тогда и только тогда, когда для лю- любой подсистемы {?, , S,-2,..., «S,- } с M(S) выполняется неравен- неравенство [JSj >к, т.е. количество элементов в объединении лю- бых к подмножеств должно быть не менее к. Доказательство. (=>) Необходимое условие теоремы следует из определения системы различных представителей. Каждое под- подмножество St e M{S) содержит элемент х, eSr, отличный от J kJ J элементов других подмножеств, а значит (с=)Пустьr=(V{uV2, U, Ф) —двудольныйграф,соответству- —двудольныйграф,соответствующий системе подмножеств M{S) = {S{, S2,..., Sn). Покажем, что в данном графе существует максимальное паросочетание, количе- количество ребер в котором равно п. Тогда из леммы 6.14.1 будет следо- следовать достаточное условие теоремы. Из теоремы 6.14.2 имеем, что число ребер в максимальном паросочетании равно яG) = |Fi| — -тах(|Л| -|ДЛ|), где АА = {у е V2 \ Зх е Vx л (х, у) е U) с V2. В рам- AV ках принятой интерпретации A={St ,Si2,...,Sj }, \A\ = к и к АА = (J St-,.. По условию теоремы \АА\ > к. Таким образом, VA с V{ 7=1 \А\ - \АА\<0, а значит, тг(Г) =1^1 - тах(И -|ЛЛ|) >| КХ|. Однако АУ п(Г) < IKJ, следовательно, п(Г) = \V{\ = n {достаточноеусловие до- доказано). 6.14.6. Задача о назначениях Существует множество задач, постановки которых укладыва- укладываются в рамки задачи о назначениях. Рассмотрим две такие поста- постановки. Задача. Предположим, что вычислительная сеть объединяет п специализированных ЭВМ. На вход сети поступают задачи. Изве- Известно, что наибольшая производительность конкретной ЭВМ сети достигается на определенном классе задач. Это выражается коэф- коэффициентом ^использования /-й ЭВМ при решенииу-го класса за-
6.14. Двудольные графы 191 дач. Найти оптимальное распределение задач по сети таким обра- образом, чтобы эффективность ее использования была наибольшей. Задана. Группа лиц может выполнить п видов работ. Эффек- Эффективность использования /-го лица на^-й работе определяется ме- мерой ценности аху Найти оптимальную расстановку людей по ви- видам работ. • Теорема 6.14.4 — алгоритм поиска оптимальной перестановки я. Пусть А = [ay], i, 7 = 1,л — матрица целых чисел. Тогда макси- максимум X, F.14.1) по всем перестановкам я равен минимуму FЛ4-2) по всем числам их и v, таким, что щ+ъ>ар V/J = ui. F.14.3) Минимум суммы F.14.2) достигается на перестановке я такой, что Щ+Ущ = **,> VI =1,/!. Доказательство. Пусть я — произвольная перестановка. При изменении / от 1 до п величины я,- принимают все значения множе- множества {1, 2,..., п). По условию u, + v, > ар Vi,j= I, n, а значит, и для j = nt верно щ +vn. =аы.. Установим связь сумм F.14.1) и F.14.2). Таким образом, сумма F.14.1) для любой перестановки я не боль- больше суммы F.14.2). Отсюда следует, что теорема будет верна, если мы найдем такие щ и v, и перестановку я, что F.14.1) и F.14.2) совпадают. Шаг 0. Поиск начальных щ и v7, удовлетворяющих ограничени- ограничениям щ + Vj > ац, Vi,j= 1, п. Положим v7 = 0 и ut =тжа1]¦,— максима- максимальный элемент в /-й строке; условие F.14.3) ut +v7 =maxa/-/ >a{j выполняется. Для матрицы ценностей на рис. 6.52 справ4 и снизу указаны начальные значения, соответственно щ и vy.
192 Глава 6. Введение в теорию графов. Алгоритмы на графах и\ U2 «3 ил VI 3 1 6 6 , 0 V2 4 4 5 4 0 V3 2 3 2 5 0 V4 1 3 5 5 0 4 4 6 6 Рис. 6.52. Начальная матрица ценностей Шаг 1. Фиксируем все vJf j = 1,л и уменьшаем значения w,, / = 1,л до тех пор, пока одно из неравенств м, + v, > а,-, не обратится в равенство^/, + v, = atj. Эту процедуру выполняем для каждой строки /= 1,л. В рассматриваемом примере на рис. 6.53 звездоч- звездочками отмечены совпадения. иг щ VI * 0 V2 * * 0 V3 0 V4 0 4 4 ^ 6 6 Рис. 6.53. Матрица совпадений Шаг 2. Для каждого иь /= 1,л определим множества совпаде- совпадений Если обратиться к примеру^о ^ = {2}, ?2 = {2}, ^3 = {1}, *У4 = {1}. Система множеств Si9 i= l,n может иметь систему различных представителей:y'i e Sbj2 e S2,...,jn e Sn, msjlJb...Jn — все раз- личные. Тогда на перестановке тг = f выполняется со- л; отношение w, +vy =w7 +vff =fl^ , а значит, найденная переста- перестановка я является оптимальной. Шаг 3. Предположим, что Sb S2,..., Sn не имеют системы различ- различных представителей, как в рассматриваемом примере. Тогда нару- нарушается условие теоремы Ф. Холла, т. е. существуют Sj ,Si2,...,Sj такие, что Sf uSj U...U5,- <к. В нашем примере \S{ u S2 u S3 u 5| = 2 < 4. Перейдем к новым значениям w/ и v*, полагая и/* =«/! -1' ui2 =ui2 -1-, «/, =uik -1 и vj =Vy +1, если индекс j e Si u-51^ u...u 5, .
6.14. Двудольные графы 193 Остальные м, и v, остаются без изменений. Обратимся к нашему при- примеру. На рис. 6.54 показаны новые значения переменных и* и vj.  Щ Vi 3 1 6 6 0 1 V2L, 4 4 5 4 0 1 , v3 2 3 2 5 0 0 V>4 1 3 5 5 0 0 Рис. 6.54. Новые значения и*, и v)  из Щ V2 * * 0 1 V3 * * 0 0 V4 * 0 0 4 3 4 3 6 5 6 5 Рис. 6.55. Матрица совпадений для новых значений и*- и v) При такой замене_переменных не нарушается основное усло- условие U; + Vj > ay, \/ij =l,n. Действительно, возможны два случая: LSSS; j ( l) A) j >ay. ,- u...u J,- , а значит, v* = Vj и w; 1. Отсюда и* +vj =(w, -l)+v7 > ay или ti v...vSj =t <k, тогда новая сумма F.14.2) 2. у Обозначим Сумма уменьшилась на к — t. Если теперь перейти к шагу 2, то в случае существования различных представителей для новых значений и * и v *, задача будет решена, в противном случае шаги 2 и 3 алгоритма продолжаем. Так как каждое повторение шагов ал- алгоритма приводит к уменьшению суммы F.14.2) на к — t единиц, 7=1 следовательно, процесс закончится, что доказывает теорему. 7—76Q7
194 Глава 6. Введение в теорию графов. Алгоритмы на графах • Замечание. При решении практических задач изменение пере- переменных щ и Vj на 1 может затянуть получение ответа. Заметим, что алгоритм допускает изменение переменных и, и v, на лю- любую величину, не^ нарушая при этом основного условия: В рассматриваемом примере сумма уменьшилась на 2, так как \S{ u S2 u S3 u ?4| = / = 2 и к = 4. Необходимо вернуться на шаг 2. Матрица совпадений примет вид на рис. 6.54, 6.55. Составим для нее систему множеств совпадений S{ = {2}, S2 = {2, 3,4}, S3 = {1,4}, *У4 = {1, 3,4}. Проверим наличие системы различных представите- представителей для данных множеств. Обращаясь к интерпретации системы различных представителей в терминах двудольного графа, надо проверить, что максимальное паросочетание равно 4 для графа Г= (V{ uF2, U, Ф), где Vx = {Sl9 S2, S3, S4}, V2 = {1, 2, 3, 4}, и связь вершин S{ -> {2}, S2 -> {2, 3, 4}, S3 -> {1, 4}, S4 -* {1, 3, 4}. Решая, можно установить, что существуют три таких паросочетания: Таким образом, существуют три оптимальных назначения: „ (I 2 3 4^ ^ _fl 2 3 4^ ^ _fl 2 3 4^ Я1 ~{2 3 1 4/ Я2 ~{2 3 4 1/ Яз ~\2 4 1 3J* Ценность назначения составляет ап + а23 + а31 + а44 = 18. 6.15. Хроматические графы Пусть Г= (X, Uf Ф) — простой граф. Граф /называется к-рас- крашиваемым, если существует такое разложение множества его вершин Хна к непересекающихся подмножеств (компонент) Сь С2,..., Ск таких, что X=\JCti qnCj=0 при/*/ F.15.1) и вершины в каждой компоненте Q независимы, т.е. ребра в Гсо- единяют вершины только из разных компонент (рис. 6.56). Пред- Представление F.15.1) называется к-раскраской графа Г. Вершины этого графа можно раскрасить к красками так, чтобы смежные вершины всегда были окрашены в разные цвета. Для этого доста- достаточно вершины каждой компоненты С, покрасить своей краской.
6.15. Хроматические графы 195 Наименьшее возможное число к = х(Л компонент в разложении F.15.1) называется хроматическим чис- числом графа Г. Рассмотрим несколько примеров хроматического разложения графов. • Утверждение 15.1. Полный граф Г= (X, U, Ф) на \Х\ = п вершинах имеет хроматическое число х(^) -J}^ Здесь каждая компонента Сь i=\,n Рис 6 56 разложения F.15.1) состоит из одной вершины, \С\ = 1, /= 1,л. • Утверждение 15.2. Граф Г= (X, U, Ф) содержит максимальный подграф (клику) из к вершин тогда и только когда, когда его хроматическое число х(Г) равно к. Доказательство. (=>) Пусть {хь х2,..., xk} e Xвершины макси- максимального подграфа. Для разложения F.15.1) максимального под- подграфа требуется к компонент Сь С2,..., Q таких, что х, е С;. Пока- Покажем, что этого числа компонент достаточно для разложения F.15.1) всего графа Г. Пусть_у е X — произвольная вершина и уе{хих2,...,хк}. Среди*,, /= \,ксуществует такая вершинах, е Cj, которая несмежна с у, в противном случае существовал бы макси- максимальный подграф из к + 1 вершины. Вершину у включаем в ком- компоненту Cj. Следовательно, х(^) = к. (<=) Имеем х(Г) = к. Предположим, что максимальный под- подграф в /содержит т вершин пт*к. Необходимое условие теоре- теоремы в этом случае утверждает: х(^) = w, что противоречит условию. • Утверждение 15.3. Граф /= (X, U, Ф) является двудольным тогда и только тогда, когда х(^) = 2. • Утверждение 15.4. Хроматическое число дерева равно 2, так как дерево является двудольным графом. • Теорема 6.15.1. Для числа р(Г) вершинной независимости и хроматического числа х(^) графа Г= (X, U, Ф), \Х\ = п выпол- выполняется соотношение р(Лх(Л> п. F.15.2) Доказательство. В разложении F.15.1) все компоненты С, яв- являются независимыми. Из определения числа р(Г) следует, что
196 Глава 6. Введение в теорию графов. Алгоритмы на графах |С,|< Р(Г). Суммируя по всем компонентам, получим 1=1 Задача. Для графа Г на рис. 6.57 найти разложение F.15.1) и установить, что хроматиче- / г>\ "> РИС- О.О/ ское число х(Г) = 3. Задана. Пусть / — длина самой длинной простой цепи в графе Г. Показать, что %(Г) < /+ 1. Решение. Предположим, что %(Г) ^/+2. Тогда утверждение 15.2 позволяет сделать заключение, что граф /"содержит максима- максимальный подграф (клику) из / + 2 вершин или более. Такой подграф содержит простой цикл из / + 2 ребер и простую цепь длиной / + 1. Это противоречит условию задачи, так как любая простая цепь графа не может превосходить длины /. Отсюда следует, что 6.16. Диаметр, радиус и центры графа I. Пусть Г= (X, U, Ф) — конечный связный псевдограф. Обо- Обозначим через d(x, у) длину минимального маршрута между вер- вершинами х, у е X. Величина d(F) = maxd(x,y) называется диамет- хуХ ром графа. II. Пусть х е X — произвольная вершина графа. Величина r(x)=maxd(x,y) называется максимальным удалением в графе Г уеХ от вершины х. III. Радиусом графа Г называется величина г(Г) =minr(jc). хеХ TV. Любая вершина z е X, для которой r(z) = г(Г), называется центром графа. Задана. Для графа Г на рис. 6.58 най- найти диаметр, радиус и все центры. Решение. Диаметр d(r)=maxd(x,y) = = 3. г (х{) = 3, г (х2) = 2, г (х3) = 3, г (х4) = 2, г (х5) = 3, ле(х6) = 2. Следовате- Следовательно, радиус графа г(Г) =minr(jc) = 2. хеХ Центры графа: х2, *4> ^б-
Введение в теорию групп. Приложения 7.1. Определение группы • Определение. Группой называется непустое множество G с би- бинарной алгебраической операцией • (будем называть умноже- умножением) такой, что выполняются следующие аксиомы: 1. V я, 6 eG3c eG ab = с — замкнутость относительно операции •. 2. \/a,b,c eG a(bc)~(ab)c — ассоциативность операции •. 3. 3\е eG\/aeG ea=ae=a — существование единичного эле- элемента е. 4. \/aeG3\a~l eG a-a~l =a~la=e — существование обратного элемента сГ . • Определение. Группа называется коммутативной, если выпол- выполняется аксиома коммутативности: 5. Va,b eG ab =ba— коммутативность операции •. Примеры групп 1. G{ = {п | п е Z) — группа с операцией сложения чисел, где Z — множество целых чисел. Действительно, 0 — единица группы; п~{ = (— п) — обратный элемент кп е G{. 2. G2 = {2n\n e Z\ — группа с операцией сложения чисел. 3. G3 = {2п | п е Z)— группа с операцией умножения чисел. 4. G4 — множество квадратных матриц порядка п, определитель которых не равен нулю, является группой с операцией умно- умножения матриц. 5. G5 — множество ортогональных матриц порядка п является группой с операцией умножения матриц. 6. С?6 = {1, —1} — группа с операцией умножения чисел. 7. G1 — множество рациональных чисел является группой отно- относительно операций сложения и умножения (без нуля). 8. G8 — множество вещественных чисел является группой отно- относительно операций сложения и умножения (без нуля).
198 Глава 7. Введение в теорию групп. Приложения 9. G9 = Sm — множество подстановок (перестановок) является группой с операцией умножения подстановок (симметриче- (симметрическая группа Sm, см. п.7.6). • Определение. Яс G называется подгруппой группы G, если Н — группа относительно бинарной операции, определенной в G, т.е. для элементов Я выполняются аксиомы 1—4. Так, на- например, являются подгруппами: G2 с Gb G5 a G4, G7 с <78. • Утверждение 7.1.1. Пусть М — подмножество группы G и \/а,Ь е М выполняется ab~l е М. Показать, что М — подгруп- подгруппа. Данное условие можно рассматривать как характеристиче- характеристическое свойство группы. Доказательство. Проверим выполнение аксиом группы. 1. Существование единичного элемента. Пусть а е М, тогда аа~[ е М или е е М. 2. Существование обратного элемента. Пусть а е М и так как е е М9 то е • a~l e Мили a~l e M. 3. Замкнутость. Пусть а, Ъ е М, тогда и b~l e M. Значит, и а • (b~l)~l е Мили ab e M. 7.2. Гомоморфизм групп • Определение. Гомоморфизмом группы G{ в G2 называется ото- отображение f:G{ -+ G2, сохраняющее операции: Va,b eG{ f(a о Ь) =f(a) •f{b\ где о — операция в группе G\\ • — операция в группе G2. Если/— взаимно однозначное отображение, то/ называется изоморфизмом. Свойства гомоморфизма Свойство 1. Единичный элемент переходит в единичный. Пусть ех е G{ — единица G{, тотда/[е{) = е2 е G2 — единица G2. Действи- Действительно, VatGxAa) =Аа)Ае\) =/^)Л«), таккакЛ^) =Лщ) = и Аа) =Ае{а) =Aei)A<t). В группе 3\е2 е G2 Aa) =АФ2 = Значит, Л^) = е2. Свойство 2. Обратный элемент переходит в обратный. Пусть а е Gl9 тогда Да) = (Да)). Действительно,Дл) Да) =Л«~1)Л«) = = еъ так как Аа)Аа~1) =Л™~~1) =Ае{)=Аа'1а) =Л«)Л^M где Ае) е В группе Э!^))"^^ Аа)<Аа)У1 = ШГ'А") = е Сле Ае{) = е2. В группе Э!^))"^^ Аа)<Аа)У1 = ШГ'А") = е2. Сле- Следовательно, 1 1
7.3. Смежные классы 199 • Определение. Образом гомоморфизма/называется подмножество Im/= {а2 е G2 \ За{ е G{ a2 =f(ax)} с G2. • Определение. Ядром гомоморфизма/называется подмножество Кег/= {а{ е G{ \f(ax) = е2е G2) с Gv • Утверждение 7.2.1. Im/e G2 — подгруппа. Доказательство. Проверим все свойства (аксиомы) группы. 1. Замкнутость. \1аъЪ2 е Im/ 3a{,b{ e G{ /(а{) = а2 л/(Ь{) = Ъ2. Тогда a2b2 =/(al)/F1) =f(alb{) e Im/ 2. Существование единичного элемента. Так как е2 =f{e{) e Im/ 3. Существование обратного элемента. \/а2 е Im/ Bay e G{ f(a{) = a2. Тогда и а~21 =(/Ц)) =f(a-ll)elmf. • Утверждение 7.2.2. Кег/е G{ — подгруппа. Доказательство. Проверим все свойства (аксиомы) группы. 1. Замкнутость. \/abb{ е Кег/ /(я^) =/(^i)/Fi) = е2е2 = е2. Сле- Следовательно, а{Ь{ е Кег/ 2. Существование единичного элемента. Так как/^) = ^2> значит, е{ е Кег/ J. Существование обратного элемента. V^e Кег/ f(a^l)={f(al))~l =e2[ =еъ откуда aj еКег/. 7.3. Смежные классы • Определение. Пусть Н= {е, Л1? h2,..., hm_]} — подгруппа группы G. Множество gH= {ge, gh{, gh2,..., ghm_{}, полученное умноже- умножением элементов Н слева на элемент g e G, называется левым смежным классом группы G по подгруппе Н. • Лемма 7.3.1. Пусть Н — подгруппа группы G, тогда \fh e H hH=H. Доказательство. Пусть Н= {е, hh Л2,..., Л^-i}. Vhk e H hhk e H — замкнутость подгруппы, значит ЛЯ с Н. С другой стороны, \fhk e H hk = ehk = (hh~~{)hk = h{h~lhk) е АЯ, откуда Яс ЛЯ. Таким образом, УЛ g Я ИН=Н. • Лемма 7.3.2. Пусть Я — подгруппа группы G. Если
200 Глава 7. Введение в теорию групп. Приложения Доказательство. Пусть t e gxHr\g2H, тогда ЗЛ1? Л2 е Я такие, что t = gxhx = g2h2. Рассмотрим левый смежный класс tH= (glhi)H= = (g2h2)H= gl(h{~H) = g2(h2H), откудаgxH=g2H. • Лемма 7.3.3. Пусть Я — подгруппа группы G, тогда Vg eG Доказательство. Для доказательства достаточно показать, что все элементы в gH различные. Пусть ЗН{ф h2 e Я такие, что ghl=gh2. Тогда g~\ghx) =g~l(gh2) или {g~lg)hx = (g~lg)h2, откуда /*! = Л2, что противоречит предположению. • Лемма 7.3.4. Группа G распадается на непересекающиеся ле- левые смежные классы по подгруппе Я, т.е. G = glHug2HKj... u g5H, где всеgug2,...,gs — различные; giHngJH= 0, если& ф gy Доказательство. Пусть G={gk ,gk ,...,gk }. Ясно, что G=gk Hugk H^j...yjgk H. Воспользовавшись л еммой 7.3.2 и уда- удалив совпадающие левые смежные классы из последнего разложе- разложения, получим искомое разложение группы • Теорема 7.3.1 Лагранжа. Порядок конечной группы G кратен порядку любой из ее подгрупп #и| G \ = \Н\ • \G: H\, где|С: Н\ — целое число, называется индексом подгруппы Яв группе G. Доказательство. Лемма 7.3.4 позволяет записать разложение группы G = g{Hug2Hv...ugsH, где giHng;H=0 при &*§-. Из леммы 7.5.5имеем Vg,- ^Я| = |Я|, тогда \($ = \glHvg2Hu...vgsH\ = = \g{H\ + \g2H\ + ... + |в,Я| = j • Я. Следовательно, \G\ = \Н\ • \G: Я|, Определение. Пусть G — группа. Порядком элемента g e G (g ф е) называется наименьшее целое к такое, что g* = e. Утверждение 7.3.1. Пусть G— группа и g gG~ произвольный элемент порядка к. Тогда множество Я= {g, g2,..., ? = е) назы- называется циклической подгруппой, a g есть образующий ее эле- элемент. Утверждение 7.3.2. Порядок группы | G \ кратен порядку любо- любого элемента g e G. (Следствие теоремы 7.3.1 Лагранжа и утвер- утверждения 7.3.1). Утверждение 7.3.3. Всякая циклическая группа коммутативна (абелева). Теорема 7.3.2. Всякая подгруппа циклической группы сама яв- является циклической.
7.3. Смежные классы 201 Доказательство, Пусть G — циклическая группа с образую- образующим элементом g e Gn Яс G — подгруппа. Предположим, что наименьшая положительная степень элемента g, содержащаяся в Я, есть#*. Покажем, что элементу* — образующий элемент под- подгруппы Я. Допустим, что в Ясодержится элементg!, где / * 0 и /не делится на к. Пусть d = (/, к)— наибольший общий делитель, тогда существуют такие целые числа и и v, что к-и + I- v = d (см. п. 8.1). Следовательно, подгруппа Яв этом случае должна содержать эле- элемент gd = (/)М(#У = /w+/v. Так как d<k,m приходим к противоре- противоречию относительно выбора элемента g*. Таким образом, g* — обра- образующий элемент подгруппы ЯсС. • Утверждение 7.3.4. Число образующих циклической группы G= {g, g2,..., g* = е} равно значению функции Эйлера ср(л) — ко- количество чисел из множества {1,2,..., л— 1} взаимно простых с п. Доказательство. Пусть г е {1,2,..., я—1} и (г, п) = 1 — НОД (см. п.8.1), т.е. run — взаимно простые. Если предположить, что на- наступит (ff)k = ?k = e для некоторого к<п,тогк = п- ?для некото- некоторого t, так как п — порядок элемента g. Из г • к = п • t следует, что п делит к, так как (г, п) = 1. Это противоречит предположению к < п. Следовательно, порядок элемента | / \ = п. Пусть теперь {г, п) - s и s > 1, т.е. r= s - р и п = s > q, где (р, q) = L Тогда (/)* = (/Т = /" = (/У = («Y = <? = е, а значит порядок элемента | /1 = q < п. Действительно, порядок | /1 не ме- меньше q, в противном случае имеем (ff)q = (jf)k = е, где /: < q, и г- к = п- t, так как л — порядок элемента g. Как и в первом случае, из г - к = п -1, spk = sqt, pk = qt следует, что q делит к, т.к. (pf q) = 1. Это противоречит предположению к < q. • Определение. Подгруппа Я группы G называется нормальным делителем, если правые смежные классы совпадают с левыми: Vge С gH=Hg. • Утверждение 7.3.5. Множество смежных классов группы Gno нормальному делителю Яявляется группой с операцией умно- умножения смежных классов. Такая группа называется фактор- факторгруппой и обозначается G/H. Элементами этой группы являют- являются смежные классы разложения группы G = gxHKj g2Hu... и ?уЯна непересекающиеся левые смежные классы, т.е. G/H= = {glH,g2Hi...,gsH}.
202 Глава 7. Введение в теорию групп. Приложения Доказательство. Проверим выполнение аксиом группы. 1. Замкнутость. Vg{H,g2He G/H glH- g2H=g{(Hg2)H=gl(g2H)H= = &\gi(HH) = (g\g2)H e G/H. Произведение двух классов — это умножение каждого с каждым элементов указанных классов. 2. Существование единичного элемента. Так как (eH)(gH) = = (gH)(eH) = (eg)H= gH, то еН= Н— единица факторгруппы G/H. 3. Существование обратного элемента. Так как (gH)(g~lH) = = (g~lH)(gH) = (gg~l)H= Н, то g~lH e G/H— обратный элемент к элементу gH e G/H. • Теорема 7.3.3. Для любого нормального делителя Н группы G отображение /: G-> G/H, где VgeG f(g)=gH, является гомоморфизмом, ядро которого Н, G/H— фактор- факторгруппа. Доказательство. Проверим свойство гомоморфизма сохране- сохранения операций: f{gx -g2)={gl g2)H =(giH)o(g2H)=f(gl)of(g2). Единицей факторгруппы G/H является Н, тогда Keif={geG\f(g) = H}. Имеем \fh e Hf(h) = hH= H, откуда Яс Кег/ С другой стороны, \/g<? H f{g)= gH* H. В противном случае, если gH= H, то суще- существует такое h e H, что gh = e или g= h~l e H, что противоречит предположению g g H. Таким образом, только ЯеКег/, а зна- значит, Кег/= Н • Теорема 7.3.4. Ядро произвольного гомоморфизма есть норма- нормальный делитель. Доказательство. Пусть/: G-> К, где G, К— группы,/— гомо- гомоморфизм. Кег/= {he G\f(h) = eeK\. Обозначим Н= Кег/— подгруппа. Покажем, что VgeG gH= Hg, т.е. Н— нормальный де- делитель. Рассмотрим множество S={geG \f(g) = к еК}, где к — фиксиро- фиксированный элемент. Покажем, что S=gH, где geS — произвольный фиксированный элемент. Пусть g\eS, тогда f(g\g~l) = _ = k-ik = e. Отсюда g{g eH ng {g{eH или g{eHg и g{egH Таким образом, S<^gHn S<^Hg,megeS.C другой стороны, УЛ eHfigh) =f(gV(h) =f(g)e = к. Отсюда gh eS или g#c S. Так же проверяется, что п Hg^S. Получили, что gH= S= Hg, т.е. Н — нормальный делитель.
7.4. Строение коммутативных (абелевых) групп 203 7.4. Строение коммутативных (абелевых) групп • Определение. Группа С? является прямым произведением своих подгрупп G{ и G2, т.е. G = G{x G2i если выполнены следующие условия: 1. Пересечение подгрупп G{n G2 = e. 2. Любой элемент g e G однозначно представим в виде произ- произведения элементов g = gig2...gk, гДе & ^G{u G2. 3. Если gri eG{n gri eG2, то ghgri =gr2grr Коммутативность указанных элементов позволяет записать представление gs eG2. Лемма 7.4.1 утверждает, что это представление од- однозначное. • Лемма 7.4.1. Пусть G — группа и G{, G2 — ее подгруппы, для которых пересечение G{r\ G2 = e. Тогда, если g{g2 =g[g2, то gl=g[ И?2=?2,где?15?1 eG{ ng2,g2eG2. Доказательство. Действительно, если g{g2 =g[g2, TOgj^ = =&21&2 =е> T-K- G{nG2 = e. Следовательно, gl=g[n g2 =g2. • Теорема 7.4.1. Группа Gявляется прямым произведением сво- своих подгрупп G{ и G2 тогда и только тогда, когда выполняются условия: 1. Пересечение подгрупп Gxn G2 = e. 2. Любой элемент g e G однозначно представим в виде произ- произведения элементов g = g\g2...gk, где g, eGxu G2. 3. Подгруппы G{ и G2 являются нормальными делителями. Доказательство. (=>) Очевидно, что если группа G является прямым произведением своих подгрупп G{ и G2, то условия 1—3 выполняются. (<=) Достаточно показать, что если g{^Gxn g2e G2, то g{g2 = = g2g{. Имеем gxg2 eft(?2H g{G2 = G>&b тогда g{g2 e G^b откуда ?i#2 =g2gv Также gxg2 e Gxg2 и Glg2 = g2Gi9 тогда gxg2 e g2G{ и, значит, gxg2 =g2g[. Итак, gxg2 =g2g{ =g2g'v а так как G{nG2 = e, то из леммы 7A.I следует, что g2 =g2 и g[ =gv Следовательно,
204 Глава 7. Введение в теорию групп. Приложения • Утверждение 7.4.1. Пусть G — конечная абелева группа поряд- порядка^ = p?lp22 "'Plk •> Т№Рь ?!•>-•••> Рк ~ простые различные чис- числа. Множество А(р) = {х е G\\x\ =pa}, где ос принимает произ- произвольные целые значения, является подгруппой и называется примарной подгруппой группы G, соответствующей простому числу р. • Теорема 7.4.2. Всякая конечная абелева группа G разлагается в прямое произведение своих примарных подгрупп А(р{), Доказательство — индукция по числу простых в разложении порядка |G| -p^lp22 ••-Pi1' • Очевидно, что для \G\=pa справедли- справедливо, т.к. в этом случае А(р) = G. Пусть теперь \G\ =pa(f, где (p,q) = 1. Покажем, что G представимо в виде G = A(p) *A(q). Проверим свойства разложения. 1. А(р) r\A(q) = е. Если предположить, что Зх е А(р) х A(q) и х * е, то | х | = ра и | х | = (Д тогда и ра = (f, что противоречит усло- условию {р, q) = 1. 2. Покажем, что любой элемент х gG можно представить в виде х = у - z, где у е А(р), z е А(ф. Поскольку порядок | х \ делит | G|,то|х\ = pXlqkl, гдеХ{ <а,Х2<р. Таккак^1 ,qkl) =1— взаимно простые, то существует представление pXl m +qkl n =1 (см. п.8.1 алгоритм Евклида), где т, п — целые. Тогда хр m+q n =x или х = у - z, те у = xq 2 n nz =хр 1'т, для которых^ =lxp lq 2 J =е и zqXl =(xp lqX2 ) =е. Проверить, еслиудг= е, то порядок | у \ де- делит К Отсюда у е А(р) и ze A(q). Пусть разложение верно для 1<к, т.е. для \G\=p*1 р^1 ...р*1 - Рассмотрим группу порядка \G\ = р*1 р%2.. ./>?*, тогда возможно пря- прямое разложение G = A(pb р2,..., Рк-\)*А(рк), где А(р{, ръ..., рк_{) = = {х eG\\x\=py{lpy22 ••-Pl'l'i }, Y/^ап — это доказывается как и для случая \G\ =pa<f. Имеем: группа А(рк) — примарная, группа А(р{, Ръ-чРк-i) по предположению индукции разлагается в прямое про- произведение своих примарных подгрупп; теорема доказана.
7.4. Строение коммутативных (абелевых) групп 205 • Утверждение 7.4.2. Порядок конечной примарной группы (подгруппы) А(р) = {х | | jc | = ра} равен | А(р) \ = рп, где п — неко- некоторое положительное целое; а принимает произвольные це- целые значения. Доказательство. Рассмотрим следующее разложение примар- примарной группы. Пусть А{ = {а,а2,...,ар 1 = е}с А(р) — циклическая подгруппа максимального порядка |^41|=Jpotl. По теореме Лагран- жа (см. теорему 7.3.1) \А(р)\ = \АУ\ • \А{р)/Ах\, где А(р)/Ах = {х{А, х2А,..., хкА) — факторгруппа по подгруппе А{. Ясно, что Vjc^ е A(p)/AY (XjAY* =e и, значит, В(р) =А(р)/А{ — примарная группа, которая вновь допускает разложение на смежные классы по циклической подгруппе А2 с В(р) максимального порядка, т.е. \А(р)\ = \А{\ • \А2\ • \В(р)/А2\, где|Л2| = /?а2. Исходная примарная груп- группа А(р) конечного порядка и, следовательно, за конечное число т шагов получим разложение \А(р)\ = \А{\ • \А2\ •...• \Ат\, или \А(р)\ = =paipa>...pa» =/,где|4|=,ра'. • Лемма 7.4.2. Пусть А(р) — примарная группа (подгруппа), А с А(р) — циклическая подгруппа максимального порядка | А | =рп с образующим элементом а, А(р)/А — факторгруппа, у е А(р)/А — класс смежности порядка | у \ =/?а, т.е. ур*=ё =А, тогда существует элемент у е у того же порядка | у \ =ра. Доказательство. Так кжура = А, то для любого у е у выполня- выполняется ура еА, где А — единица факторгруппы А(р)/А. Следователь- а Р но, ур =ас =аС{Р , где (сьр) = 1 и р <п. Положим ? =aCl — обра- зующий элемент группы А, тогда ^ = zp к\ур =[zp ] " = z/?" =e или у^"*" =е. Так как z — образующий элемент А, то ^а+л-р _ ПОрадок у Вследствие максимального порядка подгруп- подгруппы | А | =рп, порядок | у | <рп. Отсюда ра+п~^<рп или а < р. Теперь равенство ур* = zp можно записать в виде ур* = zp =( zp*" ] , а так как z{=zp * е А, то ур<х = zf или (yz~l)p* =e. Таким образом, элемент у{ = yz~l e у, порядок которого | jt | =ра.
206 Глава 7. Введение в теорию групп. Приложения • Теорема 7.4.3. Всякая конечная примарная группа (подгруппа) разложима в прямое произведение своих циклических под- подгрупп. ЕслиА(р) = {х €= G\|х| = ра}и\А(р)\ =рп,тоА(р) =С(рк> )х хС{рХг )х.. .хС(рХт ), где C(pXi) — циклическая подгруппа поряд- порядка \С{рХ{ )\ = рх<, Х{ < Х2 < ... < Хт и Х{ + Х2 + ... + Хт = п. Доказательство — индукция по числу п. Для л = 1 теорема вер- верна, т.к. (показать)группаА(р)порядка\А\=р,где/? — простое,яв- простое,является циклической и не содержит подгрупп. Предположим, что те- теорема верна для всех групп меньшего порядка рп. Пусть А ^А(р) — циклическая подгруппа максимального порядка \А\=ра. Рассмот- Рассмотрим факторгруппу А(р)/А = {х{А, х^А,..., х^А}. Данная группа являет- является примарной порядка | А(р)/А | <рп, т.к. | А(р) \ = \А\- \ А(р)/А |. Предположение индукции позволяет записать для нее разложение A(p)/A = C(pai)xC(pa2)x...xC(pak). Обозначим через г, еС(ра<) образующие циклических подгрупп. Лемма 7.4.2 утверждает, что существует ух е г,- и | у1-,\ = \ ^ | и можно положить z, = y^. Из пря- прямого разложения факторгруппы следует, что любой класс смеж- смежности х е А(р)/А можно представить в виде х-1\11^ •••?*?> или х =у*11у*? ...у**А, где 0 < f,- <а,. ТаккакА(р) = x^ujc^ u...uxkA, то произвольный элемент х е А(р) представим как х =у*1у!* ---У*?а* - Таким образом, искомое прямое разложение на циклические подгруппы найдено. Покажем, что представление А(р)=С(рХ{ )xC{pXl)x...xC{pXm ) единственно. Доказательство единственности — индукция по числу п. Для п = 1 имеем А(р) = С(р) — свойство выполняется. Пусть оно верно для всех к < п. Покажем, что верно и для групп порядка рп. Предположим существование другого разложения группыА{р)=С(р*1 )хС(р^2 )х...хС(рр/), где рх < р2 < ... < р, .Ясно, ЧТО ПОРЯДОК \A(p)\ = pkl -pXl:..-pK =/Л 'P*2:..'Ph = p" . Запишем разложение группы в уточненном виде A(j))=C(j)k')xC(pk2)x...xC{p^)xC(p)xC{p)x...xC(j)) и > )хС(р)хС(р)х...хС(р).
7.5. Строение некоммутативных групп 207 Рассмотрим группу (подгруппу) ИС/?)]^ = {у? \ х е А{р)}. Для этой группы справедливы разложения: [A(p)Y =С{р^-{)хС{р^-1)х...хС{р^'1) и (*) [A(p)Y =C(p^-l)xC(p^-l)x...xC(p^-ll (**) Порядок | [А(р)]р | < | А{р) | и, следовательно, по предположе- предположению индукции разложения (*) и (**) совпадают, т.е. 1Х = р1? h = P2v--А =P/2J 'i = ^2'азначит,илгг - t{ = l- Г2илит = /.Единст- /.Единственность разложения доказана. Пример. Пусть G — коммутативная группа порядка | G\ = 42. Так как 42 = 2 • 3 • 7, то группа разложима в произведение следу- следующих своих циклических подгрупп G= СB) х СC) х СG). Пример. Пусть G— коммутативная группа порядка | G \ = 4. Так как 4 = 22, то группа разложима в произведение следующих своих циклических подгрупп G = СD) или G = СB) х СB) и в явном виде G= {x, jc2, jc3, х4 = е} — циклическая или G= {x, у, ху, е} = = {х, X1 = ё) х {у, у1 = е). 7.5. Строение некоммутативных групп • Определение. Пусть G — конечная группа. Подгруппа Яс(? называется /ьподгруппой, если порядок ее \Н\ =ра. • Определение, /ьподгруппа называется силовской, если порядок ее ра имеет максимальную степень в разложении порядка групп G. • Теоремы 7.5.1 (Силова). Пусть G — конечная группа порядка l^h^ Pi2 •• -Pi" > гДе Pi — простые числа. 1. Для каждого р{ существует силовская подгруппа группы G. 2. Всякая /ьподгруппа группы G содержится в некоторой си- силовской подгруппе. 3. Все силовские подгруппы сопряжены, т.е. если Я, Р — си- ловские подгруппы, то существует такое t g G, что Н= tPt~l. 4. Количество силовскихр-подгрупп равное • к + 1, где к — не- некоторое целое. Пример. Пусть G — группа порядка \G\ = 28 = 22 • 71, тогда су- существуют силовские подгруппы Нь \ Н{ \ = 4 и Нъ \ Н2 \ = 7.
( 1 9 т Л становкой или перестановкой и записывается я = '" 1где имеем 208 Глава 7. Введение в теорию групп. Приложения 7.6. Симметрическая группа подстановок Пусть S — конечное множество из т элементов. Множество всех взаимно однозначных отображений множества S на себя на- называется симметрической группой Sm степени т. Без ограничения общности можно считать, что множество S состоит из элементов {1, 2,..., т). Каждое такое отображение я : S-+ S называется под- /1 2 ... тЛ я, = я(/) — образ элемента /' = 1,/и. Произведением подстановок яв- является композиция отображений (операция группы) (яст)(/) = ст(я(/)). Например, для подстановок я=(I ? ?] и <j=[1 л ira= Hi иоя= Н? . Данный пример показывает, что сим- метрическая группа Sm не является абелевой (некоммутативная) при т > 3. Порядок данной группы \Sm\ = m\ — количество всех пе- перестановок из т элементов. Единичная (тождественная) подста- новка обозначаетсяе = | i ••• ^ , которая удовлетворяет \/я е Sm ( 1 2 /и ^ яе = ея = я. Обратной к я= " является подстановка я = я! ^2 ' ¦" Пт I для которой верно, что яя = я~!я = е. • Утверждение 7.6.1. Симметрическая группа ?2 степени 2 — абелева. • Определение. Подстановка я, перемещающая элементы ib i2,...9 /^так, чтоя(/!) = /2, я(/2) = /'з,.-ч ti(^) = /'i и оставляющая на месте остальные элементы, называется циклом длины к и обознача- обозначается (/1? /2,..., /*). • Равносильное определение. Подстановка называется цикличе- циклической, если каждый из ее действительно перемещаемых элемен- элементов /1? /2,..., ik можно перевести в любой другой (из действительно перемещаемых элементов), если подстановку применить доста- достаточное число раз. Например, n(i{) = /2, я2(/1) = я^^)) = я(/2) = /3, = 4,..., nk(ii) = i\. Теперь цикл можно записать: (/ь /2,..., 2/1
7.6. Симметрическая группа подстановок 209 Пример, f 2 \ 4 5 6 7 3)= ^3j 2) 1? 4'5) ^' 7^ ~ цикл длины семь- • Определение. Два цикла называются независимыми, если они не содержат общих действительно перемещаемых элементов. Например, A, 2, 3, 5, 9) и G, 8) — независимые циклы. • Теорема 7.6.1. Каждую нетождественную подстановку Sm мож- можно разложить единственным образом в произведение незави- независимых циклов. Доказательство. Пусть я е Sm и i,j e S. Элементы /иу назовем эквивалентными /~у, еслиу = nk(i) для некоторого целого числа к. Введенное отношение есть отношение эквивалентности на мно- множестве S. Оно разбивает множество Sна непересекающиеся клас- классы эквивалентности по этому отношению S= S{ u S2 u...u Sr. Каждый элемент / e Sпринадлежит одному и только одному клас- классу St, причем множество St состоит из образов элемента / при дей- действии степеней подстановкия: St = {/,л(/),л2(/),..,9пк'~1 (/)}, где kt — количество элементов в St. Множества «5^ еще называют я-орбита- ми. Выберем в каждом классе St по одному представителю it и по- поставим ему в соответствие цикл я, ={//,тг(//),я2(/г ),...,я^~1(//)}. Так как любой элемент, не принадлежащий St, остается на месте при действии степеней я;, то перестановка я есть произведение независимых циклов я = я^.-.я,.. • Замечание 1. Если цикл я; = (/,) имеет длину 1, то он действует как тождественная подстановка. Такие циклы в записи я = я1я2...яг можно опускать. • Замечание 2. Независимые циклы в записи я = я1я2...ягможно произвольным образом переставлять между собой. Так, Пример. 3 2 15 4 Определение. Декрементом (d) подстановки называется раз- разность между числом действительно перемещаемых элементов и числом независимых циклов, на которые она раскладывает- раскладывается. Подстановка называется четной, если d — четное число и подстановка нечетная, если d — нечетное. Введем функцию
210 Глава 7. Введение в теорию групп. Приложения / \ |+1, если я-четная подстановка, [-1, если я -нечетная подстановка, где я е Sm, тогда sgn(rc) = (-1)^. Например, для подстановки] ~ ? о s 4 б) = A32) D5) декремент равен d= 5 - 2 = 3, следовательно, подстановка нечетная. • Определение. Цикл длины 2 называется транспозицией т = (ар). Для транспозиции декремент d=2 - I = 1 — нечетное число. • Теорема 7.6.2, При умножении подстановки я е Sm на транспо- транспозицию т = (ар) она меняет свою четность. Доказательство. Пусть п = (ili2...ir)(Jri2'-Js)---(hh--'tp) ~~ разло- разложение подстановки в произведение независимых циклов. Умно- Умножим ее на транспозицию т = (ар). Рассмотрим все возможные случаи: 1. а ? я, Р ? я. 2. а е я, р ? я. 3. а ? я, р е я. 4. аея,Рея,аир принадлежат одному и тому же циклу. 5. а е я, р е я, а и р принадлежат разным циклам. Пусть к — число действительно перемещаемых элементов я; / — число независимых циклов в разложении я. Декремент подста- подстановки d(n) = к- I. 1. Пусть а ? я, р ? я, тогда ят = (/i/2—'r)(/i/2—Л)—(d(z—^)(«Р)- Дек" ремент */(ят) = (/: + 2) - (/+ 1) = /:- /+ 1. 2. Пусть а е я, р ? я. Будем считать, что /j = а. В этом случае ят = (а/2.../г)(/1/2-Л)-(^2-^)(аР) = {ai2...i$)(jj2...j^.(l{l2...lp). Декремент d(ni) = {к+ 1) - /= к- / + 1. 3. Случай a g я, Рея рассматривается подобно а е я, р <? я. 4. Пусть ае я, рея,аир принадлежат одному и тому же циклу. Тогда ят = (а/2.../тр/да+2-»'г)(/1/2»Л)-('1/2-^)(аР) = ()(//У Декремент */(ят) = к- (I +\) = к-1-\. 5. Пусть ае я, рея, аир принадлежат разным циклам. Тогда ят= (а/2.../г)(Р/2...л)...(/1/2...//7)(ар) = (а/2 Декремент ^(ят) = /:-(/-!) = &-/+
7.6. Симметрическая группа подстановок 211 Таким образом, во всех случаях sgn(Ttx) = (-l)k~l±l = = (-l)±l(-l)k~l = -sgn(rc) четность подстановки ях меняется. • Теорема 7.6.3. Каждая подстановка п е Sm разлагается в произ- произведение транспозиций не единственным образом, однако чет- четность числа транспозиций постоянна и совпадает с четностью самой подстановки. Доказательство. п = {i\i2-Q{J\J2~j^—(hh~-ty ~~ разложение под- подстановки в произведение независимых циклов. Каждый цикл разла- разлагается в произведение транспозиций 0"i/2.../r) = (hh)(hh)---(hQ- Та- Таким способом можно разложить в произведение транспозиций все циклы подстановки 7г = т1т2...тА?, где х,- — транспозиции. Теорема 7.6.2 позволяет записать sgn(rc) = sgn(T1T2...xAI) = sgn((T1T2...T,l_1)T,J) = = «ii(t1t2...v1)-(-1) = «n(T1T2...V2)-(-l)(-l) =...= sgn^X-ir1 = (-1)". Таким образом, четность подстановки sgn(rc) = (-1)" совпадает с четностью числа транспозиций п в разложении я = т1т2...тЛ. • Следствие 1. sgn(ax) = sgn(a)sgn(x), a, x — произвольные под- подстановки. Доказательство. Пусть a = SiS2...sr и т = t{t2...ti — разложения в произведение транспозиций sif tj. Тогда ax = s^^.s^t^-.ti — раз- разложение в произведение транспозиций. Из теоремы sgn(ax) = • Следствие 2. sgn(o~l) = sgn(a), a — обратная подстановка. Доказательство. Пусть а = 5>1512...^г, тогда a~l = sr..s2Si, так как acf1 = (jlJs2...Jr)(Jr..^i) = (^i(^(-(^^)-)^i) = ^и^^) = е — тож- тождественная подстановка, где s, — транспозиции. Первое следст- следствие позволяет записать sgn(aa~l) = sgn(a)sgn(cr~1). С другой сто- стороны, аа~{ = е — тождественная подстановка и sgn(e) = 1. Тогда sgn(a)sgn(a~1) = 1 и, следовательно, sgn(a~1) = sgn(a). • Теорема 7.6.4. Число четных подстановок Ат с Sm равно числу нечетных. Доказательство. Достаточно показать, что \Ат\ = т\/2, так как \Sm\ = ml. Для этого установим взаимно однозначное соответствие между четными и нечетными подстановками. Пусть х — произвольная фиксированная транспозиция. Рас- Рассмотрим отображение (р: Sm -> Sm, где VneSm ф(тг) =ях. Пусть а е Ат — произвольная четная подстановка, тогда ф(д) = ах — не- нечетная подстановка.
212 Глава 7. Введение в теорию групп. Приложения Свойство 1. Для ф верно, что Уа{ ф а2 е Ат <${а{) * ф(я2), в про- противном случае ах\ - а2т. Отсюда, умножая справа последнее ра- равенство на т, получим а{(тт) = а2(тт), а так как тт = е, то а{ = а2, что противоречит выбору а{ * а2. Свойство 2. Для любой нечетной подстановки b существует прообраз Ьх е Ат четной подстановки, так как фFт) = (tn)x = = *(тт) = Ъ. Свойства 1, 2 позволяют утверждать, что отображение ср явля- является взаимно однозначным. • Утверждение 7.6.2. Ат — подфуппа симметрической группы Sm. • Теорема 7.6.5 Кэли. Всякая конечная группа G порядка т изо- изоморфна некоторой подгруппе симметрической группы Sm. Доказательство. Для любого элемента a eGрассмотрим ото- отображение La : G-> G, состоящее в умножении всех элементов G={gi, ft.»., gj слева на a: La{g^ = ag{. Свойство группы aG= G позволяет утверждать, что La — взаимно однозначное отображе- отображение (подстановка). Обратным к La будет отображение L'al =L _{, единичным отображением является Le. Вследствие ассоциатив- ассоциативности умножения в группе G имеем замкнутость: (LaLb)(g) = = Lb(Lj(g)) = b(ag) = (ab)g = Lab(g), т.е. LaLb = Lab. Отсюда следует, что множество Н ={Lg ,Lg2,..., Lgm } образует подгруппу в множе- множестве всех взаимно однозначных отображений С в себя, т.е. в сим- симметрической группе Sm. Тогда отображение <р: G-> HaSm такое, что Vа е Gy(a) = La есть изоморфизм, поскольку q> — взаимно од- однозначное и выполняется свойство y{ab) = Lab = LaLb = у(а)ц>(Ь) сохранения операций. 7.7. Действие групп на множестве • Определение. Говорят, что задано действие группы Сна множе- множестве S= {1,2,..., т}, если определен гомоморфизм Г группы G в симметрическую группу Sm подстановок: Т: G -> Sm. Свойст- Свойство сохранения операций для гомоморфизма: V?1? g2 e G T(gl°g2)=T(gl)T(g2),me { а2 ... a Далее полагаем, что^ = f1 z '" !? \
7.7. Действие групп на множестве 213 • Замечание. Чаще всего бывает так, что действие G на S возни- возникает естественным образом, как группа симметрии структуры, определенной на S. Пример. Пусть S = {1, 2, 3, 4, 5} — вершины графа на рис. 7.1. Найти G — группу самосовмещений дан- данного графа. Решение. Исходное множество элементов ^являет- 2 4 ся связанным или структурой. Группа G, действую- действующая на S, — группа самосовмещений: G- {е, а, Ъ, ab}9 где е=12 3 4 S) ~~ тожДественное преобразование; 3 4 5 )_fAz\ т™™^^ Таблица 7.1 вокруг горизонтальной оси; , (\ 1 1 4 S^ Ь=\л% Z л\ =B3) — поворот 11 5 I 4 j) A 9 ^ ч- <*b = \i i i 7 л =B3)D5) — поворот е а Ь ab е е а Ь ab а а е ab ь b b ab е а ab ab b a e вокруг вертикальной оси; 2 3 3 2 вокруг горизонтальной оси и вертикальной. В табл. 7.1 содержат- содержатся все возможные произведения элементов рассматриваемой группы. Из табл. 7.1 видно, что G — коммутативная группа и G={e,a}x{e,b}. • Определение. Элементы sh s2 e S называются g-эквивалентны- ми и записывают s{ ~ s2, если 3g e G, который, действуя на множестве S, переводитs{ в ^ т.е. g=\ '" 1 или ^ а2 более короткая запись этого gs{ = 52. • Утверждение 7.7.1. Определенная g-эквивалентностъ на мно- множестве S является отношением эквивалентности. Доказательство. Проверим свойства отношения эквивалент- эквивалентности. 1. V^ g S s{ ~ s2. Действительно, es{ = s{, где е е G — единичный элемент. 2. Vjl9 s2 e S s{~ s2^>s2~ s{. Имеем s{ - s2, тогда 3g <=G gs{ = s2 и s2 = g~lsb а значит, s2 ~ s{. 3. \/sb s2, s3 g S s{~ s2as2~ s3-+ s{~ s3.
214 Глава 7. Введение в теорию групп. Приложения Имеем, что 3t, g e G ts{ = s2a gs2 = s3, откуда (tg)s{ = gits{) = = gs2 = s3. Следовательно, s{ ~ s3. • Утверждение 7.7.2. Группа G = {gb g2,..., gk), действуя на мно- множестве S, порождает его разбиение на непересекающиеся под- подмножества — классы эквивалентности (рис. 7.2): , где Vsl9s2eSa SgeG \ gsl = s2H\/sleSaVs2 J \ NG — количество классов эквивалентности. Пусть j, eSa, тогда класс эквивалентности Рис. 7.2 i « 5ц составят все различные элементы множества ?а = • Определение. Множество Z(sx) = {g e G \ gs{ = s{, s{ e S} называ- называется стабилизатором sx e S. Элементы стабилизатора оставля- оставляют s{ на месте. Пример. Продолжим рассмотрение примера на рис. 7.1. S= {1, 2, 3, 4, 5} — вершины графа на рис. 7.3. На ? действует 5 группа самосовмещений G= {e, a, b, ab}, где e_fl2 3 4 5^| a_fl2 3 4 5^ *il2 3 4 5> a~ll 2 3 5 4 ' {\Ъ2 4 5} аЬ~\1Ъ2 5 4/ Найдем все классы эквивалентности. S{= Ml), a(l), 4A), aft(l)} = {1, 1, 1, 1} = {1}, S2= {eB), aB), bB), ab{2)} = {2, 2, 3, 3} = {2, 3}, S3= W4), eD), 4D), e4D)} = {4, 5, 4, 5} = {4, 5}. S = SluS2vSz— всего три класса эквивалентности. Определим стабилизаторы для вершин графа{1, 2, 3, 4, 5} . Д1) = {е, в, 4, ab}, Z{2) = ДЗ) = {е, a), ZD) = ZE) = {e, b). • Утверждение 7.7.3. Z{sx) cG- подгруппа группы G. Доказательство. Проверим свойства группы. 1. Замкнутость. Vgu g2 e Z(sx) g^ = sh g2s{ = sb тогда и (gig2)s{ = = fttei^i) = S2S\ = sb следовательно, g{g2 e Z(s{). 2. Единичный элемент e e Z(s{), так как es{ = s{. 3. Обратный элемент. Пусть g e Z(s{), тогда gs{ = s{, откуда s{ =g~ls{i следовательно, g~l e Z(s{).
7.7. Действие групп на множестве 215 • Утверждение 7.7.4. V^, s2 e Sa \Z{sx)\ = |Z(j2)| иЗ = tZ(s2)fl — в этом случае говорят, что подгруппы Z(sx), Z(s2) сопряжены. Доказательство. Имеем sx, s2eSa, следовательно, 3/еС tsx = s2. Vg e Z(s2) (tg)s{ = g(tsx) = gs2 = s2 = tsx или {tg)sx = tsx. Отсю- Отсюда (tgrl)sx = rl(tg)sx = rl(tsx) = (" ~Vi = Ji, т.е. tgTY e Z{sx). Полу- Получили, что \/ge Z(s2) tgt~le Z(s{). Заметим, что V^ *g2 e Z(s2) tgit~l ф tg2t~\ значит, |Z(j2)| = \tZ(s2)rl\ < \Z(Sl)\ или |Z(j2)| < \Z(s{)\. Подобным образом доказывается в обратную сторону: |Z(s2)| > \Z(s{)\, следовательно, \Z(sx)\ = \Z(s2)\. Показали, что 3t^G Vg e Z(s2) tgt'1 e Z{sx) и \Z(sx)\ = \Z(s2)\ = \tZ(s2)t'\ отсюда Z{sx) = tZ(s2)rK • Утверждение 7.7.5. \ Sa\= ' ' , где sx e Sa. \Z(sx)\ Доказательство. Пусть G= {gx, g2,..., g^}. Из утверждения 7.7.2 следует, что Sa= {gxsx, g2sx,...,gi<sx}, однако среди выписанных эле- элементов множества Sa могут встречаться одинаковые. Назовем gj ,gi2 e G эквивалентными gf ~ gi2, если они действуют на эле- элемент sx одинаковым образом, т.е. gt sx =gj sx. Данное отношение является отношением эквивалентности. Введенная эквивалент- эквивалентность разбивает группу G на классы, количество которых равно числу различных элементов среди выписанных Sa= {gxsx, g2sx,..., gksx}, т.е. равно|?а|. Пусть gilsx=ghsx (g^-gij или (gilg;il)sx=g;2l(giisx) = =g^(gi2sx)=(gi2gi'2{)sx=sx, следовательно, й^ gfi eZ(sx)gh. Верно и обратное, если gi{ eZ(sx)gh, то gifil eZ(sl)mn(giig^)sl =sv Отсюдаft^5j =gi2sx или^-^^ Таким образом, gf ~ gt 2 тогда и только тогда, когда gt , gt 2 лежат в одном правом классе смежности по стабилизатору Z(sx) (gj g Z(sx )gi2), а значит, и число элементов в Sa равно количест- количеству правых смежных классов в С по подгруппе Z(sx). Согласно тео- теореме 7.3.1 Лагранжа, \ Sa\ = -\^—=\G:Z(sx)\.
216 Глава 7. Введение в теорию групп. Приложения • Лемма 7.7.1 Бернсайда. Число классов Sa эквивалентности, на которые распадается множество S = Sx uS2u...^SNgпод дей- ствиемгруппы G,равноЛ^ = — %\y(g)\,mey(g) = {seS\gs=s}. Доказательство. Подсчитаем двумя различными способами множество всех таких пар элементов, что \/g e G \/s e S >s) \gs = s]. Это можно выполнить следующим образом: 2> seS geG Первая сумма ^|Z(j)| =]Г ^|Z(s)|. Так как seS \Z(Sl)\ = \Z(s2)\, то X\Z(s)\=\Sj.\Z(SJ\=^LjiZ(sa)\=\G\, где sa e$a. Таким образом, ^ seS i^lseSi '=1 Получили, что NG-\G\= 2lv(ff)l. откуда NG =7z='Z)v(g)\- Пример. Продолжим рассмотрение примера на рис. 7.3. S= {1, 2, 3, 4, 5} — вершины графа. На ? действует группа самосовмеще- самосовмещений G= {е} а, Ъ, ab}, где ^ =fj 2 3 4 5/ a=(l 2 3 5 4/ Л _fl 2 3 4 5^| /7/)_fl2 3 4 5^ *"\13 2 4 5> ^-Ц3 2 5 4/ Полным перебором установили, что под действием С множест- множество Sраспадается на три класса эквивалентности: S = S{ uS2 u53, где S{ ={1}, S2 ={2,3}, 53 ={4,5}. Установим данный факт, приме- применяя лемму 7.7.1 Бернсайда: NG = — J]| v[/(g)| — число классов экви- валентности. = j} = {1,2,3}, = j} = {l,4, 5},
7.8. Цикловой индекс группы 217 Отсюда следует, что число классов эквивалентности \G\ 4 Замечание. Рассмотрению более содержательных задач, при решении которых возможно применение изложенной выше тех- техники подсчета классов эквивалентности, предварим изложение теории перечисления Пойа. Это позволит нам с более формаль- формальных позиций подойти к пониманию самой техники подсчета и к применению ее для решения задач. 7.8. Цикловой индекс группы Пусть группа G действует на множестве S= {1, 2,..., т) и Т: G -»Sm — гомоморфизм в симметрическую группу Sm. Рас- Рассмотрим разложение g e G на независимые циклы где к{ — количество циклов длины 1; к2 — количество циклов длины 2; кт — количество циклов длины т. Набор (кь къ..., кт) называется характеристикой элемента g е С, где 1 - кх + 2 - к2 + ... + т - кт = т. • Определение. Цикловым индексом Z(G, хь хъ..., xm) группы G, действующей на множестве S, называется полино!м от пере- переменных х{, хъ..., хт, определяемый формулой Z(G х х х )= — Yxklxkl xkm где (кь к2,..., кт) — характеристика элемента g eG. Пример. Продолжим рассмотрение примера на рис. 7.3. 5= {1, 2, 3,4, 5} — вершины графа. На ^действует группа самосовмеще- самосовмещений G={e, а, Ъу ab}, гдее=4 j 2 3 4 5)} а=[\ 2 3 5 \\ l (\ 2 3 4 5^ l fl 2 3 4 5^1 тт - 132 45 г 113 2 5 4]" Найдем цикловой индекс группы G, для этого выполним разложение на независимые циклы под- подстановок элементов G и установим их характеристики:
218 Глава 7. Введение в теорию групп. Приложения е = A)B)C)D)E), (kfo.-kj = E, О, О, О, О); а = A)B)C)D5), (к{к2...кт) = C, 1, О, О, 0); Ь = A)B3)D)E), (к{к2...кт) = C, 1, О, О, О); аЬ = A)B3)D5), (кхк2...кт) = A, 2, О, О, О). wv5vi)vovovo , V3vivovovo , V3yivovovo J\xlx2x3x4x5 + -*] Л2Л3Л4Л5 + Х1Х2хзх4х$ + x\x\ +x\x])=\(xl +2x*xl2 +x\x22). 7.9. Теория перечисления Пойа Введем следующие обозначения. D= {db d2,..., dm) — конечное множество. G= {g\, g2, ft,-••} — конечная группа, действующая на D. R - {rb r2, /3,.-.} ~ конечное множество качественных признаков (цвета). S= \f\f: D-> R} — множество функций; каждая функция/опре- функция/определяет качественные признаки элементов D. ?1 = {со1? со2, со3,...} — множество весов, со : R -> Q — весовая функция, назначает веса со (г) е Q признакам reR. R(co) = 2]co(r) — сумма весов элементов г eR или reR R(co) = ^ГСшсо, где Сш — число элементов г eR с весом со е Q, юеГ2 множество {CJ — перечень R относительно весовой функции со(г). 2 У 2 reR toeQ Рассмотрим введенные понятия на следующем примере, к ко- которому ниже не раз будем возвращаться. Пусть D= {dx, d2, d3} — вершины правиль- ного треугольника (рис. 7.4). Треугольник нанизан на вертикальную ось, вокруг кото- которой он свободно вращается. R = {•, о} — мно- множество из двух красок. Найти количество различных раскрасок* вершин треугольни- Рис. 7.4 ка
7.9. Теория перечисления Пойа 219 На D действует группа самосовмещений G= {e, а, а2}, где 12 з)~тождественноесовмещение>Л=B \ |)—поворот во- вокруг оси на 120°, а1 =( 1 ? j\~~ поворот на 240°. Q. = {х, у, х~1, у~1 и их произведения}— множество весов. S= {f\f- D -» Щ — множество раскрасок. В треугольнике три вер- вершины и каждую допускается окрашивать в любой из двух цветов R = {; о}, следовательно, всего функций 23. Такое количество рас- раскрасок будет, если треугольник сделать неподвижным (рис. 7.4). Если допустить вращение, то различные раскраски неподвижно- неподвижного треугольника становятся одинаковыми для вращающегося треугольника. Приведем пример трех раскрасок: f^ f{:D->R, Очевидно, что для решаемой задачи раскраски/2 и/3 совпада- совпадают. Назначим краскам R = {; о} веса: со(«) =х и ю(о) = у. Замечание. Отметим, что назначенные веса элементов ©(•) =х и со (о) = у позволяют сравнивать признаки количественно, за- забывая, в какой—то степени, о качественном их содержании. Определение. Для каждой функции /е S определим вес deD 1 В нашем примере W{fi) = co(»)co(*)cu(o ) = хху = х у Определение. Группа G, действуя на D, индуцирует (наводит, создает, определяет) свое действие на множество функций S. Положим V/ gS Vg eG gf=f(g(d))— это рассматривается
220 Глава 7. Введение в теорию групп. Приложения В нашем примере рассмотрим действие элемента а2 е G на f2eS. = . и = o и Таким образом, элемент группы а2 переводит^ в/3 или, в при- принятых обозначениях, a2f2 =f3. • Определение. Положим/! ~/ъ если 3geG\/deD f{(gd) =f2(d). Такие /j и f2 определяют одинаковые раскраски элементов deD. s Введенная эквивалентность функций есть от- отношение эквивалентности, которое порождает разбиение множества элементов/е Sна непере- непересекающиеся классы эквивалентности (рис. 7.5): S S .! Рис. 7.5 NG- количество классов эквивалентности. Каждый класс эквивалентности определяет отдельную рас- раскраску элементов deD. Таким образом, количество различных раскрасок равно NG. Для определения NG воспользуемся леммой 7.7.1 Бернсайда: NG =—Y\\\/(g)\, в данном случае \G\geG i|/(?) = {fe S\gf=fwinf(gd) =Ad) VdeD}. Вернемся к нашему примеру на рис. 7.4 и найдем для него чис- число NG. ц(е) = {feS\ ef=f} удовлетворяют все/е S, откуда \ц(е)\ = - 23 = 8. v|/(a) = {fe S\ af=f) — это такие раскраски/вершин, ко- которые допускают совмещение с эквивалентной из раскрасок вра- вращением треугольника на 120°. Это возможно, если все вершины либо белые, либо черные. Итак, |у(я)| = 2. Подобным образом устанавливается, что и |ц/(а2)| = 2. Следовательно, 1 Утверждение 7.9.1. Если/j ~f2, то W(f{) = W(fl), т.е. эквива- эквивалентные функции имеют одинаковые веса. Доказательство. D = {dl9 db d3,...} и D = {gd{, gd2, gd3,...} — вер- верно W e G, так как G действует на D и g = J } ] " \ — это Urf & gd3 ...J
7.9. Теория перечисления Пойа 221 подстановка. Теперь W(fx) = Y\^Jy{d)) = ]7Jco(/1(^rf)). Имеем deD deD f{ ~/2, тогда 3geG Md e D <o(f{(gd)) = (o(f2(d)). Отсюда deD deD Определение. Последнее утверждение позволяет определить вес каждого класса эквивалентности St в разложении S = S{u u?2 u.. mSNq, как W{St) = W(J\ где f eSt. Определение кор- корректно, так как каждый класс Sf состоит из эквивалентных функций/, веса которых совпадают. Теорема 7.9.1 Пойа. ?СЮ• о> = Z(G,i?(coL),i?(co2),...,Л(о)т)), где Сю— число классов эквивалентности S = S{ u S2 и.. .и5#с с ве- весом qgQ, Z(G,x*1 ,х*2 v-j^m" ) — цикловой индекс группы G, действующей на множестве /) = {^1} ^2>---> rfm}. Отметим, что Доказательство. Пусть «А»— разбиение множества D на непе- непересекающиеся подмножества: 2J ^ К, где \Ру\ = i,\P\ = m,\-k{ + 2'k2 + ... + m-km = m. • Определение. Говорят, что/ е 5подчинена разбиению «Д» мно- множества Р и записывают/ е А, если/постоянна на каждом под- подмножестве Ру из разбиения: \/d е /),-, ДсО = Гу, где r^ g i?. Функция/, подчиненная разбиению «А», взаимно однозначно определяется набором (rnrn...rlk^2lr22...r2k2...rmirm2...rmkm ), где гиеК ' г; ^^ т2 ' ' z ' Все такие наборы составляют множество: где Sy = R, i = 1,/я,7 = 1Лг Полагая веса элементов ^ е «S^ равны- равными о)Ц) = [сэ(г^)]/ивес^= (^и512...5и152Л2...52Л2...^Л2...^ ) е 5
222 Глава 7. Введение в теорию групп. Приложения равным произведению весов cd(^) = ]^J|[coEi^)] = J~[]j[[co(r^)]', имеем со (s) = W(f), где/е А подчинена разбиению. Для множества Sвыполнены все условия правила обобщенно- обобщенного произведения, тогда сумма весов элементов данного множест- множества, а значит, и сумма весов всех функций /е А составит jn kj тп = ПП Wir)= YWiSij )]*', вследствие W{Sy ) = W(SiJ2). / =1./=1 /=1 W(Sy)= Y. Ф) = Е[(О(Г)]/ =R(^)' Следовательно, reR /i /i или Y,W(f)=[R(a>1))kl[R(®2)]k2...[R(am)]k>n. Пусть g eG и g = (p1)(p2)...(P,i )ф/д )(p/2)- ...(p7iP;2...p7-J - разложение на независимые циклы, где (кь к2,..., кт) — характе- характеристиками 1 • к{ + 2 • к2 + ... + т - кт = т. Запишем разложение на независимые циклы в виде g = (Dn)(Dn)...(Dlki )(D2l)(D22)...(D2k2 )r.{Dml)(Dm2)...{Dmkm X V \ " ^ ' V z ' где Dy — цикл длины /, \Dy\ = i. Обозначим разбиение множества D на Dy через А^. Элементы d e Dy одного цикла при умножении на g переходят последовате- последовательно по циклу в элементы того же цикла. Указанное свойство по- позволяет заключить, что \fdb d2 e Dy 3k^d{ = d2. Пример. Пусть g= A2345)F78), тогда g = A3524)F87). • Определение. Функция feSназывается неподвижной относи- относительно g е G, если Vd e D f(gd) =f(d). • Утверждение 7.9.2. Функция feS неподвижна относительно g e G тогда и только тогда, когда/е Ag подчинена разбиению Доказательство. (=>) Пусть dh d2 g Dy — принадлежат одному циклу. Следовательно, 3k gkd{ = d2. Тогда f(d2) =f(gkd{) = =f(g(/~ld\) =/(/"^1) = ••• =f(gdi) =f(d{) , где каждый переход
7.10. Цикловая структура групп подстановок 223 обусловлен неподвижностью/: \/d eD f(gd) =f(d). Таким обра- образом, Vrfls d2 e Dy f(d{) =f(d2), т.е./е Ag. (<=) Пусть d eDy , тогда и gd eDy — свойство циклов. Имеем /e Д?или Vrfj, rf2 e /)y /(^i) =f(d2), следовательно, и/(#/) =/(d), тогда /есть неподвижная относительно g e G. Запишем сумму весов/, подчиненных разбиению Ag, в следую- следующем виде ]Г W{f) = Y,abg,<*'ш' гДе лд?,ш ~ количество функций, подчиненных разбиению Ag, с весом со gQ. Составим множество всех функций, неподвижных относите- относительно g €=(?, с весом со eQ:Ym(g) = {/"| Vrf eDf(gd) =f(d) aW(J) = со}. Утверждение 7. P.2 позволяет записать Лд?1<в = |?ш(?)|. Величина Сш — число классов эквивалентности с весом со eQ, на которые распадается множество функций S = SX kjS2kj...^jSNg под дейст- действием группы G. По лемме Бернсайда, Сю =— ^ = — ^Дд^оз. Умножив последнее равенство на со и просуммиро- \G\geG вав по всем весам из Q, получим, что ^Сш •« = — Сумма Хла^,сосо== Х^^) ~" сУмма весов функций, подчи- шеП feAg ненных разбиению Ag. Таккак Х^(/)=[Д«1)^1[ДоJ)]^...[Л(шт)]^, то coeQ 7.10. Цикловая структура групп подстановок Рассмотрим несколько общих примеров, которые в какой-то степени дают представление о возможностях изложенной выше техники подсчета классов эквивалентности с использованием те- теории перечисления Пойа.
224 Глава 7. Введение в теорию групп. Приложения 7.10.1. Цикловой индекс группы, действующей на себе Пусть группа G действует на множестве S= G следующим об- образом: \/g eGVs eS g(s) = gs. Если порядок элемента | g \ = d, то все элементы&у, g*s, g*s,...,g*s = sразличны. Группа (/распадается под действием g на циклы одинаковой длины. Количество циклов равно n/d, где п = \G \ — порядок группы. Цикловой индекс груп- группы примет вид i 1,x2,...,xJ= Wd/n где y(d) — количество элементовg eGс порядком \g\ = d. Сумми- Суммирование выполняется по всем делителям d числа п. 7.10.2. Цикловой индекс циклической группы Пусть ?={0, 1,..., л-1} — множество вершин правильного л-угольника (рис. 7.6) на плоскости. Группа G — циклическая группа самосовмещений. Образующий элемент группы a eG— вращение (отображение) Sвокруг центра на угол 2п/п. Следовательно, G= {an = е, а, а2,..., ап~1}, где е — тождественная подстановка. Если обозначить вершины многоугольника {0,1,..., п-\) элементами группы {ап = е, а, а2,..., ап~1}, то вращение будет эквивалентно умножению верши- вершины на соответствующий элемент группы. Напри- Например, совмещение при вращении на угол 2п/п рав- равносильно умножению новых меток {ап = е,а,а2,..., ап~1} вершин «-угольника на элемент а, действите- действительно, а • е -> а, а • а -> а2,..., а • ап~{ -> ап. Таким образом, можно считать, что циклическая группа G действует на себе. Согласно G.10.1) цикловой индекс данной группы примет вид Md/n \b\d/n где y(d) = ф (d) — функция Эйлера. Действительно, если порядок элемента равен d (элемент суммируется в y(d)), то он является об- образующим элементом подгруппы ЯсС порядка \Н\ = d. Пока- Показать, что если порядки элементов циклической группы совпадают
7.10. Цикловая структура групп подстановок 225 \ак | = \ат | = d, то они являются образующими одной и той же под- подгруппы Яс G. Число образующих в такой подгруппе <p(d). Найдем количество возможных раскрасок NG двумя цветами вершин данного (рис. 7.6) л-угольника. Пусть цвета — R = {;°). Воспользуемся теоремой 7.9.1 Попа. Для определения количества раскрасок положим веса цветов равными ©(•) =1 и ю(о) =L Тогда ?» {ж)Л(),Ж))^ coeQ П d/n Для треугольника (п = 3) число раскрасок равно Для шестиугольника число раскрасок равно =^(фAJ3+ФBJ3+фCJ2+фFJ1) = = iA.26+123+2-22+221)=14. 6 7.10.3. Цикловой индекс симметрической группы Пусть S= {1, 2,..., п) — произвольное множество, на котором действует группа всех подстановок Sn — симметрическая группа, |»УЛ| = п\. Рассмотрим произвольную подстановку п е Snc характе- характеристикой (ки кь..., кп), где 1к{ + 2к2 + ... + пкп = п. Подсчитаем ко- количество подстановок с данной характеристикой. Для этого запи- запишем в цикловом представлении, помещая знаки «—» на местах, которые должны занять п элементов. Так, для характеристики C,2) следует записать (—)(—)(—)(—)(—). Далее пробелы можно заполнять п элементами множества S в любом порядке. Это дает п\ подстановок с характеристикой (kh k2,..., кп), которые, однако, не все различные. Каждый из циклов /:гможет начинаться с любо- любого своего элемента, не изменяя исходной подстановки и умень- уменьшая общее число различных подстановок в г раз. Если имеется кг таких циклов, то их можно переставлять к), способами, что также не будет приводить к новым подстановкам. Все эти варианты суть
226 Глава 7. Введение в теорию групп. Приложения различные обозначения одной и той же подстановки с характери- характеристикой (кь к2,..., кп). Поэтому различных подстановок с указан- ной характеристикой будет . Тогда цикло- к11ЛкЧс21-2к*...кп\-пк* вой индекс симметрической группы можно записать в следую- следующем виде: Z(G, хь х2,..., хп) = Рассмотрим пример определения числа NG раскрасок двумя цветами R={•, о} трех усов S= {1,2, 3} антенны (рис. 7.7). Усы сво- свободно вращаются в пространстве. В этом случае на множестве 5={1, 2, 3} действует симметрическая группа подстановок S3. Найдем все характеристики (*1? *2, *3) разложения числа 3 = 1*! + 2*2 + 3*3. Ими будут: C,0,0), A,1,0) и @,0,1). Цикловой индекс примет вид 2. и Z(G, хь хъ х3) = Рис. 7.7 3!^ 1 ) 1!1!^ 1 ) {2 ) VK : Для определения количества раскрасок положим веса цветов рав- равными ш(«) =1 и ш(о) =1, тогда R(a>k) = ю^(•) + шЛ(о) =2. Следователь- Следовательно, _U2)\ lB)lf2I lBI "sillj +1шЫЫ+1!Ы -
—= Глава 8 ====== Элементы теории чисел I еория чисел занимается изучением свойств целых чисел. Целыми называются числа Z= {..., -3, -2, -1, 0, 1, 2, 3,...}. Для любых а,Ъ е Zсумма а + Ь, разность а - b и произведение а - Ь являются целыми числами. Но частное - от деления а на Ь о (если Ъ не равно нулю) может быть как целым, так и не целым. В случае, когда частное -является целым, то обозначают а = bq, где Ъ q — целое число, а Ъ тогда называют делителем числа а и записы- записывают так: Ь\а. В общем случае единственным является представ- представление а = bq + г, О <r<b где г — называют остатком от деления. 8.1. Наибольший общий делитель В дальнейшем будем рассматривать лишь положительные де- делители чисел. Всякое целое, делящее одновременно целые а, 6,..., с, называется их общим делителем. Наибольший из общих делите- делителей называется наибольшим общим делителем (НОД) и обозначает- обозначается (а,Ь,...,с). Если (а, Ь,..., с) = 1, то а, Ь,..., с называются взаимно простыми. Например, A0, 15) = 5, (8, 21) = 1. Свойства наибольшего общего делителя 1. Если а = bq, то (а, Ь) = Ъ. 2. Если а = bq + г, тогда общие делители чисел а и Ъ суть те же, что и общие делители чисел bur, в частности, (а, Ь) - (Ь, г). 3. Для определения наибольшего общего делителя применяется алгоритм Евклида. Он состоит в нижеследующем. Пусть а и Ъ — положительные целые числа и а > Ь. Составим ряд равенств: а = bq{ + г2, 0 < г2 < Ъ, b = r2q2 + r3, 0 < r3 < r2,
228 Глава 8. Элементы теории чисел r2 = r3q3 + rb 0<r4<r3, (8.1.1) Гп_2 = Гп-ХЯп-Х + гю 0 < гп < гп-\ гп-\ = rnqn, заканчивающийся, когда получается некоторое гя+1 = 0. По- Последнее неизбежно случится, так как ряд Ь, гъ г3,... убывающих целых чисел не может содержать более чем b положительных. 4. Из формул (8.1.1) алгоритма Евклида следует, что {а, Ъ) = (Ь, /2) = (г2> г3) = ... = (гп_ь гп) = гп. Наибольший общий делитель равен последнему не равному нулю остатку алгоритма Евклида. 5. Из формул (8.1.1) алгоритма Евклида следует также, что суще- существуют целые t{ и t2, что txa + t2b = rn. В частности, если (а, 6) = 1, то t{a + t2b= 1. Пример. Найдем E25, 231). 525 = 231-2 + 63, 231 = 63-3+42, 63 = 42- 1 + 21, 42 = 21 • 2. Последний остаток есть 21, значит, НОД = E25, 231) = 21. 6. Пусть т — любое положительное целое, тогда (am, bm) = = (a, b)m. 7. Если (я, Ъ) = 1, то (ас, Ь) = (с, Ь). 8. Если (а, Ь) = 1 и ас делится на Ь, то с делится на Ь. 8.2. Наименьшее общее кратное Всякое целое, кратное всех данных чисел, называется их об- общим кратным. Наименьшее положительное общее кратное назы- называется наименьшим общим кратным (НОК). Наименьшее общее кратное двух чисел а и b равно их произведению, деленному на их общий наибольший делитель, т.е. ^у. 8.3. Простые числа 1. Число 1 имеет только один положительный делитель, имен- именно 1. В этом отношении число 1 в ряде натуральных чисел сто- стоит совершенно особо.
8.3. Простые числа 229 Всякое целое, большее 1, имеет не менее двух делителей, имен- именно 1 и самого себя; если других делителей нет, то число называ- называется простым. Целое, большее 1, имеющее кроме 1 и самого себя другие положительные делители, называют составным. 2. Наименьший отличный от единицы делитель целого, больше- большего единицы, есть число простое. В противном случае, можно было бы выбрать делитель еще меньше. 3. Наименьший отличный от единицы делитель (он будет про- простым) составного числа а не превосходит 4а. Действительно, пусть q — именно этот делитель, тогда a = qbnb>q(q — наи- наименьший делитель), откуда а > q2 или q <4а. 4. Простых чисел бесконечно много. Это следует из того, что како- каковы бы ни были различные простые числа р^ Pi,--, Рь можно получить новое простое, среди них не находящееся. Таковым будет простой делитель суммы р^р2---Рк + 1» который, деля всю сумму, не может совпадать ни с одним из простых/^,Р2,---,Рк- 5. Решето Эратосфена для составления таблицы простых чисел. Данный способ состоит в следующем. Выписываем числа 1,2, 3,4, 5, 6, 7,8,9, -Ш, И,..., N. Первое, большее 1, число этого ряда есть 2. Оно делится толь- только на себя и на 1 и, следовательно, оно простое. Вычеркиваем из ряда (как составные) все числа, кратные 2, кроме самого себя. Первое, следующее за 2 не вычеркнутое число есть 3 — оно также будет простым. С ним, как и с числом 2, проделываем ту же про- процедуру и т.д. Если указанным способом уже вычеркнуты все числа кратные простых, меньших/? {4а <р), то все невычеркнутые, ме- меньшие р2, будут простые. Составление таблицы простых чисел, не превосходящих N, за- закончено, как только вычеркнуты все составные кратные простых, не превосходящих 4N. В алгоритме 8.1 реализовано решето Эратосфена для нечетных чисел 27V+ 1 с предпросеиванием для двойки; другими словами, начинаем только с нечетных чисел, отсеивая кратные 3, 5, 7, 11 и т.д. Вектор X является двоичным набором индикаторов простых нечетных чисел. Так элемент вектора Хк = 1, если соответствую- соответствующее ему число 2к + 1 — простое; в противном случае, когда Хк = О, число 2к+ 1— непростое.
230 Глава 8. Элементы теории чисел Алгоритм 8.1. Решето Эратосфена *=Ц, 1,..., 1); fork=3 to V27V41 by 2 do {X(k_iyi ~ индикатор нечетного числа k) {Вычеркнуть числа кратные к) *fX(k-i)/2 = 1 then for i^k2 to IN+\ by 2k do X(, _1)/2 = 0; { Печать простых чисел } for k=\ to N do ifXk = 1 then вывести 2k + 1. Рабочая программа на языке Pascal реализации решета Эра- Эратосфена генерации простых чисел приводится в алгоритме 8.2. Алгоритм 8.3 — это пример реализации алгоритма решета Эра- Эратосфена на языке Си. Алгоритм 8.2. Программа на Pascal'е генерации простых чисел Program PgmPrimary; {Программа генерации простых чисел} uses CRT; Const N=45; {Простые числа среди 3,5,...,2*N+1} Туре Vector=array[1..N] of Boolean; Var f :Text; {Текстовый файл простых чисел} X :Vector; {Вектор индикаторов простых чисел} Procedure Primary; {Генерация простых чисел} Var i,k,M,nin : Integer; begin nm:=2*N+l; for k:=l to N do X[k]:=TRUE; k:=3; M:=trunc (sqrt (rim) ) ; while k<=M do begin if X[(k-1) div 2] then begin i:=k*k; {Исключить числа кратные к} while i<=nm do begin X[(i-1) div 2]:=FALSE; i:=i+2*k; end; end; k:=k+2; {Выбираем нечетные числа к} end;
8.3. Простые числа 231 {Печать простых чисел по индикаторам Х[к]} i:=0; for k:=l to N do if X[k] then begin Write(f,2*k+l,' Mr- end; WriteLn(f); WriteLn(f,'Количество простых нечетных чисел '+ 'в диапазоне [3,',2*N+1,'] равно ',i); end; begin Assign(f,'Primary.out');{Файл для записи простых чисел} Rewrite(f) ; Primary; Close(f); end. Алгоритм 8.3. Программа на Си генерации простых чисел #include <stdio.h> tinclude <math.h> #define N 45 char X[N+1]; // Индикаторы простых чисел // в диапазоне 3,5,...,2*N+1} int main(void){ FILE *f; int i,k,M,nm; f=fopen("primary.out","wt"); // Файл для записи // простых чисел nm=2*N+l; M=sqrt(nm); for( k=l; k<=N; k++ ) X[k]=l; for( k=3; k<=M; k+=2 ) if( X[(k-l)/2] ) for( i=k*k; i<=nm; i+=2*k ) X[(i-1)/2]=0; //Печать простых нечетных чисел i=0; for( k=l; k<=N; k++ ) if( X[k]){ i++; fprintf(f,"%d "f2*k+l); } fprintf(f,"ХпКоличество простых нечетных чисел в диапазоне [3,%d] равно %d",2*N+1,i); fclose(f); return 0;
232 Глава 8. Элементы теории чисел Исходными данными для программ алгоритмов 8.2 и 8.3 явля- является верхняя граница 2N+ 1 диапазона [3,2N+ 1] поиска простых чисел. Значение 2N+ 1 этой границы устанавливается явным об- образом в программе посредством присваивания соответствующего значения переменной N. Нижняя граница диапазона всегда при- принимается равной 3 — первое нечетное простое число. Результаты расчетов по программам алгоритмов 8.2 и 8.3 со- сохраняются в выходном файле Primary.out со следующей структу- структурой: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89. Количество простых нечетных чисел в диапазоне [3,91] равно 23. В первой строке приводятся все вычисленные простые нечет- нечетные числа из диапазона [3, 2#+ 1], границы которого распечаты- распечатываются во второй строке результирующего файла. Во второй же строке указывается и общее количество найденных простых чи- чисел. 8.4. Сравнения, свойства сравнений Пусть т — целое положительное число, которое назовем моду- модулем. Будем говорить, что целые числа аиЬ сравнимы по модулю т, если a-b = t- m для некоторого целого t, т.е. равны остатки от деления аи Ъ на т. Сравнение чисел а и Ъ по модулю т будем за- записывать а = Ъ (mod m). Например, 77 s 5(mod 8), 102 = 0(mod 3). Свойства сравнений 1. а = a (mod m) — свойство рефлексивности. 2. а = Ъ (mod m) => b = a (mod m) — свойство симметричности. 3. а = Ь (mod m), b = c (mod m)^> a = c (mod m)— свойство тран- транзитивности. 4. а = b (mod m) => {а, т) = (Ь, т). 5. а = b (mod m), c = d (mod m)=>a + c = b + d (mod m). 6. a = b (mod m), c = d (mod m)=> ac = bd (mod m). 7. a = a{d, b = bxd, (d, m) = 1, a = b (mod m) => a{ = b{ (mod m). 8. a = b (mod m), m^m {m{ делит m) => a = b (mod m^). 9. a = b (mod m), d\a, d\b, d\m z=> al = bl (mod m{).
8.6. Приведенная система вычетов 233 8.5. Полная система вычетов Свойства 1—3 сравнений показывают, что операция сравнения целых чисел по модулю является отношением эквивалентности. Множество всех целых чисел Zpaзбивaeтcя на классы эквивален- эквивалентности (рис. 8.1), которые называются вычетами по модулю т. Числа г, s EZлeжaт в одном классе {А:,}, т.е. r,s e {&,} тогда и только тогда, когда г = s (mod m) имеют одинаковые остатки от деления на т. Числа одного и того же класса имеют с модулем т один и тот же наибольший общий делитель, т.к. из г, s е {?,} следует, что (г, т) = (s, m) (см. п.8.4). Особенно важны классы, для которых этот делитель равен единице, т.е. классы, содержащие числа, вза- взаимно простые с модулем. z {1} {2} {3} {4} {5} {т-2} {т-1} Рис. 8.1. Полная система вычетов Определение. Множество классов вычетов {0}, {1},..., {т - 1} по модулю т называется полной системой вычетов (п.с.в.). Пол- Полную систему вычетов можно получить следующим образом. Пусть Z— аддитивная (операция сложения) группа целых чи- чисел, mZ— подгруппа всех чисел, кратных т. Тогда факторгруп- факторгруппа Z/mZ— аддитивная группа вычетов по модулю т {полная сис- система вычетов). 8.6. Приведенная система вычетов Определение. Пусть т — целое положительное число. Множе- Множество классов из полной системы вычетов {0}, {1},..., {т - 1} вза- взаимно простых с т называется приведенной системой вычетов, которую будем обозначать как Мп или Мп(т). Приведенную систему вычетов, следовательно, можно составить из чисел п.с.в., взаимно простых с модулем. Обыкновенно Мк выделя- выделяют из системы наименьших неотрицательных вычетов: 0, 1, 2,..., т-1.
234 Глава 8. Элементы теории чисел • Утверждение 8.6.1. Мп является группой с операцией умноже- умножения. Доказательство. Проверим все свойства (аксиомы) группы. 1. Замкнутость. Пусть произвольные af b e Мк. Покажем, что аЪ е Мп. По условию а = 1 (mod т) и Ъ = 1 (mod m), тогда ab = I (mod m). 2. Ассоциативность операции умножения чисел выполняется. 3. Единичный элемент — 1. 4. Существование обратного элемента. Возьмем произвольный элемент а е Мп. Покажем совпаде- совпадение множеств аМк = Мп. Ясно, что аМп с Мп, так как для Мк вы- выполняется свойство замкнутости. Для доказательства аМк = Мп теперь достаточно показать, что все элементы множества аМп различны. Предположим, что существуют b{* Ъ2 e Мп, для которых ab{ - ab2 = 0 (mod т). Отсюда а(Ь{ - Ь2) = 0 (mod m). Атак как {а, т) = 1 — взаимно простые, то Ь{ - Ь2= 0 (mod m) или b{ = b2 (mod m), что противоречит принадлежности их разным классам. Таким образом, все элементы множества аМк различны, зна- значит, 3b е Мп, что а • Ъ = 1 (mod m). Элемент Ъявляется обратным к а, и по доказательству он единственный такой элемент {сущест- {существование обратного элемента а'1 доказано). Таким образом, получили, что Мп является группой по умно- умножению. Порядок этой группы равен количеству чисел меньших т и взаимно простых с ним. 8.7. Функция Эйлера • Определение. Функция Эйлера у(т) определяется для всех це- целых положительных т и равна количеству чисел ряда 1,2,...,/я-1, взаимно простых с т, где число 1 полагается взаимно простым с любым из чисел и срA) = 1. Примеры. ФA) = 1, ФB) = 1, ФC) = 2, ФD) = 2, ФE) = 4, ФF) = 2. • Замечание. Отметим, что порядок группы Мп(т) приведенной системы вычетов по модулю т равен \Мп(т)\ = ц>(т).
8.7. Функция Эйлера 235 Свойства функции Эйлера Свойство 1. Если (ть т2) - 1, то у(т{ • т2) - (p(mi)q(m2). Доказательство 1. Пусть С(т{т2) — циклическая группа по- порядка \C(mim2)\ = тхт2, число образующих ее равно ф(/г21/п2) (см. утверждение 7.3.4). Так как (т{т2) = 1, то допустимо разложение (см. п.7.4) группы С(тхт2) в прямое произведение своих цикли- циклических подгрупп С(т{т2) = С(тх) х С(т2) и, следовательно, чис- число образующих группы С(т{т2) равно 9(^)9(^2). Доказательство 2. Достаточно показать, что 1. Заметим, что из {т^т^) = 1 следует существование целых а и Ь, для которых выполняется ат2 + Ьт{ = 1 (алгоритм Евклида см. п.8.1). Приведем значения целых а и b к значениям а е {1, 2,..., m{}nb € {1, 2,..., ю2Ь для которых ат2 + Zwij = Цтоё/и^)- Пусть с е {1, 2,..., т{т2}, тогда верно сд/я2 + c?mt = c(mod /^^2), где зна- значения са и сЪ приведены к значениям а е {1, 2,..., /wj и Ъ е {1, 2,..., аи2}- Таким образом, произвольное число с е {1, 2,..., т{т2} можно записать в виде ат2 + Ьт{ = с (mod т{т2), где а е {1, 2,..., ahJ и 6 е {1, 2,..., /и2}. Данное представление является однозначным, так как число возможных пар (а, Ь) равно т{т2 и та- такое же количество представляемых чисел с е {1, 2,..., т{т2}. Далее рассмотрим все представления ат2 + бя^ для всех а е {1, 2,..., /wj и*е {1,2,..., /я2}. 2. Пусть а е Мп(т{) иЬ е Мп(т2), т.е. (а, т{) = 1 и F, аи2) = 1 и (aw1? т2) = 1. Покажем, что (ат2 + 6т2, Wj^) = 1. Выражение (ат2 + Лт15 т{т2) = 1 эквивалентно (aw2 + Ъть т{) = 1 и (a/w2 + + Ьть т2) = 1. В первом случае — (ат2 + Ьт{, т{) = (ат2, т{) = = (а, т{) = 1 и во втором — (ат2 + Ьт{, т2) = (Ьть т2) = (Ь, т2) = 1. Таких пар (а, Ь), а значит и чисел ат2 + Ьт{ взаимно простых с т{т2, равно <р(т{) • ф(т2). Покажем, что других чисел взаимно простых с т{т2 среди ат2 + Ьт{ нет. 3. Остались не рассмотренными числа ат2 + Ьт{, где а ? Мп(т{) или Ъ ? Мп(т2), для них (ат2 + Ьть т{т2) * 1, т.е. та- такие числа не являются взаимно простыми с тхт2. 4. Из пунктов 1), 2), 3) следует, что ц>(т{т2) =ф(/и1)ф(т2).
236 Глава 8. Элементы теории чисел Свойство 2. ф(/?а)=/?а -ра~1 =ра\1— , Pj где р — простое число и а > 0. Доказательство. Числа вида к • р, где к = {1,2,...,ра~1} — это все числа не взаимно простые сра среди 1, 2,...,ра, а значит остальные являются взаимно простыми с ра. Отсюда у(ра) =ра -ра~1. Свойство 3. Пусть разложение числа т на простые сомножите- сомножители имеет вид т =р*1 р%2 ..-/>?*, гдеpt — простые числа, тогда к /=1 i=l V Pi) /=1V Pi Свойство 4. ^ф(^) =п, где d — различные делители числа п. d\n Доказательство 1. Пустьп =p*vР22 •• -Pakk — разложение числа п на простые сомножители. Правило обобщенного произведения (см. п.3.4) позволяет записать: d\n /=1г,=0 Сумма Отсюда искомая сумма П Доказательство 2. Пусть С(л) — циклическая группа порядка |С(л)| = п. Для всякого делителя ^ числа п существует единствен- единственная подгруппа C(d) с С(п) порядка \C(d)\ = d. Образующие груп- группы C(d) составляют множество Sd = {х е С(п) \ \ х \ = d). Viz утвер- утверждения 7.3.4 следует, что число образующих группы C(d) равно ф(</) = \Sd\. Так как Sdn Sd> = 0 для dф d\ то \jSd =C(n) или d\n d\n
8.7. Функция Эйлера 237 • Теорема 8.7.1 Эйлера. хф^ = 1 (mod т), где т > 0 и (х, т) = 1. Доказательство. Приведенная система вычетов Мп по модулю т является группой, порядок которой \Мп\ = ц>(т). Пусть х — про- произвольное такое, что (х, т) = 1 и x = r(mod m), где re Mn. Из свойств сравнений следует, что наибольший общий делитель (г, т) = 1. Теорема 7.3.1 Лагранжа утверждает, что порядок эле- элемента группы кратен порядку этой группы. Пусть к — порядок элемента г, т.е. г = 1 (mod т). Отсюда ф(т) = к- d, где d — поло- положительное целое. Тогда ^т) = /J = 1 (mod т). Из х = г (mod m) следует, что хф(/п) = ^(т) (mod т), а значит, и хф("° = 1 (mod /и). • Теорема 8.7.2 Ферма. xF = x (modр), где ^ — простое число; х — произвольное целое положительное число. Доказательство. Пусть х = 0 (mod ;?), тогда и/^0 (mod p). Пусть теперь x = r (mod /?), где re {1, 2,...,р- 1} и, значит, (г,/?) = 1. Из теоремы Эйлера следует, что хф(р) = 1 (mod p), где ф(р) =/> - 1. Отсюда хГ1 = 1 (mod р) и л^ = 1 (mod ^). • Теорема 8.7.3 Вильсона, (р - 1)! + 1 = 0 (mod p), где /? — простое число. Доказательство. Пусть Мп = {1,2,...,р-1} — приведенная сис- система вычетов по модулю р. Мк является группой. Для любого х е {\, 2,..., р-1} существует единственный обратный элемент у е {1, 2,..., р - 1} такой, что х • у = 1 (mod/?). Заметим, чтох • х = 1 (mod/?) выполняется только для двух эле- элементов: jc=1 n х=р - I. Действительно х2 - 1 = (х- 1)(х + 1) = = 0 (mod/?) равносильно* - 1=0 (mod/?) илих + 1=0 (mod/?). От- Отсюда jc = 1 илих = /? - 1. Таким образом, обратными элементами к себе являются только х=1 пх=р-1. Для любого из оставшихся элементов группых е {2, 3,...,/? - 2} существует единственный обратный у е {2, 3,..., /? - 2} такой, что ху = 1 (modр) кхФу. Тогда верно 2 • 3 •...• (/? - 1) = 1 (mod/?). Ум- Умножив последнее сравнение на 1 • (/? - 1), получим 1 • 2 •...• (/? - 1) = = (/?- 1)! = -1 (mod/?) или (р- 1)! + 1 =0 (mod/?). Задана. Пусть/? — простое и h{, h2,..., hn — целые числа. Дока- Доказать, что (h{ +Л2+...+Л„ У sAf +й? +...+Л? (mod/?).
238 Глава 8. Элементы теории чисел Решение. Согласно теореме Ферма (8.7.2), hf =A,(mod/?), / = l,/i. Свойства операции сравнения (см. п.8.4) позволяют запи- записать данные п сравнений hf =hi(modp) в виде их суммы: Н +h[+---+K =h{+h2 +...+ hn (mod/?). С другой стороны, верно и (h{ + h2 + ... + hnY s hx + h2 + ... + hn (mod p), что непосредственно вытекает из теоремы Ферма. 8.8. Функция Мёбиуса. Формула обращения Мёбиуса • Определение. Функция Мёбиуса ц(л) определяется для всех це- целых положительных п и равна 1, если /i = l, О, если п =р*[р2 2 ---Р^к и За/ >1, (-1)*, если п = р1р2...рк, где п = р*1 р%2.. .р^к — разложение на простые сомножители, Pi — простые числа, а, — кратность pt в разложении. Пример. |i(l) = 1, цB)—1, цC) = -1, цD) = 0, цE)=-1, цF) = 1, = -1, ,а(8) = 0, ц(9) = 0, fiA0) = l, ц(И) = -1, цA2)=0, 1, цA5) = 1, цA6)=0, цA7) = -1, цA8)=0, цB0) = 0, цB1) = 1 , цB2) = 1, цB3) = -1. . Лемма 8.8.1. У>(L? ! ^;HV [1, если л = 1, где суммирование идет по всем делителям d числа л. Доказательство. Если /i = 1, то ^]ц(^)=цA)=1. Пусть теперь d\l п =Р?1 Р2 2 • • -jP^ * 1 — разложение на простые сомножители. Тог- Тогда En(rf) = 2^(rf) = ^Crk(-iy =a-l)* =0- Все делители </, для г=0 которых ц(^/)^0, имеют вид р^р^.^р^и ^{piipi2...pir )=(~1)г. Количество таких делителей рх рь равно числу сочетаний Crk. Количество таких делителей рх р^.. .pir, выбираемых из рь рг,...,
8.8. Функция Мёбиуса. Формула обращения Мёбиуса 239 • Теорема 8,8.1. Формула обращения Мёбиуса: если f(n) = ^g(d\ то g(n) = 2>(<0/(?), где /(л), g(ny— функции, определенные для всех целых поло- положительных п. Доказательство. Выполним подстановку /(^) в сумме ]]^ ] ^, • Заметим, что здесь число п неявно d\n d\n | J рассматривается в виде произведения п = d • 5 • г, где делители d и 5 принимают все допустимые значения независимо друг от друга и порядок суммирования не влияет на значение суммы, т.е. W4 l |, где Ь\п это вследствие леммы 8.8.1. Тогда Задача. Установить связь функций Эйлера ф(л) и Мёбиуса ц(л). Решение. ^\x(d) =п — свойство 4 функции Эйлера (см. п.8.7). d/n К данной сумме применим формулу обращения Мёбиуса: и, наконец, ^l^^ d\n d\n d\n Например, для п = 6 имеем фF) = 2, все делители d е {1, 2, 3, 6}, = 1, цB) = -1, |ыC) = -1, |дF) = 1 и, наконец, выражение ^p- = YJ^P~ в этом случае примет вид |=| + ^-+ ^- +i. d\n Пусть п =р*1Р22 •--Pakk — разложение на простые множители. k ( i \ Так как ф(а2)=л-^ 1 — свойство 3 функции Эйлера (см. /=1V Pi) /=1V Pi J d/n /=1V Pi J d/n
Задачи и упражнения Комбинаторные схемы 1. Доказать комбинаторными рассуждениями (т.е. используя только определение числа сочетаний) тождества: 1 и\ рп-\ _/~т г^п в) С2я -С2л-1 + С2л-2 1 / Si+m+1 ~ ^п+т + ил+ 2. Доказать тождества: б) к=0 к=0 д) ±(-\)кСкп =0. 3. Доказать тождество ? ? S •••Z Z /„=1 /и_1=1 /Л_2=1 /2=1 l^llo^l п Qk\ п Q 2 4. Доказать, что У п~1 = , п > 1. . ^ Bл)! (Зл)! (л2)! Bл)! 5. Доказать, что следующие числа: ^ У , , , 2" 2пЪп пп л|! являются целыми. 6. Доказать формулу бинома Ньютона {а + Ь)п = ^СкакЬп~к к=0 7. Найти число подмножеств множества М = {аь а2,..., ап). 8. Доказать, что ?СЯ2* =XC^+1 =s2li- к к
Задачи и упражнения 241 к п 9. Доказать, что ^С^С^ г =С„+т и ^(Сл ) =CJ, (теорема сложе- ния). 10. 11. 12. Доказать Доказать Доказать равенство равенство равенство п п—к У УС к=0г=0 п п ^ _ Та _к=Ъ\ 2я+1-1 «+1 * 13. Найти сумму Мк2 -1+ — 1-С*. *=ov &+1J 14. Доказать тождество У '- = кп, где суммирование рас- *~ипх\п1\...пк\ пространяется на все упорядоченные разбиения п на А: слагаемых: п = пх + п2 + ... + пк, п > 0 — целые числа. 15. Из города А в город В ведут семь дорог, а из города /? в город С — тридороги. Сколько возможных маршрутов ведут из А в Сче- рез город В? 16. Сколькими способами число 11Л можно представить в виде трех сомножителей (представления, отличающиеся порядком со- сомножителей, считаются различными; 11° — сомножитель)? 17. Сколькими способами можно указать на шахматной доске 2п х 2п два квадрата — белый и черный? 18. Сколькими способами можно указать на шахматной доске 2л х 2п белый и черный квадраты, не лежащие на одной горизон- горизонтали и вертикали? 19. Какое количество матриц можно составить из п строк и т столбцов с элементами из множества {0,1}? 20. Сколькими способами можно составить трехцветный флаг, если имеется материал 5 различных цветов? Та же задача, если одна из полос должна быть красной. 21. Надо послать 6 срочных писем. Сколькими способами это можно сделать, если любое письмо можно передать с любым из 3 курьеров? 22. У одного студента 7 книг, у другого 9 различных книг. Сколь- Сколькими способами они могут обменять одну книгу одного на одну книгу другого?
242 Задачи и упражнения 23. Сколько различных словарей надо издать, чтобы можно было переводить с любого из данных п языков на любой другой язык этого же множества? 24. В правление избрано т человек. Из них надо выбрать предсе- председателя, заместителя председателя, секретаря и казначея. Сколь- Сколькими способами можно это сделать? 25. У мамы 5 яблок, 7 груш и 3 апельсина. Каждый день в течение 15 дней подряд она выдает сыну по одному фрукту. Сколькими способами это может быть сделано? 26. У мамы т яблок и п груш. Каждый день в течение п + т дней подряд она выдает сыну по одному фрукту. Сколькими способа- способами это может быть сделано? 27. Найти число векторов а = (а{, аъ..., ап), координаты которых п удовлетворяют условию я, = {0, 1}, /= 1, 2,..., п, ^Гя,- =г. /=i 28. У англичан принято давать детям несколько имен. Сколькими способами можно назвать ребенка, если ему дают не более трех имен, а общее число имен равно ml 29. Сколькими способами можно расставить белые фигуры: 2 коня, 2 слона, 2 ладьи, ферзя и короля на первой линии шахмат- шахматной доски? 30. Сколькими способами можно расставить к ладей на шахмат- шахматной доске размером пх т так, чтобы они не угрожали друг другу, т. е. так, чтобы никакие две из них не стояли на одной вертикали или горизонтали? 31. Сколькими способами можно посадить п мужчин и п женщин за круглый стол так, чтобы никакие два лица одного пола не сиде- сидели рядом? Та же задача, но стол может вращаться и способы, переходя- переходящие при вращении друг в друга, считаются одинаковыми. 32. На школьном вечере присутствуют 12 девушек и 15 юношей. Сколькими способами можно выбрать из них 4 пары? 33. Пусть п (п>2) человек садятся за круглый вращающийся стол. Два размещения будем считать совпадающими, если каж- каждый человек имеет одних и тех же соседей в обоих случаях. Сколь- Сколько существует способов сесть за стол? 34. Хор состоит из 10 участников/Сколькими способами можно в течение трех дней выбирать по 6 участников, так, чтобы каждый день были различные составы хора?
Задачи и упражнения 243 35. Сколькими способами можно распределить Ъп различных предметов между тремя людьми так, чтобы каждый получил п предметов? 36. Имеется п абонентов. Сколькими способами можно одновре- одновременно соединить три пары? 37. Сколькими способами можно составить три пары из п шахма- шахматистов? 38. Рассматриваются всевозможные разбиения 2л элементов на пары, причем разбиения, отличающиеся друг от друга порядком элементов внутри пар и порядком расположения пар, считаются совпадающими. Определить число таких разбиений. 39. Доказать, что нечетное число предметов можно выбрать из п предметов 2п~1 способами. 40. Сколькими способами можно посадить рядом 3 англичан, 3 французов и 3 немцев так, чтобы никакие три соотечественника не сидели рядом? 41. В колоде 52 карты. В скольких случаях при выборе из колоды 10 карт среди них окажутся: а) ровно один туз; б) хотя бы один туз; в) не менее двух тузов; г) ровно два туза? 42. Сколькими способами можно выбрать 6 карт из колоды, со- содержащей 52 карты, так, чтобы среди них были карты каждой ма- масти? 43. На железнодорожной станции имеется т светофоров. Сколь- Сколько может быть дано различных сигналов, если каждый светофор имеет три состояния: красный, желтый и зеленый? 44. Имеется 17 пар различных предметов. Найти полное число выборок из этих предметов. Каждая пара может участвовать в вы- выборке, предоставляя любой из двух ее элементов, или не участво- участвовать. Выборки считаются различными, если отличаются друг от друга своим составом; порядок предметов в выборке не учитыва- учитывается. 45. Найти число способов раскладки п различных шаров по т раз- различным корзинам. 46. Найти число способов раскладки п одинаковых шаров по т различным корзинам. 47. Сколькими способами можно разместить п одинаковых ша- шаров по т различным корзинам при следующих условиях: а) пустых корзин нет; б) во второй корзине к шаров; в) в первых к корзинах соответственно а{, а2,..<> ак шаров?
244 Задачи и упражнения 48. Сколькими способами можно разместить пх красных, п2 жел- желтых и л3 зеленых шаров по т различным урнам? 49. Сколькими способами 3 человека могут разделить между со- собой 6 одинаковых яблок, 1 апельсин, 1 сливу, 1 лимон, 1 грушу, 1 айву и 1 финик? 50. Поезду, в котором находится п пассажиров, предстоит сделать т остановок. Сколькими способами могут распределиться пасса- пассажиры между этими остановками? 51. Сколькими способами можно раскрасить квадрат, разделен- разделенный на четыре части, пятью цветами: а) допуская окрашивание разных частей в один цвет; б) если различные части окрашиваются разными цветами? 52. Сколькими способами можно выбрать 5 номеров из 36? 53. В скольких случаях при игре в «Спортлото» (угадывание 5 но- номеров из 36) будут правильно выбраны: а) ровно 3 номера; б) не менее 3 номеров? 54. Сколько существует различных комбинаций из 30 монет до- достоинством 1,2 и 5 рублей {построить дерево решений, см.п. 2.2.2I 55. Сколькими способами можно раскрасить квадрат, разделен- разделенный на девять частей, четырьмя цветами таким образом, чтобы в первый цвет были окрашены 3 части, во второй — 2, в третий — 3, в четвертый — 1 часть? 56. Определить коэффициент с в одночлене сх\х\х] после разло- разложения выражения (х{ +х2 + х3I0 и приведения подобных членов. 57. Сколько делителей имеет число q = р*1 р%2.../?"", где рг — про- простые числа, не равные единице, а,- — некоторые натуральные чис- числа? Чему равна сумма этих делителей? 58. Доказать, что в разложении числа п\ на простые сомножители простое число р входит с показателем ^ = ~т + -т + Л +• • • • 59. Из выбранных к различных чисел от 1 до п составляют произ- произведение, к фиксировано. Какое количество полученных таким образом произведений делится на простое число р < nl 60. Сколько можно составить перестановок из п элементов, в ко- которых данные т элементов не стоят рядом в любом порядке? 61. На шахматную доску п х п произвольным образом поставили две ладьи — черную и белую. Что вероятнее: ладьи бьют друг друга или нет?
Задачи и упражнения 245 62. Доказать, что из пяти грибов, растущих в лесу и не располо- расположенных на одной прямой, всегда можно найти четыре таких, ко- которые служат вершинами выпуклого четырехугольника. 63. В розыгрыше первенства мира по футболу участвуют 20 команд. Какое наименьшее число игр должно быть сыграно, чтобы среди любых трех команд нашлись две, уже игравшие между собой? 64. Некая комиссия собиралась 40 раз. Каждый раз на заседаниях присутствовали по 10 человек, причем никакие двое из ее членов не были на заседаниях вместе больше одного раза. Доказать, что число членов комиссии больше 60. 65. В некотором учреждении 25 сотрудников. Доказать, что из них нельзя составить больше 30 комиссий по 5 человек в каждой так, чтобы никакие две комиссии не имели более одного общего члена. 66. В соревнованиях по гимнастике две команды имели одинако- одинаковое число участников. В итоге, общая сумма баллов, полученных всеми участниками, равна 156. Сколько было участников, если каждый из них получил оценки только 8 или 9 баллов? 67. Группа из 41 студента успешно сдала сессию из трех экзаме- экзаменов. Возможные оценки: 5,4,3. Доказать, что, по крайней мере, пять студентов сдали сессию с одинаковыми оценками. 68. Поступающий в высшее учебное заведение должен сдать че- четыре экзамена. Он полагает, что для поступления будет достаточ- достаточно набрать 17 баллов. Сколькими способами он сможет сдать эк- экзамены, набрав не менее 17 баллов и не получив ни одной двойки (построить дерево решений, см.п.2.2.2I 69. Каких чисел больше среди первого миллиона: тех, в записи которых встречается 1, или тех, в записи которых ее нет? 70. Пусть числа 1, 2,..., п расположены подряд по кругу. Двигаясь по кругу, вычеркиваем каждое второе число. Показать, что по- последнее не вычеркнутое число равно 2л-211о§2/|1+1 +L 71. Сколькими способами можно число п представить в виде сум- суммы к слагаемых (представления, отличающиеся лишь порядком слагаемых, считаются различными), если: а) каждое слагаемое является целым неотрицательным числом; б) каждое слагаемое — натуральное число? 72. Какова таблица инверсий для перестановки 271845936? 73. Какой перестановке соответствует таблица инверсий 50121200? 74. Пусть перестановке а{а2...ап соответствует таблица инверсий d{d2...dn. Какой перестановке тогда будет соответствовать следую- следующая таблица инверсий (п - 1 - d{){n - 2 - rf2)...@ - dn)?
246 Задачи и упражнения 75. На окружности произвольным образом отмечают п точек бук- буквой Nn m точек буквой М. На каждой из дуг, на которые окруж- окружность делится выбранными точками, ставят числа 2 или 1/2 сле- следующим образом: если концы дуги отмечены буквой N, то ставят число 2; если концы дуги отмечены буквой М, то ставят число 1/2; если же концы дуги отмечены различными буквами, то ставят число 1. Доказать, что произведение всех поставленных чисел равно 2п'т. 76. Сколькими способами можно распределить Ъп различных книг между тремя лицами так, чтобы числа книг образовывали арифметическую прогрессию? 77. Рассматриваются всевозможные разбиения пк элементов на п групп по к элементов в каждой, причем разбиения, отличающие- отличающиеся друг от друга только порядком элементов внутри групп и по- порядком расположения групп, считаются совпадающими. Сколь- Сколько существует различных таких разбиений? 78. Сколькими способами можно разбить 30 рабочих на 3 брига- бригады по 10 человек в каждой бригаде? На 10 групп по 3 человека в каждой группе? 79. Сколькими способами можно разделить колоду из 36 карт по- пополам так, чтобы в каждой пачке было по два туза? 80. Сколькими способами можно разложить 10 книг в 5 бандеро- бандеролей по 2 книги в каждую (порядок бандеролей не принимается во внимание)? 81. Сколькими способами можно разложить 9 книг в 4 бандероли по 2 книги и в 1 бандероль 1 книгу (порядок бандеролей не при- принимается во внимание)? 82. Сколькими способами можно разделить 9 книг в 3 бандероли по 3 книги в каждую (порядок бандеролей не принимается во внимание)? 83. На первые две линии шахматной доски выставляют белые и черные фигуры (по два коня, два слона, две ладьи, ферзя и короля каждого цвета). Сколькими способами можно это сделать? 84. Сколькими способами можно расположить в 9 лузах 7 белых шаров и 2 черных шара? Часть луз может быть пустой, и лузы счи- считаются различными. 85. В лифт сели 8 человек. Сколькими способами они могут вый- выйти на четырех этажах так, чтобы на каждом этаже вышел, по край- крайней мере, один человек?
Задачи и упражнения 247 86. Доказать, что число упорядоченных разбиений числа п на к натуральных слагаемых, т. е. число решений уравнения п = х{ + + х2 + ... + хк, X} > О, / = 1, 2,..., к, равно C$Z\» a общее число упоря- упорядоченных разбиений для различных к равно 2я. 87. Сколькими способами можно разложить л различных шаров по к различным корзинам так, чтобы в первую корзину попало п{ шаров, во вторую корзину попало п2 шаров и т.д., в к-ю корзину попало пк шаров, где п = п{ + п2 +... + пк1 88. Сколько существует чисел от 0 до 10", которые не содержат две идущие друг за другом одинаковые цифры? 89. Сколько существует натуральных л-значных чисел, у которых цифры расположены в неубывающем порядке? 90. Сколько существует натуральных чисел, не превышающих 10", у которых цифры расположены в неубывающем порядке? 91. Сколькими способами можно расставить л нулей и к единиц так, чтобы никакие две единицы не стояли рядом? 92. Город имеет вид прямоугольника, разделенного улицами на квадраты. Число таких улиц в направлении с севера на юг равно л, а в направлении с востока на запад — к. Сколько имеется крат- кратчайших дорог от одной из вершин прямоугольника до противопо- противоположной? 93. Как разбить квадратное поле на участки так, чтобы высеять на нем т сортов пшеницы для сравнения урожайности этих сортов, исключающего влияние изменения плодородия в пределах участ- участка? Считаем, что плодородие убывает при удалении от одной сто- стороны поля (неизвестно, какой именно) к противоположной. 94. Бросают т игральных костей, помеченных числами 1,2,3,4, 5,6. Сколько может получиться различных результатов (результа- (результаты, отличающиеся порядком очков, считаются одинаковыми)? 95. Имеем т различных шаров и к различных корзин. Сколькими способами можно разместить предметы по корзинам, допускают- допускаются пустые корзины? 96. Имеем т различных шаров и & различных корзин. Сколькими способами можно разместить предметы по корзинам, пустые корзины не допускаются? Указание: воспользоваться правилом включения и исключения. 97. Найти число способов разложения т шаров по к корзинам так, чтобы г корзин остались пустыми. Указание: воспользоваться правилом включения и исключения.
248 Задачи и упражнения 98. Имеем т различных шаров аь а2,..., ат и столько же различных корзин кь к2,..., кт. Сколькими способами можно разместить предметы по корзинам так, чтобы никакой предмет я, не попал в корзину kj (допускаются пустые корзины)? Указание: воспользова- воспользоваться правилом включения и исключения. 99. Задача о беспорядках. Имеем т различных шаров а{, а2,..., ат и столько же различных корзин кь к2,..., кт. Сколькими способами можно разместить предметы по корзинам так, чтобы никакой предмет ах не попал в корзину kh пустые корзины не допускают- допускаются? Указание: воспользоваться правилом включения и исключения. 100. Найти число перестановок т шаров, в которых ровно г эле- элементов остаются на месте. Указание: воспользоваться правилом включения и исключения. 101. Доказать, что г различных вещей можно разделить между п +р людьми так, чтобы данные п людей получили, по крайней мере, по одному предмету, способами Cf}(n+p)r -Cl{n + p-\)r + +С];{п + р-2)г-...+{-1)пС„{п+р-п)г. Указание: воспользоваться правилом включения и исключения. 102. Рыцарские переговоры. К обеду за круглым столом приглаше- приглашены п пар враждующих рыцарей, п > 2. Требуется рассадить их так, чтобы никакие два врага не сидели рядом. Показать, что это мож- можно сделать ]Г(-1)*С*2*Bn-k)lспособами. Указание: воспользова- к=0 ться правилом включения и исключения. 103. Найти число целых положительных чисел, не превосходя- превосходящих 1000 и не делящихся ни на одно из чисел 3, 5 и 7. 104. Найти число целых положительных чисел, не превосходя- превосходящих 1000 и не делящихся ни на одно из чисел 6, 10 и 15. 105. Показать, что если п = 30т, то число целых, не превосходя- превосходящих л и не делящихся ни на одно из чисел 6, 10, 15, равно 22т. 106. При обследовании читательских вкусов студентов оказалось, что 60% студентов читают журнал А, 50% —журнал В, 50% —жур- —журнал С, 30% — журналы А и В, 20% — журналы В и С, 40% — жур- журнал Аи С, 10% — журналы А, В и С. Сколько процентов студентов а) не читают ни одного из журналов; б) читают в точности два журнала; в) читают не менее двух журналов? 107. На одной из кафедр университета работают тринадцать чело- человек, причем каждый из них знает хотя бы один иностранный язык. Десять человек знают английский, семеро — немецкий, ше-
Задачи и упражнения 249 стеро — французский. Пятеро знают английский и немецкий, четверо — английский и французский, трое — немецкий и фран- французский. Найти: а) сколько человек знают все три языка; б) сколь- сколько знают ровно два языка; в) сколько знают только английский? 108. Имеются Зл + 1 предметов (л одинаковых, остальные различ- различны). Доказать, что из них можно извлечь л предметов 22п способами. 109. Применяя формулу включения и исключения, определить количество целочисленных решений системы уравнений и нера- неравенств: х{ + х2 + ... + хп = г, at < Xj < bh i = 1,л, ah xh bt — целые числа. ПО. Определить количество целочисленных решений системы х{ + х2 + х3 = 40, хх > 3, х2 > 0, хъ > 2. 111. Компания, состоящая из 10 супружеских пар, разбивается на 5 групп по 4 человека для лодочной прогулки. Сколькими спосо- способами можно разбить их так, чтобы в каждой лодке оказались двое мужчин и две женщины? 112. Имеем л предметов, расположенных в ряд. Сколькими спо- способами можно выбрать из них три предмета так, чтобы не брать никаких двух соседних элементов? 113. Даны 2л различных предметов аь аъ аъ а2>-> аю ап- Сколько существует перестановок из этих 2л предметов, в которых не сто- стоят рядом одинаковые элементы? 114. В шахматной олимпиаде участвуют представители п стран по 4 представителя от каждой страны. Сколькими способами они могут встать в ряд так, чтобы рядом с каждым был представитель той же страны? 115. Имеется п одинаковых вещей и еще п различных вещей. Ско- Сколькими способами можно выбрать из них п вещей? Сколькими способами можно упорядочить все 2л вещей? 116. Найти число способов распределения 2л одинаковых шаров по двум неразличимым корзинам. 117. В каждой клетке шахматной доски размером пх п поставили число, указывающее количество прямоугольников, в которые входит эта клетка. Чему равна сумма всех поставленных чисел? 118. Найти число расстановок владей так, чтобы они не били друг друга, на доске пх п (см. случаи а, б, в) с выколотыми или добав- добавленными клетками. В случае в) использовать л ладей. б)
250 Задачи и упражнения Производящие функции и рекуррентные соотношения 119. Найти производящую функцию последовательности {2(л-5) + 7Л+2}. 120. Применить технику производящих функций для нахождения суммы чисел I3 + 23 +... + л3. 121. Решить рекуррентные соотношения: !) ип+2 - 4un+i + 3w/i = о, wo = 8> ui =10; 2) и„;3 - ЗиЛ+2 + ипЛ - Ъип = О, щ = 1, i/x = 3,u2 = 8; 3) иЛ+2±9мЛ = 0, wo=l, «! = 0; 4) «Л+4 ± 4"л = 0, w0 = 1, «i = 1, и2 = I, щ = 1; 5) «л+з + «л+2 - И/н-i - «л = °5 "о = 1.  = 2, w2 = 3; 6) и„+2 - 4н„+1 + 4«„ = 0, w0 = 1, wx = 2. 122. Решить неоднородные рекуррентные соотношения: 2) wm-2 = -2ww+1 + 8W,, + 27 • 5л, w0 = 0, щ = - 9; 3) wn+2 - 3w,,+1 + 2ил = п,щ = 1, их = 1; 4) и„+2 - 4и„+1 + 4w^ = 2я, и0 = 1, «1 = 2; 5) и„+2 = w^+1 - -w,, + 2'п, ио=1,и{ = 3/2; 6) и„+2 - 3w^+1 + 2ип = (-1)л, «о =1,1/! = 2. 123. Последовательность Фибоначчи {м„} задается рекуррентным соотношением ил+2 = ип+[ + ип, щ = 1, wx = 1. Найти н„; показать, что ип и w^+1 — взаимно простые числа и ил делится на ит, где л = т - к. 124. Найти общее решение рекуррентных соотношений: 2) и„+2 - 4ил+1 + Зип = 0; 3) "л+2 - ww+1 - ип = 0. 125. Найти решение системы рекуррентных соотношений: 126. Найти число решений уравнения х + 2у = п, где х, у, п е Z+ — положительные целые числа; х, у — неизвестные. 127. Найти число решений уравнения x+2y + 4z = n,x,y,ne Z+, х, у, z — неизвестные.
Задачи и упражнения 251 128. Найти определитель матрицы 1 а + р ар 1 а + р ар 1 а + р ар 1 a+pj где а, р — произвольные числа; вне обозначенных диагоналей матрицы располагаются нули. 129. Вычислить сумму ]ГA/2*), где суммирование производится по всем натуральным к, не кратным 2, 3 и 5. 130. Найти ладейный многочлен запрещенных позиций для до- досок а) и Ь) и для каждого из этих случаев составить многочлен по- попаданий. Для доски с) составить многочлен запрещенных пози- позиций. Для досок а), Ь) и с) найти число расстановок трех ладей на запрещенных позициях. с к а) Ь) d) 131. Найти число способов расставить 5 ладей на доске 5x5 так, чтобы ни одну из них не бил слон. Позиция слона указана на до- доске d) символом «с». 132. Найти число способов расставить 5 ладей на доске 5x5 так, чтобы ни одну из них не бил конь. Позиция коня указана на доске d) символом «к». 133. Найти число замкнутых маршрутов длины 2п по ребрам гра- графа для случаев а), Ь) и с). Длина ребра равна 1. Начало и конец пути есть вершина А. А а)
252 Задачи и упражнения 134. Найти число замкнутых маршрутов длины п по а) сторонам треугольника и б) ребрам тетраэдра. Длины сторон треугольника и ребра тетраэдра равны 1. Начало и конец пути есть любая из вершин рассматриваемой геометрической фигуры. 135. На листе бумаги нанесена ортогональная сетка. Сколько раз- различных л-звенных ломаных можно провести по линиям сетки, если ломаная может проходить один и тот же отрезок несколько раз? Указание: построить дерево решений, см.п.2.2.2. 136. На листе бумаги нанесена ортогональная сетка. Сколько раз- различных 2л-звенных замкнутых ломаных можно провести по ли- линиям сетки, если ломаная может проходить один и тот же отрезок несколько раз? 137. Маршрут выполняется по оси ОХ. Исходное расположе- расположение — начало координат. Начальное направление движения вы- выбирается в любую из сторон оси. В каждой целочисленной коор- координате оси ОХ направление движения можно менять. Определить количество таких замкнутых маршрутов длины 2л. Теория графов и приложения 138. Покажите, что [п2/4] — максимальное число ребер, которое может иметь «-вершинный граф без треугольников. 139. Доказать по индукции, что для плоского графа /справедливо неравенство %(Г) < 5. 140. Показать, что в любом графе выполняется условие2| U\ = ^d(x). хеХ 141. Показать, что в любом графе число вершин с нечетными сте- степенями четно. 142. Показать, что в любом графе найдутся две вершины с одина- одинаковыми степенями. 143. Может ли полный граф иметь 7,8,9 или 10 ребер? 144. Показать, что связный граф с п вершинами содержит не ме- менее чем п - 1 ребро. 145. Пусть d — минимальная из степеней графа с п вершинами. Показать, что если d>^, то граф связный. 146. Показать, что в любом графе с п вершинами и ребрами не ме- менее C^_j +2 существует гамильтонов цикл. 147. Доказать, что всякий замкнутый маршрут нечетной длины содержит простой цикл. Верно ли аналогичное утверждение для маршрутов четной длины?
Задачи и упражнения 253 148. Показать, что для графа Г с п вершинами выполняется Р(Г)х(Г) > л, где р(Г) — максимальное число независимых вер- вершин в графе. 149. Дана симметричная матрица размером л х л, в каждой строке которой располагается нечетное число ненулевых элементов. По- Показать, что л является четным. Диагональные элементы матрицы равны нулю. 150. Показать, что если в графе с вершинами отсутствуют циклы нечетной длины и число ребер превышает ((л- 1)/2) , то граф связный. 151. Пусть / — длина самой длинной простой цепи в графе Г. По- Показать, что %(Г) > /+ 1. 152. Пусть d — максимальная степень вершины в графе Г. Пока- Показать, что %(Г) >d+l. 153. Сколько существует простых графов с 2л вершинами и л реб- ребрами, компоненты связности которых являются изолированны- изолированными ребрами? 154. Показать, что число различных совершенных паросочетаний (максимальных) в полном графе с 2л вершинами равно (^Д. 155. Показать, что в полном графе с л вершинами имеется (л - 1)!/2 различных гамильтоновых циклов. 156. Показать, что полный граф с 2л + 1 вершинами можно пред- представить в виде объединения л гамильтоновых циклов. 157. Показать, что граф с л вершинами и числом ребер больше ((л - 1)(л - 2))/2 является связным. 158. Имеется л лиц, каждые двое имеют точно одного знакомого. Показать, что в графе знакомств найдется хотя бы один подграф вида треугольника и не найдется ни одного подграфа вида прямо- прямоугольника. 159. Определить хроматическое число полного л-вершинного графа. 160. Определить хроматическое число связного однородного гра- графа степени 2 с л вершинами (однородный граф обозначает, что степени всех вершин одинаковые). 161. Определить хроматическое число графа, полученного из полного л-вершинного графа удалением: а) одного ребра; б) двух ребер; в) трех ребер, составляющих треугольник. 162. Найти хроматическое число л-вершинного линейного дере- дерева, л > 1.
254 Задачи и упражнения 163. Найти хроматическое число л-вершинного дерева, п > 1. 164. Доказать, что в компании из 6 человек всегда найдутся либо трое знакомых друг с другом, либо трое друг с другом не знако- знакомых. 165. Доказать, что при любой раскраске ребер полного 6—графа в два цвета найдется монохроматический 3—граф. 166. Рассмотрим граф Мп Муна—Мозера с Ъп вершинами {1,2,..., Зл}, в котором вершины разбиты на триады {1, 2, 3}, {4, 5, 6}, ...,{3л - 2, 3/1 - 1, З/i}; Мп не имеет ребер внутри любой триады, но вне их каждая вершина связана с каждой из остальных. Докажите (по индукции), что Мп имеет Зп клик. 167. Показать, что в графе с п вершинами и с к компонентами связности число ребер не более ((п - к)(п -к + 1))/2. 168. Докажите, что если в графе все вершины имеют четные сте- степени, то в этом графе нет мостов. Указание: допустить, что суще- существует мост; удалить это ребро-мост и показать, что полученный граф будет противоречить условию задачи. 169. Разобьем плоскость на конечное число частей прямыми ли- линиями. Докажите, что полученная карта имеет хроматическое число равное двум. Указание: для доказательства воспользуйтесь индукцией по числу прямых. 170. Для каждого графа а) и б) найти остовное дерево, используя программную реализацию жадного алгоритма (алгоритм 6.7) и алгоритма ближайшего соседа (алгоритм 6.9). На каждом шаге ал- алгоритмов отобразить состояние используемых структур данных. xl х2 хб п/ / \ 22\ л 16 ч / \ю х7\ / / / \ 17\ 14 19 \ V \ / / х4 19 хЗ\ / 21 11 6) 171. Найти кратчайшие пути от вершины Xq до всех остальных вершин ориентированного графа (см. рис. на следующей страни- странице).
Задачи и упражнения 255 172. Пусть Ак =[а^\ i,j= l,/i обозначает к-ю степень матрицы смежности орграфа. Доказать, что элемент а\к) данной матрицы равен количеству маршрутов длины к из вершины х, в Xj. Указание: при доказательстве воспользоваться индукцией по числу к. 173. Выполнить хроматическое разложение графа. Найти все клики, фундаментальное множество циклов, листы, блоки и мос- мосты. Определить центры, радиус и диаметр графа. 174. Сколь много ребер может иметь л-вершинный граф, у кото- которого степень всякой вершины не превосходит (Р. 175. Показать, что в дереве с нечетным диаметром любые две про- простые цепи наибольшей длины имеют хотя бы одно общее ребро. 176. Пусть корневое дерево с п (п > 2) висячими вершинами не имеет вершин степени 2, отличных от корня. Показать, что общее число вершин дерева не превосходит 2п-\. 177. Доказать, что дерево обладает единственным центром в слу- случае, когда его диаметр есть число четное, и обладает двумя цент- центрами, когда диаметр есть нечетное число. 178. Доказать, что в любом дереве с п > 2 вершинами имеется не менее двух висячих вершин. 179. Вершины графа Г пронумерованы в порядке возрастания их степеней. Доказать, что если к — наибольшее число, такое, что к < d(xk) + 1, то %(Г) < к, где d(xk) — степень вершины хк. 180. Доказать, что если для любых двух вершин х и у связного л-вершинного графа выполняется d(x) + d{y) > n, то граф имеет гамильтонов цикл.
256 Задачи и упражнения 181. Используя алгоритм чередующихся цепей (см. п.6.14.3), рас- расширить заданное начальное паросочетание в двудольном графе Г= (Vx u V2, U, Ф) до максимального паросочетания, где Vx = {s{, s2i s3, s4, s5, s6} и V2 = {1, 2, 3, 4, 5, 6}, смежные вершины в графе: s{ - {1, 2, 3}, s2 - {1, 2}, 53 - {1, 2}, *4 - {1, 2, 3, 4}, *5 - {1, 2, 4, 5}, s6 — {I, 2, 3, 5, 6} и начальное паросочетание тг = {(jj, 1), (^2> 2), E4, 3), E5з 4), (^6, 5)}. 182. Используя алгоритм чередующихся цепей (см. п.6.14.3), рас- расширить заданное начальное паросочетание в двудольном графе Г=(У{и V2, U, Ф) до максимального паросочетания, где V{ = {s{, s2, s3, s4, s5, s6, s7} и V2 = {1, 2, 3,4, 5, 6, 7}; смежные вершины в гра- графе: s{ - {1, 2}, *2 - {2, 5, 6}, *3 - {5}, *4 - {1, 2, 5}, *5 - {3, 4, 5, 6}, ^6 — {4, 5, 7}, s7 — {5, 6}, и начальное паросочетание п = {(s{, 1), Су2, 2), С?3, 5), (s5, 3), (s6, 7), (j7, 6)}. 183. Перераспределить заданный начальный поток по транспорт- транспортной сети а),б)пв) так, чтобы он стал максимальным, а сеть — на- сыщенной(см. п.6.10). Найти все разрезы транспортной сети и их мощности, сравнить мощность минимального разреза с найден- найденным максимальным потоком.
Задачи и упражнения 257 184. Решить задачи о назначениях максимального выбора а) б) 2 8 1 8 9 12 10 7 17 2 9 б 7 5 7 11 9 15 1 18 11 14 4 2 3 1 1 9 11 14 16 8 б 7 4 4 2 3 4 Г2 8 16 3 1 1 3 3 0 3 5 9 6 15 5 10 2 5 3 1 б 7 185. Решить задачи о назначениях минимального выбора а) 4 13 9 12 б 10 9 10 9 14 16 12 7 14 13 10 б) 9 38 28 58 30 20 71 13 34 3 60 69 80 13 53 15 49 28 37 20 21 60 34 25 21 в) 44 22 28 49 27 70 74 28 39 53 37 27 35 42 54 45 30 21 49 59 47 50 18 32 30 83 35 43 30 _31 45 41 24 38 22 9 О—9AQ7
258 Задачи и упражнения 186. Фирма по перевозке грузов должна забрать пять контейнеров в пунктах района края А, В, С, Д Е и доставить их в пункты а, Ь, с, d, e. Расстояния в километрах между пунктами загрузки и пункта- пунктами назначения контейнеров приведены ниже: А-а 60 в-ь 30 С-с 100 D-d | Е-е 50 | 40 Фирма располагает пятью грузовиками двух типов Хп Гна сто- стоянках S, Г, U, V, W. Три грузовика типа ^находятся на автостоян- автостоянках S, U, Vh два грузовика типа Гнаходятся на автостоянках Г, W. Стоимость пробега одного километра для грузовиков типа Хи Y, включая горючее, страховку и т.д., приведена ниже: X Y Пустой 20 30 Гружёный 40 60 Расстояния от стоянки грузовиков до места назначения приве- приведены ниже: Стоянки S Т и V W А 30 30 40 20 \ 30 в 20 10 10 20 20 Расстояние С 40 30 10 40 10 D 10 20 40 20 30 Е 20 30 10 30 40 Определить распределение контейнеров по грузовикам, ми- минимизирующее общую стоимость перевозок. 187. Ежедневно авиалиния, которая принадлежит некоторой ком- компании, осуществляет следующие перелеты между городами А и В: № полета 1 2 3 4 5 Отправление из города А 9.00 10.00 15.00 19.00 20.00 Прибытие в город В 11.00 12.00 17.00 21.00 22.00 № полета 11 12 13 14 15 Отправление из города В 8.00 9.00 14.00 20.00 21.00 Прибытие в город А 10.00 11.00 16.00 22.00 23.00
Задачи и упражнения 259 Компания хочет организовать полеты туда и обратно так, что- чтобы минимизировать время простоя при условии, что каждому са- самолету требуется 1 час для дозаправки. 188. Авиалиния связывает три города А, В, С. Полеты происходят семь дней в неделю согласно расписанию: Вылет Город А А А А А А В В В В С С Прибытие Время 8.00 9.00 10.00 14.00 18.00 20.00 7.00 9.00 13.00 18.00 9.00 15.00 Город В с в в в с А А А А А А Время 12.00 12.00 14.00 18.00 22.00 23.00 11.00 13.00 17.00 22.00 12.00 18.00 Как следует распределить самолеты по линиям для минимизации стоимости простоя в каждом из городов? Следует учесть, что само- самолет не может подняться менее чем через 1 час после приземления, так как требуется время на технический контроль и заправку. Теория групп и приложения 189. Показать, что G{ = {п \ п е Z) — группа с операцией сложения чисел, где Z— множество целых чисел; G2 = {2п \ п е Z} — группа с операцией сложения чисел; G3 = {2п \ п е Z} — группа с опера- операцией умножения чисел; G4 — множество квадратных матриц по- порядка п, определитель которых не равен нулю, является группой с операцией умножения матриц; G5 — множество ортогональных матриц порядка п является группой с операцией умножения мат- матриц; G6 = {1, -1} — группа с операцией умножения чисел; G7 — множество рациональных чисел является группой относительно операций сложения и умножения (без нуля); G8 — множество ве- вещественных чисел является группой относительно операций сло- сложения и умножения (без нуля). Установить, какие из групп явля- являются подгруппами других групп.
260 Задачи и упражнения 190. Пусть М— подмножество группы (?и \/а, b eMвыполняется ab~l е М. Показать, что М — подгруппа. 191. Пусть Gb G2 — группы и отображение/: G{-> G2 — гомомор- гомоморфизм. Показать, что ядро и образ гомоморфизма являются под- подгруппами. 192. Пусть G{ = {x е R+} и G2 = {х е 7?}, где R+ — положительные вещественные числа, R — вещественные числа. Показать, что G{ — группа с операцией умножения, G2 — группа с операцией сложения. Рассмотрим отображение ср : G{ -> G2 такое, что Vx e G{ ф(х) = ln(x) e G2. Показать, что ср — изоморфизм групп. 193. Пусть G— группа иге G — фиксированный элемент. Опре- Определим отображение ср : G -> G формулой Vg e Gy(g) = r~ gr. Дока- Докажите, что ф — изоморфизм группы на себя. 194. Докажите, что если порядок группы Gравен 2лиЯ- под- подгруппа порядка п группы G, то Н — ее нормальный делитель. 195. Доказать, что если в квадратной матрице порядка п содер- содержится нулевая подматрица размера rx s и r+ s> п, то определи- определитель матрицы равен нулю. 196. Найти порядок группы, порожденной подстановкой A 2 3 4 5) 1,2 3 4 5 If 197. Разложить подстановки (* \ \ * \ \ \ |1 и (\ \ \ \ \ \ 75) в про- произведение независимых циклов и в произведение транспозиций, определить их четность. 198. Пусть Не S4, где *У4 — симметрическая группа. Будет ли Н подгруппой в следующих случаях: 3 4\A 2 3 4)A 2 3 4U1 2 3 4 з 4),{2 i 4 ЗДЗ 4 1 2)\4 3 2 1, 2 3 4\ A 2 3 4\A 2 3 4^ A 2 3 2 3 4)\г 3 1 4Дз 1 2 4)>{2 4 1 199. Пусть G — циклическая группа, \G\ = m. Показать, что число образующих группы равно ц>(т) — функция Эйлера. 200. Пусть G — циклическая группа. Показать, что элементы группы одинакового порядка являются образующими одной и той же подгруппы ЯсС. 201. Пусть G — группа порядка \G\=p9p — простое число. Пока- Показать, что G — циклическая группа. 202. Показать, что циклическая группа — коммутативна.
Задачи и упражнения 261 203. Пусть G — группа. Показать, что для всякого g e G найдется такое целое к, что ? = е. 204. Показать, что число образующих циклической группы G = {g, g2,..., gn = е) равно значению функции Эйлера ц>(п) — количество чисел из множества {1,2,...,л-1} взаимно простых с п. 205. Пусть G — конечная абелева группа порядка \G\ = р*1 р22... р°,к, rjxepi,p2,...,Pic — простые различные числа; множество А(р) = = {х €G| \х\=ра}, где а принимает произвольные целые значе- значения. Показать, что А{р) — подгруппа. 206. Пусть Gb C2, — коммутативные группы порядков \G{\ = 56, | G21 = 64. Найти количество возможных прямых разложений каж- каждой из групп на циклические подгруппы. 207. Определить множество левых и правых смежных классов симметрической группы S3 по подгруппе Я, где Н— циклическая подгруппа с образующим элементом [312]* Доказать что Н ~ нормальный делитель. 208. Найти цикловой индекс группы самосовмещений (автомор- (автоморфизмов), действующей на множестве а), б), в), г). Отдельно рас- рассмотреть случаи действия группы на плоскости и в пространстве. \ / б) 209. Применить теорему Пойа для определения количества воз- возможных раскрасок двумя и тремя красками вершин графов а), б), в), г) предыдущей задачи. 210. Используя теорему Пойа, найти количество различных оже- ожерелий, которые можно составить из четырех бусинок пяти цветов. Рассмотреть отдельно варианты, когда группа самосовмещений (автоморфизмов) действует на плоскости и в пространстве. Алгоритмы и графы 211. Задана о стоянке. На некоторой улице с односторонним дви- движением имеется п мест для стоянки автомобилей, расположен- расположенных в ряд и перенумерованных от 1 до т. Муж везет в автомобиле
262 Задачи и упражнения жену. Внезапно жена просыпается и требует остановиться. Он послушно останавливается на первом свободном месте. Если нет свободных мест, к которым можно подъехать, не поворачивая об- обратно (т.е. если жена проснулась, когда машина достигла к-то ме- места для стоянки, но все «позиции» к, к + 1,..., m заняты), то муж приносит свои извинения и едет дальше. Предположим, что это происходит с п различными машинами, причему-я жена просыпается в момент, когда машина находится перед местом Oj. Сколько имеется таких последовательностей аь а2,..., ап, при которых все машины удачно припаркуются, предпо- предполагается, что первоначально улица пуста и никто со стоянки не уезжает? Составить алгоритм—программу вычисления всех воз- возможных перестановок аъ аъ..., ап и соответствующие им располо- расположения автомобилей. Исходные данные — т, п. Например, если т = п = 9 и (аи а2,..., ап) = C, 1, 4, 1, 5, 9, 2, 6, 5), то автомобили расположатся следующим образом: 2, 4, 1, 3, 5, 7, 8, 9, 6. 212. Фальшивая монета. Банк «Золотой Ящик» получил информа- информацию, что в последней партии из п монет ровно одна монета фаль- фальшивая и отличается от других монет по весу. Для определения фа- фальшивой монеты кассиру выдали только аптечные весы без гирь. Первым шагом кассир перенумеровал все монеты от 1 до п. Таким образом, каждая монета получила уникальный номер — целое число. После этого он начал взвешивать различные группы монет по составу, отмечая, какие из них больше, меньше или равны. Ваша задача — написать алгоритм—программу, которая по ре- результатам взвешиваний, выполненных кассиром, определит фа- фальшивую монету или определит, что этого нельзя сделать. Текстовый файл входных данных содержит следующую ин- информацию. Первая строка файла содержит два целых числа пик, разде- разделенных пробелами, где п — число монет в партии (п > 2) и к - чис- число взвешиваний, выполненных кассиром. Следующие 2к строк файла описывают результаты взвешивания. Каждое взвешивание представляется двумя строками файла. Первая из них начинается числом^ A < р-х < л/2), которое обо- обозначает число монет, участвовавших при взвешивании на каждой чашке весов. Следующие pt чисел на этой же строке файла явля- являются номерами монет, которые располагались на левой чашке ве- весов, и последние/?/ чисел на этой же строке файла являются номе- номерами монет, которые располагались на правой чашке весов.
Задачи и упражнения 263 Вторая строка содержит один из знаков: <, > или =. • Знак < означает, что вес левой чашки меньше веса правой чаш- чашки весов. • Знак > означает, что вес левой чашки больше веса правой чаш- чашки весов. • Знак = означает, что вес левой чашки равен весу правой чашки весов. Ниже приведен пример файла входных данных. Результаты определения номера фальшивой монеты сохра- сохранить в текстовом файле. Если по выполненным взвешиваниям нельзя выявить фальшивую монету, то в качестве результата со- сохранить 0. Ниже приведен пример файла результатов. ФАЙЛ ИСХОДНЫХ ДАННЫХ 5 3 2 12 3 4 114 12 5 ФАЙЛ РЕЗУЛЬТАТОВ ФАЙЛ ИСХОДНЫХ ДАННЫХ б 4 3 12 3 4 5 6 112 2 13 4 5 < 2 4 5 2 6 > ФАЙЛ РЕЗУЛЬТАТОВ 0 213. Грядки. Садовый участок, имеющий прямоугольную форму и разбитый на квадратные клетки со стороной 1 метр, имеет шири- ширину п и длину т метров. На этом участке вскопаны грядки. Грядкой называется совокупность клеток, удовлетворяющих условиям: • из любой клетки этой грядки можно попасть в любую другую клетку этой же грядки, последовательно переходя по грядке из клетки в клетку через их общую сторону; • никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам клеток (касание грядок по углам клеток допускается). Составьте алгоритм—программу расчета количества грядок на садовом участке. Исходные данные задаются в текстовом файле. В первой стро- строке располагаются два числа: пит, разделенные одним или неско- несколькими пробелами. Далее следуют п строк по т символов. Символ
264 Задачи и упражнения «#» обозначает территорию грядки. Символ «.» соответствует не- незанятой территории. Других символов в исходном файле нет. В выходной текстовый файл вывести количество грядок на садовом участке. Пример файла исходных данных: 5 10 ## ## .#..#...#. .### ## . .## ## #. Выходной файл для данного примера имеет вид: з. 214. Спуск с горы. 1 3 8 8 10 2 7 4 4 4 5 2 6 5 На рисунке показан числовой треугольник. Написать алго- алгоритм—программу, которая находит максимальную сумму чисел в вершинах треугольника при движении сверху вниз по ребрам тре- треугольника, т.е. из каждой вершины можно двигаться вниз налево или вниз направо. Например, для данного треугольника маршрут движения по узлам 7, 8, 1, 7, 2 дает сумму 25. Результаты расчетов сохранить в текстовом файле. Исходные данные представлены в текстовом файле, имеющем следующую структуру. Первая строка: п — число уровней в треу- треугольнике. Вторая и следующие строки содержат описание треуго- треугольника. Пример файла исходных данных: 5 7 3 8 8 10 2 7 4 4 4 5 2 6 5 Пример файла выходных данных: 30 7 3 8 7 5
Задачи и упражнения 265 215. Перестановка корзин. Даны 2л корзин с шарами А и Д распо- расположенные в ряд, как на рисунке (п < 5). \A\B\B\A | | |Л|2?|Л |?| Два места под корзины пустые. Другие п - 1 корзина содержат шары Аи п- I корзина — шары В. Составьте алгоритм—программу, которая бы переставляла корзины с шарами А с одной стороны, а корзины с шарами В с другой стороны. Правила перемещения корзин: разрешается пе- переставлять на пустые места любые две смежные (пара) непустые корзины, сохраняя их первоначальный порядок. Исходные данные представлены в текстовом файле со следую- следующей структурой. Первая строка: 2л — число корзин с пустыми ме- местами. Вторая строка: | Л | 2? | 2? | Л | | | ./4 | 2? | Л 11? |— исходное расположение корзин. Расчетные данные сохранить в текстовом файле со следующей структурой. Каждая строка — состояние корзин после каждой перестановки. 216. Комнаты музея. Составьте алгоритм—программу определе- определения числа комнат в музее и площади каждой комнаты в клетках. План музея показан ниже на рисунке. 11 7 1 13 б q in 11 11 в 1? 10 б 1 3 7 8 3 s 1 3 10 10 7 1 3 14 б 5 5 13 Цифровая карта Карта перекрытий Площадь музея состоит из клеток: п рядов и т столбцов. В каждой клетке такой матрицы (цифровая карта) проставляется число, в котором кодируется наличие стен у данной клетки. Значение чис- числа в каждой клетке является суммой чисел: 1 (клетка имеет стену на западе), 2 (клетка имеет стену на севере), 4 (клетка имеет стену на востоке), 8 (клетка имеет стену на юге). Например, если в клет- клетке стоит число 11 A1 = 8 + 2+1), то клетка имеет стену с южной стороны, с северной и с западной. Исходные данные представляются в текстовом файле со сле- следующей структурой. Первая строка: п, т — размерность сетки. Вторая строка, третья и следующие строки содержат описание матрицы цифровой карты по строкам. Расчетные данные сохра- сохранить в текстовом файле со следующей структурой. Число в пер- первой строке — количество комнат в музее. Вторая строка — пло- площадь каждой комнаты.
266 Задачи и упражнения Пример файла исходных данных: 4 7 11 б 11 б 3 10 б 7 9 б 13 5 7 5 1 10 12 7 13 13 5 13 11 10 8 10 14 13 Пример файла выходных данных: 9 6 3 2 8. 217. Переворот бокалов. На столе стоят в ряд ./Убокалов, пронуме- пронумерованных слева направо от 1 до N. Первоначально все бокалы стоят дном вниз. Над бокалами можно выполнять операцию «пе- «переворот». За один переворот ровно М A < М< N) любых бокалов переворачиваются так, что те бокалы, которые стояли дном вниз, оказываются перевернутыми вверх дном, а остальные из М бока- бокалов ставятся вниз дном. Составить алгоритм-программу, которая за минимальное ко- количество шагов позволяет перевернуть все бокалы вверх дном или определяет, что это сделать невозможно. Исходные данные N, Л/задаются в текстовом файле. Результа- Результаты последовательных переворотов сохранить в текстовом файле. 218. Течение воды. Все улицы в некотором городе имеют направ- направление с севера на юг (п улиц) или с запада на восток (т улиц), как на рисунке. Для каждого перекрестка улиц задается высота его над уровнем моря: //[/, у], / = l,M, j=l,N — матрица высот над уровнем моря. Требуется написать алгоритм—программу, кото- который находит путь от перекрестка А до перекрестка В или в обрат- обратном направлении. Путь должен проходить по таким улицам, ко- которые не ведут к возвышенностям (уровень при движении не дол- должен возрастать). м А гв J N Исходные данные представлены в текстовом файле со следую- следующей структурой. Первая строка: М, N — размерность матрицы и
Задачи и упражнения 267 улиц. Вторая строка: А = (iaja), В = (ibjb) — координаты двух пе- перекрестков. Третья и следующие строки определяют значения элементов матрицы высот H[iJ], i = l,MJ = 1,-^V. Результаты рас- расчетов сохранить в выходном текстовом файле со следующей структурой. Каждая строка — координаты и высоты перекрест- перекрестков, через которые пролегает маршрут. 219. Бомба. Требуется составить алгоритм—программу для опре- определения наименьшей окружности (центр и минимальный ради- радиус), охватывающей не менее к из п заданных точек на плоскости. Исходные точки на плоскости (хь у{), (х2, У2),---, (*„, Уп) задаются в текстовом файле. Результаты расчетов (координаты центра окружности, радиус ее и точки (xh yt), попадающие в окружность) сохранить в текстовом файле. Решите эту же задачу, но искомая окружность должна включать все заданные точки (xh yt). 220. Ханойская башня. Задача о ханойской башне проиллюстриро- проиллюстрирована на следующем рисунке: в с п-\ п Имеются три колышка А, В, С. На колышек А нанизано п дисков радиуса 1, 2,..., п (каждый с отверстием в середине) таким обра- образом, что диск радиуса /является /-м сверху. Задача состоит в том, чтобы переместить все диски на колышек Стаким образом, чтобы диск радиуса / был опять /-м сверху. За один раз разрешается пе- перемещать только один диск с любого колышка на любой другой (можно пользоваться колышком В). При этом должно выполня- выполняться следующее условие: на каждом колышке ни в какой момент никакой диск не может находиться выше диска с меньшим номе- номером. Составить рекурсивную алгоритм—программу требуемых перемещений дисков. Результаты расчетов: состояние каждого колышка на каждом шаге перекладывания дисков сохранять в текстовом файле. 221. Числа. Дана последовательность п различных между собой целых чисел аъаъ..., ап. Трансформацией называется следующая последовательность действий: некоторые из чисел увеличивают-
268 Задачи и упражнения ся на 1, если в последовательности оказываются два одинаковых числа, то одно из них исключается из последовательности. Вы- Выполним данную трансформацию к раз, с целью достигнуть мини- минимального количества чисел в последовательности аи аъ..., ап. Со- Составить алгоритм—программу, которая вычисляет р — количество чисел, оставшихся в последовательности. Исходные данные п, к и последовательность аь аъ..., ап задаются в текстовом файле. Най- Найденное число р сохранить в текстовом файле. Пример файла исходных данных: 5 2 7 1 15 8 3. Пример файла выходных данных: з. 222. Знакомства. Имеется п человек, где 1 < п < 1000. Каждому из них приписано некоторое число, которое определяет количество человек, с которыми ему предписано познакомиться. При этом знакомство взаимно, т.е. если человек с номером / знакомится с человеком с номерому, то и человек с номерому знакомится с че- человеком с номером /'. Составить алгоритм—программу, задача ко- которой состоит в следующем. Необходимо организовать знаком- знакомства, чтобы после их реализации участники могли быть разбиты на 2 команды таким образом, что в первой команде находятся участники, знакомые друг с другом (каждый знает каждого), а во второй — только незнакомые (никто никого не знает). При этом численность первой команды должна быть максимальна. В слу- случае невозможности реализации знакомств в выходной файл запи- записать ответ «NO». Формат файла входных данных. В первой строке входного фай- файла находится число п. В каждой /-й из следующих п строк нахо- находится число — количество человек, с которыми необходимо пере- перезнакомиться человеку с номером /. Формат файла выходных данных. В первой строке выходного файла находится численность первой команды или «NO». В слу- случае, если реализация знакомств возможна, то в каждой из следую- следующих строк должны находиться 2 числа, разделенные пробелом — номера людей, которым необходимо познакомиться. Приведем примеры расчетов для конкретных исходных данных.
Задачи и упражнения 269 Пример входного файла: Пример выходного файла: 3 1 2 1 3 1 4 2 3 223. Обмен. Каждому из п жителей одного городка шериф присво- присвоил личный номер — целое число от 1 до п и сообщил его, а затем поручил секретарше разослать по почте жетоны с личными номе- номерами. Но она разложила их по конвертам случайным образом. Для восстановления порядка, когда у жителя находится жетон с его номером, необходимо организовать обмен жетонами. Каж- Каждый житель может обменять в один день жетон, который находит- находится у него, на другой только с одним другим жителем. В один день обмениваться жетонами могут любое количество пар жителей. Составить алгоритм-программу поиска минимального количе- количества дней т, необходимых для того, чтобы все жители получили свои жетоны. Формат файла входных данных. Первая строка содержит целое число л, 1 < п < 1000, равное количеству жителей городка. Следу- Следующие п строк содержат по одному числу — номеру жетона, т.е. в (/+ 1)-й строке, соответствующей /-му жителю, находится номер того жетона, который он получил по почте. Выходной файл дан- данных содержит одну строку с найденным числом дней т. 224. Кокосы. В газетах 9 октября 1926 года сообщалось о корабле- кораблекрушении судна в Индийском океане. Пять человек и одна обезь- якка спаслись на необитаемом острове. В первый день пребыва- пребывания на острове они собирали кокосы. Среди ночи один из них проснулся и решил разделить кокосы. Он разделил кокосы на пять равных частей. Однако остался один кокос, который он от- отдал обезьянке. Свою часть он взял с собой и пошел досыпать. Да- Далее второй, третий, четвертый и пятый поступили аналогичным образом и каждый раз оставался один кокос, который они с удо- удовольствием отдавали обезьянке. Напрашивается вопрос: сколько было кокосов? Однако мы решим несколько другую задачу (об- (обратную). Составить алгоритм—программу поиска максимально возможного числа людей и одной обезьянки, которые могут про- проделать рассмотренную ночную операцию, если изначально изве- известно количество собранных кокосов?
270 Задачи и упражнения Исходные данные задаются в текстовом файле, который со- содержит последовательность целых чисел, каждое из которых яв- является числом собранных кокосов. Последовательность чи- чисел—кокосов заканчивается числом — 1 — признак конца данных. Результаты расчетов числа людей и одной обезьянки для каждого случая исходных данных сохранить в выходном текстовом файле. Приведем примеры расчетов для конкретных исходных данных. Файл исходных данных 25 кокосов 20 кокосов 3121 кокосов -1 Файл результатов 3 человека и 1 обезьянка. Нет решений. 5 человека и 1 обезьянка. 225. Быстрый Фил. Фил работает в последнюю смену. После рабо- работы ровно в 2:00 утра Фил уезжает домой с автомобильной стоя- стоянки. Его маршрут пролегает по дороге, на которой установлены один или несколько светофоров. Фил всегда удивлялся, что, вы- выбирая определенную скорость движения по маршруту и не изме- изменяя ее, он мог иногда доехать к дому без задержки на светофорах, т.е. все светофоры он проезжал на зеленый свет. Скорость движе- движения в городской черте не должна превосходить 60 миль/ч. Однако Фил не любил и тихо ездить. Минимальная скорость его движе- движения 30 миль/ч. Составьте алгоритм—программу, которая находит все целочисленные скорости (в милях/ч), с которыми Фил может двигаться домой без остановки на светофорах, начало движения с автомобильной стояки ровно в 2:00 утра. В этот момент времени все светофоры сбрасываются в зеленый цвет. Исходные данные задаются в текстовом файле, в котором при- приводится набор данных для описания режимов работы светофоров. Последнее число в файле (—1), является признаком конца данных в файле. Первое число п каждого набора определяет количество светофоров на маршруте. Далее следуют п наборов чисел: Length- GreenYellowRed (LGYR) для каждого светофора, где L — положи- положительное действительное число, указывающее место расположе- расположения светофора от начала маршрута Фила; G, Y,R — интервал про- продолжительности времени в секундах непрерывного цвета свето- светофора: зеленого, желтого и красного. Результаты расчетов допустимых целочисленных скоростей движения Фила сохра- сохранить в выходном текстовом файле:
Задачи и упражнения 271 Файл исходных 1 5.5 3 10.7 12.5 17.93 -1 40 10 12 15 8 2 5 4 данных 25 75 57 67 Файл выходных данных 30, 48, 0 32,33,36 49,50,51 — признак ,37,38,41, ,52,53,54, 42, 59, отсутствия такой 43,44,45, 60 скорости. 226. Парламент. Парламент состоит из iV делегатов. Делегаты должны разделиться на группы (фракции), количество депутатов в каждой группе отличается от количества депутатов в любой дру- другой группе. Каждый день каждая фракция посылает одного пред- представителя в президиум. Парламент начинает работу в том случае, когда состав президиума отличен от составов президиумов пре- предыдущих дней. Составьте алгоритм—программу, которая бы определяла опти- оптимальное число фракций и количество делегатов в каждой из них так, чтобы парламент мог работать как можно дольше. Число де- делегатов задается в исходном текстовом файле. Рассчитанные зна- значения количества делегатов в каждой фракции, сортированные по возрастанию, сохранить в выходном текстовом файле. Приве- Приведем примеры оптимальных расчетов для N=7 и N=31. Файл 7 31 исходных данных Файл 3 4 2 3 выходных 5 6 7 данных 8 227. Кот и Лиса. Дан ориентированный граф Г= (X, U, Ф), верши- вершины которого являются позициями в следующей игре. Участвуют два игрока — Кот и Лиса. Они двигают фишку из позиции в пози- позицию по дугам графа. Множество позиций Zразделено на два под- подмножества Х= К и Л. В позициях Л ход делает Лиса, а в позициях К— Кот. Если игра находится в позиции х е X, владелец этой по- позиции выбирает произвольную выходящую дугу (х, у) е Uu двига- двигает фишку из л: в .у. Игра начинается в некоторой позиции. Лиса выигрывает, если фишка оказалась в фиксированной вершине Z e X. Если за любое количество ходов фишка не попадает в эту позицию z e X, то выигрывает Кот.
272 Задачи и упражнения Составить алгоритм—программу, которая определяет все вы- выигрышные стартовые позиции для Лисы при оптимальной стра- стратегии обеих сторон. Считаем, что Х= {1, 2,..., л}, 1 < п < 1000. Исходные данные представлены в текстовом файле, имеющем следующую структуру. Первая строка: п, т, z, где п — число вершин, т — число дуг, Z — заключительная позиция. Со второй строки записаны: Ь{, Ъъ..., Ъп и х$х х-^уг ... х„ут, где Ьх¦= 1, если вершина / принадлежит Лисе; bt = 0, если вершина / принадлежит Коту; xjyt — список дуг графа, лс, — начальная вер- вершина, ух — конечная вершина соответствующей дуги. Все параметры — целые числа, разделенные пробелами. Пример входного файла: 7 12 7 0 10 0 0 10 12 14 13 2 4 2 5 3 13 6 3 7 4 3 4 6 5 б 6 7 Результат представить в текстовом файле, в котором записать п целых чисел q, с2,..., сп, где с7 = 1, если позиция / выигрышная для Лисы; иначе с, = 0. Для примера результаты расчетов представляются строкой: 0 10 0 111 228. Ящик с молоком. Ящик имеет пх п ячеек для бутылок с моло- молоком. Мистер Смит для каждого столбца и каждой строки заготовил отдельный листок бумаги, где записал наличие или отсутствие в ячейке бутылки молока: 1 — ячейка занята молоком, 0 — ячейка не занята молоком, но забыл проставить на каждом листе чему он соответствует: строке или столбцу и все это вложил в коробку. В пути ящик попал под дождь, и часть записей на листах пропала. Испорченные цифры 1 и 0 были заменены цифрой 2. Составить алгоритм—программу, которая по таким записям восстанавливает исходное расположение бутылок с молоком, т.е. определить, какие записи относятся к строкам, а какие — к столбцам. Исходные ис- испорченные записи по строкам и столбцам задаются в текстовом файле. Результаты сохранить в текстовом файле.
Задачи и упражнения 273 Пример. Исходные данные 1) 01210 2) 21120 3) 21001 4) 12110 5) 12101 б) 12101 7) 00011 8) 22222 9) 11001 10) 10010 Восстановленные данные б 9 3 2 8 4 1 1 1 1 0 1 0 1 1 1 0 10 1 0 0 1 0 7 0 0 0 1 1 5 1 1 1 0 1 229. Длина объединения. Текстовый файл содержит целые числа: аь by аъ Z>2,.., an, bn. Эта последовательность определяет на оси ОХп отрезков. Составить алгоритм—программу, которая опреде- определяет длину объединения всех отрезков. Результаты расчетов со- сохранить в текстовом файле. Исходные данные представлены в текстовом файле со следующей структурой. Первая строка: п — количество отрезков. Вторая строка, третья строка и т.д: аь Ьх — параметры соответствующего отрезка. Результаты расчетов со- сохранить в текстовом файле. Пример файла исходных данных: з 0 2 -1 1 0 1. Пример файла выходных данных: з. 230. Площадь объединения. Условие данной задачи — это условие предыдущей задачи, где вместо отрезков на прямой рассматрива- рассматриваются прямоугольники на плоскости, стороны которых паралле- параллельны осям координат. Составить алгоритм—программу определе- определения площади объединения таких прямоугольников. 231. Прямоугольные области. Условие данной задачи — это усло- условие предыдущей задачи. Однако требуется составить алго- алгоритм-программу определения количества областей, на которые границы прямоугольников разбивают плоскость.
274 Задачи и упражнения 232. Несвязные области. На плоскость ХОY произвольным обра- образом размещают N произвольных прямоугольников со сторонами, параллельными осям координат. Взаимное расположение прямо- прямоугольников допускает их пересечение. Требуется составить алго- алгоритм—программу определения количества несвязных областей, на которые прямоугольники разбивают плоскость XOY. Входные и выходные данные. В первой строке входного файла содержится число N. В каждой из следующих N строк располагаются коорди- координаты одного прямоугольника: (д„ 6,) — координаты левого верх- верхнего угла; (ch d{) — координаты правого нижнего угла. Выходной .файл должен содержать единственное число, равное количеству несвязных областей. Пример файла исходных данных: б 13 7 1 3 5 5 2 2 7 9 4 6 5 14 2 8 8 13 б 12 7 15 4. Выходной файл для данного примера: з. 233. Площадь участка. Требуется составить алгоритм—программу определения площади участка, ограниченного замкнутой лома- ломаной, составленной из отрезков единичной длины, параллельных осям координат. Исходные данные — координаты концов отрез- отрезков — задаются в текстовом файле. Найденную площадь сохра- сохранить в файле результатов. Отметим, что отрезки, составляющие границу участка, во входном файле могут следовать в произволь- произвольном порядке. Пример файла исходных данных: 24 — количество отрезков 4 0 5 0 3343 4353 0 1 1 0 0 1 3 0 1 2 3 0 1 0 1 2 2 1 0 1 3 0 1 2 3 1 2 1 1 2 CNJ 1 0 0 1 2 3 1 2 2 3 2 0 0 CNJ 2 3 2 2 3 2 0 0 2 3 2 3 4 3 0 0 2 3 3
Задачи и упражнения 275 4041 4142 5051 5152 5253 Пример файла результатов: 11 — площадь участка 234. Совмещение ломаных. Две ломаные построены по ребрам се- сеточной области с целочисленными координатами. Требуется со- составить алгоритм—программу проверки совпадения двух лома- ломаных, составленных из отрезков, с точностью до параллельного переноса и поворота на 90°, 180°, 270°. Исходные данные — число отрезков ломаных и значения координат их концов — определя- определяются в текстовом файле. Выходной файл результатов должен со- содержать признак 1, если ломаные совпадают, и 0 — в противном случае. Пример файла исходных данных: 4 — количество отрезков первой ломаной 0010 3020 1020 3031 2 — количество отрезков второй ломаной 1114 04 14 Пример файла результатов: 1 — ломаные совпадают. 235. Деление на равные половины. Текстовый файл содержит по- последовательность целых чисел — веса элементов: аь а2,..., ап. Со- Составить алгоритм—программу деления этих предметов на две группы так, чтобы общие веса двух групп были максимально близкими друг к другу. Результаты расчетов сохранить в тексто- текстовом файле. Исходные данные представлены в текстовом файле со следующей структурой. Первая строка: п — количество чисел. Следующие строки содержат веса элементов а,. Пример файла исходных данных: 5 6 3 14 5. Пример файла выходных данных: б 3 1 — первая группа 4 5 — вторая группа. 236. Простой круг. Натуральные числа 1, 2,..., п (п — чётное чис- число) располагают по кругу как на диаграмме. Первое число по кру-
276 Задачи и упражнения гу всегда должно быть 1. Все остальные числа располагаются таким образом, чтобы сумма двух соседних чисел по кругу была простым числом, начиная с 1. Составить алго- алгоритм-программу определения всех указанных расстановок. Исходное число п задается в тек- текстовом файле. Результаты расчетов сохранить в текстовом файле. Пример файла исходных данных Пример файла результатов 4_3_ 2_5_6_L 12385 6 741 125834761 237. Почтальон. Дана последовательность из ./Уулиц (по названи- названиям). Каждая улица соединяет два перекрестка. Первая и послед- последняя буквы названия улицы определяют два перекрестка для этой улицы. Длина названия улицы определяет стоимость проезда по ней. Все названия улиц состоят из строчных символов алфавита. Например, название улицы «computer» показывает, что улица на- находится между перекрестками «с» и «г», а длина ее 8. Нет улиц, ко- которые имеют одинаковые первые и последние символы. Есть не более одной улицы, напрямую соединяющей два любых перекре- перекрестка. Всегда есть путь между любыми двумя перекрестками. Чис- Число улиц с данным перекрестком называется степенью этого пере- перекрестка. Есть не более двух перекрестков нечетной степени. Все остальные перекрестки — четной степени. Составить алго- алгоритм—программу определения минимальной стоимости проезда по всем улицам, по крайней мере, один раз. Путешествие должно начаться и закончиться на одном и том же перекрестке. Стои- Стоимость проезда по улице равна ее длине. Пример входного файла 3 one two three Пример выходного файла 11 238. Пересечение с отрезками. Имеются N отрезков, концы кото- которых задаются двумя парами точек на плоскости: (xl[i\, yl[i]) и (jc2[/], y2[i\). Требуется составить алгоритм—программу определе-
Задачи и упражнения 277 ния такой прямой линии, которая пересекает как можно большее количество заданных отрезков. Исходные данные определяются в текстовом файле, имеющем следующую структуру. Первая строка: N — количество отрезков. Вторая и следующие строки: jcl[/], yl[i] и x2[i], y2[i] — пары точек на плоскости (концы отрез- отрезков). Результаты расчетов сохранить в выходном текстовом фай- файле^ имеющем следующую структуру данных. Строки файла — но- номера отрезков в возрастающем порядке, которые пересекает най- найденная прямая. Если найденная прямая линия проходит через концы отрезков, то это учитывать как пересечение. 239. Простые суммы. Даны числа от 1 до п, 1<п< 5000. Требуется составить алгоритм-программу разбиения данных чисел на ми- минимальное количество групп, в каждой из которых сумма являет- является простым числом. Например, при п = 8 такими группами могут быть: {1,4,5,6, 7}, {2, 3,8}. Примечание: число 1 не считается про- простым. Файл исходных данных содержит число п. Выходной файл должен содержать п чисел (номера групп), которые показывают в какую группу входит соответствующее по порядку число. Для ну- нумерации групп должны использоваться идущие подряд натураль- натуральные числа, начиная с единицы. Пример файла исходных данных: 8. Пример файла выходных данных: 12211112. 240. Движение плота. Квадратное озеро, покрытое многочислен- многочисленными островами, задается матрицей размером Nx N. Каждый эле- элемент матрицы — либо символ «#» — решетка, обозначающий ост- остров, либо символ «-» — минус, обозначающий участок воды. В верхнем левом углу озера находится квадратный плот размером М х Мклеток. За один шаг плот может перемещаться на одну клет- клетку по горизонтали или вертикали. Составить алгоритм—программу для определения минимального числа шагов, за которое плот мо- может достигнуть правого нижнего угла озера. Входной файл исход- исходных данных содержит числа Мп N. В следующих N строках распо- располагается матрица, представляющая озеро. Выходной файл должен содержать единственное число — количество необходимых шагов. Если правого нижнего угла достичь невозможно, то выходной файл должен содержать число —1 (минус один).
278 Задачи и упражнения Пример файла исходных данных: 8 2 — #- — ## Выходной файл для данного примера: 18. 241. Пират в подземелье. В поисках драгоценных камней пират проваливается в подземелье. План подземелья — матрица Nx M комнат с драгоценными камнями. Камни из одной комнаты име- имеют одинаковую стоимость. Пирату в каждой комнате разрешается взять с собой лишь один камень и следовать в любую другую со- соседнюю с ним комнату. Каждую из комнат пират может посещать неоднократно. Требуется составить алгоритм—программу опре- определения маршрута посещения пиратом К комнат лабиринта та- таким образом, чтобы он набрал камней на максимально возмож- возможную сумму. Входные и выходные данные. В первой строке входного файла содержатся числа N, Ми К. В следующих N строках распо- располагается матрица Nx M лабиринта. Каждый элемент матрицы представляется стоимостью камня соответствующей комнаты. Маршрут начинается с левой верхней угловой комнаты лабирин- лабиринта. Выходной файл должен содержать единственное число, рав- равное общей стоимости взятых с собой камней. Пример файла исходных данных: 3 4 7 1111 112 1 112 3 Выходной файл для данного примера: 12. 242. Оставить условие задачи №241 и предписать пирату, чтобы он за К шагов еще и вернулся в начальную комнату лабиринта.
Задачи и упражнения 279 2 4 5 1 6 3 7 243. Задана Д.Андре. Составить алгоритм—программу поиска всех способов заполнения числами 1, 2,..., п массива из п ячеек так, чтобы во всех строках и столб- столбцах они располагались в возраста- возрастающем порядке (слева—направо и сверху—вниз). Исходное число п задается в текстовом файле. Резу- Результаты заполнения сохранить в файле результатов. 244. Сумма чисел. Дано натуральное число т. Вставить между не- некоторыми цифрами: 1,2,3,4,5,6,7,8,9, записанными именно в таком порядке, знаки +, - так, чтобы значением получившегося выражения было число т. Например, если т- 122, то подойдет следующая расстановка знаков: 12 + 34-5-6 + 78 + 9. Требуется составить алгоритм—программу определения всех расстановок знаков +, -, отвечающих условию задачи. Исходное число т зада- задается во входном текстовом файле. Выходной текстовый файл дол- должен содержать найденные расстановки знаков. Если требуемая расстановка знаков невозможна, то выходной файл должен со- содержать число —1. 245. Обслуживание авиалиний. Имеется некоторый город М, кото- который связан маршрутами с городами АьА2,...,Ап- Пусть, согласно расписанию, маршрут MAtMобслуживается в интервале времени [ahbj\. Другими словами, я, — это тот момент, начиная с которого самолет связан с маршрутом MAtM, a bt — тот момент, когда эта связь прекращается. Таким образом, задано п временных интер- интервалов [ahbj], i = 1, 2,..., п. Требуется составить алгоритм-програм- алгоритм-программу определения минимального числа самолетов, достаточного для обслуживания всех рейсов. Файл исходных данных Файл результатов 3 — количество городов 12 — интервалы времени 2 3 3 5 1 самолет на все рейсы
280 Задачи и упражнения 5 - количество городов 2 самолета на все рейсы 1 3 — интервалы времени 7 12 6 8 2 4 9 10 246. Симпатичный прием. Генерал желает устроить юбилей с мак- максимальным числом гостей из своих знакомых. Стремясь сделать юбилейный вечер приятным, он должен организовать все так, чтобы на этом вечере присутствовали люди, симпатизирующие друг другу. Оказалось, что у генерала п знакомых. Каждый из них получил соответствующий номер от 1 до п. Исходные данные за- задачи — это список пар симпатизирующих гостей генерала. Соста- Составить алгоритм—программу определения по исходным данным максимально возможного числа гостей на юбилейном вечере и сохранить его в выходном файле результатов. Файл результатов 2 приглашенных на вечер Файл исходных данных 5 — число знакомых у генерала 6 — число симпатизирующих пар 1 2 1 3 2 4 2 5 3 4 3 5 247. Таблица инверсий. Составить алгоритм—программу определе- определения таблицы инверсий did2...dn перестановки (аи а2,..., ап), где dj — число элементов, больших./ и расположенных левее j (см.п.1.13). Исходные данные — число п и произвольная переста- перестановка чисел 1, 2,..., п — определяются в текстовом файле. Выход- Выходной файл результатов должен содержать найденную таблицу ин- инверсий. Пример файла исходных данных: 5 — число п 5 3 4 2 1 — перестановка Пример файла результатов: 4 3 1 1 0 — таблица инверсий.
Ответы 1. Множество D всех сочетаний Ск разобьем на два непересекаю- непересекающихся подмножества D = D{u D2, где D{n D2 = 0. Множество D{ включает все сочетания с произвольным фиксированным эле- элементом, \D{\ = Ck~f. Множество D2 включает все сочетания без вы- выделенного фиксированного элемента, \D2\ = C%_1. Следовательно, )" ^ 2. Используйте бином Ньютона A+х)" = к=0 3. Применить индукцию по п. 7. 2п. 8. Воспользуйтесь тождеством(а + Ь)п = ^С„акЬп~к. к=0 9. Воспользуйтесь тождеством A + х)т{\ + х)п = A + х)т+п. 10. Воспользуйтесь тождеством A + A + 1))Л = Ъп. 11—13. Воспользуйтесь тождеством A+х)л =^Скхк. к=0 14. Указание. Воспользуйтесь полиномиальным разложением формулы A + 1 + ... + 1)л = Ал. 15.21. 16. СЛ2+2. П.2п2х2п2. lS.2n2xBn2-2n). V>.2nm. 2О.Л53,C|3L 21. З6. 22.63. 23. С„2 —двустороннихсловарей, А2- односторонних словарей, п — словарей при переводе по циклу. 24.4J. 25.PEJ,3)=^=C5i5C7lQCl 26. С^. 27. с;. 28. Л^ +Л^ +4^ — учитывается порядок имен. 29. РB,2,2,1,1). 30. C*C*JfcL 31. 2/1!л!и2/|!/|!/2/1 = л!(л-1)!. 32. С^4!. 33. п\/2п, где деление на число п обозначает совпадение соседей при циклическом перемещении исходной перестановки; в цифре 2 учитываются одни и те же соседи при отраженном (зеркальном) расположении исходной перестановки. 34.С1б0(С1б0-1)(С1б0-2)=^. 35. С^С^С^ 36. Свп((С2вС2С2)/31) =l5cl 37. С/16((С62С42С22)/3!)=15СЛ6. 38. (Bп)\/B\)п)/п\ — неупорядоченное разбиение множества.
282 Ответы 39. См. решение задач 7 и 8. 40. 9!-С^7!3!+С325!3!3!3!-С333!3!3!3!. 110 8 42.(С{С13з)(С11зK+(С42(С123J)(С11зJ. 43. 3" 44. 317. 45. лЛ 51. 5 , ^45. 52. C35. 53. С5С31, С35 - q30 55. PC,2,3,l). 56. q30C74C33. 57. A + ttl)(l + a2)...(l +ая), . 59. « - [n/p] — столько чисел среди 1, 2,..., « не кратных^. Всего произведений С^, тогда число произведе- произведений, кратных/?, равноС% -С„_[п/Р]. 60. п\ - т\{п - т + 1)! (объеди- (объединить т элементов в один элемент). 61. 2(С2J =" {п~{) — способов поставить две ладьи так, чтобы они не угрожали друг другу. (CJ J{п -1) =п2(п -1) — способов по- поставить две ладьи так, чтобы они угрожали друг другу. Для ответа на вопрос задачи осталось сравнить указанные числа. 63. С20 +С20 =90. 66. 18. 68. 31. 71. Ckn;lk_v С*;/. 72. 205223000, см. п. 1.13. 73. 27354186, см. п. 1.13. 75. Указание: воспользуйтесь тем, что перестановка двух соседних меток N и Мне оказывает влияния на произведение 2п~т. 16.3Сп3п2п. 77. {kri)\/{{k\)nn\). 78. C0)!/(A0!K3!), C0)!/(C!I010!). 79. {С1С]/2\У{С\\С\1). 80. (С20С2С62С2С2)/5! =10!/(B!M5!). 81. 9!/(A!IB!L1!4!). 82. 9!/(C!K3!). 83. РB,2,2,2,2,2,1,1,1,1). 84. С?5С?0. 85. 48 -С\3* + C\l8 -С4318 — воспользоваться форму- формулой включений и исключений для свойств: Р, — пустой /-й этаж, / = ТД 87. ^L. 88.(9°+123^1 89. C9n~\_v 90. С]^_{ -1, где -1 обозначает число 0. Cn\_v 91. С*+1.92. С*+А. 93. Схема посева сортов пшеницы должна соот- соответствовать латинскому квадрату т х т. 94.CtU 95.
Ответы 283 97. k?(-iycrr+icrk+i(k-r-i)m =q|;Vi)'q_r(*-/--Om- /=0 /=0 99. ?=0 m-r m-/\ k 100. 102. Введем обозначения. Рк — свойство, что к-я пара враждую- враждующих рыцарей сидит рядом, к = 1,2,..., л. ДО) — размещение рыца- рыцарей, которые не обладают ни одним из указанных свойств, т.е. требуемые размещения по условию задачи. ДО) = W@) - Щ1) + + W{2) - ... + (-l)nW(n), где W{k) — количество размещений ры- рыцарей, когда к и более враждующих пар сидят вместе. Объединим каждую из к указанных пар в один объект. Тогда имеем 2л - к объ- объектов, которые можно расположить Bл - к)\ способами. В каждой из к заданных пар врагов можно поменять местами 2к способами. Выбор к враждующих пар можно сделать С„ способами. Следова- Следовательно, искомое число равно ^ к=0 103. 542. 104. 734. 106. 20%, 60%, 70%. 107. 2, 6, 3. 109—110. Решение подобного уравнения рассмотрено в п. 1.7. 3 111. —тг7"~т^- 112- С„3-2- Действительно, выбирая из п - 2 три различных предмета Сл3_2 способами, можно однозначно отобра- отобразить их в разбиения, требуемые по условию. Если выбраны пред- предметы с номерами кх < к2 < к3, то в исходном ряду их номера будут к{ < к2 + 1 < къ + 2. 113. ХНУ Cig^. 115. 2", Ц^. 116. п + 1.117. Количество прямоугольников размера / xj равно (л - / + 1) х (л -j + 1). Каждый прямоугольник учиты- учитывается в сумме столько раз, какова его площадь. Тогда сумма рав- i=ij=\ I 6 J
284 Ответы 118. a) k\CknCkm +2(k-DiC^C* +(к-2)!СЯ*-2С*-2; в) п + 1. 119. ^-^ + iJ. 120. (л(л + 1)/2J. 121. 1) 7 + 3"; 2) и2п = [9 ¦ З2" + (-1)"]/Ю, м,„+1 = [9 • 32"+1 + 3 • (-1Л/10, п > 0; 3) (+9)"; 4) (+4)"; 5) (-1)> - 1) + 2; 6) 2". 122. 1) С2+2 -2С2+1 +2С„2; 2) -2(-4)" + 3 • 2" + 5"; 3) 2" -ф; 4) 2" +2"-2С„2; 5) l*!^). 6) 2^-зч-1)\ 124. 1)^-5^; 2)^ + 5-3";3) 125. д„ = 2л+1Bя + 7), 6„ = 2л+1(-2« - 3). 129. Использовать формулу включений и исключений. 130. а)Л(х, C)=41+^K + A+3jc + x2)A+x). 133. а) 2", с) 2 • Зп~1. Составить рекуррентное соотношение (см.п.3.3). 134. а) 2П+(~1Г2, б) ^З" -(-l)"). Составить рекур- рекуррентное соотношение (см.п.3.3). 135. 4". 136. Ch^iCnJ =(С2ЛJ. Воспользуйтесь производящей функ- циеи I х + — +у + — = > CJJ х + — v + — | всех ломаных У) к=0 V XJ К >> маршрутов длины 2п по рассматриваемой сетке. Свободный член в правой части является искомым числом для замкнутых маршру- маршрутов (см. п.3.4). 137. С^ (см. указание к предыдущей задаче). 183. а) 14; б) 18; в) 9. 184. а) 43; б) 61. 185. а) 37; б) 100; в) 158.
Литература 1. Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. — М.: Мир, 1979. 2. Берж К. Теория графов и ее применения. — М.: ИЛ, 1962. 3. Виленкин Н.Я. Комбинаторика. — М.: Наука, 1969. 4. Виноградов И.М. Основы теории чисел. - М.: Наука, 1981. 5. Гаврилов Г.П., Сапоженко А.А. Сборник задач по дискретной математи- математике. - М.: Наука, 1977. 6. Грин Д., Кнут Д. Математические методы анализа алгоритмов. — М.: Мир, 1987. 7. Гроссман И., Магнус В. Группы и их графы. - М.: Мир, 1971. 8. Гудман С, Хидетниеми С. Введение в разработку и анализ алгоритмов. — М.: Мир, 1981. 9. Иванов Б.Н. Подсчет и оценивание. Алгоритмы на графах: Метод, указа- указания для студентов. - Владивосток, 1991. 10. Кнут Д. Искусство программирования для ЭВМ. Сортировка и поиск. Т.З. - М.: Мир, 1978. 11. Комбинаторный анализ. Задачи и упражнения. Учебное пособие / Под ред. Рыбникова К.А.- М.: Наука, 1980. 12. Кофман А. Введение в прикладную комбинаторику. - М.: Наука, 1975. 13. Кристофидес М. Теория графов. - М.: Мир, 1978. 14. Курош А.Г. Лекции по общей алгебре. - М.: Наука, 1973. 15. Нефедов В.Н., Осипова В.А. Курс дискретной математики. — М.: МАИ, 1992. 16. Оре О. Теория графов. - М.: Наука, 1980. 17. Препарата Ф., Шеймос М. Вычислительная геометрия. - М.: Мир, 1989. 18. Райзер Дж. Комбинаторная математика. — М.: Мир, 1966. 19. Рейнголц Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы. Теория и практика. — М.: Мир, 1980. 20. Риордан Дж. Введение в комбинаторный анализ. - М.: ИЛ, 1963. 21. Рыбников К.А. Введение в комбинаторный анализ. - М.: МГУ, 1972. 22.Уилсон Р.Дж. Введение в теорию графов. - М.: Мир, 1977. 23. Форд Л.Р., Фалкерсон Д.Р. Потоки в сетях. - М.: Мир, 1966. 24. Харрари Ф. Теория графов. - М.: Мир, 1973. 25. Харрари Ф., Палмер Э. Перечисление графов. - М.: Мир, 1977. 26. Холл М. Комбинаторика. — М.: Мир, 1970. 27. Холл П. Вычислительные структуры. Введение в нечисленное програм- программирование. — М.: Мир, 1978.
Предметный указатель Алгоритмы Евклида 227-228 поиска с возвращениями 66-68 порождения (=генерация) композиций 84 перестановок 68—75 случайных 89-90 подмножеств 76 разбиений 85—88 размещений с повторениями 79 сочетаний 80 Алгоритмы на графах выделение компонент связности 126-129 кратчайшие пути на графе 151-155 максимальное паросочетание 186-188 поиск блоков в глубину 182—184 поиск в глубину (общий) 117-123 поиск клик 160—171 поиск эйлеровой цепи 131—136 потоки в сетях 156—159 остовное дерево 137—138 ближайшего соседа 145-149 жадный 139-144 фундаментальные циклы 172-176 чередующиеся цепи 185-188 Бернсанда лемма 216 Вильсона теорема 237 Включение и исключение правило (принцип) 56 Выпуклая оболочка многоугольника (задача) 81 Вычеты 233 полная система 233 приведенная система 234 Гамильтонов цикл 113 Граф ПО блоки 180-184 вершины висячие 112 изолированные 112 смежные 112 двудольный 185 двусвязные 183 диаметр, радиус, центры 196 дополнение 112 изоморфный 111 клики 160 компоненты связности 125 листы 177-179 маршрут 113 матрица весов 114 инцидентности 115 смежности 114 мост (разделяющее ребро) 178 мультиграф 111 остовное дерево 137 паросочетания 186 чередующиеся цепи 186-187 пути на графе 151-155 плоский (=планарный) 112 помеченный 113 связный 125 список ребер 116 структура смежности 117 ориентированный 111 петля ПО подграф 111 полный 112 простой 112 псевдограф 111 связный 113 сильно 113 слабо 113 транспортная сеть 156-159 фундаментальные циклы 172-176 хроматический 194 цепь 113 простая 113 замкнутая 113 гамильтонова 113 эйлерова 130 цикл 113 простой ИЗ замкнутый 113 гамильтонов 113 эйлеров 130 эйлеров 130 Группа 197 абелевы 203 вычетов 233-234 гомоморфизм 198 образ 199 ядро 199 изоморфизм 199 теорема Кэли 212
Предметный указатель 287 индекс 200 коммутативная 197 подстановок 208 примарная 204 прямое произведение 203 циклические подгруппы 206 Силова 207 симметрическая 208 смежные классы 199-200 фактор 201-202 циклическая 200—201 цикловой индекс 217 Действие групп на множестве 212-216 Декремент подстановки 209-210 Дерево (граф) 114 бинарное (двоичное) 31 корневое 31 остовное 137-144 поддерево 32 представление 31 на связной памяти 32 на смежной памяти 32 бинарное (двоичное) 33 регулярное 34 сравнений 104 Доминирующее множество 160-161 минимальное 161 число доминирования 161 Доска запрещенных позиций 60 Задача о назначениях 190-193 Инверсии перестановки 20 Индекс подгруппы 200 Клики (в графе) 160 Коллизии 108 Компоненты связности графа 125-126 Корень дерева 32 Коэффициенты полиномиальные 14 Куб «-мерный (задача) 40 Кэли теорема 212 Лагранжа теорема 200 Лес (=множество деревьев) 31,114 Линейный порядок 91 Мёбиуса функция 238 Многочлен ладейный 60-62 попаданий 63 Множество весов элементов 53 дополнение 8 объединение 8 пересечение 8 представление 37 смежное 37-38 связанное 37-38 характеристический вектор 38 прямое произведение 8 пустое 8 разность 8 универсальное 8 Мультимножество 14 Наибольший общий делитель 227 Наименьшее общее кратное 228 Независимое множество вершин, ребер 162 Независимые циклы подстановок 206 Нормальный делитель 201 Обобщенное правило произведения 53 Образующий элемент группы 200 Орграф ^ориентированный граф) 111 Отношение эквивалентности 124 Паросочетание максимальное 186-188 Петля (в графе) ПО Перестановки 11 инверсии 20 обратные 21 порождение 68-73 с повторениями 13 Подгруппа 198 индекс 200 нормальный делитель 201 циклическая 200 Подстановки 208 группа симметрическая 208 декремент 209 транспозиции 210—211 цикловая структура 223-226 четность 209-210 Поиск данных 91 закон Зипфа 103 логарифмический 104-106 последовательный 102—103 Поиск с возвращениями (алгоритм) 66 Пойа теория перечисления 218-223 Порядок элемента (в группе) 200 линейный 91 Потоки в сетях (в графе) 156-160 Правило суммы 8,9,53 прямого произведения 8,9,53 Представление последовательности 24 связанное 26 смежное 24 характеристический вектор 25
288 Предметный указатель Принцип включения и исключения 56 Производящая функция 39 операции 39 дополнительные суммы 42 изменение масштаба 43 линейные 41 сдвиг влево, вправо 41-42 свертка 44 частичные суммы 42 Простые числа 228 решето Эратосфена 229 Прямая адресация 106-109 Разбиение множества упорядоченное 15 неупорядоченное 15 Разделяющая вершина 181-182 Размещение с повторениями 9 без повторений 10 Расстановка 9—12 Ребро (в графе) ПО Рекуррентные линейные соотношения 49 неоднородное 51 Система различных представителей 189 двудольные графы 189 теорема Холла 190 Смежные вершины 112 Смежные левые (правые) классы 199 Списки связанные 26-27 циклически связанные 27 Сортировка 91 внешняя 91—92 внутренняя 91-92 всплытием Флойда 95—100 вставками 92 отрезков (задача) 100-101 перечислением 94 прямой адресации 106-109 пузырьковая 93 полная 94 сложность 91 Сочетания 11 с повторениями 12 Стабилизатор (группа) 214 Сумма (задачи) квадратов 47 счастливая 77 Теорема Вильсона 237 включения и исключения 56 Кэли 212 Лагранжа 200 о двудольных графах 185 о максимальном паросочетании 188 о максимальном потоке и минимальном разрезе Силова 207 Ферма 237 Форда и Фалкерсона 158 Холла и система различных представителей 189-190 Эйлера о графах 130 о числах 237 Теория чисел 227-239 Точки сочленения 181 Транспозиции подстановки 210-212 Транспортная сеть 156 поток 156 максимальный 158-160 насыщенный 158 пропускная способность 156 разрез 157 Факторгруппа 201 Ферма теорема 237 Формула бинома Ньютона 19 обращения Мёбиуса 238-239 полиномиальная 18 Фундаментальное множество циклов 172-177 Функция Мёбиуса (свойства) 238-239 производящая 39 Эйлера (свойства) 234-235 Характеристический вектор последовательности 25 полином (уравнение) 50 Хроматические графы 194-195 Циклическая группа 200-201 Цикловой индекс группы 217 Цикловая структура групп подстановок 224-226 Эйлеров граф 130-136 Эйлерова теорема о числах 237 Эйлерова функция (свойства) 234—236 Эратосфеново решето 228—231 простые числа 228