SlideShare a Scribd company logo
ТЕХНИЧЕСКИЙ & УНИВЕРСИТЕТ
Б. Н. ИВАНОВ
дискретнаяматематика
АЛГОРИТМЫ
И ПРОГРАММЫ
Москва
Лаборатория Базовых Знаний
2 0 0 3
ББК 32.973.3
УДК 519(075.8)+681.142.2
И 20
Рецензенты:
кафедра математического моделирования и информатики ДВГТУ (зав. кафед-
рой доктор физико-математических наук, профессор А. А. Буренин);
доктор физико-математических наук, профессор В. В. Катрахов
Иванов Б. Н.
Дискретная математика. Алгоритмы и программы: Учеб. по-
И20 собие/Б. Н. Иванов. — М.: Лаборатория Базовых Знаний, 2003.
— 288 с.: ил.
ISBN 5-93208-093-0
Книга посвящена современному курсу дискретной математики. Теоретиче-
ские основы курса сопровождаются практически значимыми алгоритмами, реа-
лизованными в конкретныхкомпьютерныхпрограммах. Книгу можно рассматри-
вать в качестве хорошего справочника методов и алгоритмов дискретной матема-
тики, широко применяемых в практическом программировании.
Пособие рассчитано на студентов специальностей, учебные планы которых
предполагают изучение каких-либо разделов курса дискретной математики, в
первую очередь на математиков-прикладников, а также программистов, занятых
разработкой прикладного программного обеспечения.
ББК 32.973.3
УДК 519(075.8)+681.142.2
Серия «Технический университет»
Учебное издание
Иванов Борис Николаевич
ДИСКРЕТНАЯ МАТЕМАТИКА. АЛГОРИТМЫ И ПРОГРАММЫ
Художник Н. Лозинская
Компьютерная верстка В.Носенко
Подписано в печать 22.04.01. Формат 60х90'/1в
.
Гарнитура Ньютон. Бумага офсетная. Печать офсетная.
Усл. печ. л. 18,0. Тираж 3000 экз. Заказ 2697
Издательство «Лаборатория Базовых Знаний»
Телефон (095)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. Многочлены попаданий . 6 3
Содержание
Глава 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
Глава б. Введение в теорию графов. Алгоритмы на графах 110
6.1. Основные понятия и определения ПО
6.2. Представления графов 114
6.2.1. Матрица смежности графа 114
6.2.2. Матрица инцидентности графа . 1 1 5
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
Предисловие
радиционно кдискретной математике относят такие облас-
ти математического знания, как комбинаторика, теория чисел,
математическая логика, теория алгебраических систем, теория
графов и сетей и т.д. Дискретная математика всегда оставалась
наиболее динамичной областью знаний. Сегодня наиболее зна-
чимой областью применения методов дискретной математики
является область компьютерных технологий. Это объясняется не-
обходимостью создания и эксплуатации электронных вычисли-
тельных машин, средств передачи и обработки информации,
автоматизированных систем управления и проектирования. На
грани дискретной математики и программирования появляются
новые дисциплины, такие как разработка и анализ вычислитель-
ных алгоритмов, нечисленное программирование, комбинатор-
ные алгоритмы, алгоритмизация процессов. Дискретная
математика и примыкающие к ней дисциплины изучаются во
всех университетах и институтах, где осуществляется подготовка
специалистов в области программирования, математики, а также
по экономическим, техническим и гуманитарным направлениям.
Цель написания учебного пособия — научить студентов не то-
лько основам дискретной математики, но и показать ее роль в со-
временных компьютерных технологиях, вооружить читателя ме-
тодами, применяемыми для решения широкого круга задач. По-
собие написано в доступной форме, достаточно полно и строго.
Особое внимание в книге уделяется вопросу практической
компьютерной реализации. В каждом конкретном случае содер-
жится достаточно информации для применения рассматривае-
мых методов на практике. В этом отношении много полезного
найдет читатель, более склонный к программистской работе и
интересующийся предлагаемыми алгоритмами в силу их практи-
ческого использования. Для любого заинтересованного читателя
рассматриваемый в пособии набор приемов и правил алгоритми-
ческого характера может составить хорошую основу формирова-
ния культуры разработки, анализа и программной реализации ал-
горитмов.
Комбинаторные схемы
D этой главе будет сделан обзор комбинаторных формул,
наиболее важных для вычислительных задач. Мы не ставим себе
целью сделать этот обзор всеобъемлющим, а хотим сосредоточить
внимание читателя на таких формулах, которые он мог бы недо-
оценить или даже совсем не заметить. Заинтересованному чита-
телю рекомендуется обратиться к специальной литературе.
Введем некоторые важные обозначения. Множества будем
обозначать заглавными буквами. Множества состоят из элемен-
тов, которые будем обозначать малыми буквами. Так, запись а еА
обозначает, что элемент а принадлежит множествуА. Такие мно-
жества будем изображать перечислением элементов, заключая их
в фигурные скобки. Например, {а, Ь, х, у}. Количество элементов
в множестве называется мощностью и записывается как | А .
Пусть имеются два множества А и В. Рассмотрим все пары эле-
ментов при условии, что первый элемент берется из множестваЛ,
а второй — из множества В. Полученное таким образом множест-
во называется прямым произведением АхВ множеств Аи В. На-
помним некоторые операции над множествами, которыми время
от времени будем пользоваться.
АхВ = {(а,Ь) а <=А, Ъ еВ} — прямое произведение множеств.
А и5 = {х | х еА v х &В} — объединение множеств.
А глВ - {х | х &А л х &В} — пересечение множеств.
А В - {х | х еА л х &В} — разность множеств.
0 — пустое множество.
U — универсальное множество.
A =U А = {х | х еА}— дополнение множества.
1.1. Правило суммы
Пусть Аи В— конечные множества такие, что А гВ =0,А =
и В  = п. Тогда I A u5 I = т + п.
Предисловие
Практическая компьютерная реализация большого количест-
ва рассматриваемых задач потребовала включения в книгу специ-
альных разделов дискретной математики, таких как представле-
ние абстрактных объектов, сортировка и поиск, порождение ком-
бинаторных объектов. Однако увеличение объема материала по-
собия только лишь усилило многие вопросы, позволило уточнить
их суть, а также придать общее звучание разделам курса, которые
на первый взгляд никоим образом не связаны. Книгу можно рас-
сматривать в качестве хорошего справочника методов и алгорит-
мов дискретной математики, широко используемых в разработ-
ках прикладного программного обеспечения.
Уровень математической подготовки, требующийся для пони-
мания материала книги, может меняться от главы к главе. Мини-
мум необходимых познаний в программировании соответствует
уровню первокурсника, уже научившегося писать довольно про-
странные программы. Необходимый уровень математического
образования соответствует типичной подготовке студента, про-
слушавшего ряд основных математических курсов, таких как ма-
тематический анализ, аналитическая геометрия, линейная алгеб-
ра.
Учебное пособие ориентировано на семестровый лекционный
курс, читаемый автором на механико-математическом факульте-
те Дальневосточного государственного технического университе-
та. Без сомнения, книга может составить хорошую основу курсов,
примыкающих к дискретной математике, таких как информати-
ка, алгоритмизация процессов, анализ вычислительных алгорит-
мов.
Учебное пособие предназначено прежде всего для студентов
специальности «Прикладная математика», а также студентов дру-
гих специальностей, изучающих дискретную математику и про-
граммирование. Книга будет полезна преподавателям, аспиран-
там и научным работникам, применяющим методы дискретной
математики в прикладных задачах.
1.3. Размещения с повторениями
Интерпретация. Если элемент а еА можно выбрать т спосо-
бами, а элемент b еВ — п способами, то выбор элемента х &А jB
можно осуществить т + п способами. Пусть Xi,X2,...,Xk — попар-
но непересекающиеся множества, Xt -,г Xj = 0, где / *j. Тогда, оче-
видно, выполняется равенство
k
1=1
j
k
1=1
1.2. Правило прямого произведения
Пусть А и В — конечные множества, | Л | = /и и В = п, тогда
АхВ = т-п.
Интерпретация. Если элемент а еЛ можно выбрать т способа-
ми и если после каждого такого выбора элемент b &B можно вы-
брать п способами, то выбор пары (а,Ь) <=А*Вв указанном поряд-
кеможноосуществитьАхЦ =т•пспособами. Вэтомслучаегово-
рят, что выбор элементов множества А не зависит от способа вы-
бора элементов множества В. Пусть теперь Xl,X2,...,Xk —
произвольные множества, Xt =nis / =!,£. Тогда
Задача. Найти число маршрутов
из пункта Мв пункт Л'' через пункт
К. Из Л/в ЛГведут 5 дорог, из KB N—
3 дороги.
Решение. Введем два множества: S= {^, s2
, s3
, s4
, s5
}— дороги из
Мв К, T={t{
, t2
, t3
}— дороги из KB N. Теперь дорогу из Мв УУмож-
но представить парой (s, tj), где /'= 1, 2, 3, 4, 5;у'= 1, 2, 3. Значит,
S х Т — это множество всех дорог из Мв N, количество которых
равно |5'хГ|=5-3=15.
1.3. Размещения с повторениями
Задача формулируется следующим образом. Имеются пред-
меты п различных видов яь
а2
,..., а„. Из них составляют всевоз-
можные расстановки длины k. Например, a2
fl
i
fl
3
fl
3
fl
4
fl
3
a
2
fl
i ~ Р
ас
"
становка длины 8. Такие расстановки называются размещения-
ми с повторениями из п по k (элементы одного вида могут повто-
ряться). Найдем общее число расстановок, среди которых две
расстановки считаются различными, если они отличаются друг
10 .Глава 1. Комбинаторные схемы
от друга или видом входящих в них предметов, или порядком
этих предметов. При составлении указанных расстановокдлины
k на каждое место можно поставить предмет любого вида. Рас-
смотрим множества XbX2,...,Xk такие, что Х1 = Х2 = ... - Xk = (аь
а2,..., ап} . Тогда все размещения с повторениями составят мно-
жество Х{ xX2x...xXk. По правилу прямого произведения по-
лучаем, что общее число размещений с повторениями из л по А:
равно Xl xX2*...xXk=n
k
.
Задача. Найти количество всех пятизначных чисел.
Решение. Введем пять множеств: А2 = А3=А4=А5 = {О, 1,..., 9},
А1 = {1, 2,..., 9}. Тогда все пятизначные числа составят прямое
произведение указанных множеств А{ х А2 х А3 х Д, х А5. Соглас-
но правилу прямого произведения, количество элементов в мно-
жестве AI х А2 х А3 х А х Л5 равно 9-10-10-10-10 =90000.
1.4. Размещения без повторений
Имеютсяпразличныхпредметовal,a2,...,an.Сколькоизних
можно составить расстановок длины k? Две расстановки счита-
ются различными, если они отличаются видом входящих в них
элементов или порядком их в расстановке. Такие расстановки
называются размещениями без повторений, а их число обо-
значают А%. При составлении данных расстановок на первое
место можно поставить любой из имеющихся п предметов. На
второе место теперь можно поставить только любой из п — 1
оставшихся. И, наконец, на &-е место — любой из п — k + 1
оставшихся предметов. По правилу прямого произведения по-
лучаем, что общее число размещений без повторений из л по А:
равно А% =n(n-)...(n-k+l)=n/(n-k}. Напомним, что
п = п(п -!)...! иО! = 1.
Задана. В хоккейном турнире участвуют 17 команд. Разыгры-
ваются золотые, серебряные и бронзовые медали. Сколькими
способами могут быть распределены медали?
Решение. 17 команд претендуют на 3 места. Тогда тройку при-
зеров можно выбрать способами Л^ =17-16-15 = 4080.
1.6. Сочетания 11
1.5. Перестановки
При составлении размещений без повторений из п по kмы по-
лучали расстановки, отличающиеся друг от друга либо составом,
либо порядком элементов. Но если брать расстановки, которые
включают все п элементов, то они могут отличаться друг от друга
лишь порядком входящих в них элементов. Такие расстановки
называются перестановками из п элементов, а их число обознача-
ется Рп. Следовательно, число перестановок равно Р„ =А" =«!.
Перестановки я = (щ, я2,...,я„) элементов 1, 2,..., п записывают и в
f Л 1 *
матричной форме тс =
п
, где верхняя строка— это по-
рядковые номера 1, 2,..., п позиций элементов в перестановке;
нижняя строка — тот же набор чисел 1, 2,..., я, взятых в каком-ли-
бо порядке; щ — номер элемента нау'-м месте перестановки. По-
рядок столбцов в перестановках, записанных в матричной форме,
не является существенным, так как в этом случае номер позиции
каждого элемента в перестановке указывается явно в верхней
строке. Например, перестановка (3,2,4,1) из четырех элементов
может быть записана как (* 2 4 l J ' ( 4 3 l 2 ) ' ( 2 3 l 4 J
H Т-Д
'
Задача оладьях. Сколькими способами можно расположить на
шахматной доске 8 ладей, чтобы они «не били» друг друга?
Решение. Условие «не могли бить» означает, что на каждой го-
ризонтали и вертикали может стоять лишь одна ладья. Ввиду это-
го, каждому расположению ладей на доске соответствует переста-
( 1 2 8 ^
новка я = . Верхняя строка перестановки — это но-
мера горизонталей, нижняя — вертикалей, пересечение которых
определяет положение ладей на доске. Следовательно, число рас-
становок равно числу перестановок /*8
= 8! из 8 элементов.
1.6. Сочетания
В тех случаях, когда нас не интересует порядок элементов в
расстановке, а интересует лишь ее состав, то говорят о сочетани-
ях. Сочетаниями из п различных элементов по k называют все
возможные расстановки длины k, образованные из этих элемен-
тов и отличающиеся друг от друга составом, но не порядком эле-
12 Глава 1. Комбинаторные схемы
ментов. Общее число сочетаний обозначают через С* или [ ?

к
Определим это число. Составим все сочетания из п по k. Затем пе-
реставим в каждом сочетании элементы всеми возможными спо-
собами. Теперь мы получили расстановки, отличающиеся либо
составом, либо порядком, т.е. это все размещения без повторений
из п по k. Их число равно А*. Учитывая, что каждое сочетание
дает №. размещений, то по правилу произведения можно записать
С*х*!=4*. Тогда С* = :, или С* = " ' , и
k k(n-k}
Qk = Qn-k
Задача о прямоугольниках. Сколько
различных прямоугольников можно
вырезать из клеток доски, размер кото-
рой т х л?
Решение. Прямоугольник однознач-
но определяется положением его сто-
рон. Горизонтальные стороны могут за-
нимать любое из т + 1 положения. Тогда число способов их выбо-
ра равно С^+1. Вертикальные стороны можно выбрать Сп
2
+1 спосо-
бами. По правилу прямого произведения заключаем, что
1
2
3
т
2 3 п
количество прямоугольников равно -С +1
.
1.7. Сочетания с повторениями
Имеются предметы п различных видов. Число элементов каж-
дого вида неограниченно. Сколько существует расстановок дли-
ны k, если не принимать во внимание порядок элементов? Такие
расстановки называют сочетаниями с повторениями, количество
и обозначение которых следующее Cn
k
= C^~
l
k_l =C*+k_l. Выведем
данную формулу.
Пусть а, Ь,с,..., d—это исходные различные типы элементов,
количество которых п. Рассмотрим произвольное сочетание с по-
вторениями cbbcaccda...ddaccbbb из данных типов элементов. Так
как порядок элементов в сочетаниях не учитывается, то расста-
новку можно записать и так: аа...а  bb...b  ее...с ...  dd...d, где
элементы каждого из типов упорядочены и завершаются вертика-
1.7. Сочетания с повторениями 13
льной чертой, за исключением последней серии элементов. Дли-
на такой расстановки с учетом вертикальных линий составляет
k + (n— l) = n + k— 1, где k — количество элементов в расстанов-
ке; п — 1 — число вертикальных линий. Очевидно, что любую та-
кую расстановку можно задать выбором из п + k — 1 места п — 1
место для положений вертикальных линий. Это можно сделать
СП+LI способами. Промежуточные места между линиями запол-
няются соответствующими типами элементов.
Задача. Трое ребят собрали в саду 63 яблока. Сколькими спо-
собами они могут их разделить между собой?
Решение. Поставим в соответствие каждому делению яблок
между ребятами сочетание с повторениями следующим спосо-
бом. Типами элементов в нашем случае будут ребята. Таким обра-
зом, имеемтри типа элементов а, Ь,с(п = 3), из которых предстоит
составить все различные расстановки длины k = 63. Наличие в
расстановке какого-либо из элементов а, Ъ, с отвечает принад-
лежности данного яблока соответствующему мальчику. Порядок
элементов в такой расстановке не играет роли. При делении яб-
лок между ребятами не важно, какое из них попадет тому или
иному мальчику/Гогда число способов разделить яблоки между
ребятами равно С3
63
= С3
"63Ч
=C3
2
+63
_1
=-^1 =2080.
Задача. Найти количество целочисленных решений системы
*! +х2
+ ... +хп
= k, k>0, xt
> 0, /'= 1, 2,..., п; п > I.
Решение. Рассмотрим следующую интерпретацию решения
уравнения. Каждое значение xt
= 1,+ 1,-+ ... + 1, представим как
сумму единиц, количество которых х{
. Индекс у 1, отмечает ее
принадлежность к разложению числа х(
. Таким образом, мы вве-
ли п типов различных элементов {11з
12
,..., !„}, значение каждого
из них равно единице. Теперь любое решение исходного уравне-
ния можно представить как сумму, составленную из k произволь-
ных единиц множества (Ij, 12
,..., !„}. Суммируя подобные едини-
цы 1, с одинаковыми индексами, можно составить соответствую-
щие слагаемые д;, решения исходного уравнения. Данное соответ-
ствие является взаимно однозначным, откуда и следует, что число
решений системы равно числу сочетаний с повторениями
Глава 1. Комбинаторные схемы
1.8. Перестановки с повторениями,
мультимножества
Задача формулируется следующим образом. Имеются предме-
ты k различных видов. Сколько существует перестановок из «j
элементов первого типа, п2 элементов второго типа и т. д., nk эле-
ментов &-го типа? Рассмотрим, например, мультимножество М=
{а, а, а, Ь, Ь, с, d, d, d, d}, в котором содержатся 3 элемента а, 2 эле-
мента Ь, 1 элемент с и 4 элемента d. Мультимножество — это то же
самое, что и множество, но в нем могут содержаться одинаковые
элементы. Повторения элементов можно указать и другим спосо-
бом:М={3-а,2•Ь,1•с, 4•d}.Такимобразом,искомыеперестановки
с повторениями — это перестановки элементов мультимножест-
ва. Если бы мы рассматривали все элементы множества М как
различные, обозначив их al; а2, а-$, blt Ь2, cl, dlt d2, d$, d$, то полу-
чили бы 10! перестановок, но после отбрасывания индексов мно-
гие из них оказались бы одинаковыми. Фактически каждая пере-
становка множества М встретилась бы ровно 3!-2!-1!-4!раз, поско-
льку в любой перестановке М индексы при буквах а можно рас-
ставить 3! способами, при Ь — 2! способами, при с — одним
способом, а при d — соответственно 4! способами. Поэтому число
перестановок множества Мравно ^ . В применении к обще-
му случаю те же рассуждения показывают, что число перестано-
вок любого мультимножества (перестановки с повторениями)
равно полиномиальному коэффициенту
где п = «J + п2
+ ... + nk
— общее число элементов.
Перестановки с повторениями имеют тесную связь с сочета-
ниями. Определим количество этих перестановок следующим об-
разом. Из всех п мест перестановки п{
место занимают элементы
первого типа. Выбор мест для них можно сделать С"
1
способами.
Из оставшихся п — п^ мест элементы второго типа занимают п2
места, которые можно выбрать С
п
п
г
_п
способами. Те же рассужде-
ния показывают, что элементы k-то типа можно расположить в
перестановке C"n
k
_n
_п
_п
способами. Согласно правилу прямо-
1 .9. Упорядоченные разбиения множества 15
го произведения, число перестановок с повторениями равно
Задача. Сколько существует различных перестановок из букв
слова «Уссури»? *
Решение.
1.9. Упорядоченные разбиения множества
ПодсчитаемчислоразбиенийконечногомножестваS, где | S=п,
на k различных подмножеств 5" = Si u S^ и ... и Sk
, попарно не пере-
k
секающихся, Sj = nh
i= 1, 2,..., k и ^]и, =п . Последовательность
различных Si, S2
,..., Sk
рассматривается как упорядоченная последо-
вательность подмножеств. При формировании упорядоченной Si,
S2
,...,Sk
последовательности на первое место подмножество Si мож-
но выбрать С^
1
способами, на второе место подмножество S2
можно
выбрать из оставшихся п — щ элементов С"*п
способами и т. д., на
последнее место множество Sk
можно выбрать из оставшихся
п - п{
- п2
-...- nk
_i элементов С"*_п
_п
_ _п
способами. По правилу
прямого произведения получаем, что общее число упорядоченных
разбиений множества S на k подмножеств равно
Г
п
 Г
п
г Cn
k —
П
-...v^
л л-rtj'•• n-n1-...-nt_1 и 1и f и ('
что совпадает с числом Д/ij, п2
,..., п/) перестановок с повторениями.
Замечание 1. Установим взаимно однозначное соответствие
между упорядоченными разбиениями множества и перестанов-
ками с повторениями. Каждой перестановке с повторениями
можно поставить в соответствие упорядоченное разбиение мно-
жества номеров элементов S= {1, 2,..., п} в перестановке на под-
множества Si, S2
,..., Sk
, где Sj — множество номеров элементов
г'-го типа в перестановке. Очевидно, что данное соответствие
между перестановками с повторениями и разбиениями является
взаимно однозначным.
Глава 1. Комбинаторные схемы
Замечание 2. Упорядоченные разбиения множества S на по-
парно непересекающиеся подмножества Sl u S2 и ... и Sk = £до-
пускают интерпретацию в терминах «корзин» и «шаров». Обозна-
чим элементы исходного множества | S  = п «шарами». Под разби-
ением исходного множества, теперь множества шаров, на различ-
ные Sj упорядоченные подмножества будем понимать
разложение шаров по & различным корзинам (упорядоченные S{,
$2,..., Sk подмножества): /ij шаров положить в корзину Si, пг шаров
положить в корзину ^ и т. д., nk шаров положить в корзину Sk, где
п{ + п2 + ... + nk = п. Как установлено, число таких разложений
равно СС^...^,...^^^-^.
Задача. В студенческой группе, состоящей из 25 человек, при
выборе старосты за выдвинутую кандидатуру проголосовали 19
человек, против — 3, воздержались — 3. Сколькими способами
может быть проведено такое голосование?
Решение. Имеем три различные корзины: «за», «против», «воз-
держались», в которые необходимо разложить 25 шаров, соответ-
ственно 19 — в первую, 3 — во вторую, 3 — в третью. Количество
таких разложений определяется выражением Cj5 -С$ -С] -jg^-y •
1.10. Неупорядоченные разбиения
множества
Подсчитаем, сколькими способами можно разбить множество
S, где | S | = п, на подмножества, среди которых для каждого / = 1,
2,..., п имеется mt
> О подмножеств с / элементами. Тогда верно,
п
что ^/-/и, =п. Данное разбиение позволяет представить исход-
ное множество следующим образом:
т„ п т,
7=1 7=1 7=1 i=lj=l
где ^попарнонепересекаютсяи$ц=Sa
= ... =| Sim
. = /длякаж-
дого /' = 1, 2,..., п. Порядок подмножеств в разбиении не является
существенным. Так, например, разбиения множества S- {1, 2, 3,
4, 5} вида
1.10. Неупорядоченные разбиения множества V7
{1, 3}, {4}, {25};
{1, 3}, {25}, {4};
{25}, {1, 3}, {4};
{4}, {1, 3}, {25};
считаются одинаковыми.
Обозначим число неупорядоченных разбиений множества S
через N(m^, m2,..., т„). Рассмотрим схему формирования упорядо-
ченных разбиений для представления п =l-ml +2-т2 +...+п-т„:
flf1
! /-<2 /-i2 г<Ъ /">3 /^п _
1 /712 '"З
л!
!Г2
...(л!)'""
Воспользуемся интерпретацией формирования упорядочен-
ных разбиений как разложения п различных шаров по различным
ml + т2 +... +тп корзинам так, что в каждую из /я, корзину кладут /
шаров. Теперь откажемся от упорядоченности подмножеств в
разбиении. Пусть все корзины имеют различное число шаров, та-
кие корзины можно рассматривать как различные (они отлича-
ются числом шаров). В этом случае упорядоченные и неупорядо-
ченные разложения шаров совпадают. Пусть теперь в разложении
существуют /и, корзин с одинаковым количеством шаров. При
упорядоченном разложении такие корзины рассматриваются как
различные. Однако при неупорядоченном разложении обмен ша-
рами таких корзин можно рассматривать как соответствующую
перестановку указанных корзин, что не приводит к новым разло-
жениям. Если количество корзин с одинаковым числом шаров
равно mt
, то неупорядоченных разложений будет в /п,! меньше,
чем упорядоченных. Тогда общее число неупорядоченных разби-
ений будет в ml
m2
...ml
^. раз меньше, чем упорядоченных. Следо-
вательно,
п
N(m,,m'>....,mn
)= '
Заметим еще раз, что если выполнено упорядоченное разбиение
числа п на подмножестваразличной длины (мощности), то они сов-
падают с неупорядоченными разбиениями. В этом случае все
т, б{0,1}.
IjB _ Глава 1. Комбинаторные схемы
Задача. Сколькими способами из группы в 17 человек можно
сформировать 6 коалиций по 2 человека и 1 коалицию из 5 чело-
век?
Решение. Требуется разбить множество из 17 человек на непере-
секающиеся и неупорядоченные группы людей. Откуда искомое
число равно 7V(Q 6 03,04Д5,06,07,...,0 )=
17!
.
(2!)
6
(5!)
1
6!1!
Задача. Сколькими способами можно разделить колоду из 36
карт пополам так, чтобы в каждой пачке было по два туза?
Решение. 4 туза можно разбить на — 11— = 3 различные коалиции
(2!)22!
по две карты в каждой (неупорядоченные разбиения), т.е. только 3
способами можно разделить тузы пополам. Далее, каждая полови-
на любого из этих трех разбиений тузов выполняет роль различных
двух «корзин», куда необходимо разложить пополам оставшиеся 32
карты. Разложение 32 оставшихся карт уже будет упорядоченным,
так как «корзины» различные, число разложений равно ^^. Со-
16! 16!
гласно правилу прямого произведения, общее число вариантов
41 32' 3-32
1
разделить колоду пополам равно . = _ . .
1.11. Полиномиальная формула
Формула
л!
• ... ..
nl
+n2
+...+nk
=n"l -»2 ••••"* •
называется полиномиальной, где суммирование выполняется по
всем решениям уравнения лj + л2
+ ... + nk
= и в целых неотрицате-
льных числах, я, > 0, / = 1, 2,..., k. Для доказательства выполним
умножение
+xk
)...(xl
+ x2
+...+xk
)=(xl
Чтобы привести подобные в полученном выражении, необхо-
димо подсчитать количество одночленов вида jc"
1
x
n
j . . .x",
k
каждо-1 ^ К
го разбиения щ + п2
+ ... + nk
= n. Для получения же одночлена
x"l
x^2
...x"k
k
необходимо выбрать jct
в качестве множителя в п±
1.12. Бином Ньютона _ _ 19
скобках при раскрытии выражения (xl
+ х2
+ ... + xk
)n
. Это можно
сделать С1
^ способами. Из оставшихся п — п{
не раскрытых ско-
бок необходимо выбрать х2
в качестве множителя в п2
скобках.
Это можно сделать С"1п
способами и т. д. Тогда количество од-
ночленов х"1
х"2
2
. . .x"k
k
при раскрытии выражения
(xl
+x2
+...+xk
)(xl
+ x2
+...+xk
)...(xl
+x2
+...+xk
)
~"~ п
будет равно числу С'С^ ...С"п
^_ _^^ =^ '^ , упорядо-
ченных разбиений.
1.12. Бином Ньютона
Частный вид полиномиальной формулы (1.11.1):
=YJ
Ck
ak
bn
'k
(1.12.1)
называется биномом Ньютона.
Рассмотрим несколько задач, в основе решения которых ле-
жит бином Ньютона.
п
Задача 1. Доказать тождество ^С* =2".
Решение. Воспользуемся формулой (1.12.1) бинома Ньютона,
в которой положим а = 1 и Ъ = 1, тогда (1+1)" =^С% -lk
-l"~k
.
п
Задача 2. Доказать тождество ^С„(т -l)"'k
=m".
*=о
Решение. Воспользуемся формулой (1.12.1), где положим а = 1
и Ь = т — 1.
m m
Задача 3. Доказать тождество Xе
/? = ZС
п =2
•
/ЫО *=1
Решение. Воспользуемся формулой (1.12.1), в которой положим
а
= 1 и £= -1, тогда (1-1)" =£(-!)*С* =0. Группируя положите-
*=о
льные и отрицательные члены равенства, установим
20 Глава 1. Комбинаторные схемы
f '. Так как С„
2
*
1
= с* =2», то каж-
/t=0 /t=l )t=0 *=1 /t=0
дая из сумм составляет половину числа 2".
Задача 4. Доказать тождество]^k -С* =«2"~
1
.
Решение. Воспользуемся формулой (1.12.1), из которой, пола-
гая а = 1 и Ъ = х, получим (1+jc)" = "^C
k
x
k
. Дифференцирование
последнего равенства дает «(l+x)""
1
= ^k-C
k
x
k
~
l
. Пусть х= 1 ,
тогда n(l+l)"~
l
= ^k-C
k
l
k
~
l
, что доказывает искомое тождество.
1.13. Инверсии
Перестановки особенно важны при изучении алгоритмов сор-
тировки, так как они служат для представления неупорядоченных
исходных данных. Чтобы исследовать эффективность различных
методов сортировки, нужно уметь подсчитывать число переста-
новок, которые вынуждают повторять некоторый шаг алгоритма
определенное число раз.
Пусть (а1
,а2
,...,ал
) — перестановка элементов множества {1,
2,..., п}. Если / <j, а а, > я,-, то пара (a,-, aj) называется инверсией
перестановки. Например, перестановка 3142 имеет три инверсии
(3, 1), (3, 2), (4, 2). Каждая инверсия — это пара элементов, «нару-
шающих порядок»; следовательно, единственная перестановка, не
содержащая инверсий, — это отсортированная перестановка (1,
2,..., л).
Таблицей инверсии перестановки (а{
, а2
,.. ., ап
) называется по-
следовательность d{
d2
...dn
, где dj — число элементов, больших/ и
расположенных левее/ Другими словами, dj — число инверсий, у
которых второй элемент равен/ Например, таблица инверсий пе-
рестановки 5 9 1 8 2 6 4 7 3 будет 2 3 6 4 0 2 2 1 0 , поскольку 5 и 9
расположены левее 1; 5, 9, 8 — левее 2 и т. д. Всего 20 инверсий.
По определению
О < dv
< п - 1, 0<d2
<n-2, ..., О < </„_! < 1, dn
= 0.
1.14. Обратные перестановки 21
М. Холл установил, что таблица инверсий единственным обра-
зом определяет соответствующую перестановку. Из любой табли-
цы инверсий d"id2...dn можно однозначно восстановить переста-
новку, которая порождает данную таблицу, путем последователь-
ного определения относительного расположения элементов п,
п — !,...,! (в этом порядке). Например, перестановку, соответст-
вующую таблице инверсий (2,3,6,4,0,2,2,1,0) = d^d^d^d-jd^,
можно построить следующим образом: выпишем число 9; так как
ds = 1, то 8 стоит правее 9. Поскольку d1 = 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, придем к перестановке (5,9,1,8,2,6,4,7,3).
Такое соответствие между перестановками и таблицами ин-
версий важно, потому что часто можно заменить задачу, сформу-
лированную в терминах перестановок, эквивалентной ей задачей,
сформулированной в терминах таблиц инверсий. Рассмотрим,
например, еще раз вопрос: сколько существует перестановок
множества {1,2,...,л}? Ответ должен быть равен числу всевозмож-
ных таблиц инверсий, а их легко пересчитать, так как d{
можно
выбрать п различными способами, d2
можно независимо от d{
вы-
брать п - I способами и т.д., dn
— одним способом. Тогда различ-
ных таблиц инверсий п(п — !)...! = п. Таблицы инверсий пере-
считать легко, потому что все dj независимые, в то время как эле-
менты uj перестановки должны все быть различными.
1.14. Обратные перестановки
Не следует путать «инверсии» перестановок с обратными пе-
рестановками. Пусть аь
а2
,..., ап
— различные шары, индексы
которых свяжем с номерами шаров. Тогда исходное расположе-
ние шаров однозначно определяется тождественной переста-
новкой е = (1, 2,..., и). Пусть п = (я^я^.....^) — произвольная пе-
рестановка номеров 1, 2,..., л, где nk
— номер шара наfc-мместе.
Такая перестановка отвечает расположению шаров
й„. ,ап
,...,ял
. Вспомним (см. п.1.5), что перестановка
| 2 ••• п |может
быть записана в матричном виде. Данная
1*1 "2 ••• ъп
)
22 Глава 1. Комбинаторные схемы
форма записи позволяет рассматривать перестановку в качест-
ве оператора, который заменяет старые номера шаров — верх-
няя строка матрицы — на новые номера — нижняя строка мат-
рицы. Тогда результат двух последовательных изменений
л = (л1; л2,..., л„) и ст = (CTI, ст2,..., ст„) исходной последовательно-
сти 1, 2,..., п номеров шаров можно рассматривать как операцию
умножения перестановок р = яа =
п
'' ... п
Упорядочим столбцы перестановки а в соответствии с переста-
2 ••• пновкойл = Оч, л2,..., я„), т.е. ст=!
( 1 9 п
Тогдаможнозаписать, чтор =лог = ". , , ст
 1 2 л у v jtj Л2
'"
п
'-' •••"]. Этой перестановке отвечает
••Pnj
расположение шаров api,api,...,apnгде значение pk =стп^ — это
номер шара на k-м месте.
( 1 2 пОбратной к перестановке я = называется пере-
V
71
! Л
2 ' ' Л
л7
становкал~' = ' „
2
"
s
-i -i -i I которая получает-
^ 1 2 ... п) [ji^ я2 ... п„ j
ся, если в исходной перестановке поменять местами строки, а за-
тем упорядочить столбцы в возрастающем порядке по верхним
элементам,т.е.л"
1
=(itl
l
,n2
1
,...,л~').Ясно,чтопоследовательное
изменение порядка шаров согласно перестановкам л = (л^ л2
,...,
л„) иобратной л'
1
=(я^
1
,л2
!
,...,л'
1
)приводиткисходномуихрас-
положению, т.е. к тождественной перестановке
2 '.'.'.
перестановке (5,9,1,8,2,6,4,7,3) будет перестановка (3,5,9,7,
16849^ таккя^Г
5 9 1
8 2 6 4 7 3 W 1 2 3 4 5 6 78 9')
1,о,б/Ь4>, т,
К
|ч
1 2 3 4 5 6 7 8 9j~v
3 5 9 7 1 6 8 4 2J-
Сортированную последовательность элементов перестановки
л = (я1, я2
,..., я„) можно получить, заполнив в цикле вектор elt
<?2
,...,
en-
far k =l to n do en
=nk или f{nk] = nk.
1.14. Обратные перестановки 23
Ясно, что результирующие значения q, e2,..., е„ будут соответ-
ственно 1,2,...,л. В цикле каждый элемент uk встает на свое упоря-
доченное место еп (см. п.5.7). Подобным образом выполним за-
полнение элементов перестановки л'
1
=(я^', я2
:
,..., я"
1
), однако в
упорядоченное место я"
1
элемента nk будем размещать его номер
в исходной перестановке я = (яь я2,..., я„):
for k=to n do я"
1
=k или n'
l
[nk]=k.
Результирующий вектор я'
1
=(я^, я^
1
,..., я"
1
) будет обратной
перестановкой к я = (KI, я2,..., я„).
X. А. Роте впервые установил связь между обратными переста-
новками и инверсиями: обратная перестановка содержит ровно
столько же инверсий, сколько исходная.
Глава 2 —
Представление абстрактных
объектов
ассматривая решение задачи с абстрактной точки зрения,
как правило, избегают каких бы то ни было предположений отно-
сительно того, как мы намерены автоматизировать ее решение.
В идеале структура вычислительной машины должна соответ-
ствовать естественной структуре задачи, однако это требование
часто не выполняется, хотя приспособляемость современной вы-
числительной техники такова, что она позволяет обойти эти огра-
ничения без труда. Языки высокого уровня при условии, что они
должным образом сконструированы, предоставляют в распоря-
жение программиста, реализующего алгоритм, более удобную
«машину», смягчая несоответствие основной машины требова-
ниям алгоритма. Будем считать, что читатель знаком с элементар-
ными понятиями математики и основными типами данных: це-
лыми и вещественными числами, массивами, строками и т. д.
2.1. Представление последовательностей
Любой заданный класс абстрактных объектов может иметь не-
сколько возможных представлений, и выбор наилучшего из них
решающим образом зависит от того, каким образом объект будет
использован, а также от типа производимых над ним операций.
2.1.1. Смежное представление
В алгоритмах на дискретных структурах часто приходится встре-
чаться с представлением конечных последовательностей и операци-
ями с ними. С вычислительной точки зрения простейшим пред-
ставлением конечной последовательности 5Ъ s2, ..., sn является точ-
ный список ее членов, расположенных по порядку в смежных ячей-
ках памяти. В языках высокого уровня — это одномерные,
двухмерные и т. д. массивы данных. Наряду с очевидными преиму-
ществами последовательное представление имеет и некоторые зна-
чительные недостатки. Смежное представление становится неуд об-
2.1. Представление последовательностей 25
ным, если требуется изменить последовательность путем включе-
ния новых и исключения имеющихся там элементов. Включение
между Sj и si+i нового элемента требует сдвига s^, S/+2,..., snвправо на
одну позицию; аналогично исключение ^требует сдвига тех же эле-
ментов на одну позицию влево, как показано в алгоритме 2.1.
Алгоритм 2.1. Включение и исключение элементов
при последовательном размещении
(Включить элемент z на i-e место }
п = п + 1;
forj - п — 1 to i by — 1 do Sj+i = Sj,
st = z.
{Исключить элемент с i-го места }
forj = i to n — I do Sj = Sj+l'}
n = n — 1.
В обоих случаях включение или удаление элементов при смеж-
ном представлении требует перемещения многих элементов. С
точки зрения времени обработки такое перемещение элементов
может оказаться дорогостоящим из-за сложности операций
включения и удаления 0(п).
2.1.2. Характеристические векторы
Важной разновидностью смежного размещения является слу-
чай, когда такому представлению подвергается подпоследовате-
льность sk
,sk
,...,sk
некоторой основной последовательности
5j, s2
,..., sn
. В этом случае подпоследовательность можно предста-
вить более удобно, используя характеристический вектор — по-
следовательность из нулей и единиц, где /'-и разряд равен едини-
це, если Sj принадлежит рассматриваемой подпоследовательно-
сти.
Например, для последовательности (1,2,3,4,5,6,7,8,9) характе-
ристический вектор подпоследовательности чисел, кратных 3,
имеет вид (0,0,1,0,0,1,0,0,1).
Характеристические векторы полезны в том случае, когда
формирование нужной подпоследовательности выполняется пу-
тем последовательного удаления из основной последовательно-
сти элементов, которые не входят в подпоследовательность. Глав-
ное неудобство характеристических векторов состоит в том, что
они не экономичны.
26 Глава 2. Представление абстрактных объектов
2.1.3. Связанное размещение
Неудобство включения и исключения элементов при смежном
представлении происходит из—за того, что порядок следования
элементов задается неявно требованием, чтобы смежные элемен-
ты последовательности находились в смежных ячейках памяти. В
результате многие элементы последовательности во время вклю-
чения или исключения должны передвигаться.
Если требование последовательного размещения элементов
опущено, то операции включения и исключения можно выпол-
нить без того, чтобы передвигать элементы. При любом размеще-
нии элементов необходимо сохранять информацию о способе их упо-
рядочения. При связанном размещении последовательности sb
s2
,..., sn
каждому Sj ставится в соответствие указатель /,, который
указывает на следующую подобную пару элементов si+l
, li+l
no
списку. Вводится начальный указатель /0
, который указывает на
первый элемент s^ последовательности. Последний указатель /„ в
списке является пустым или нулевым, это признак конца списка.
Графическое представление связанного списка можно изобра-
зить следующим образом:
Здесь каждый элемент связанного списка состоит из двух по-
лей. В поле DATA размещен сам элемент последовательности, а в
поле NEXT — указатель на следующий за ним элемент. Связан-
ное представление последовательностей облегчает операции
включения и удаления элементов из списка. Например, для иск-
лючения второго элемента достаточно переустановить указатели
NEXT(/i) = NEXT(/2
). Графически это изображается следующим
образом:
до исключения
после исключения —
Чтобы в последовательность включить новый элемент sr
после
sl}
необходимо установить указатели: NEXT(/r
) = NEXT(/j) и
NEXT(/j) = lr
, начальное значение указателя установлено на но-
вый включаемый элемент. Графически включение нового эле-
мента изображается так:
2.1. Представление последовательностей 27
do включения — /0
—H
«осле включения —
С помощью связанных распределений мы добились большей
гибкости, но потеряли возможность работать с элементами по-
следовательности как с массивами, когда по номеру / можно не-
посредственно обратиться к элементу st
. В связанном размеще-
нии такой возможности не существует, и доступ к элементам по-
следовательности не является прямым и эффективным. Напри-
мер, при поиске среднего элемента последовательности, даже
при известной ее длине, требуется просмотреть по связанному
списку половину последовательности. В алгоритмах 2.2 и 2.3 при-
водятся программы, реализованные на языках Pascal и С, связан-
ного формирования списка элементов последовательности. В
программы включены операции работы со списком: печать эле-
ментов списка, включение новых элементов в список и удаление
элементов из списка.
Существуют различные модификации представления после-
довательностей в виде связанных списков. Следующие два при-
мера позволят, при желании, читателю самостоятельно продол-
жить получение и других модификаций связанных распределе-
ний, отличных от приводимых ниже.
Циклическая форма представления позволяет эффективно
возвращаться с последнего элемента списка к первому.
Рис. 2.1. Циклический список
Еще большая гибкость достигается, если использовать дважды
связанный список, когда каждый элемент последовательности
вместо одного имеет два связанных с ним указателя. В таком спи-
ске для любого элемента имеется мгновенный прямой доступ к
предыдущему и последующему элементам. Следует помнить, что
28 Глава 2. Представление абстрактных объектов
выбор того или иного представления последовательности в зна-
чительной степени зависит от типа операций, выполняемых с
элементами последовательности.
Рис. 2.2
Дважды
связанный
список
/о"* 0 5, 1*2 •4 л 0
Алгоритм 2.2. Программа на Pascal 'е включения и исключения
элементов из списка
Program Number_List; {Связанный список данных}
uses CRT;
type
NodePointer=A
Node;
Node= RECORD {Элемент связанного списка}
s :Integer; (Элемент последовательности}
next :NodePointer;
{Указатель на следующий элемент}
END;
const first :NodePointer=NIL;
{Указатель начала списка}
{Генерация нового элемента списка}
function InitNode: NodePointer;
var newNode :NodePointer;
begin
New(newNode); {Выделить память новому элементу}
newNode
A
.s:=Random(99)+1;
{Значение нового элемента}
newNode
A
.next:=NIL;
InitNode:=newNode;
end;
{Включить новый элемент в начало списка}
procedure IncludeNode( newNode: NodePointer );
begin
newNode
A
.next:=first;
first:=newNode;
end;
{Удалить из списка k-й элемент}
2.1. Представление последовательностей _ 29
procedure DeleteNode ( k : Integer ) ;
var previos, current :NodePointer;
i : Integer;
begin
i:=0;
current:=first;
while currentoNIL do begin
if i=k then begin { k-й элемент найден}
if first=current then first :=current
A
.next
else previos'
4
.next : =current
A
.next;
{Удаление из списка}
dispose(current);
break;
end;
previos:=current;
current:=current
A
.next;
end;
end;
procedure PrintNodeList; {Печать элементов списка}
var p :NodePointer;
begin
WriteLn;
p:=first;
while ponil do begin
Write(p
A
.s:3,' ');
р:=р
л
.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; {Удалить из списка m-й элемент}
DeleteNode(m);
PrintNodeList;
ReadKey;
end. (Main)
30 _ Глава 2. Представление абстрактных объектов
Алгоритм 2.3. Программа на Си включения и исключения
элементов из списка
#include <stdio.h>
tinclude <stdlib.h>
ttinclude <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-й элемент найден
i f ( 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("n");
m=17; //Удалить m-й элемент
DeleteNode(m) ;
PrintNodeList();
getch();
Связанное представление предпочтительнее лишь в том слу-
чае, если в значительной степени используются операции вклю-
чения и исключения элементов.
2.2. Представление деревьев
Конечное корневое дерево ^формально определяется как непу-
стое конечное множество упорядоченных узлов, таких, что суще-
ствует один выделенный узел, называемый корнем дерева, а
оставшиеся узлы разбиты на т > 0 поддеревьев 7, Т2,..., Тт.
Корневое дерево на рис. 2.3 содержит 9 узлов, помеченных
буквами от а до л Узлы с метками e,f, с, g, h, r являются листьями,
остальные узлы — внутренние. Узел с меткой а — корень. Поня-
тие дерева используется в различных аспектах. Деревья — наибо-
лее важные нелинейные объекты, используемые для представле-
ния данных в алгоритмах на дискретных структурах.
32 Глава2.Представлениеабстрактныхобъектов
Рис. 2.3. Корневое дерево с тремя поддеревьями
Важной разновидность корневых деревьев являются бинарные
деревья. Бинарное дерево Глибо пустое, либо состоит из выделен-
ного узла, называемого корнем, идвухбинарныхподдеревьев: ле-
вого 7i и правого Т2.
Лесом называют упорядоченное множество деревьев. Тогдаде-
рево можно определить как непустое множество узлов, такое, что
существует один выделенный узел, называемый корнем дерева, а
оставшиеся узлы образуют лес с поддеревьями корня.
2.2.Л. Представление деревьев на связанной
памяти
Почти все машинные представления деревьев основаны на
связанных распределениях. Каждый узел состоит из поля данных
и некоторых полей для указателей. В следующем примере пред-
ставления дерева каждый узел имеет по три поля указателей.
first
Рис. 2.4. Регулярная связанная структура представления дерева
Произвольное дерево с переменным числом поддеревьев все-
гда можно представить с помощью односторонних списков с ис-
пользованием двухкомпонентных звеньев, в которых в первом
поле находится либо указатель, либо данные, а во втором — все-
гда указатель.
2.2. Представление деревьев 33
first
Рис. 2.5. Универсальная связанная структура представления дерева
Применение указателей и связанных списков придает памяти
гибкость, необходимую для представления различных структур.
Но при этом легко и перестараться; поэтому следует избегать
слишком большого количества указателей; сложность програм-
мной поддержки таких структур возрастает «экспоненциально»,
теряется четкость основной структуры, которую пытаются пред-
ставить в памяти (последний пример представления дерева это
наглядно подтверждает).
2.2.2. Представление деревьев
на смежной памяти
Представление деревьев на смежной памяти (одномерный
массив) предполагает неявное присутствие ребер, переход по ко-
торым выполняется посредством арифметических операций над
индексами элементов массива — смежной памяти. Формирова-
ние таких деревьев с помощью адресной арифметики можно осу-
ществлять двумя способами. Идея первого способа применима
при любом постоянном количестве ребер, выходящих из вершин
(регулярное дерево). Рассмотрим данный способ формирования
на примере двоичного (бинарного) дерева.
Пусть имеется одномерный массив смежных элементов аъ
а2,..., а„. Неявная структурадвоичного дерева определяется как на
рис. 2.6.
По дереву на рис. 2.6 легко перемещаться в обоих направлениях.
Переход вниз на один уровень из вершины a[k] можно выполнить,
удвоив индекс k (индекс левого поддерева) или удвоив и прибавив 1
(индекс правого поддерева). Переход вверх на один уровень из вер-
шины а[т] можно выполнить, разделив m пополам и отбросив
дробную часть. Рассмотренная структура применима к любому де-
реву с постоянным количеством ребер, выходящих из вершин.
2—2697
34 Глава 2. Представление абстрактных объектов
a[2k] a[2k+l] a[m] . . . a[n]
Рис. 2.6. Двоичное дерево на смежной памяти с последовательной
нумерацией вершин
Другой способ, основанный на индексной арифметике, при-
меним только для двоичных деревьев. Пусть для представления де-
рева используется одномерный массив а,, ам,..., а,. Корнем дере-
ва полагают элемент ат, где индекс элемента корня рассчитыва-
ется по формуле т = [_(/ +/)/2_|, т.е. середина массива. Левое под-
дерево располагается в массиве а,, а/+1,..., ат_, а правое
поддерево — в массиве ат+1, ат+2,..., о,. Корни поддеревьев рас-
считываются подобным же образом, как и корень основного де-
рева. Второй способ формирования двоичных деревьев на смеж-
ной памяти имеет довольно ограниченное применение. Основ-
ное его использование — поиск данных,в сортированных масси-
вах, таблицах и т.д.
В качестве примера использования представления регулярных
деревьев на смежной памяти рассмотрим решение следующей за-
дачи.
Задача. Написать программу поиска всех а
замкнутых маршрутов длины /К15 по ребрам
треугольника abc. Длину ребра принять рав-
ной 1. Начальная и конечная точка искомых
маршрутов — вершина а. Длина маршрута п
задается в текстовом файле исходныхданных.
Результаты расчетов всех маршрутов сохранить в выходном тек-
стовом файле. Каждый маршрут представить как последователь-
ную комбинацию меток а,Ь,с посещаемых вершин треугольника
при движении по нему. Каждый маршрут должен включать л+1
метку, где первой и последней меткой должна быть вершина а.
Пример файла исходных данных:
4
2.2. Представление деревьев 35
Выходной файл для данного примера:
abcba 1
ababa 2
acaba 3
abaca 4
асаса 5
acbca 6
В алгоритме 2.4 представлена программа расчета всех искомых
маршрутов длины я. Алгоритм делится на две части. В первой час-
ти (процедура CreateTreeA.bc) выполняется формирование двоич-
ного регулярного дерева на смежной памяти рис. 2.7.
Алгоритм 2.4. Программа на Pascal's поиска
замкнутых маршрутов по треугольнику
Program Тгее_АЪс; {Движение по треугольнику АЬс)
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,m,ml,m2 :LongInt;
begin
z[l]:='a'; {Вершина а}
level:=1; {Номер уровня}
ml:=l; {Индекс первой вешины уровня}
m2:=l; {Индекс последней вешины уровня}
while level<=n do begin
for k:=ml to m2 do begin {Заполнить следующий
уровень дерева}
m:=2*k;
case z[k] of
'a': begin z[m]:='b'; z[m+l]:='c'; end;
'b': begin z[m]:='c'; z[m+l]:='a'; end;
'c': begin z[m]:='a'; z[m+1]:='b'; end;
end;
end;
level:=level+l;
36 Глава 2. Представление абстрактных объектов
ml:=2*ml;
m2:=2*m2+l;
end;
end;
Procedure RouteTreeAbc( n:Integer ); {Формирование
маршрутов}
var
i,k,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 показывают соответствующее их место в массиве
данных (смежной памяти).
с[4] а[5] а[6] Ь[7]
а[8] b[9] b[10] c[ll] b[121 с[13] с[14] а[15]
Л Л Л / / Л / /Ь[1б| с[17] с[18]а[19] с[20] а[21] а[22] Ь[23] с[24] а[25] а[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 представления последовательностей.
с а Ъ X у г
X
у - #
Рис. 2.8. Смежное и связанное представление множества в памяти
Как и для последовательностей, наилучший метод представления
множеств существенно зависит от операций, которые мы собира-
емся выполнять над ними. Типичные операции над множествами:
выяснить, имеется ли конкретный элемент в данном множестве;
добавить в множество новые элементы; удалить элементы из мно-
жества; выполнить обычные теоретико—множественные операции,
такие как объединение или пересечениедвух множеств. Как прави-
ло, для представления множеств применяют связанную память.
При втором методе множество представляется в виде вектора
на смежной памяти. Пусть U — универсальное множество (т. е.
все рассматриваемые множества являются его подмножествами),
состоящее из п элементов. Любое подмножество 5с{/представ-
ляется в виде характеристического вектора из п элементов. Эле-
мент / в этом векторе равен 1 тогда и только тогда, когда /-и эле-
мент множества U принадлежит S, в противном случае он уста-
навливается равным 0 (рис. 2.9).
Представление в виде характеристического вектора удобнее тем,
что можно определять принадлежность /-го элемента множеству за
время, не зависящее от его размера. Основные операции над мно-
жествами, такие как объединение и пересечение, можно осуществ-
лять как операции v и л наддвоичными векторами. Недостаток это-
го представления заключается в том, что операции объединение и
пересечение занимают время, пропорциональное мощности уни-
версального множества U, а не рассматриваемого множества S.Дан-
ное представление требует дополнительной памяти для хранения
характеристического вектора, что для больших я (размер универса-
льного множества U) бывает практически невыполнимо.
1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 0
Рис. 2.9. Представление множества характеристическим вектором
Методы подсчета и оценивания
ассмотренные в предыдущих разделах комбинаторные
формулы подсчета означают вычисление или определение
свойств некоторой последовательности чисел, соответствующие
той или иной задаче. В этомразделе предлагается полезный инст-
румент для работы с последовательностями. Идея состоит в том,
чтобы каждой числовой последовательности сопоставить функ-
циюдействительного или комплексного переменного, с тем, что-
бы обычные операции над последовательностями
соответствовали простым операциям над соответствующими
функциями. Аналитические методы работы с функциями оказы-
ваются проще и эффективнее, чем непосредственные комбина-
торные методы работы с последовательностями.
3.1. Производящие функции
Пусть а0, «j, а2,... — произвольная последовательность. Сопо-
ставим последовательности функцию действительного или ком-
плексного переменного:
4*)= !>***• (3.1.1)
*»о
Функция А(х) называется производящей функцией последовате-
льности а0, ai,a2,.... Какправило, поискфункцииА(х) по форму-
ле (3.1.1) прямыми методами является сложной задачей. Однако
заметим, что последовательность {ak} может быть восстановлена
по А(х). Выражение (3.1.1) является разложением А(х) в ряд Тей-
лора в окрестности точки х = 0. Воспользуемся этим замечанием
и приведем некоторые наиболее распространенные производя-
щие функции и соответствующие им последовательности.
40
Производящие
1 v
1-х &
1 ^,
(1-х)
2
~
1
-У
1-* Я
1П
Л , v  V
(i+ *)' -I
е" = Z
е
"
=
Й
1 ^v-xY ~h
функции А(х)
1 - Х *
i
t l f ,  v-A(К + 1)Х
1
х*
/t x
,(;>'i *V
'
..*
r
—-xk
(r+ k -iV*
,1 * J*
Глава 3. Методы подсчета и оценивания
Последовательности {а^}
at
k+l, k>0 (3.1.3)
о и
. a
t ^ ' (3.1.4)
" ' ' * /с ' ' '
at
= l^},k>l,r — любое (3.1.6)
|в4
= р,Л2:0 (3.1.7)
Г*
i at
= — , Л>0, /- — любое (3.1.8)
Г г + Л - Л
at
^ ,к>0,г любое (3.1.9)
Задача. Найти число ^-мерных граней в л-мерном кубе.
Решение. Обозначим через ak
число Л-мерных граней в «-мер-
ном кубе, где 0 < k < п. Тогда производящую функцию последова-
п
тельности {ak
} можно записать как А„(х) = ^ak
x . Индекс п для
/ыо
А„(х) показывает размерность куба. Например, А0
(х) = 1,
AI(X) = 2 + х, А2
(х) = 4 + 4х + х2
. Рассмотрим производящую функ-
цию Ап+1
(х) последовательности {ak
} для (п +1)-мерного куба. За-
метим, что (и +1)-мерный куб можно получить из я-мерного куба
сдвигом последнего по (я +1)-му измерению. На рисунке показан
пример получения трехмерного куба сдвигом по тре-
тьему измерению квадрата (двухмерного куба). От-
сюда видно, что (я +1)-мерный куб включает два ста-
рых л-мерных куба и каждая ^-мерная грань при
сдвиге переходит в (k +1)-мерную грань. Из приведенных рассуж-
дений следует, что
Ап+1
(х) = 2А„(х) + х • Ап
(х), где А^х) = 1.
Отсюда
3.1. Производящие функции 41
Воспользуемся разложением бинома Ньютона:
4=0 k=0
Сравнивая коэффициенты при степеняхx
k
, получим, что число
А:-мерных граней в л-мерном кубе равно ak = 2"~
k
C
k
t . Например,
ЛзОс)=2
3
-
0
Сз
0
х
0
+2
3
-
1
С3-;с
1
+2
3
-
2
C3
2
JC
2
+2
3
-
3
C3V = 8 + Ux+ 6x
2
+
+ x
Простейшие производящие функции (3.1.2)—(3.1.9) будем ис-
пользовать как «строительные кирпичики» для получения произ-
водящих функций более сложных последовательностей. С этой
целью рассмотрим наиболее важные из операций над производя-
щими функциями, т.е. способы получения новых производящих
функций и соответствующих им последовательностей. Обозна-
чим через {ak}, {bk}, {ck} последовательности, а соответствующие
им производящие функции — как Л(;с), В(х), С(х).
3.1.1. Линейные операции
Если а и р константы, то последовательность ck = a • ak + p • bk
имеет производящую функцию С(х) = а. • А(х) + (3 • В(х).
Например, последовательность {1} соответствует производя-
щей функции-, а последовательность  — L соответствует про-
1-х [^!j
изводящей функции е*, тогда последовательность  100+ — I соот-
( k
100 .х
ветствует производящей функции -+5е .
1-х
3.1.2. Сдвиг начала вправо
Пусть последовательность {bk
} определяется через последова-
тельность {ak
} следующим образом:
bk
= Q для k = 0, 1,..., / - 1 и
bk
= ak
_j дня k = i, i + 1,..., тогда В(х) = х'А(х).
Действительно
k=i
42 3. Методы подсчета и оценивания
3.1.3. Сдвиг начала влево
Пусть последовательность {bk} определяется через последова-
тельность {ak} следующим образом: bk = ak+i, k = 0, I,..., тогда
*=0
Действительно
А=0
со /-I /-I
.*=0 k=0 A=0
3.1.4. Частичные суммы
Пусть последовательность {bk} определяется через последова-
тельность {ak} следующим образом:
bk =Z
u
i>
k=
°. !>•••> тогда В(х)=-^-.
/=о 1-*
Действительно
1 2 3 4
/t=o /=o
*=0 U»0
Множество пар точек (k, /), по которым ведется
суммирование, представлено на рисунке. Изме-
ним порядок суммирования (сначала по /, затем
по k). Выражение для Б(х) примет вид
/=o /=o
3.1.5. Дополнительные частичные суммы
Пусть последовательность {bk
} определяется через последова-
тельность {ak
} следующим образом:
** =|>/. * = 0. 1..... тогда В(Х) =
А(1)
~
i=k 1-Х
3.1. Производящие функции 43
Действительно
;uo *=oV/=* ) 5
4
Множество пар точек (k, f), по которым ведется з
суммирование, представлено на рисунке. Из- 2
меним порядок суммирования (сначала по /,
затем по К). Выражение для В(х) примет вид О
пг
1 2 3 4 k
1=0 u=o ^ /=о
,/+1
Л А()-х-А(х)
'
v
О (=0
3.1.6. Изменение масштаба
1. Пусть последовательность {bk
} определяется через последо-
вательность {ak
} следующим образом:
bk
= k- ak
, тогда В(х) = х • А'(х).
Действительно
и Д-1
*=о
или
=B(x).
2. Пусть последовательность {bk} определяется через последо-
вательность {ak} следующим образом:
=p-, тогда B(x)=--A(x)dx.
Jk+1
Поскольку , то
А=0 о k=0
K+i
k=0
44 Глава 3. Методы подсчета и оценивания
3.1.7. Свертка
Последовательность
c
k =Е
Й
Л-,'
k
= °- 1>->
тог
Д
а
ОД =Д*
/=о
00 00
Действительно, Дх) = ^я*** и 5(х) = ^^х*, тогда
/1=0 *=OU=0 ) /=OA=i
СО _ 00 / 00  I 00 
1=0 A=i Vi»0 ) U=0 J
Далее обсудим наиболее общие приемы использования произ-
водящих функций на примере решения следующих задач.
Задача. Рассмотрим обобщенное биномиальное правило рас-
крытия выражений.
а-*)г
*
где обобщенный биномиальный коэффициент
k
=
(_
к
' V ту---У т"- ~1) _/'_1Ч*
Тогда
1
Рассмотрим полученное выражение при г = — .
3.1. Производящие функции 45
2*-iM-3-5.7...(2*-3) л ^ 1.З.5...(2*-3)
2*£! £, 2**!
, у( D
2 * - i - - . . . . - л
. . . . . - t =
2*£! £, *
il-2-3-4-S-6...(2£-3)(2fc-2) =
fci 2**!-2-4-6...(2Л-2)
^l-2-3-4-5-6...(2fc-3)(2fc-2) k
_— J^ > —• л ~~
1
* 1 Z. Lil, 2* I. t . 4L Ч « * Vx Т I. Т fc
~2_, —x =1-2^—^-=-x .
Таким образом,
,2 СA-l
Рассмотримвыражение =(!-*) г
при /•= 1.
где
Следовательно, —=(l-jc)-1
=£(-!)* (-х)* =Jjc
1
-д:
= =
Задача. Сколькими способами можно разбить выпуклый
(п + 3)-угольник (п > 0) на треугольники диагоналями, не пересе-
кающимися внутри многоугольника?
Решение. Пусть мл+3 — искомое число способов разбить
(п + 3)-угольник на треугольники. Перенумеруем вершины ис-
ходного многоугольника числами от 1 до л + 3. Заметим, что при
любом разбиении найдется треугольник, содержащий ребро мно-
гоугольника с вершинами п + 2 и я + 3. Третья вершина этого тре-
угольника может быть любой из остальных 1,2,...,я+1. Пусть это
будет вершина k. Если удалить треугольник с вершинами п + 2,
п + 3, k, то получим два многоугольника с числом вершин k + 1 и
46 _ Глава 3. Методы подсчета и оценивания
п + 3 — k, которые можно разбить на треугольники иА+1 и un+3_k
способами. Суммируя по k = 1, 2,..., п + 1, получим (согласно пра-
вилам прямого произведения и суммы) искомое число разбиений
исходного (я + 3)-угольника на треугольники:
И«+3 = «2 ' "п+2 + "3 ' «л+1 + «4 ' "«-О + - "Л+1 ' «3 + ««+2 ' "2.
где п > 0 и положили и2 = 1.
Получили нелинейное рекуррентное соотношение для после-
довательности {ип+2}, п > О, для поиска которой удобно ввести но-
вую последовательность {vn}, п > 0, такую, что vn = ип+2, п>0.
Тогда рекуррентное соотношение перепишется в виде
Vn+l = «О ' V/I+0 + VI • У„_! + V2 ' Vn_2 + ... Vn_! ' Vt + Vn_0 ' V0, ИЛИ
k=0
Заметим, что правая часть является сверткой двух одинаковых
последовательностей {vn} и {vn} (см. п.3.1.7 операцийс производя-
щими функциями). Ввиду этого, составим производящую функ-
цию правой части
Aя=0 n=OU=0
Пусть У(х) — производящая функция последовательности {vn
},
п > 0, тогда последнее соотношение запишем как
или х • Vx) - V(x) +1 = 0.
Ранее рассмотренное разложение обобщенного бинома
^l у 2
'^-2 kЛ -1 Л
запишем для случая
3.1. Производящие функции _ 47
Поскольку результат V(x) должен быть рядом по неотрицатель-
ным степеням х*, то решение V(x) =(1/ 2x)(l + Vl-4x)является по-
сторонним. Окончательно
С"
Отсюда «я+2 =vn =-^- , я > 0.
Ответ: число способов разбить выпуклый (л + 2)-угольник на
С"
треугольникинепересекающимисядиагоналямиравно—^-,п>0.
я+1
/f
Задача. Найти сумму!
2
+2
2
+...+ k
2
= ^'
2
.
i=i
Определим четыре последовательности и их производящие
функции:
ak
= l,bk
= kak
, ck
= kbk
, dk
= £/2
и А(х), B(x), C(x), D(x).
/=o
Для решения задачи необходимо найти dk. С этой целью опреде-
лим D(x), что позволит нам установить значения dk,
00
Дх) = ^dkx . Последовательности bk и ak связаны «изменением
*=о
масштаба», значит В(х) = х • А'(х). Последовательности ck
и bk
так-
же связаны «изменением масштаба», следовательно,
С(х) =х-В'(х)=х(х-А'(х)У =х-А'(х)+х
2
А"(х).
Последовательности dk
и ck
связаны «частичной суммой», тогда
D(x) =
C(x)=
x-A'(x)+x
2
A"(x)
1-х 1-х
ОкончательноD(x)=—-—/.
(1-^с)
4
Для получения коэффициентов dk
воспользуемся разложением
(3.1.9):
1
48 Глава 3. Методы подсчета и оценивания
Теперь можно записать, что
k=0 k=2 k=0
Сравнивая коэффициенты при одинаковых степеняхл:, получим
d0=0, dl=Cl, dk=C
3
k+l+Cl+2, Л =2,3,....
Таким образом,
I
2
+2
2
+...+k
2
= ]Г/
2
=Cl+ +С%+2 ~ —
/=o
k .
Задача. Показать, что 2^C'r+i =C*+k^ или
1 СО
Заметим, что - - = Х^г+А
;с
* является производящей
функцией последовательности ak =C
k
rJfk. Следовательно, иско-
k . k
мая сумма равна ^C'r+i
=^я, .
;=0 1=0
k
Рассмотрим поеледовательностьйд. =]ГаА
..ТаккакйА
иоА
свя-
/^о
D/ ч
А(х) 1 „
заны частичной суммой, то В(х ) = — -
L
-
J
-= - z- . Разложение
1-Jc (1-jc)"
2
(3.1.9) позволяет записать последнее выражение в следующем
виде:
-Х) k=
o 1=0 1=0
Задача. Пусть .АТи 7— целочисленные случайные величины и
определены их ряды распределений. Характеристической функ-
цией распределения случайной величины (с.в.) X называется
функция
k=0 A=0
3.2. Линейные рекуррентные соотношения 49
Таким образом, gj^s) — это производящая функция последовате-
льности чисел Р(Х= k), где k= О, 1,... . Будем полагать Хи Унеза-
висимыми случайными величинами (с.в.). Рассмотрим с.в.
Z=X+ Y. Очевидно, что
P(Z =k) = P(X + Y=k) = Y,P(X = i)P(Y =k -/).
i=0
Ввиду свойства свертки для производящих функций характери-
стическая функция с.в. Z может быть записана таким образом:
k)s =gx(s)gY(s).
k=0
3.2. Линейные рекуррентные соотношения
Рассмотрим последовательность {ип}, п = О, 1, 2,... . Будем го-
ворить, что задано однородное линейное рекуррентное соотно-
шение с постоянными коэффициентами порядка г, если для чле-
нов последовательности {«„} выполняется равенство
и
п+
г =
с
1«„+
л-1 +
с
2«П+
г-2 +•••+£,-«„> (3-2.1)
где cl, с2,..., сг — постоянные величины. Выражение (3.2.1) позво-
ляет вычислить очередной член последовательности по предыду-
щим /-членам. Ясно, что, задав начальные значения MO
, HI,..., иг
_ь
можно последовательно определить все члены последовательно-
сти. Мы рассмотрим общий метод решения (т.е. поиска ип
как
функции от п) рекуррентного соотношения (3.2.1).
Для решения задачи достаточно найти производящую функ-
цию
ВД = 1>*** (3-2.2)
*=о
последовательности {«„}. Введем обозначение для полинома
К(х) = 1 — срс — с2
х* — ... — c^f
и рассмотрим произведение
ЩхЩх) = С(х).
Непосредственным умножением можно убедиться, что С(х) —
это полином, степень которого не превышает г — 1, так как коэф-
фициенты при х"
+г
(п = О, 1,...) в U(x)K(x), согласно уравнению
(3.2.1), равны un+r- (qH^-i + c2un+r_2 +... + с^п) = 0 .
50 _ Глава 3. Методы подсчета и оценивания
Характеристическим полиномом соотношения (3.2.1) назы-
вается
F(x)=xr
-Cl
xr
'1
-c2
xr
-2
-...-cr
_lX
-cr
. (3.2.3)
Выполним разложение Дх) на линейные множители
ВД=(* -а, )<>(*-«2Г2
-(*-«,-)'',
гдев!+е2
+...+ег
=г.
Сравнивая К(х) и F(x), запишем К(х) =xr
F - I Отсюда
U/
= г.= (l-alx)
ei
(l-a2x)
e2
...(l-arxY
r
, el + e2
Данное разложение на множители используем для представле-
ния
в виде суммы простых дробей:
£/<*)= - т = — — - • (3-2.4)
К(х) kk(-aiXy
Таким образом, Щх) является суммой функций вида
(1-ох)"
Тогда выражение (3.2.4) примет вид
Щ Л С(х) _ у^д Y ' / ' / j + - j i t ..9 -,
х
>=-гГч=2-2-Р*|-2-1 ' ' ( J
/=1л=1 A=0
Данное разложение является производящей функцией
00
U(x
) = ^,и
пх
" последовательности {и„}. Для определения и„ необ-
л=0
ходимо найти коэффициент при х„ в разложении (3.2.5).
Задача. Найти члены последовательности {и„}, удовлетворяю-
щие рекуррентному соотношению ип+2
= 5мл+1
— 6м„, щ = и^ = 1.
Решение. К(х) = 1 - 5х + бх2
, K(x)U(x) = С(х).
3.3. Неоднородные линейные рекуррентные соотношения _ 51^
Выполним данноеумножение: (1 — 5х + 6х
2
)(и0 + щх+ z^x
2
+ ...) =
= ы0 + («! — 5и0)х+ (и2 — 5«! + 6и2)х
2
+... = HO + (MJ -5и0)х= 1 — 4х.
Таким образом, С(х) = 1 — 4х.
ХарактеристическийполиномДх) =х
2
— 5х+6 = (х— 2)(х— 3).
Отсюда г/(х)= = = + _ _ . Значения вели-
(1-2х)(1-Зх) 1-2х 1-Зх
чин А л В находим методом неопределенных коэффициентов:
А = 2, В = —1. Наконец, принимая во внимание (3.1.2),
С другой стороны, U(x) = ^ukx . Поэтому, сравнивая коэффи-
А=0
циенты при одинаковыхстепеняхх", заключаем, что ип = 2"
+1
—3".
3.3. Неоднородные линейные рекуррентные
соотношения
Неоднородное линейное рекуррентное соотношение имеет
вид
««+/• =
c
l
u
n+
r-l +
с
2ИЛ+
/-2+"-+
с
г"п +Ь„, (3.3.1)
где величина Ъ„ в общем случае является функцией от п. Общее
решение соотношения (3.3.1) представляет собой сумму частного
решения неоднородного уравнения (3.3.1) (т.е. любого решения,
которое ему удовлетворяет) и общего решения соответствующего
ему однородного соотношения (3.2.1), которое находится рас-
смотренным способом. Общих способов определения частного
решения нет, однако для специальных значений Ъ существуют
стандартные приемы определения и„. Рассмотрим на примере в
некотором роде универсальную процедуру, которая позволяет
сразу находить общее решение неоднородного уравнения (3.3.1).
Задача. Найти {и„}, если известно, что м„+1
= и„ + (п + 1) и
м0 =1.
Умножив левую и правую части рекуррентного соотношения на
х", получим
52 Глава 3. Методы подсчета и оценивания
Суммирование последнего уравнения для всех п дает
п=0 п=0 п=0
Свойства операций с производящими функциями позволяют
данное выражение привести к виду
дс (1-х)
2
Учитывая, что и0 = 1, запишем
-х „=о л=о
Сравнивая коэффициенты при V, заключаем, что
п
Задача. Найти число замкнутых маршру-
тов длины п по ребрам треугольника ABC.
Длину ребра принять равной единице. Нача-
льная и конечная точка маршрутов — верши-
•С на А.
Решение. Введем обозначения: ап
— число замкнутых маршру-
тов длины п из вершины А в вершину А; Ьп
— число маршрутов
длины л из вершиныА в вершину В сп
— число маршрутов длины
п из вершины А в вершину С.
Очевидно, что из условия симметрии задачи Ъп
= с„. Величины
же а„, Ь„, сп
связаны системой рекуррентных соотношений:
bn+
i=an
+bn
,
C
n+
l=a
n+C
n,
Ъп
=с„.
С учетом последнего равенства Ь„ = сп
(п = О, 1, 2,...) система при-
водится к виду
,+1 =°л +V
3.4. Обобщенное правило произведения 53
Выражая Ъп из первого уравнения и подставляя во второе, полу-
чим однородное рекуррентное соотношение относительно по-
следовательности {а„}. Запишем его в принятых обозначениях,
полагая и„ = а„:
«л+2 = "«+1 + 2«„, м0 =!,«! = О, где п = О, 1, 2,... .
Решение данного соотношения получим согласно изложенной
выше теории.
К(х) = -х-2х
2
, U(x)K(x) = С(х) = 1 -х.
Характеристическийполином
F(x) = х2
- х - 2 = (х - 2)(х + 1).
Отсюда Щх)= *"* = -JjL+
-Ji-.
(l-2jc)(l+jc) -2х l+jc
Перепишем U(x) в развернутом виде по степеням У:
П 00 00 Л П , / 1 Ч
П
9 ОЭ
вд=+£2"*"+±]г;(-1)''*"=2г V V=x»X-Jn=0 ^/1=0 n=0 n=0
Сравнивая коэффициенты при х", заключаем, что число замкну-
2" +(-!)"2
тых маршрутов длины п равно ип = —-—.
3.4. Обобщенное правило произведения
Пусть 5
1
!, ^2,..., Sn
— произвольные множества.
Q = {(»!, ю2
, й>з>---} ~~ множество весов, где под са, будем понимать
любой из символов 1, х, у, z, x~
l
, y~
l
, z~
l
и их произведения. В от-
личие от элементов, вес — это число либо переменная, которая
может принимать любые числовые значения. Назначим каждому
элементу j &Sj(i= 1,2,..., л) вес ®(s) e Q. Во многих задачах требу-
ется определить количество элементов с определенными свойст-
вами, а не их вес. В этом случае полагают m(s) = 1.
Пусть С,ю
— количество элементов множества 5, с весом со, тог-
да A(Sj) = ^Cfoco — сумма весов элементов множества 5
1
,.
соеП
Рассмотрим прямое произведение множеств
S = SixS2x...*Sn ={E=(sls2...sn)si eSj,i=l,n}.
54 Глава 3. Методы подсчета и оценивания
Положим вес элемента множества равным
СО(Е) =( 5, )eQ.
(=1
Пусть ЕП — количество элементов Е е S с весом ш, тогда
A(S) = ^.ЕщШ — сумма весов элементов множества .
теП
Теорема. A(S) = A(Si)A(S2
)...A(Sn
).
Доказательство.
А
Л
~
А
<^
Л1- ._А1
Д
Задача. Найти количество замкну-
тых маршрутов длины 2л по ребрам
трехмерного куба. Начальное и конеч-
ное положение — вершина AQ куба.
Решение. Исходное положение —
вершина А0. Каждый шаг движения
по кубу — это выбор одного из трех ребер. Пусть 1 обозначает
выбор ребра вдоль оси ОХ, 2 — вдоль оси 07, 3 — вдоль оси OZ.
В соответствии с этим введем множества S^ S2,..., S2n такие, что
Si = S2 = ... = S2n = {I, 2, 3}. Тогда все маршруты длины 2п соста-
вят множество S- S^ x S2 x ... х S2n. Например, маршрут 2113
означает, что изAQ пошли в А5, затем в А$, вернулись в А5 и подня-
лись в А2.
Назначим веса элементам множества: и(1)=х, ш(2)=у,
и(3) = z. По правилуобобщенного произведения суммавесов всех
маршрутов длины 2п равна A(S) = A(Sl)A(S2)..^A(Sn) = (x + у + z)2n
,
т.к. A(S,) = x + у + z •
После возведения в степень получим, что
k.X
i
yJZ
k
, (3.4.1)
3.4. Обобщенное правило произведения 55
где У/г — вес маршрута, включающего / шагов вдоль оси OX, j —
вдоль О¥н k — вдоль OZ(i +j + k = 2л), aijk
— количество маршру-
тов с весом хУ^*-
Заметим, что только маршрут, заканчивающийся в AQ, имеет вес
x'y'z с четными степенями i,j, k, т. к. в замкнутом маршруте, сде-
лав шаг вдоль оси, необходимо вернуться по этой оси. Для выде-
ления таких маршрутов положимх = у1
= г2
= 1 (х, у, г.— произво-
льные). Тогда выражение (3.4.1) примет вид
(х + у + г)2л
= С0
+ Cjyz + C^xz + Cgxy, (3.4.2)
где С0
— число маршрутов, заканчивающихся вА^; С2
— ъА2
, С4
—
в Aj, С6 — в А6.
Учитывая симметрию точекА2
, А$, А$ относительно AQ, можно за-
ключить, что С2
= С4
= С6
= С. Тогда из системы (3.4.2) следует,
что
(3.4.3)
Уравнение (3.4.3) содержит два неизвестных С0
и С при
х2
= у1
= z2
= 1. Для их определения составим систему уравнений
из выражения (3.4.3), полагая x = y = z= тлх = у-, z=l. Это
возможно, т.к. выполняется условие х2
= у2
= z2
= 1. Получим сис-
тему
з
2п
=с0+
зс
UCo-C
З
2
" +3
Отсюда С0 = -- число искомых маршрутов.
Задача. Найти число решений р, q уравнения
2р + 3q = п, где п, р, q e{0, 1, 2,...}.
Решение. Введем множества: Sl = {2р р = 0, 1, 2,...}, S2 = {3<7 1 q =
= О, 1, 2,...} и S= Sl x S2 = {(2p,3q) p,q = Q,l, 2,...}.
Назначим веса элементам данных множеств следующим образом:
а)(2^)=х2
^,ш(3^)=Л и
Ш(Е) = ш((2р, 3q)) = х2
^3
^" = х2р
• х3
" = т(2р)ш(3д).
Веса элементов определены таким образом, что выполняется
правило обобщенного произведения A(S) =A(S{)-A(S2). Легко за-
метить, что степень веса х2
**3
^" любого элемента Е = (2р, 3q) s5
дает одно из решений исходного уравнения 2р + 3q = п.
56 Глава 3. Методы подсчета и оценивания
Раскроем выражение A(S) = A(S)-A(S2
):
HO + «i*+ «г*
2
+ ••• + "«*"+ ••• =
= (х
2
'
0
+
х
2
'
1
+ х
2
'
2
+
... + х
2
'" + ...)(х
3
'
0
+ х
3
'
1
+ х
3
'
2
+ ... + х
3
'" + ...) =
=(1+х
2
+х
4
+...)(1+х
3
+х
б
+...)=—Ц-—Ц-,
1-х
2
1-х
3
где м„ — число решений уравнения 2р + Зд = п. Фактически, сум-
ма весов A(S) элементов множества S является производящей
функцией числа решений уравнения 2р + Зд = п. Таким образом,
A(S) = - ^ -- у Разложим данное выражение на множители:
(1-х)
2
1-х
2 7
1-х3
*=0 k=0 k=0
где и„ — число решений уравнения 2р + Ъq = «.
Сравнивая коэффициенты при одинаковых степенях , полу-
чим:
_3-(-1)3
"+2-(Зл
~ ~
_3-(-1)3п+2
+2-(Зл+3)+3_2л+3+(-1)3
"
"12~ "4~
где я е{0, 1, 2...}.
3.5. Принцип включения и исключения
Пусть S = {$!, ^2
, ^З"-"} ~ произвольное множество элементов.
Q = {ю1
,о)2
. «з,...} — множество весов, Q(JA
) — вес элемента sk
eS.
PI, Р2, РЗ,..., Р„ — свойства элементов или индикаторы свойств
элементов.
3.5. Принцип включения и исключения 57
Р ( ч _ J1>
еслиэлемент s
k обладает свойством />• ,
'
k
[О, если элемент sk не обладает свойством PJ .
W(Pj )= ]£] /5 (.УА ) • га(.уfc ) — сумма весов элементов со свойством Р-г
sk
eS ,
W(Pt Pi2 ...Pim ) — сумма весов элементов множества S, которые
обладают каждым из свойств Pt ,Pt ,..., Pim .
W(m) = ^W(Pj Pi2...Pim), суммирование выполняется по всем
(Ifa-im)
сочетаниям (/1/2—0 длины т из п свойств, количество сочетаний
равноС™.
Таким образом, в W(m) суммируются веса только тех элемен-
тов, которые имеют как минимум т свойств. Пусть элемент s обла-
дает k свойствами nk>m, тогда его вес ш(,у) в Щт) войдет С™ раз.
Так, W() = 'YJW(Pi ) = W(Pi) + W(P2)+...+W(Pn) содержит С =
= п членов и Щ2)= ^W^P^W^PJ+W^P^ +
...+ ЩРп
_1
Рп
)
Cl'2)
содержит С„
2
=л(« + 1)/2 членов.
Распространим определение W(m) на т = 0, положив
^K»(J) — сумма весов элементов исходного множества S.
Данное
6
определение W(Q) выполнено корректно, так как сумма
ЩО) должна включать элементы, обладающие нуль свойствами и
более. Действительно, любой из элементов множества £удовлет-
воряет этим условиям.
Положим:
Е(т) — сумма весов элементов, обладающих ровно т свойствами;
ДО) — сумма весов элементов, которые не имеют ни одного из
указанных свойств.
Теорема. Сумма весов элементов, обладающихточно т свойст-
вами из п свойств PI, Р2
,.~, Рп
> равна
или
Е(т) ="f(-l)' (%цЩт +/). (3.5.1)
/=о
Доказательство. Для доказательства достаточно показать, что
вклад веса e>(s) произвольного элемента s e S в правую и левую
58 _ _ Глава 3. Методы подсчета и оценивания
части (3.5.1) одинаковый. Пусть,? 6.5*обладаетточно /свойствами.
Возможны следующие соотношения между / и т:
1) / < т, тогда co(s) не входит в Е(т) и не входит в Щт + /) для
/ = О, 1,..., п — т. Равенство (3.5.1) примет вид 0 = 0.
2) / = т, тогда e>(s) входит один раз в Е(т) и один раз в W(m).
3) / > т, тогда ю(s) не входит в Е(т) илевая часть равна 0. Пока-
жем, что в этом случае и правая часть выражения (3.5.1) равна
нулю.
Вес со(s) в Щт + i) входит С,т+
' раз, т + i < /. Правая часть для
веса со(s) одного элемента s примет вид
t-m
=сф)£(-1)'С+1.сг.
/=0
Заметим, что
т m+i
(w+Q! * /! (t-m)
да!/! (то +/)!(/-(«+'))!
Следовательно, С™+|
С™+(
=С,т
С,'_от
, а исходная сумма составит
t-m t-m
1=0
j=0
И в третьем случае выражение (3.5.1) справедливо. Теорема дока-
зана.
Следствие.
Е(0) = ЩО) - W(l) + Щ2) - ЩЗ) + ... +(-)"W(n).
Задача. В группе 23 студента. Из них 18 знают английский
язык, 9 — немецкий и 6 — оба языка. Сколько студентов в группе
не знают ни одного языка? Сколько студентов знают один язык?
Решение. Пусть S— множество всех студентов, S = 23. Назна-
чим вес co(j) = 1 всем элементам s s S. Теперь под суммой весов
будем понимать количество студентов.
Назначим свойства элементам s e S:
PI — знание английского языка, Р2 — знание немецкого языка.
ДО) — студенты, не знающие языков (не обладают свойствами).
3.6. Ладейные многочлены и многочлены попаданий __ 59
ДО) = W(0) - W() + W(2).
seS
Щ1) = ЩР{) + W(P2
) = 18 + 9 = 27.
Щ2) = W(P,P2
) = 6.
Тогда ДО) = 23 - 27 + 6 = 2.
Е(1) — студенты со знанием одного языка (обладают ровно одним
свойством).
Задача. Найти число перестановок т шаров, в которых ровно г
шаров остаются на месте.
Решение. Введем обозначения. Р, — свойство, состоящее в том,
что при перестановке шаров /-и шар остается на месте, / = 1, 2...,
т. Е(г) — количество перестановок, обладающих ровно г свойст-
вами, т.е. при перестановке шаров ровно гиз них остаются на сво-
их местах. Тогда по формуле включений и исключений запишем:
Е(г) = (-!)' С;+/
Щг + i). Рассмотрим W(r) = ^ЩР^ Ph
...Pir
),
1=0 (l1 '2---'V)
где суммирование выполняется по всем сочетаниям (/j/j.-./V)
длины г из т свойств, количество сочетаний равно Сг
т.
W(Pt Pi:i...Pir)=(m -r)! — количество перестановок из т — г ша-
ров, так как г шаров должны оставаться на месте. Тогда значение
W(r)=Cr
m
(m-r)l Следовательно, и £(/•)= ^(-l)1
СГ
Ы
С? (т-г -/)!
(=0
г!,to '! г
3.6. Ладейные многочлены и многочлены
попаданий
Основная цель данного подраздела — показать возможности
применения методов подсчета и оценивания при решении конк-
ретных задач. В то же время обсуждаемые здесь задачи сами по
себе не лишены интереса, и в большей степени для тех, кто впер-
вые знакомится ними.
60 Глава 3. Методы подсчета и оценивания
Рис. 3.1
3.6.1. Ладейные многочлены
• Определение. Доской запрещенных позиций назы-
вается произвольный набор выделенных клеток
шахматной доски, сохраняющих свое расположе-
ние относительно других клетокдоски. Пример до-
ски запрещенных позиций показан на рис. 3.1.
• Определение. Пусть С — доска запрещенных пози-
ций. Введем обозначения: rk — количество способов расста-
вить владей на доске запрещенных позиций так, чтобы они не
били друг друга; г0 = 1 — количество способов расстановки О
ладей на доске запрещенных позиций, т.е. способов не ставить
ладьи на доску. Ладьи считаются неразличимыми. Производя-
щую функцию последовательности {rk} будем называть ладей-
ным многочленом доски С и обозначать
00
IV v /"Л X"1
*• vk (i (. 
ЛХ,{,) = 2_,
r
k ' (j.O.JJ
С,
•
Задача. Найти ладейный многочлен для доски Q
на рис. 3.2.
Рис. 3.2 Решение. Непосредственным подсчетом можно
установить, что г0
= 1, ^ = 1 и /-, = 0, /' > 2. Тогда R(x, Cj) = 1 + х.
Задача. Найти ладейный многочлен доски С2
на
рис. 3.3.
Решение. Непосредственным подсчетом можно
установить, что г0
= 1, г{
= 2, г2
= 1 и rt
•, = 0, / > 3. Тогда
Задача. Найти ладейный многочлен доски С3
на
рис. 3.4.
Рис. 3.4 Решение. Непосредственным подсчетом можно
установить, что г0
= 1, г, = 3, г2
= 1 и г,- = 0, /' > 3. Тогда
R(x, С3
) = 1 + 3jc + х2
.
Определение. Доски Q и С2
называются неза-
висимыми, если их клетки располагаются на
различных горизонталях и вертикалях. При-
мер независимых досок показан на рис. 3.5.
С,-
3.6. Ладейные многочлены и многочлены попаданий 61
Свойства ладейных многочленов
• Свойство 1. Правило произведения. Пусть R(x, Q) и R(x, C2
) —
ладейные многочлены независимых досок Cj и С2
. Если доска
С= Ci u С2
, то R(x, С) = R(x, CJRix, C2
).
Доказательство. Пусть щ — расстановка ладей на доске С,
тг2
— расстановка ладей на доске С2
. Тогда тс = (щ, л2
) — переста-
новка ладей на доске С = С и С2
. Верно и обратное. Пусть Sn
и
5Л2
— множество расстановокладей надоске, соответственно Q и
С2
. Тогда прямое произведение 5„ =Sn
хЗ„2
— множество рас-
становок ладей на доске С.
Обозначим веса расстановок: w^ ) =xkl
, где &, — число ладей в
перестановке щ; ш(тг2
) =xk2
, где k2
— число ладей в перестановке п2
.
Тогда вес перестановки п равен s(n)=xkl+k2
=xki
-х*2
= Цтс, )со(я2
).
В соответствии с тем, как введены веса перестановок, ладей-
ные многочлены можно записать как сумму весов элементов мно-
жеств:
R(x,Cl
) = ^(^lR(x,C2
)= £ш(*2
) и Д(х,С)=£ш(я).
Многочлены Л(х, Q), 7?(х, С2
) и /?(х, С) удовлетворяют всем усло-
виям правила обобщенного произведения (см. п.3.4), в соответст-
вии с которым R(x, С) = R(x, C])R(x, C2).
Задача. Найти ладейный многочлен доски С на рис. 3.6.
Пусть Cj — доска из одной клетки,
R(x, С) = 1 + х. Ясно, что доска С состоит из п
независимых досок Q. Отсюда следует, что
• Свойство 2. Правило суммы. Пусть С — доска РИС. 3.6
запрещенных позиций. Введем обозначения:
С, — доска с ладьей в клетке а (/ — index); Ce^ — доска с уда-
ленной клеткой а (е — erase). Тогда
В(х,С)=хВ(х>С1л)+В(х,Сел ) или R(xia +еа ) =хД(/а )+R(ea ).
Длядоказательства данного свойства вновь рассмотрим ладей-
ный многочлен как сумму весов перестановок. Все расстановки
множества разобьем на два подмножества Sn
. и S,e
, Sn
. — пе-
рестановки с ладьей на клетке а; 5Я
— перестановки, которые нееа
занимаютклеткуос.
62 Глава 3. Методы подсчета и оценивания
Тогда
Множитель х перед скобкой — это вес ладьи в перестановке щ^,
которая поставлена на выделенную клетку а.
Задача. Найти R(x, С) для доски на рис. 3.7.
Решение. Воспользуемся правилом суммы, по ко-
торому
b3& Л
3
. '
Рис
"
3
'
7
Отметим, что по виду полученного ладейного многочлена
(производящей функции) можно сказать, что число способов
расставить две ладьи на доску С равно 4.
• Свойство 3 для прямоугольных досок. Пусть
С — прямоугольная доска запрещенных по-
зиций размером т х п, т — число горизонта-
лей; л — число вертикалей (рис. 3.8).
На квадратнойдоске размером k х А:можно &!
способами расставить £ладей. Различных досок
k х k на доске т х п можно выбрать способами
Рис
- 3.8
C^C
k
. Отсюда rk
=С%С% -k —число способов расставить k ла-
дей на исходной прямоугольной доске. Тогда R(x, С) =
min(/7i/i)
= £ Ck
mCk
kxk
.
k=0
Задача. Найти R(x, С) для прямоугольной доски С размером
2 x 3 .
Решение.
f^lf~>l-II...I ./^2f^2^iv
2 _
^2^3 •* +1'2^3 ^'•*
Коэффициент при х
2
показывает, что число способов поставить
две ладьи на такую доску равно 6.
3.6. Ладейные многочлены и многочлены попаданий 63
3.6.2. Многочлены попаданий
Определение. Пусть дана квадратная доска
размером л х л с запрещенными позициями
(рис. 3.9). Обозначим через En
(k) количество
перестановок на квадратной доске л ладей, k
из которых занимают запрещенные позиции.
Многочленом попадания называется произ-
п
водящая функция E(t) = ^En
(k)t последо- Рис. 3.9
вательности (Еп
(К)}.
Установим связь между многочленом попаданий и ладейным
многочленом. Введем обозначения:
Sn
= {я1;
я2
,..., ял!
} — множество всех перестановок л ладей на до-
ске л х и;
П = {ю!, 0)2,.-} — множество весов;
ю: Sn
-> П — весовая функция,га(я) е fi — вес перестановки я е Sn
i
{1, 2,..., т) — номера запрещенных клеток на доске л х л;
PI, Р2
,..., Рт
— свойства перестановок; я е Sn
обладает свойством
PJ, если ее ладья занимает запрещенную позицию/
Р ( -Ъесли л
обладает свойством PJ,
J
О, в противном случае.
W(Pj) = ^ PJ (л)ю(я) — сумма весов перестановок со свойством PJ,
W(PJiP**.".Ph ) = ZP
A W2М-Л(я)со(я) сумма весов
перестановок со свойствами Р,- Pj2...PJt;
W(k)= УЩР/Р/ ...Р: ), суммирование выполняется по всем / ^_, v 7| Ji Jk " J
сочетаниям (/i/2—Л) Длины k из т свойств, число сочетаний С*.
Принцип включения и исключения позволяет определить
Так как нас интересует лишь количество перестановок, то будем
полагать со(л) = 1. Нетрудно установить, что ЩК) = rk(n - K), где
rk — количество способов расставить владей на запрещенных по-
зициях доски я х и. Тогда
Е„ (k) =Ck
k
rk
(п -k)l -Ck
k+l
rk+l
(п -k +1)!+.. .+(-1)"-* Ck
m
rm
(n-m).
64 Глава 3. Методы подсчета и оценивания
Заметим, что rk
= 0 для всех k > п. С другой стороны, если т < п, то
rk
= О для всех k > т. Поэтому последнее выражение примет вид
Ett
(k) = C
k
k
rk
(n -k) -C
k
k+l
rk+l
(л -k +1)!+.. .+(-!)"-* С>„ (л -л)! или
я-А
.£„(£) = J](-1) C'k+irk+i(n-(k + i))l. Найденное выражение позво-
(=0
ляет записать многочлен попаданий в виде

*=0 А=0/=0
Суммирование выполняется по координатам уз-
лов сетки на рис. 3.10. Замена переменных сумми-
рования k'= k + i и /"= / в последнем выражении по-
зволяет упростить многочлен попаданий и приво-
п k
дит его к виду E(t) = ^^(-l)'C'k
rk
(n-k)t , где
k=0i=0
суммирование уже выполняется по узлам сетки на
рис. 3.11. Таким образом,
= ^/-J У(-!)'С£-?*~' (л-£)! или
*=о U=o J Рис.3.11
*=0
Для более компактной записи последнего выражения введем
оператор Е~ , действие которого распространим на функции це-
лочисленного аргумента: Е~!
(Дл)) =f(n - 1) и Б~*(Дл)) =Дл - k).
Например, е"1
(л!) = (л - 1)! и Е~*(Л!) = (л - k) .
Заметим, что [(t- l)^l
fnl = (t- l)V*7z! = (t- )k
(n-k). Тог-
да многочлен попаданий перепишем в виде
k=0
=o
k=0
п
~,
где x = (t-l)E . Таким образом, E(f) = R((t - и .
3.6. Ладейные многочлены и многочлены попаданий 65
Задача. Найти многочлен попаданий для доски
3 х 3 с запрещенными позициями на рис. 3.12. За-
прещенные позиции отмечены темным цветом.
Решение. Найдем ладейный многочлен доски за-
прещенных позиций, которая состоит из двух неза-
висимых досок. Тогда
R(x) = R(S> • Я(ЕП) = (1 + *)(! + Зх + х
2
) = 1
Значит
=R((t- 1)E-V = (1 +4(Г- De'1
+4[(r- De'1
]2
= 1 • 3! + Aft - l)s~l
3! + 4[(/- l^"1
]2
3! + [(t- l)s
Рис. 3.12
4л2
~
1
]
3
3! =
= 3! + 4(t - 1)2! + 4(f - I)
2
1! + (t - I)
3
0! .
Итак, E(t) = l + 3t+t2
+ t3
.
Анализ коэффициентов E(t) при / показывает, что число пе-
рестановок, в которых ладьи не занимают запрещенных клеток,
равно 1 (коэффициент при f°); перестановок с одной ладьей на
запрещенных позициях — 3 (коэффициент при t1
)', перестановок
с двумя ладьями на запрещенных позициях — 1 (коэффициент
при t2
); перестановок с тремя ладьями на запрещенных позициях
—1 (коэффициент при / ).
3—2697
= Глава 4 _
Генерация комбинаторных
объектов
О комбинаторных алгоритмах часто необходимо порождать
и исследовать все элементы некоторого класса комбинаторных
объектов. Наиболее общие методы решения таких задач основы-
ваются на поиске с возвращением, однако во многих случаях объ-
екты настолько просты, что целесообразнее применять
специализированные методы. Задачи, требующие генерации
комбинаторных объектов; возникают при вычислении комбина-
торных формул. Например, часто приходится вычислять суммы,
имеющие вид
где суммирование выполняется по всем последовательностям jq,
х2
,..., х„, удовлетворяющим некоторым ограничениям.
В алгоритмах порождения комбинаторных объектов нас преж-
де всего будет интересовать сложность алгоритмов, т.е. общее ко-
личество времени, требующегося для порождения всего множе-
ства объектов.
4.1. Поиск с возвращением
Использование компьютера для ответа на такие вопросы, как
«сколько существует способов...», «перечислите все возмож-
ные...», или «есть ли способ...», обычно требует исчерпывающего
поиска множества решений. Метод поиска с возвращением по-
стоянно пытается расширить частичное решение. Если расшире-
ние текущего частичного решения невозможно, то возвращаются
к более короткому частичному решению и пытаются снова его
продолжить.
Идею поиска с возвращением легче всего понять в связи с за-
дачей прохода через лабиринт: цель — попасть из некоторого за-
данного квадрата Нъ другой заданный квадрат Кпутем последо-
4.1. Поиск с возвращением 67
вательного перемещения по квадратам.
Трудность состоит в том, что существу-
ющие преграды запрещают некоторые
перемещения. Один из способов прохо-
да через лабиринт — это двигаться из
начального квадрата в соответствии с
двумя правилами: и
к
• в каждом квадрате выбирать еще не исследованный путь;
• если из исследуемого в данный момент квадрата не ведут не-
исследованные пути, то нужно вернуться на один квадрат
назад по последнему пройденному пути, по которому при-
шли в данный квадрат.
Первое правило говорит о том, как расширить исследуемый
путь, если это возможно, а второе правило — о том, как выходить
из тупика. В этом и состоит сущность поиска с возвращением:
продолжать расширение исследуемого решения до тех пор, пока
это возможно, и когда решение нельзя расширить, возвращаться
по нему и пытаться сделатьдругой выбор на самом близком шаге,
где имеется такая возможность.
Общий алгоритм
В самом общем случае полагаем, что решение задачи состоит
из вектора (аь
а2
, а$,...) конечной, но неопределенной длины,
удовлетворяющего некоторым ограничениям. Каждое ai
е At
, где
AJ — конечное линейно упорядоченное множество. Таким обра-
зом, при исчерпывающем поиске должны рассматриваться эле-
менты множества (аь
а2
, а3
,..., а,) е Л, х А2
х...х Af
, для / = О, 1, 2,...
в качестве возможных решений. В качестве исходного частичного
решения примем пустой вектор () и на основании имеющихся
ограничений выясним, какие элементы из AI являются кандида-
тами в oj. Обозначим это подмножество кандидатов через S^ с А{
.
В результате имеем частичное решение (а{). В общем случае для
расширения частичного решения от (аь
a2
,..., aA
_i) до (вь
а2
,...,
ak
_i, ak
) кандидаты на роль ak
выбираются из Sk
с Ak
. Если частич-
ное решение (аь
а2
,..., ak
_{) не представляет возможности для вы-
бора элемента ak
, то Sk
= 0; возвращаемся и выбираем новый эле-
мент «£_!. Если новый элемент а^ выбрать нельзя, возвращаем-
ся еще дальше и выбираем новый элемент ak_2 и т.д. Этот процесс
удобно представлять в терминах прохождения дерева поиска в
68 Глава 4. Генерация комбинаторных объектов
глубину. Процедура поиска с возвращением для нахождения всех
решений формально представлена в алгоритме 4.1.
Алгоритм 4.1. Общий алгоритм поиска с возвращениями
6*! =Ai', {Выделить кандидатов}
k= 1; {Длина частичного решения}
while k > 0 do begin
while Sk Ф 0 do begin
ak e Sk; {Расширить частичное решение }
Sk = Sk — {ak}; {Удалить выбранного кандидата}
if(ai, a2,..., ak) —решение then Сохранить решение;
k = k+ 1; (Расширить частичное решение}
Sk с Ak; {Выделить кандидатов]
end;
k = k— 1; {Вернуться, уменьшить частичное решение]
end.
Поиск с возвращением приводит к алгоритмам экспоненциа-
льной сложности, так как из предположения, что все решения
имеют длину не более «, исследованию подлежат приблизительно
п
Y[ Ak элементов. В предположении, что все Ak  = С— констан-
k=
п
ты, получаем экспоненциальную сложность ]^[|^|=С
Л
. Нужно
*=i
помнить, что поиск с возвращением представляет собой только
общий метод. Непосредственное его применение обычно ведет к
алгоритмам, время работы которых недопустимо велико. Поэто-
му, чтобы метод был полезен, к нему нужно относиться как к схе-
ме, с которой следует подходить к задаче. Схема должна быть хо-
рошо приспособлена (часто это требует большой изобретательно-
сти) к конкретной задаче, так чтобы в результате алгоритм годил-
ся для практического использования.
4.2. Перестановки различных элементов
Перестановки множества {а1;
a2
,..., а„} различных элементов
относятся к часто порождаемым комбинаторным объектам. Без
ограничения общности можно полагать, что элементами множе-
ства являются целые числа от 1 до п, т.е. рассматриваются пере-
становки целых чисел 1, 2,..., п.
4.2. Перестановки различных элементов 69
Порождение перестановок на основе метода поиска с возвра-
щениями выполняется в алгоритме 4.2. Заметим, что в процессе
приспосабливания общего алгоритма 4.1 поиска с возвращения-
ми к задаче порождения перестановок мы не вычисляли и не хра-
нили явно множества Sk
. В этом случае легче и достаточно хра-
нить только наименьшее значение из Sk
, т.е. sk
, и следующее зна-
чение вычислять по мере необходимости. Проверка условия
Sk
Ф 0 соответствует условию sk
< n, поскольку алгоритм устроен
так, что перебор значений элемента sk
выполняется в порядке их
возрастания. Поэтому неравенство sk
> п соответствует пустому
множеству кандидатов Sk
= 0.
Алгоритм 4.2. Порождение перестановок методом поиска
с возвращением
SY = 1; {Первый кандидат}
k = 1; {Длина частичного решения}
while k > 0 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; {Расширить частичное решение}
s
k = i;
while sk
<n and notflag(sk
) do sk
= sk
+ 1;
end;
end;
k = k - 1; {Вернуться, уменьшить частичное решение}
end;
Function flag(sk
) {Поиск элемента sk
e перестановке (й1
,а2
,---, ^_i)}
flag= TRUE;
/=i;
while i < k andflag do begin
if a, = sk
then flag = FALSE;
i= i+ 1;
end.
70 Глава 4. Генерация комбинаторных объектов
Программа на языке Pascal реализации рассмотренного мето-
да генерации перестановок приводится в алгоритме 4.3. Следует
отметить, что в программе размерность (длина) и перестановок
читается из файла и порождаемые перестановки также сохраня-
ются в файле. Попутно программа вычисляет время порождения
всех перестановок с точностью до сотых долей секунды, которое
сохраняется в конце файла сгенерированных перестановок.
Алгоритм 4.3. Программа на Pascal'е порождения перестановок
методом поиска с возвращением
Program Start_BackTrack; {Порождение перестановок}
uses CRT,DOS;
Const max_n=20;
Type Vector=array[I..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;
i:=i+l;
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[!]:=!; k:=l;
while k>0 do begin
while s[k]<=n do begin
a[k]:=s[k];
repeat {Поиск следующего кандидата на место a[k]}
s[k]:=s[k]+l;
until (s[k]>n) or Flag(a,s[k],k);
if k=n then begin {Перестановка найдена}
m:=m+l;
4.3.Эффективноепорождениеперестановок 71
Write(f,m,') ');
for i:=l to n do Write(f,a[i],' '); WriteLn(f);
end
else Ьед1п{Поиск первого кандидата на место 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(f,'BkTrack.in');
Reset(f);{Файл открыт для чтения}
ReadLn(f,n);{Ввод длины перестановки}
Close(f);
Assignff,'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(f,'Время счета=',delta div 100,'.',
delta mod 100,' сек');
Close(f);
end{Main}.
4.3. Эффективное порождение
перестановок
Последовательность я! перестановок на множестве {1, 2,..., «},
в которой соседние перестановки различаются так мало, как только
возможно, — лучшее, на что можно надеяться с точки зрения мини-
72 Глава 4. Генерация комбинаторных объектов
мизации объема работы, необходимого для порождения перестано-
вок. Для того чтобы такое различие было минимально возможным,
любая перестановка в нашей последовательности должна отличать-
ся от предшествующей ей транспозицией двух соседних элементов.
Такую последовательность перестановок легко построить рекур-
сивно. Для п = 1 единственная перестановка {1} удовлетворяет на-
шим требованиям. Предположим, мы имеем последовательность
перестановок л1;
л2
>
я
з>--- на множестве {1, 2,..., п}, в которой после-
довательные перестановки различаются только транспозицией
смежных элементов. Расширим каждую из этих (и — 1)! перестано-
вок, вставляя элемент п на каждое из я возможных мест. Порядок
порождаемых таким образом перестановок будет следующим:
17iH
21-
Г1234
,23 1243123
1423
[4123
Г4132
i тл 143213/
11342
[1324
Г3124
312
3142312
3412
[4312
Г4321
„,1342132
M 3241
[3214
Г2314
9,11234123
Ч2431
[4231
Г4213
21 т]2413213
12143
[2134
Данную последовательность перестановок можно порождать
итеративно, получая каждую перестановку из предшествующей
ей и небольшого количества добавочной информации. Это дела-
ется с помощью трех векторов: текущей перестановки я = (nl
,
я2
,..., тг„), обратной к ней перестановкир = (р±, р2
,---, р„) и записи
направления dt
, в котором сдвигается каждый элемент / (—1, если
он сдвигается влево; +1, если вправо; и 0, если не сдвигается).
4.3. Эффективное порождение перестановок 73
Элемент сдвигается до тех пор, пока не достигнет элемента, боль-
шего, чем он сам; в этом случае сдвиг прекращается. В этот мо-
мент направление сдвига данного элемента изменяется на проти-
воположное и передвигается следующий меньший его элемент,
который можно сдвинуть. Поскольку хранится перестановка, об-
ратная к я, то в л легко найти место следующего меньшего эле-
мента. Алгоритм 4.4 представляет собой реализацию рассмотрен-
ного метода.
Корректность алгоритма доказывается индукцией по п. Алго-
ритм порождения всех п перестановок линеен, сложность его
определяется как п + о(п). Алгоритм 4.4 — один из наиболее эф-
фективных алгоритмов для порождения перестановок.
Рабочая программа на языке Pascal реализации эффективного
метода генерации перестановок приводится в алгоритме 4.5.
В качестве примера в алгоритме 4.6 приводится программа ре-
ализации эффективного метода генерации перестановок, напи-
санная на языке Си.
Алгоритм 4.4. Метод эффективного порождения перестановок
fori= ton
я0 = nn+i = т = n + 1; {Метки границы}
Print к = (п1,п2,...,п„);
while тФ do •
т =п;
whileп„ .А >т do т
~ "!
[т =т-1
:рт +dm ; (Изменить я}
р. <*рт (Изменитьр = п ,np,dm =m]
Алгоритм 4.5. Программа на Pascal'е порождения перестановок
эффективным методом
Program Start_Effeet; {Эффективная генерация
перестановок}
uses CRT,DOS;
Const max_n=20; { n<=max_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+1]:=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[m]+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. Программа на Си порождения перестановок
эффективным методом
^include <stdio.h>
ttinclude <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,"Id",&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; i++ ){ z [i]=p [i]=i
d[l]=0; z[0]=z[n+l]=m=n+l; k=0;
while ( m!=l ) {
//Печать перестановки
k++; fprintf (f, "n%ld) ",k);
for( 1=1; 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(Stnew);
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 сек",
( l o n g ) ( d e l t a / 1 0 0 ) , ( l o n g ) ( d e l t a % 1 0 0 ) ) ;
f c l o s e ( f ) ;
4.4. Порождение подмножеств множества
Порождение подмножеств множества {аь а2,..., а„} эквивалентно
порождению «-разрядных двоичных наборов а,, принадлежащих
подмножеству, если и только если /-и разряд равен единице. Таким
образом, задача порождения всех подмножеств множества сводится
к задаче порождения всех возможных двоичных последовательно-
стей длины п. Очевидно, что наиболее прямым способом порожде-
ния всехдвоичных наборов длины п является счет в системе счисле-
ния с основанием 2, как показано в алгоритме 4.7.
Перевод этого алгоритма на язык подмножеств множества {alt
а2,..., ап] осуществляется согласно алгоритму 4.8, где добавлен
фиктивный элемент а„+1.
Алгоритм 4.7. Счет в системе счисления с основанием 2
для порождения всех п—разрядных наборов
for i = 0 to п do bj = 0;
while bn
Ф 1 do
/=0;
while bi = ldo{
bi
l'-
b, =1
Алгоритм 4.8. Порождение подмножеств счетом
в двоичной системе счисления
while an+l
eS do
Print(S),
/=0;
while a.r e S do  . ~ ,
[/=/+!;
4.4. Порождение подмножеств множества 77
Задача «Счастливый билет». Дано п (п>2) произвольных
цифр: Oj, а2,..., а„, где и, е {1,2,..., 9}, и произвольное целое число
w. Написать программу, которая расставляла бы между каждой
парой цифр аь а2,..., ап, записанных именно в таком порядке,
знаки +,- так, чтобы значением получившегося выражения было
число т. Например, если д15 а2,..., ап соответственно равны 1,
2,..., 9 и т = 5, то подойдет следующая расстановка знаков:
1—2+3—4+5—6+7—8+9. Если требуемая расстановка невозмож-
на, то сообщить об этом.
Исходные данные вводятся из текстового файла, имеющего сле-
дующую структуру:
Первая строка — целое число п.
Вторая строка — целое число т.
Третья строка — цифры at, a2,..., ап через пробелы.
Результаты расчетов сохранить в текстовом файле.
Пример файла исходных данных:
14
71
6 5 8 8 4 7 5 2 3 4 5 7 8 9
Пример файла выходных данных:
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 с.
Ясно, что для решения данной задачи достаточно выполнить
полный перебор всех возможных вариантов расстановки знаков
«±» между каждой парой цифр аъ
а2
,...,ап
и выбрать те расстанов-
ки знаков «±», которые удовлетворяют условию равенства суммы
величине т. Всего позиций для расстановки «±» равно п — 1, а
значит для полного перебора необходимо проверить 2"~
1
двоич-
ных наборов, если «+» будет соответствовать 1, а «—» — 0.
Программа решения задачи «счастливый билет» представлена
алгоритмом 4.9. Процедура SubSet (подмножество) этой програм-
мы реализует рассмотренный выше алгоритм 4.7 счета в системе
счисления с основанием 2 для порождения всех (п — 1)-разрядных
наборов. Порожденные двоичные наборы используются в проце-
дуре Summa (сумма) для формирования суммы, соответствующей
данному набору знаков «±», где «+» соответствует 1, а «—» — 0.
78 _ Глава 4. Генерация комбинаторных объектов
Алгоритм 4.9. Программа на Pascal 'е решения задачи
«Счастливый билет»
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+ (2*b [i] -1) *a[i+l] ;
if S=m then begin
Write(f,a[l]);
for i:=l to n-1 do begin
if b[i]=l then Write {£,'+') else Write (f,'-');
Write(f,a[i+l]);
end;
WriteLnff,' = ',3: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,b,n,m);
i:=l;
while b[i]=l do begin
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. Генерация размещений
с повторениями
Порождение множества всех размещений с повторениями
длины k из элементов {а0, аь..., ап_{ эквивалентно генерации
множества ^-разрядных чисел в системе счисления с основани-
ем и: на г-м месте в размещении будет располагаться элемент я,,
если цифра в r-м. разряде соответствующего числа равна /. Всего
размещений с повторениями п . Например, для k = 2 и п = 3 все
наборы длины два в системе счисления с основанием три можно
записать: 00,01,02,10,11,12, 20,21,22. Тогда эквивалентные раз-
мещения примут вид
(а0я0), (а0а{), (айа2), (а^), (а^), (а^), (а2«о). (a
2fl
i)> (o2«2)-
Алгоритм 4.10 использует фиктивный элемент bk при порож-
дении наборов длины k в системе счисления с основанием и, где
80 Глава 4. Генерация комбинаторных объектов
bj е {О, 1,..., п — 1}, /'=О, 1,..., k,т.е. 6,—этоцифрыгенерируемого
числа в системе счисления с основанием п.
Алгоритм 4.10. Счет в системе счисления с основанием п
для порождения всех k-разрядных наборов
while bk * 1 do
Awr(6*_i>**-2>-A));
/=0;
whilebj =n-ldo .'_~ '
bt =6, +1.
4.6. Порождение сочетаний
Обычно требуются не все подмножества множества {alt a2,...,
а„}, а только те, которые удовлетворяют некоторым ограничени-
ям. Особый интерес представляют подмножества фиксирован-
ной длины k, С* сочетаний из п предметов по А:штук. Как обычно,
предполагаем, что основным множеством является множество
натуральных чисел {1, 2,..., п}; таким образом, будем порождать
все сочетания длины k из целых чисел {1,2,..., п}. Так, например,
Cl =20 сочетаний из шести предметов по три (т.е. трехэлементные
подмножества множества {1,2,3,4,5,6}) записываются в лексиког-
рафическом порядке следующим образом:
123 135 234 256
124 136 235 345
125 145 236 346
126 146 245 356
134 156 246 456
Сочетания в лексикографическом порядке можно порождать
последовательно простым способом. Начиная с сочетания (1,
2,...,k} следующее сочетание находится просмотром текущего со-
четания справа налево с тем, чтобы определить место самого пра-
вого элемента, который еще не достиг своего максимального зна-
чения. Этот элемент увеличивается на единицу, и всем элементам
справа от него присваиваются новые возможные наименьшие
значения, как показано в алгоритме 4.11. Алгоритм порождения
всех С* сочетаний линеен, его сложность С* +о(С%).
4.6. Порождение сочетаний 81
Алгоритм 4.11. Порождение сочетаний
for i = 0 to k do с/ = i;
Print(ci,c2,...,ck);
while Cj = n -k+j do j = j -1;
Cj = Cj +1;
oc, =c, , +1.
whilej Ф 0 do
Задача. Выпуклый многоугольник. Дано множество пар целых
чисел (*j, у{), (х2, у2),---, (хп, у„) — координаты точек на плоскости.
Написать программу выделения тех точек из заданного множест-
ва, которые являются вершинами выпуклого многоугольника,
содержащего все остальные точки. Исходные данные представле-
ны в текстовом файле, имеющем следующую структуру. Первым
числом в файле является целое п — количество точек. Последую-
щие числа определяют п пар целых (х, у,) — координаты точек. Ре-
зультаты расчетов, признаки принадлежности исходных точек
выпуклому многоугольнику: 0 — точка не принадлежит, 1 — точ-
ка принадлежит, сохранить в текстовом файле.
Пример файла исходных данных:
15
0 0 9 9 5 1 2 3 2 7 1 1 5 4 6 7 1 5 6 7 3 4 5 7 7 8 8 7 6 4
Выходной файл для данного примера:
1 1 1 0 1 0 0 0 1 0 0 0 0 1 0
Решение. Если не применять специальных методов, то в каче-
стве решения можно использовать следующий алгоритм. Ясно,
что точка (Xj у,) является вершиной выпуклого многоугольника,
если она не лежит ни в одном треугольнике, вершинами которых
являются исходные точки (xb
yj, (x2
, у?),..., (хп
, уп
), без рассмат-
риваемой точки (xt
у,-). Всего треугольников из п точек можно со-
ставить С„
3
+ 0(п
3
). Тогда сложность задачи полного перебора тре-
угольников для каждой точки (xir
у,) составит 0(п ). Реализация
данного подхода представлена программой на языке 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
VI • —*~ M 1 • V9 • —<~ Г ? 1 • V • —1~ Г 7 1 •j.x > —O L J . J , ?*£.. —о i &. j , jvj. —L - i ~ j j f
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 k do c[i]:=i;
j:=l;
while j<>0 do begin
{Print(c,k);}
Envelope(c,n);
j:=k;
while c[j]=n-k+j do j:=j-l;
c[j]:=c[j]+l;
for i:=j+l to k 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],' *);
Close(f);
end. {Main}
4.7. Порождение композиций и разбиений
Рассмотрим задачу порождения разбиений положительного
числа п в последовательность неотрицательных целых чисел (z,
z2,..., zk],
такчто
Zi + z2 + ... +zk = n.
Разбиение {^i, Zi,--, zk
} называется композицией числа п, если
учитывается порядок чисел г,. Как правило, представляют инте-
рес композиции, в которых либо все г, > 0, либо все г, > 0.
84 Глава 4. Генерация комбинаторных объектов
Разбиение {^i, Zi,—, Z^} называетсяразбиением числа п, если все
Zj> 0 и порядок чисел г, не важен. По сути разбиение {z, Z},—, Z/J
числа я является мультимножеством (см. п. 1.8).
Рассмотрим примеры разбиения числа п = 3.
(1, 2), (2, 1) — все композиции числа три из двух частей, г/ > 0.
(1, 1, 1) — все композиции числа три из трех частей, z > 0.
(О, 3), (1, 2), (2, 1), (3, 0) — все композиции числа три из двух час-
тей, z,> 0.
(3), (1, 2), (1, 1, 1) — все разбиения числа три.
Композиции z, > О
Композицию [z, Zi,-, zd, гдеZj > 0, числаz + Zi +-+ z^ = n можно
интерпретировать следующим образом. Каждое значение
Zj= 1,+ 1/ + ... + 1/ представим как сумму единиц, количество кото-
рых zt
. Индекс у элемента 1,- показывает его принадлежность разло-
жению числа Zj. Таким образом, мы ввели k типов различных эле-
ментов {1Ь
12
,..., 1*}, значение каждого из них равно единице. Те-
перь любую композицию можно представить как сумму, составлен-
ную из п произвольных единиц множества {Ij, 12
,..., 1*}. Суммируя
подобные единицы 1, с одинаковыми индексами, получим соответ-
ствующие значения £, композиции. Данное соответствие является
взаимно однозначным, откуда и следует, что число композиций
равно числу сочетаний с повторениями C"k = C^_j = C^+A_j. Каждое
из сочетаний C"+k_{ можно интерпретировать как расстановку 1 и О
длины п + k - 1, в которой п единиц и k - 1 нуль, т.е. каждому соче-
танию ставим в соответствие (п + k- 1)-разрядное число из единиц
и нулей; верно и обратное. Суммируя в таком числе слева направо
единицы между нулями (их k - 1), будем получать соответствующие
значения членов z (их k) композиции. Например, одному из
c
«+*-i =c
i7?
+7-i сочетаний 11011100111101111111010 соответствует
композиция (2,3,0,4,7,1,0) числа 17.
Ясно, что методы предыдущего раздела генерации подмно-
жеств множества легко применить к последовательному порож-
дению рассмотренных композиций г, S 0.
Композиции zt > О
Удобное представление композиций получается из рассмотре-
ния целого числа п как отрезка прямой, состоящего из отрезков
единичной длины. Линия разделена п - 1 точками, и композиция
4.7. Порождение композиций и разбиений 85
получается пометкой некоторых из них. Элементами компози-
ции являются просто расстояния между смежными точками. На
рисунке показано графическое представление композиции
(2,1,2,2,1) для числа п = 8. Очевидно, что каждая композиция чис-
ла п соответствует способу выбора подмножества из п - 1 точек.
Каждой точке можно сопоставить двоичную цифру, и, таким об-
разом, композиции п будет соответствовать (п - 1)-разрядное
число. В этой интерпретации композиция из Участей соответст-
вует (п - 1)-разрядному числу ровно с k - 1 единицами, и поэтому
существует C*J/ таких композиций.
Воспользуемся методами предыдущего раздела для генерации
композиций Zj > 0. Учитывая, что в композиции z + Z2
+...+ zk
=
п
каждый из Zj > 0, тогдадля новых переменных г, = z, - 1, (г,- > 0) со-
ответствующая композиция (/*!, г2
,..., rk
) будет для числа n-k =
= r
i +
Г
2
+
"-
+ r
k>
r
i - О- Генерация слагаемых г, > 0 композиции (г1;
r2
,..., rk
) подробно разобрана в предыдущем разделе, добавляя к
каждому из г, по единице, получим слагаемые zf
> 0 композиции
{Zi, Z2
, — , Zk}-
Разбиения
Разбиения п отличаются от композиций п тем, что порядок
компонент не важен, так что, например, не делается различия
между, скажем, 1+1+2,1+2+1, 2+1+1. Таким образом, разбиение
п можно рассматривать как мультимножество, которое записы-
вается следующим способом:
{ml
»zl
,m2
»z2
,..-,mk
»zk
},
где имеется т вхождений z, т2
вхождений z2
, щ вхождений г3
k
и т. д. и и =^/и,г,. Каждое разбиение удовлетворяет условию
/=1
Zi > z2
> ... > z^ Рассмотрим пример генерации разбиений для
п = 7. Последовательность генерации разбиенийданного примера
далее будет положена в основу алгоритма порождения полного
списка разбиений.
Идея приведенного списка разбиений состоит в том, чтобы пе-
реходить от одного разбиения к следующему, рассматривая са-
мый правый элемент тk
»zk
разбиения. Если mk
zk
достаточно ве-
86 Глава 4. Генерация комбинаторных объектов
лико (mk > 1), можно исключить два zk для того, чтобы добавить
еще одно zk + 1 (иливключить одно ^ + 1, если втекущиймомент
его нет). Если mk = 1, то m^Zk-i + mkzk достаточно велико для
того, чтобы добавить Zk- + 1. Все, что остается, превращается в
соответствующее число единиц и формируется новое разбиение.
{VI)
{1«2,5Ч}
{2'2,3'1}
{3-2, 1-1}
{1-3, 4-1}
{1'3,1«2,2Ч}
{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'U
=(1,1,1,1,1,1,1)
={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}
,1}={3,3,
={4,1,1,1}
={4,2,1}
={4,3}
={5,1,1}
={5,2}
={6,1}
{1'7> ={7)
Алгоритм 4. 13 использует рассмотренный процесс для порож-
дения всех разбиений числа п.
Алгоритм 4.13. Генерация разбиений числа п
k=;
т = п;
while k Ф 0 do •
Print{ml
•zl
,m2
Summa = тk
zk

{k-k-V
ifmk
=lthen~'
l>
c
[Summa =Summa+mk
zk
',
ifZk-i
= z
k +lthen
elsel
k
.
k
'
mk =1;
if Summa >zk
then mk+l
= Summa-zk
',
4.7. Порождение композиций и разбиений 87
Алгоритм 4.13 линеен, так как число операций, необходимых
для перехода от одного разбиения к другому, ограничено кон-
стантой, не зависящей от п и k.
Программа на языке Pascal реализации рассмотренного мето-
да генерации разбиений чисел приводится в алгоритме 4.14. От-
метим, что в программе число для разбиения п читается из файла,
а порождаемые разбиения сохраняются в файле. Попутно про-
грамма вычисляет полное время генерации всех разбиений с точ-
ностью до сотых долей секунды, которое сохраняется в конце
файла сгенерированных разбиений.
Алгоритм 4.14. Программа на Pascal'е генерации разбиений
числа п
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,'{
Л
);
for i:=l to k do begin
Write(f,m[i],'*',z[i]);
if iok then Write (f,',');
end;
WriteLnff,'}');
end;{Print}
Procedure Divide( n:Integer ); {Разбиение числа n)
Var
k,Sum :Integer;
begin;
k:=l;
z[-l]:=0;
m[-l]:=0;
88 _ Глава 4. Генерация комбинаторных объектов
z [0] :=п+1;
т[0] :=0;
:=п;
while k<>0 do begin
Print (т, 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, Seel00 :Word;
rHour, rMinute, rSecond, rSeclOO :Word;
delta rLonglnt;
begin
Assign(f,'Divide.in');
Reset (f); {Файл открыт для чтения}
ReadLn(f,n); {Чтение числа 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*100+rSeclOO-Secl00;
WriteLn(f,'Время счета=',delta div 100,'.',
delta mod 100,' сек' ) ;
Close (f ) ;
end.
4.8. Генерация случайных перестановок 89
4.8. Генерация случайных перестановок
Пусть тс = (nlt
я2
,..., п„) — произвольно выбранная перестанов-
ка целых чисел 1, 2,..., п, например, я = (1, 2,..., и) — тождествен-
ная. Случайную перестановку можно получить за линейное время
О(п) из выбранной перестановки я = (я1;
я2
,...,
п
л)> выполнив
в ней п транспозиций (см. п.7.4).
Для промежуточных перестановок введем верхний индекс,
значение которого будет соответствовать количеству выполнен-
ных транспозиций. Один из элементов в каждой транспозиции
выбирается случайным образом. Индекс такого элемента уста-
навливается функцией rand(k,t), которая порождает независимые
случайные целые числа на отрезке [k, l с равномерным распреде-
лением.
Положим я
(0)
= (Tc
(
j
0)
,тс
(
2
0)
,...,TcJ,
0)
)равной исходной перестановке
я = (яь
тс2
,..., тс„). Каждая следующая перестановкаTC
W
=(я
(
1
А)
,тс
(
2
/г)
,...,
я^')получаетсяизпредыдущейперестановкия**'
1
' =(п^'
1)
,n
(
2
k
~
l)
,
...,я^*~
1)
) транспозицией элементов я^
-1)
ия
(
г
*~]* гдеА;= 1,2,...,
п. Между элементами перестановок я , я ,..., я вьшолняются ра-
венства я
(
;> =я
(
А
"-
1)
=..-=n[
k)
, где k=l, 2,..., п.
Покажем, что после выполнения всех указанных п транспози-
ций равновероятно получение любой из п! возможных перестано-
вок и = (als
о-2
,...,ст„) исходных чисел я1
,п2
,...,кп
. Для этого доста-
точно проверить, что Рг(л
(
'^ = а) = /п. С этой целью введем со-
бытия AI, А2
,..., Ап
.
k
_V =0-^}, k = 2,..., п.
Вероятности данных событий, согласно схеме формирования
я
(0)
, я
(1)
,..., я
(п)
, равны
Pi(Ak
) = !/(«- k +1), гдеЛ=1, 2..., п.
перестановок я
(0)
, я
(1)
,..., я
(п)
, равны
90 _ Глава 4. Генерация комбинаторных объектов
Условие я**'
1
* =ст1
&л
(
2
/:
"
1)
=ст2
&...&л^
1)
=ok
_l
в событии Ль
k = 2,..., п, обеспечивает выбор элемента n
(k
~
1
),, , из множестваrand(kjt)
{я^*
1)
,п
(
А
*~
1)
,...,я^ ^J, которое совпадает с множеством {стл
,
сгЛ+
1,..., а„}. Индекс же rand(k, n) элемента n^J* является неза-
висимой случайной величиной с равномерным распределением
на отрезке [k, n] целых чисел.
Теперь заметим, что
Рг(л(я)
= ст)=Рг(л(
1")
= ст1&я2")
= а2&...&я<л)
=а„) =
= Рг(л(
1
1)
=сг1&л(
2
2)
=а2&...&л<,я)
=ст„) =
Рассмотренный метод генерации случайной перестановки
представлен в алгоритме 4.15.
Алгоритм 4.15, Генерация случайной перестановки
for k= to n do nk
= k; {Начальная перестановка}
for k = 1 to n - 1 do uk
«-» nrand
(krf>
; { Случайная перестановка}
или, если генерацию перестановки вести с конца,
for k = 1 to n do nk
- k {Начальная перестановка]
for k = n to 2 do nk
<-» Kran
d({^) { Случайная перестановка}.
Сортировка и поиск
ассматриваемые здесь вопросы можно отнести к наиболее
часто встречающимся в задачах машинной обработки данных.
Почти во всех компьютерных приложениях множество объектов
должно быть переразмещено в соответствии с некоторым заранее
определенным порядком. Очевидно, что с сортированными дан-
ными легче работать, чем с произвольно расположенными. Сор-
тировка больших объемов данных составляет значительную часть
коммерческой обработки данных, эффективные алгоритмы для
сортировки важны и с экономической точки зрения. Эффектив-
ность оценивается с точки зрения требуемых памяти и времени, а
также простоты программирования. Простота программирова-
ния предполагает и простоту понимания используемого метода,
поскольку для того, чтобы написать хорошую программу, важно
хорошо понять соответствующий метод. В наших же оценках мы
будем учитывать только число сравнений. Самые простые алго-
ритмы сортировки, основанные на сравнении элементов, имеют
сложность порядка 0(п
г
), а лучшие из них обходятся количеством
сравнений 0(«log2
«).
Задачу сортировки можно сформулировать так: дана последо-
вательность из п элементов alt
а2
,..., а„, выбранных из множества,
на котором задан линейный порядок, т.е. для любых а,, а7
- выпол-
няетсялибо а, < Oj, либо а, < я,, либо ау
= Oj, либо а, > йу
, либо а, > Oj.
Требуется найти перестановку n = (nl
,n2
,...,nn
) этих п элементов,
которая отобразит данную последовательность в неубывающую
последовательность ап
<а„2
<...<аТГл
. Как правило, далее будем
получать саму упорядоченную последовательность, а не упорядо-
чивающую перестановку п.
Методы сортировки классифицируются на внутренние (когда
данные размещаются в оперативной памяти) и внешние (когда
данные размещаются на внешней памяти). Внешняя сортировка
составляет часть таких приложений, в которых в работу вовлека-
ется гораздо больше элементов, чем можно сразу запомнить в
оперативной памяти. Поэтому методы внешней сортировки при-
92 Глава 5. Сортировка и поиск
менимы к данным, находящимся на внешних устройствах памя-
ти, и имеют огромное коммерческое значение.
Внутренняя сортировка важна как для разработки алгоритмов,
так и для коммерческих приложений. Сортируемые данные раз-
мещаются в оперативной памяти. Здесь рассматриваются именно
методы внутренней сортировки данных. Известно много алго-
ритмов сортировки данных. Почему же так много методов сорти-
ровки? Ответ состоит в том, что каждый метод имеет свои преи-
мущества и недостатки, поэтому он оказывается эффективнее
других при некоторых структурах данных и аппаратной части.
Здесь же мы не пытаемся охватить даже те из них, которые счи-
таются важными; скорее, мы ограничимся методами, оказавши-
мися полезными в разработке алгоритмов и в практической их ре-
ализации. Рассматриваемые здесь методы сортировки активно
используются при разработке алгоритмов во многих разделах
данного пособия. Полезно изучить характеристики каждого ме-
тода сортировки, чтобы можно было производить разумный вы-
бор для конкретных приложений. К счастью, задача изучения
этих алгоритмов не столь уж громоздка.
5.1. Сортировка вставками
Сортировка вставками элементов аь
а2
,..., а„ относится к наи-
более очевидным методам (алгоритм 5.1). Для компактности ал-
горитма вводится фиктивный элемент а0
, значение которого
устанавливается равным -оо. Сортировка проходит цикл дляу = 2,
3,..., п; для каждого j элемент в,- вставляется в свое правильное
место среди я1;
а2
,..., o/_i. При вставке элемент ^временно разме-
щается в >и просматриваются имена Ду_1(
Oj_2
,..., a^, они сравни-
ваются с w и сдвигаются вправо, если обнаруживается, что они
больше w. Имеется фиктивный элемент а0
, значение которого -оо
служит для остановки просмотра слева.
Алгоритм 5.1. Сортировка вставками
о0 =
'=7-1;
w=a
j>
forj = 2 ton do{ I a,., =a,-;
while w <o. do { '+1
[/=/+1;
ai+1=w.
5.2. Пузырьковая сортировка 93
Сложность алгоритма определяется числом проверок условия
w < djB цикле. Сравнение w < д, для конкретного w = а, (/' > 2) вы-
полняется 1 + с^раз, где dj — число элементов, больших Oj и стоя-
щих слева от него, т.е. dj — это число инверсий, у которых второй
элемент о,-. Числа dj составляют таблицу инверсий dld2...dn, а так
как 0 <fl"i< л - 1, 0 < d2 < л - 2,..., О < dn_v < 1, dn = 0, то в худшем
п
случае сортировка элементов ab a2,..., an потребует ~^(l + d j ) <
j'2
А „ .. n(n-l) n
. 2ч
<2_l(l+n-j) = — - - - = 0(n ) сравнении. Сложность сортировки
>2 2
вставками является квадратичной.
5.2. Пузырьковая сортировка
Рассматриваемый метод пузырьковой сортировки последова-
тельности аь а2,..., ап представляет собой наиболее очевидный
метод систематического обмена местами слева направо смежных
элементов, не отвечающих выбранному порядку, до тех пор пока
каждый элемент не оказывается на правильном месте. Эта техни-
ка получила название пузырьковой сортировки, так как большие
элементы «пузырьками всплывают» вверх в конец списка. Реали-
зация метода представлена алгоритмом 5.2. В алгоритме исполь-
зуется переменная Ь, значение которой при каждом проходе цик-
ла устанавливается равным наибольшему индексу t, такому, что
все элементы аг+1, а1+2,..., ап уже находятся на своих окончатель-
ных позициях. Ясно, что не имеет смысла продолжать просмотр
для указанных элементов.
Алгоритм 5.2. Пузырьковая сортировка
while b*Qdoforj=tob-do if a} > aj+l then I
uj
_
[' -J'
(b=t.
Сложность алгоритма определяется числом проверок условия
uj > aj+i в цикле и числом обменов я,- <-> а,+1, которое равно числу
инверсий в исходной перестановке элементов alt a2,..., ап. Опре-
делим число сравнений. В худшем случае верхняя граница b - 1
94 ___ Глава 5. Сортировка и поиск
вложенного циклаfor на каждом шаге внешнего цикла while будет
1
уменьшаться на 1, тогда число сравнений равно ^(Ь -1) = (я - 1) +
+(п-2)+...+1=—--=0(л
2
).Сложностьпузырьковойсорти-
ровки является квадратичной.
В алгоритме 5.3 представлена «полная» пузырьковая сортиров-
ка. Это наиболее популярный и упрощенный вариант алгоритма
5.2. Ясно, что основным достоинством алгоритма полной пузы-
рьковой сортировки является легкость программирования.
Сложность же алгоритма 5.3 остается постоянной, равной
2
п-/)=(п-1)+(п-2)+...+1=—--=0(п
2
),инезависитотрас-
2
положения исходных данных.
Алгоритм 5.3. Полная пузырьковая сортировка
for i = 1 to n do begin
forj = 1 to n - i do begin
end;
end.
> aj+i
then а}
<->
5.3. Сортировка перечислением
Идея сортировки поеледовательности д1;
а2
,..., «„данных пере-
числением состоит в том, чтобы сравнить попарно все элементы
аь
а2
,..., ап
и подсчитать, сколько из них меньше каждого отдель-
ного элемента (алгоритм 5.4). Для подсчета числа элементов, ме-
ньших данного, в алгоритме используется вспомогательный век-
тор cl
,c2
,--,cn
. После завершения алгоритма значения Cj+l,j= 1,
2,..., п определяют окончательное положение элементов о. в сор-
тированной последовательности rl;
г2
,..., гп
.
Алгоритм 5.4. Сортировка перечислением
for i = 1 to n do ct
: = 0 { Сбросить счетчики}
for i = п to 1 by -1 do begin
forj = i - 1 to 1 by -1 do begin
ifa/ > Oj then ct
= c, + 1
end;
else C = Cj+ I
5.4. Сортировка всплытием Флойда 95
end;
for i = 1 to n do begin;
r
c-+i
=a
i (
r
i— сортированные элементы}
end.'
Сложность алгоритма сортировки перечислением определяет-
ся парой вложенных циклов и составляет 0(п
2
). Величина слож-
ности не зависит от расположения данных в исходной последова-
тельности аь
а2
,..., а„.
Пусть перестановка л = (п17
я2
,..., пп
), гдетс,— с,- + 1, /= 1, 2,..., п.
Алгоритм 5.4 сортировки перечислением определяет перестанов-
ку л~ , которая соответствует расположению а ч
<а ., <...<а i
7Г] 7I2
71„
исходных данных (см.п.1.14).
5.4. Сортировка всплытием Флойда
Все ранее упомянутые методы сортировки последовательно-
сти alt
a2
,..., ап
требовали сравнений порядка О(п ), и «это никуда
не годится». Рассмотрим один из наиболее элегантных и эффек-
тивных методов сортировки сложности 0(nlogn), предложенный
Флойдом. До сих пор он остается самым оптимальным из сущест-
вующих методов. В алгоритме активно используется упорядочен-
ное двоичное дерево, пример которого представлен на рис. 5.1.
96-
22 17 2 28
Рис. 5.1. Пример упорядоченного двоичного дерева
Значение в каждой его вершине не меньше, чем значение в его
дочерних вершинах. Двоичное дерево называется частичноупоря-
доченным, если свойство упорядоченности выполняется для каж-
дой из его вершин, однако для корня это свойство нарушается.
Пример частично упорядоченного дерева приведен на рис. 5.2.
22 17 2 28
Рис. 5.2. Пример частично упорядоченного двоичного дерева
96 Глава 5. Сортировка и поиск
Интересно отметить, что в ранее рассмотренных методах сор-
тировки сложности 0(п
2
) при выборе наибольшего (наименьше-
го) элемента, «забывали» информацию о других, забракованных
элементах на эту роль, хотя эта проверка и выполнялась. Структу-
ра же дерева позволяет сохранить состояние процесса сортировки
последовательности alt a2,..., а„ на каждом его шаге, с целью ис-
пользования этого состояния в дальнейших расчетах и уменьше-
ния числа операций сравнений при поиске наибольшего (наи-
меньшего) из оставшихся элементов.
Метод сортировки Флойда представлен в алгоритме 5.5, где
исходная последовательность а1; й2,..., ап данных представляется
в виде дерева на смежной памяти (одномерный массив а[1..п]). В
таком дереве ребра присутствуют неявно и вычисляются с помо-
щью арифметических операций над индексами элементов масси-
ва — смежной памяти. Пример двоичного дерева показан на
рис. 5.3. Корень дерева — а[1], за каждой вершиной a[k] следуют
вершины a[2k] и a[2k+l]. Использование смежной памяти для
представления дерева имеет и другие преимущества, которые ста-
новятся очевидными после анализа алгоритма 5.5.
а[2]
а[5] а[б а[7]
Рис. 5.3. Пример двоичного дерева на смежной памяти
Основу алгоритма 5.5 составляет процедура SURFACE (a[i..k])
всплытия Флойда, которая за O(log2
«) сравнений преобразует
почти упорядоченное поддерево в упорядоченное. Поддерево
представляется на одномерном массиве a[i..k], рис.5.4, где a[i] —
корень поддерева, a[k] — максимальный элемент массива, кото-
рый еще может принадлежать поддереву.
a[k]
Рис. 5.4. Двоичное поддерево на смежной памяти a[i..k]
5.4. Сортировка всплытием Флойда 97
Определим сложность процедуры SURFACE всплытия Флой-
да. Процедура заключается в том, что значение из корня (здесь
может нарушаться условие упорядоченности) всплывает по на-
правлению клистьям (последний уровень вершин вдереве) до тех
пор, пока дерево не преобразуется в упорядоченное. Во время
всплытия на каждом уровне выполняется конечное число С опе-
раций сравнения элементов. Если положить, что высота дерева
(число уровней в дереве) равна Л, то сложность одного всплытия
составит С • h = 0(h). Высота h регулярного двоичного дерева из п
вершин легко находится из соотношения п < 2° + 2
1
+...+ 2
Л
~
1
, где
2'"
1
— количество вершин на /-м уровне дерева, /= 1, 2,..., п. От-
сюда высота дерева Л = flog2(w + 1)1. Таким образом, сложность
процедуры SURFACE всплытия Флойда составляет O(log2«).
Рассмотренная процедура SURFACE всплытия Флойда позво-
ляет в почти упорядоченном дереве найти наибольший (наимень-
ший) элемент за число сравнений 0(log2«), преобразуя дерево к
упорядоченному виду. В результате найденный элемент будет
располагаться в вершине дерева. Для сортировки же множества
элементов аьа2,...,ап из них по алгоритму 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
всплытие -»-37 ->• перестановка-*• 18 -+• всплытие —> 18
4 18
56 63 65 66
перестановка -*• 4
18 37
56 63 65 66
Рис. 5.5. Пример сортировки чисел 18,4,56,65,37,63,66
методом Флойда
Алгоритм 5.5. Сортировка всплытием Флойда сложности 0(и1о§2
«)
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]:=Random(100);
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,1,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:I,']=',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(1о§2
«), общая сложность алгоритма сортировки данных аь
а2
,..., ап
равна 0(«log2
«).
Это лучшая оценка, на что вообще можно надеяться при сор-
тировках, в основу которых положены сравнения данных. Дейст-
вительно, число возможных перестановок из элементов а{
, а2
,...,
ап
равно п и только одна из них удовлетворяет условию нашей
сортировки. Двоичный же поиск перестановки среди множества
л! перестановок требует Iog2
«! числа сравнений. Для упрощения
воспользуемся формулой Стирлинга п~ J2nnnn
e~". Тогда
Iog2
«! ~j2nnnn
e~n
=0(«log2
«).
Задача. Длина объединения отрезков. Текстовый файл содержит
целые числа: аь
Ь1г
а2
, Ь2
,..., а„, Ь„. Данная последовательность чи-
сел определяет на прямой п отрезков [а,-, Ь,], / = 1, 2,..., п. Найти
длину объединения указанных отрезков. Исходные данные пред-
ставлены в текстовом файле со следующей структурой. Первая
строка файла: п — количество отрезков. Вторая, третья и т.д. стро-
ки файла содержат целые числа а-„ bi
— границы соответствующих
отрезков. Результаты расчетов длины объединения отрезков со-
хранить в текстовом файле.
5.4. Сортировка всплытием Флойда 101
Пример файла исходных данных:
з
О 2
-1 1
О 1
Пример файла выходных данных:
з
Решение. Алгоритм 5.6 решения задачи основывается на пред-
варительной сортировке абсцисс al
, Ьь
а2
, Ь2
,..., а„, Ъп
в массиве
ab[l..2n]. Создается вспомогательный массив g[1..2n], который
поддерживает после сортировки массива ab[..2n] отношение
границ отрезков: g[i] = 1 — левая граница, g[i] = 0 — правая грани-
ца. Вычисление завершается простым просмотром массива
ab[1..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, с : Integer/-
begin
ab[0]:=ab[1];
m:=0; {Длина объединения}
c:=0; {Число перекрывающихся интервалов}
for i:=l to n do begin
if coO then m:=m+ab[i] -ab[i-l] ;
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+1]; ab[j+l]:=w;
w:=g[j]; g[j]:=g[j+1]; 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(f,ab[k-l],ab[k]);
g[k-l]:=l; {Левая граница}
g[k]:=0; {Правая граница}
end;
Close(f);
Assign(f,'Measure.out');
Rewrite(f); {Файл открыт для записи}
SortBubble(2*n);
Measure(m,2*n);
WriteLn(f,m); {Длина объединения}
Close (f);
end. {Main}
5.5. Последовательный поиск
Задача поиска является фундаментальной в алгоритмах на ди-
скретных структурах. Удивительно то, что, накладывая незначи-
тельные ограничения на структуру исходных данных, можно по-
лучить множество разнообразных стратегий поиска различной
степени эффективности.
5.5. Последовательный поиск 103
При последовательном поиске подразумевается исследование
элементов множества а{
, а2
,..., а„ в том порядке, в котором они
встречаются. «Начни сначала и продвигайся, пока не найдешь
нужный элемент; тогда остановись». Такая последовательная
процедура является очевидным способом поиска. Алгоритм 5.7
выполняет последовательный поиск элемента z в множестве alt
а2
,..., ап
. Несмотря на свою простоту, последовательный поиск
содержит ряд очень интересных идей.
Алгоритм 5. 7, Последовательный поиск
с = 0; (Признак поиска записи г }
{с =]•
'
break;
ifc=l then Запись найдена else Запись не найдена.
Оценим среднюю сложность поиска элементов множества als
а2
,..., а„. Для нахождения /-го элемента а, требуется / сравнений.
Для вычисления же среднего времени поиска необходимо задать
информацию о частоте обращения к каждому элементу множест-
ва. Будем предполагать, что частота обращения распределена рав-
номерно, т.е. что ко всем элементам обращаются одинаково час-
то. Тогда средняя сложность поиска элемента множества являет-
- , . „, .
ся-> /=-=0(п)линейной.
»м 2
Рассмотрим распределение частот обращения к элементам в
общем случае. Пусть р, обозначает частоту (распределение веро-
п
ятностей) обращения к элементу а/, где р/>0 и ^р,- =1. В этом
/=1
случае средняя сложность (математическое ожидание) поиска
п
элемента будет равна ]Г /р, . Хорошим приближением распределе-
(=1
£
ния частот к действительности является закон Зипфа: р, =т> для
/ = 1, 2,..., п. (Дж. К. Зипф заметил, что я-е наиболее употребите-
льное в тексте на естественном языке слово встречается с часто-
той, приблизительно обратно пропорциональной л.) Нормирую-
п
щая константа выбираетсятак, что ^]р, =1. Пусть элементы мно-
/=i
жества аь
аг
,..., ап
упорядочены согласно указанным частотам.
104 __ Глава 5. Сортировка и поиск
- 1 1 1
Тогдас=-=-я—исреднеевремяуспешногопоискасо-
Я Ы,
. .с 1 п п + 
ставит>го•=>i-=n-c-п-»-,чтомногоменьше-.
£ ft / Нп 1гш' 2
Последний пример показывает, что даже простой последовате-
льный поиск требует выбора разумной структуры данных множе-
ства, который бы повышал эффективность работы алгоритма. Бо-
лее того, это общепринятая стратегия, время от времени переупо-
рядочивать данные, для большинства последовательных файлов во
внешней памяти, когда последовательная природа файла диктует-
ся техническими характеристиками носителя информации.
Алгоритм последовательного поиска данных одинаково эф-
фективно выполняется при размещении множества аь а2,..., а„ на
смежной или связанной памяти.
5.6. Логарифмический поиск
Логарифмический (бинарный или метод деления пополам) по-
иск данных применим к сортированному множеству элементов
GJ < д2 < ••• <а
п> размещение которого выполнено на смежной па-
мяти. Для большей эффективности поиска элементов надо, чтобы
пути доступа к ним стали более короткими, чем просто последова-
тельный перебор. Наиболее очевидный метод: начать поиск со
среднего элемента, т.е. выполнить сравнение с элементом а, 1+„ , .
_ L 2 J
Результат сравнения позволит определить, в какой половине по-
следовательности tfj, U2,..., а, 1+„ ,,..., ап продолжить поиск,
применяя к ней ту же процедуру, и т.д. Основная идея бинарного
поиска довольно проста, однако «для многих хороших програм-
мистов не одна попытка написать правильную программу закон-
чилась неудачей». Чтобы досконально разобраться в алгоритме,
лучше всего представить данные а^ < а2 < ... < а„ в виде двоичного
дерева сравнений, которое отвечает бинарному поиску.
Двоичное дерево называется деревом сравнений , если для лю-
бой его вершины (корня дерева или корня поддерева) выполняет-
ся условие:
{Вершины левого поддерева} <Вершина корня <{Вершины
правого поддерева }.
5.6. Логарифмический поиск 105
Пусть на очередном шаге деления пополам оказалось, что необ-
ходимо выполнить поиск среди элементов а,- < a,+i <...< а,-. В каче-
стве корня принимается элемент a, i + j , , где  '-^- ] — наибольшее
целое, меньшее или равное (/ +f)/2. Левое поддерево располагает-
ся в векторе а„ ai+i,..., a, U J , , а правое поддерево — в векторе
[~та
 ,ч; i )•••. Oj_i, uj. На рис. 5.6 показан пример двоичного дерева
сравнений, ребра которого неявно выражаются рассмотренными
выше отношениями между индексами элементов а{, а2,..., ап.
^9
5- "
Рис. 5.6. Пример дерева сравнений, отвечающего бинарному поиску
среди сортированных эламенюв: 3,5,7,9,12,19,27,44
Поиск элемента z среди а < a2 <...< ап методом деления попо-
лам представлен в алгоритме 5.8.
Алгоритм 5.8. Логарифмический поиск z в al < a2 <...< а„
/ind=Q; {Признак поиска записи}
/ = 1; {Левая граница поддерева}
j = n; {Правая граница поддерева}
while i <j do begin
т = '-±L ; {Корень текущего поддерева}
ifz= am then **
п
~ {Элемент найден]
I &FCUK
else ifz > ат then i = т + 1 {Новая левая граница}
elsej = т — 1 {Новая правая граница}
end',
iffind = 1 then Запись найдена;
else Запись отсутствует.
106 Глава 5. Сортировка и поиск
Средняя сложность бинарного поиска среди элементов et
<
< я2
<•••<
а
п сравнима с высотой двоичного дерева (рис 5.6). В худ-
шем случае искомый элемент может оказаться либо на последнем
уровне, либо вообще не будет найден. На каждом уровне необхо-
димо выполнить определенное число сравнений. В п.5.4 установ-
лено, что уровней в дереве flog2
(n + 1)1. Значит, сложность поис-
ка является логарифмической 0(1о§2
и), что оправдывает и назва-
ние самого метода поиска.
Необходимо отметить, что рассмотренный метод бинарного
поиска предназначен главным образом для сортированных эле-
ментов ai < а2
<...< а„ на смежной памяти фиксированного п раз-
мера. Если же размерность вектора динамически меняется, то
экономия от использования бинарного поиска не покроет затрат
на поддержание упорядоченного расположения «j < a2
<...< а„.
5.7. Сортировка с вычисляемыми адресами
Пусть а{
, а2
,..., а„ — исходная последовательность сортируе-
мых целых чисел и л = (кь
п2
,..., п„) — упорядочивающая переста-
новка этих элементов ап
<ani
<... <а„п
. Принятое ограничение,
что о, — целые числа, не ведет к потере общности рассматривае-
мых ниже алгоритмов. Сортированная последовательность at
подсказывает очевидный способ использования значений этих
элементов в качестве индексов (адресов) их расположения в мас-
сиве bn
br+l
,..., bs
, где ba
. =d j . Получим упорядоченную последо-
вательность ЪГ
< Ьм
<...< bs
, а значит, и упорядоченную последо-
вательность исходных данных аь
а2
,..., ап
.
В качестве примера рассмотрим частный случай сортировки
элементов последовательности ait
a2
,..., aj, равных соответствен-
но 6,3,5,7,2, 4, 1 — различные целые числа от 1 до 7. Значение
каждого элемента а, показывает его место в сортированном спис-
ке bl
< Ь2
<...< Ь7
, где bj определяются в цикле
for /'= 1 to I doba
. = d j .
Сложность данного метода сортировки является линейной
0(п), где п = 1. Фактически, значения а, определяют перестановку
л = (кь
л2
,..., л„) =(7,5,2,6,3,1,4), которая упорядочивает элементы
ял
<аП2
<...<оПл
. Значения л, устанавливаются в цикле
for i= I to 7 dona
=/'.
5.7. Сортировка с вычисляемыми адресами 107
Сортировка стала возможной благодаря тому, что значения
исходных данных 6, 3, 5, 7, 2, 4, 1 заполняют сплошной интервал
последовательности натуральных чисел. Рассмотрим обобщение
идеи сортировки с вычисляемыми адресами на случай произволь-
ных целых аъ
а2
,..., а„. Алгоритм сортировки существенно упро-
щается, если все значения а, а2
,..., ап
различные.
Значения в„ а2
,..., а„ — различные
Реализация метода сортировки представлена в алгоритме 5.9.
Временный массив br
, br+l
,.,., bs
, где r=mm(al
, а2
,..., а„) и
s = max(ai, а2
,..., а„), используется для сортированной упаковки
элементов я15
а2
,..., а„. Свободные места в массиве br
, b^,..., bs
инициализируются значением s + 1, отличным от значений эле-
ментов flj, а2
,..., а„.
Алгоритм 5.9. Сортировка с вычисляемыми адресами
для различных а^, а2
,..., ап
{Поиск min и max значений среди alt
a2
,..., ап
}
r = s = al;
for i = 2 to n do begin
ifr>a, then r= a,
else ifs < ai
then s = a,
end;
{Инициализация bt
значением s+l, отличным от at
}
for i = rtosdobj = s+ 1;
{Сортированная упаковка элементов а^, а2
,..,, ап
}
for i = 1 to n do ba. =a,;
{Выделение сортированных а, а2
,..., ап
из bn
b^.b
.,., bs
}
k = 0;
for i-r to s do begin
ifbj#S+ 1 then begin
k = k+l;
a
k = */;
end;
end.
Сортированный вектор ax
< a2
<...< an
является результатом
последовательногопросмотрамассиваbn
b^i,..., ^приудалении
из него оставшихся незанятыми элементов, равных значению
108 Глава 5. Сортировка и поиск
s + 1. Алгоритм не содержит вложенных циклов, а значит, слож-
ность его линейная О(п).
Допускаются одинаковые значения среди я,, а2,..., я„
Реализация метода представлена в алгоритме 5.10. Наличие
одинаковых элементов среди alt
a2
,..., ап
, например, я, = о/, при
упаковке ba
= at
w.ba
=д7
ведет к потере данных в исходном мно-
жестве flj, а2
,..., ап
. Ситуация, когда одновременно несколько эле-
ментов претендуют на одно место, называется коллизией. Такие
элементы необходимо переразмещать на свободные места, сохра-
няя свойства сортировки с вычисляемыми адресами. С этой це-
лью на основании величин а1;
а2
,..., ап
рассчитывается вектор ин-
дексов dr
, drf-i,..., ds
сортированной упаковки данных а{
, а2
,..., а„
в массиве Ь1г
Ь2
,..., Ь„. В алгоритме 5.9 роль индексов упаковки
могли выполнять непосредственно сами значения элементов а{
,
а2
,..., а„, так как они были различные. В данном случае значения
dn
df+i,..., ds
настраиваются таким образом, что одинаковые по ве-
личине элементы из аь
о2
,..., ап
оказываются смежными при их
упаковке в массиве Ь1г
Ь2
,..., Ъп
. Вектор cr
, c^,..., cs
используется
для подсчета количества элементов каждого значения среди flj,
а2
,..., а„и формирования индексов упаковки dr
, d^i,..., ds
.
Алгоритм 5.10. Сортировка с вычисляемыми адресами
для произвольных а, а2
,..., ап
{Поиск min и max значений среди аь
а2
,..., а„ }
r = s = al;
for i - 2 to n do begin
ifr> at
then r= at
else ifs < a, then s = a,
end',
{Расчет количества элементов каждого значения a,}
for i = r to s do Cj = 0;
for i = 1 to n do ca. =ca. +1;
{Расчет индексов упаковки dr
, d^^..., ds
}
dr
=;
for / = /•+! to s do dt, = flf,._! + Cj_i,
{Сортированнаяупаковка элементов ui, a2
,..., а„ в bi,b2
,...,bn
}
for i = 1 to n do begin
k = a,;
5.7. Сортировка с вычисляемыми адресами _ 109
end.
Результирующий сортированный вектор исходных данных й1;
а2,..., ап располагается в массиве Ь1<Ь2< ... < Ь„. Алгоритм не со-
держит вложенных циклов, а значит сложность его линейная
0(п).
Сортировка с вычисляемыми адресами является очень быст-
рым методом, но она может быть крайне неэффективной при бо-
льших значениях s - re точки зрения использования оперативной
памяти, необходимой для хранения временных массивов данных
с„ CH-IV, с, и dn dm,..., ds.
Глава 6 =*—^
Введение в теорию графов.
Алгоритмы на графах
I ножество самых разнообразных задач естественно форму-
лируется в терминах точек и связей между ними, т.е. в терминах
графов. Так, например, могут быть сформулированы задачи со-
ставления расписания, анализа сетей в электротехнике, анализа
цепей Маркова в теории вероятностей, в программировании, в
проектировании электронных схем, в экономике, в социологии и
т.д. Поэтому эффективные алгоритмы решения задач теории гра-
фов имеют большое практическое значение.
6.1. Основные понятия и определения
• Определение. Конечным графом называется тройка
Г=(Х, U, Ф),гдеАг
—конечное множество вершин; U— конеч-
ное множество ребер (дуг); Ф — отношение инцидентности;
XrU=0. Отношение инцидентности Ф является трехмест-
ным отношением Ф(х, и, у), где х, у е X, и е U, которое может
либо выполняться (быть истинным), либо не выполняться
(быть ложным) и удовлетворяет свойствам:
1) Vw е U Зх,у &Х Ф(х, и, у) — ребро всегда соединяет пару вершин.
2)(ФОс, и, у)*Ф(х', и,у'))^((х = х'лу = у')у(х = у'лу = х')) -
ребро и соответствует не более чем одной паре вершин х, у.
• Графическое представление графов.
Элементы графов Геометрические элементы
1. х е X— вершина.
2. Ф(х, и,у)л-, Ф(у, и, х) —
ориентированное ребро, дуга.
3. Ф(х, и, у) л Ф(у, и, х) -
неориентированное ребро.
4. Ф(х, и, х) — петля.
1. • — точка в пространстве.
2. х— -у— направленный отрезок.
3. х-
4.
у — отрезок.
— замкнутый отрезок.
6.1. Основные понятия и определения 111
Рис. 6.1. Графы с тремя вершинами и двумя ребрами
• Определение. / = (Х, Ul} Ф^ и Г2 = (Х2, U2, Ф2) называются
изоморфными (7 = Г2), если существуют два взаимно одно-
значных соответствия ср : Х -> Х2 и у : C/j -> U2, сохраняющие
отношение инцидентности: Ф2(ф(х1),|/(и1),ср(>'1)) = Ф1(х1,и1,.у1).
Из определения следует, что изоморфные графы можно оди-
наково изображать графически и отличаться они будут только
метками вершин (рис. 6.2).
2 А 7^.1 1
Рис. 6.2. Три изоморфных графа
Определение. Граф называется ориентированным {орграф),
если каждое его ребро ориентировано: Vjc^y eJfVw e U
Ф(х, и, у) => -:Ф(у, и, х). Иногда удобно преобразовать неори-
ентированный граф в ориентированный — заменой каждого
неориентированного ребра парой ориентированных ребер с
противоположной ориентацией.
Определение. Подграфом графа Г= (X, U, Ф) называется такой
граф Г= (Х U', Ф), что Х'^Х, U'cU. Обозначают Г с Г.
Определение. Граф называется псевдографом, если в нем допус-
каются петли и кратные ребра, т. е. две вершины могут быть
соединены более чем одним ребром. Псевдограф без петель
называется мультиграфом (рис. 6.3).
Рис. 6.3. Псевдограф (слева) и мультиграф (справа)
112 Глава 6. Введение в теорию графов. Алгоритмы на графах
Определение. Неориентированный граф называется простым,
если он не имеет петель и любая пара вершин соединена не бо-
лее чем одним ребром.
Определение. Простой граф называется полным, если каждая
пара вершин соединена ребром. Такой граф с п вершинами со-
держит С^ ребер (рис. 6.4).
Рис. 6.4. Полные неориентированные графы
Определение. Дополнением простого графа /называется граф
Г, имеющий те же вершины, а его ребра являются дополнени-
ем Гдо полного графа (рис. 6.5).
Рис. 6.5. Исходный граф Г и дополнительный Г
Определение. Граф называется плоским (планарным), если он
может быть изображен на плоскости так, что все пересечения
ребер являются его вершинами.
Рис. 6.6. Граф Г-| — плоский, а граф Гу, — неплоский
Определение. Если вершины х и у соединены ребром и, то гово-
рят, что вершины х, у смежные, а ребро и инцидентно верши-
нам х и у. Два ребра называются смежными, если они имеют
общую вершину.
Определение. Степенью вершины графа называется количест-
во ребер, инцидентных данной вершине. Вершина графа, име-
ющая степень 0, называется изолированной, а если степень ее
равна 1, то такая вершина называется висячей.
6.1. Основные понятия и определения 113
Определение. Граф называется помеченным (или перенумеро-
ванным), если его вершины отличаются друг от друга каки-
ми-либо пометками (рис. 6.7).
х,
Рис. 6.7. Граф /~| — помеченный, а граф Г-i — непомеченный
Определение. Путь (маршрут) на графе Т- (X, U, Ф) определя-
ется последовательностью вершин и ребер х1и1х2и2х^...хпипхп+1,
где jc, е X, Uj е U. Ребро щ соединяет вершину х, с вершиной
xi+l,т.е.выполняетсяотношениеинцидентностиФ(х„ы„х/+1).
• Маршрут называется цепью, если все его ребра различные.
• Маршрут называется замкнутым, если xi = xn+j.
• Замкнутая цепь называется циклом.
• Цепь называется простой, если не содержит одинаковых
вершин.
• Простая замкнутая цепь называется простым циклом.
• Гамшътоновой цепью называется простая цепь, содержащая
все вершины графа.
• Гамилътоновым циклом называется простой цикл, содержа-
щий все вершины графа.
Определение. Граф Г=(Х, U, Ф) называется связным, если для
всех х, у е X существует путь из вершины jc в вершину у (вер-
шины х и у связаны маршрутом). Связный ориентированный
граф называется сильно связным. Орграф называется слабо связ-
ным, если соответствующий ему неориентированный граф (иг-
норируется ориентация ребер) связный (рис. 6.8).
Рис. 6.8. /~| — слабо связный, Г2
— сильно связный
• Определение. Связный неориентированный ациклический граф
называется деревом, множество деревьев называется лесом.
114 Глава 6. Введение в теорию графов. Алгоритмы на графах
Рис. 6.9. /~! — дерево, Г% — не дерево
Большинство задач на графах касается определения компо-
нент связности, поиска маршрутов, расстояний и т.п. Далее будут
рассмотрены решения подобных вопросов. Однако при решении
реальных задач соответствующие им графы весьма велики, и ана-
лиз возможен лишь с привлечением современной вычислитель-
ной техники. Поэтому конечной целью рассмотрения каждой из
задач будет являться описание и реализация практического алго-
ритма решения данной задачи на ЭВМ.
6.2. Представления графов
Наиболее известный и популярный способ представления гра-
фов состоит в геометрическом изображении точек (вершин) или-
ний (ребер) на бумаге. При численном решении задач на вычис-
лительных машинах граф должен быть представлен дискретным
способом. Существует довольно много способов такого рода
представления графов. Однако простота использования пред-
ставления графа, как и эффективность алгоритма, в основе кото-
рого он лежит, в полной мере зависит от конкретного выбора это-
го представления. Одно из направлений теории графов связано с
их матричным представлением. Существуют различные виды
матриц, ассоциированные с графами. Эти алгебраические формы
используются для решения многих задач теории графов. Ниже
рассматриваются две такие матричные формы и несколько не-
стандартных представлений, которые наиболее широко исполь-
зуются в алгоритмах на графах.
6.2.1. Матрица смежности графа
• Определение. Матрицей смежности ориентированного поме-
ченного графа с п вершинами называется матрица А= [а/}
],
i,j= 1, 2,..., п, в которой
_ Г1, если существует ребро (xt
,Xj),
У 10, если вершины х/ ,Xj не связаны ребром (;с, ,Xj).
6.2. Представления графов 115
Матрица смежности однозначно определяет структуру графа.
Примеры орграфа и его матрицы смежности приведены соответ-
ственно на рис. 6.10 и рис. 6.11. Отметим, что петля в матрице
смежности может быть представлена соответствующим единич-
ным диагональным элементом. Кратные ребра можно предста-
вить, позволив элементу матрицы быть больше 1, но это не при-
нято, обычно же представляют каждый элемент матрицы одним
двоичным разрядом.
"0
1
0
1
0
0
0
1
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
1
1
0
1
1
1
0
1
1
0
0
0
0
0
0
0
0"
1
0
1
0
1
0
3 5
Рис. 6.10. Ориентированный граф
А=
Рис. 6.11. Матрица смежности ориентированного графа рис. 6.10
6.2.2. Матрица инцидентности графа
• Определение. Матрицей инцидентности для неориентированно-
го графа с п вершинами и т ребрами называется матрица
В = [by], i = 1, 2,...,п, j = 1, 2,..., т, строки которой соответству-
ют вершинам, а столбцы — ребрам. Элементы
_ J1, если вершина х, инцидентна ребру и,-,
'•* 10, если вершина jc, не инцидентна ребру и,.
• Определение. Матрицей инцидентности для ориентированного
графа с п вершинами и т ребрами называется матрица В[Ьд],
116 Глава 6. Введение в теорию графов. Алгоритмы на графах
/= 1, 2,...,п, j= 1, 2,..., т, строки которой соответствуют вер-
шинам, а столбцы — ребрам. Элементы
{+1, если ребро му выходит из вершины д;,,
-1, если ребро Uj входит в вершинух,,
О, если вершина х, не инцидентна ребру Uj.
Матрица инцидентности однозначно определяет структуру
графа. На рис. 6.12 представлена такая матрица для орграфа на
рис. 6.10.
1 1 2 2 1 1 2 1 1 1 1 . 6 6 6 1 7
2 3 1 3 4 5 7 5 1 5 7 4 5 7 4 5
]Г+1 + 1 - 1 0 0 0 0 0 - 1 0 0 0 0 0 0 0
2-1 0 + 1 + 1 + 1 + 1 + 1 0 0 0 0 О О О О О
3 0 - 1 0 - 1 0 0 0 + 1 0 0 0 0 0 0 0 0
О О О 0-1 0 0 0 + 1 + 1 + 1 - 1 0 0-1 О
О 0 0 0 0-1 0-1 0 - 1 0 0-1 0 0-1
0 0 0 0 0 0 0 0 0 0 0 + 1 + 1 + 1 0 0
О 0 0 0 0 0 - 1 0 0 0-1 0 0-1+1+1
Рис. 6.12. Матрица инцидентности ориентированного графа
6.2.3. Матрица весов графа
• Определение. Граф называется взвешенным, если каждому его
ребру сопоставлено число. Простой взвешенный граф может
быть представлен своей матрицей весов W= [wy, где Wy — вес
ребра, соединяющего вершины i,j= 1, 2,..., п. Веса несущест-
вующих ребер полагают равными QO или 0 в зависимости от
приложений. Заметим, что матрица весов является простым
обобщением матрицы смежности.
6.2.4. Список ребер графа
При описании графа списком его ребер каждое ребро пред-
ставляется парой инцидентных ему вершин. Это представление
можно реализовать двумя массивами r=(rl
,r2
,...,rm
)ut=(tl
,t2
,...,
tm
), где т — количество ребер в графе. Каждый элемент в массиве
есть метка вершины, а /-е ребро графа выходит из вершины г, и
входит в вершину tt
. Например, соответствующие массивы пред-
ставления графа на рис. 6.10 будут иметь вид:
г= (1,1,2, 2, 2, 2,2, 3, 4, 4, 4, 6, 6, 6, 7, 7),
Г =(2,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
Adj[x}
2, 3
1,3,4,5,7
5
1,5,7
—
4,5,7
4,5
Структуры смежности могут быть удобно реализованы масси-
вом из п (число вершин в графе) линейно связанных списков.
Каждый список содержит вершины, смежные с вершиной, для
которой составляется список. Хранение же списков смежности
на сцепленной памяти желательно в алгоритмах, в основе кото-
рых лежат операции добавления и удаления вершин из списков.
Следует отметить, что во многих задачах на графах выбор пред-
ставления является решающим для эффективности алгоритмов.
6.3. Метод поиска в глубину
Один из наиболее естественных способов систематического
исследования всех вершин графа исходит из процедуры прохож-
дения графа методом поиска с возвращением, который исследует
граф в глубину (см. п.4.1). На неориентированном графе
Г= (X, U, Ф) поиск в глубину осуществляется следующим обра-
зом. Когда посещаем вершину л: е X, то далее идем по одному из
ребер (х, у), инцидентному вершине у е X. Если вершина у уже
пройдена (посещалась ранее), то возвращаемся в х и выбираем
118 Глава 6. Введение в теорию графов. Алгоритмы на графах
другое ребро. Если вершина у не пройдена, то заходим в нее и
применяем процесс прохождения рекурсивно уже с вершиной у.
Если все ребра, инцидентные вершине х, просмотрены, то идем
назад по ребру (s, x), по которому пришли в х, и продолжаем ис-
следование ребер, инцидентных вершине s е X. Процесс закан-
чивается, когда попытаемся вернуться из вершины, с которой на-
чали просмотр графа.
Поиск в глубину можно также осуществлять и на ориентиро-
ванном графе. Если граф ориентированный, то, находясь в узле х,
необходимо выбирать ребро (х, у), только выходящее изх Иссле-
довав все ребра, выходящие из у, возвращаемся в jc даже тогда,
когда в у входят другие ребра, еще не рассмотренные. Данная тех-
ника просмотра в глубину полезна в практических приложениях
при определении различных свойств как ориентированных, так и
неориентированных графов.
Метод поиска в глубину на простом неориентированном гра-
фе представлен в алгоритме 6.1. Рекурсивная процедура
Depth(x, w) осуществляет поиск в глубину на графе Г= (X, U, Ф),
содержащем д; е X, и строит для графа дерево Т поиска, которое
является ориентированным остовным деревом Г0 = (X, Т, Ф)
(если исходный граф не связен, то Г0 будет лесом); w e А'является
отцом х е Хъ строящемся дереве, где х — исследуемая вершина.
Граф задан структурой смежности Adj[x], где Adj[x] означает мно-
жество вершин, смежных с х е X. Элементы Т— это ребра строя-
щегося дерева поиска, а элементы В — это обратные ребра, кото-
рые не могут принадлежать Г0
, так как они ведут назад в пройден-
ные ранее вершины. Заметим, что обратное ребродолжно идти от
потомка к предку по дереву поиска. Чтобы отличить уже прой-
денные вершины от непройденных, вводится вектор Mark[x] ме-
ток вершин, которые постепенно нумеруются от 1 до (A'l по мере
того, как попадаем в них. Сначала полагается Mark[x] = 0 для всех
х е X в знак того, что ни одна вершина не пройдена, и когда попа-
даем в вершину х первый раз, Mark[x] получает ненулевое значе-
ние. Ребро (х, v) е Т, если метка вершины Mark[v] = 0. Если же
Mark[v] Ф О, то условием того, что (х, v) & В будет обратным реб-
ром, являются соотношения Mark[v] < Mark[x] и v * w. Условие
Mark[v] < Mark[x] означает, что вершина v была пройдена раньше
вершины х. Поэтому ребро (х, v) е В будет обратным, если оно не
является ребром дерева Т, пройденным от отца w к х, т. е. v * w.
6.3. Метод поиска в глубину 119
• Сложность поиска в глубину. Поскольку для каждой вершины,
которую проходим впервые, выполняется обращение к проце-
дуре Depth ровно один раз, то всего обращений будет Х. При
каждом обращении количество производимых действий про-
порционально числу ребер, инцидентных рассматриваемой
вершине. Поэтому сложность поиска составляет 0(Х + U).
Алгоритм 6.1. Поиск в глубину
на простом неориентированном графе
for v е X do Mark[v] = 0;
count= 0;
Т=0; 5=0;
for v e Xdo ifMark[v] = 0 then Depth(v, 0);
procedure Depth(x, w);
count= count+ 1;
Mark[x] = count;
for v e Adj[x] do begin
ifMark[v] = 0 then
T= T^J {(x, v)}; { Включить ребро дерева }
Depth(v, x);
else ifMark[v] < Mark[x] and v Ф w then
B = .Su {(x, v)}; { Включить обратное ребро }
end;
end.
Программная реализация алгоритма 6.1 представлена алгорит-
мом 6.2. Реализация близко соответствует основному алгоритму
6.1. Программа представлена тремя процедурами Init, Depth, Way-
Depth, где WayDepth — основная программа поиска в глубину;
Depth — рекурсивная процедура поиска, один к одному соответст-
вующая аналогичной процедуре в алгоритме 6.1; /m'f— процедура
контроля исходных данных и изменения меток вершин. Измене-
ние нумерации меток вершин является существенным для алго-
ритма. Новые метки вершин — это натуральные числа от 1 до Х.
Данная нумерация позволяет обращаться к элементам массивов,
содержащих информацию о вершинах, по номерам соответству-
ющих вершин. Такой прием позволяет очень близко подойти в
программной реализацией структуры смежности Adj[x] к ее мно-
жественному описанию. В этом случае множественное описание
выражения for v e Adj[x] do ... в программной реализации пред-
120 Глава 6. Введение в теорию графов. Алгоритмы на графах
ставляется какfor i=lto Nbr[x] dov = Adj[Fst[x] + /']..., где Nbr[x] —
количество вершин в структуре смежности для вершины х е X;
Adj[x] — вектор, содержащий все вершины структуры смежности
по строкам; Fst[x] + 1 — номер первой вершины в структуре смеж-
ности для соответствующей вершины х е X, тогда Fst[x] + i — но-
мер /-и вершины в структуре смежности для х е X.
Например, для следующей структуры смежности графа Adj[x]:
X
1
2
3
4
5
6
7
AdJM
2, 3,5
1, 3,4
1, 2,4,5
2, 3
1, 3,6,7
5,7
5, 6
соответствующие массивы в программной реализации принима-
ют вид
№ix
Fst[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
1 3 2 3 5
2 3 1 3 4
3 4 1 2 4
4 2 2 3
5 4 1 3 6
6 2 5 7
7 2 5 6
Результаты расчетов сохраняются в выходном файле Depth.out
со следующей структурой:
2 3 1 4 2 5 1 6
1 1 0 1 0 1 0 1
У!
TvB
Каждая колонка таблицы выходного файла соответствует реб-
ру (х» у,) прохода графа, где последнее значение является призна-
ком 1 или 0, что отвечает при проходе либо основному ребру,
либо обратному.
Алгоритм 6.2. Программа поиска в глубину
на простом неориентированном графе
Program PgmWayDepth; {Проход графа в глубину)
uses CRT,DOS;
Const
nVertex=100; {Максимальное количество вершин}
nAdjacent=1000; {Максимальная длина списка смежности}
Туре
TypeVertex=array[1..nVertex] of Integer;
TypeAdjacent=array[1..nAdjacent] of Integer;
Var
f :Text; { Текстовый файл }
n :Integer; { Количество вершин }
nT :Integer; { Количество ребер прохода в глубину}
Adj :TypeAdjacent; { Список смежности графа }
Fst :TypeVertex; {Указатели вершин списка смежности }
Nbr :TypeVertex; { Количество вершин в списке
смежности}
Vtx :TypeVertex; { Список вершин графа }
Mark :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[nT]:=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; {Т - пустое дерево}
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}
Assign(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);
Assign(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*1]]: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. Vjj e. S sl~ Sj.
2. Vsj,S2 e S $i ~ $2 —> Si ~ s.
3. V^i, ^2, 53 е S $i ~ $2 л л ~ .УЗ —» $i ~ s^,
Все элементы из множества S, эквивалентные данному эле-
менту Sj, образуют множество St, которое называется классом эк-
вивалентности. Два различных класса эквивалентности не могут
иметь какого-либо общего элемента, в противном случае такие
классы совпадают, что следует из свойств 1—3. Таким образом,
определенное на множестве S отношение эквивалентности вы-
полняет разложение его на непересекающиеся классы S/ эквива-
лентности, т.е. S =(J S j , где St n Sj• = 0, i #j.
/
Пример. Пусть 5
1
— множество треугольников. Определим на S
бинарное ~ отношение. Будем считать, что для треугольников
Ля, Аи е S выполняется отношение Да ~ Ab, если они подобные.
Ясно, данное отношение является отношением эквивалентности,
так как свойства 1—3 выполняются для подобных треугольников.
Введенное отношение разбивает множество треугольников на
классы эквивалентности подобных треугольников.
Пример. Пусть S— множество л-мерных векторов. Определим
на S бинарное ~ отношение. Будем полагать, что для a,b e S вы-
полняется отношение а ~ Ь, если они колинеарные. Данное отно-
шение является отношением эквивалентности, так как свойства
1—3 выполняются для колинеарных векторов. Множество векто-
ров под действием введенного отношения разбивается на классы
эквивалентности колинеарных векторов.
Пример. Пусть S= {1, 2,..., п]. Определим на б
1
бинарное ~ от-
ношение. Будем полагать, что для р, q e S выполняется отноше-
ние р ~ q, если они имеют одинаковые остатки от деления на це-
лое положительное число т. Данное отношение является отно-
шением эквивалентности. Множество Sпод действием введенно-
го отношения разбивается на классы эквивалентности чисел с
одинаковыми остатками от деления на т.
6.5. Связные компоненты 125
Пример. Пусть S— множество треугольников. Определим на S
бинарное ~ отношение. Будем считать, что для треугольников
Да, Д£ е ^выполняется отношение Да ~ Д&, если их площади рав-
ны. Данное отношение является отношением эквивалентности.
6.5. Связные компоненты
Пусть псевдограф Г= (X, U, Ф) является неориентированным.
Две вершины xl} x2 e ^называются связанными, если существует
маршрут из xl в х2. Определим на множестве вершин ЛГбинарное ~
отношение. Для хъ х2 е ЛГ отношение ~ будет выполняться, т.е.
jq ~ х2, если эти вершины связанные. Введенное отношение яв-
ляется отношением эквивалентности. Действительно, если вер-
шина *! связана с х2, а вершина х2 связана с х3, то очевидно, что
вершина х{ связана с х3. Следовательно, существует такое разло-
жение множества вершин
на попарно непересекающиеся подмножества, что все вершины в
каждом Х( связаны, а вершины из различных Xt не связаны. Тогда
можно записать разложение
графа Г= (X, U, Ф) на непересекающиеся связные подграфы
/= (Xj, Uj, Ф). Вследствие попарного непересечения подграфов,
разложение называется прямым, а сами подграфы называются
компонентами связности графа Г. Таким образом, справедливо
следующее утверждение.
• Утверждение 6.5.1. Каждый неориентированный граф распа-
дается единственным образом в прямую сумму своих компо-
нент связности.
Количество компонент связности находится в определенном
отношении с основными параметрами графа — числом его вер-
шин и ребер.
• Утверждение 6.5.2. Пусть Г= (X, U, Ф) является простым гра-
фом с п вершинами и k компонентами связности. Число ребер
в таком графе не может превосходить величины С„_А+1 =
Доказательство. Рассмотрим прямое разложение
k
Г =   r ( X j ,Uj ,Ф) исходного графа на компоненты связности.
126 Глава 6. Введение в теорию графов. Алгоритмы на графах
Если положить, что число вершин в компоненте Xt связности рав-
*
но nh то число ребер в таком графе не превосходит ^С„.. Данная
величина достигается в том случае, когда каждая из компонент
связности является полным подграфом. Допустим, что среди
компонент связности F(Xj, Ut, Ф) найдутся хотя бы две, которые
имеют более одной вершины, например л2 -
Л
1 > 1- Перенесем
одну вершину из / в Г2. Легко видеть, что это увеличивает число
ребер в модифицируемом полном графе с k компонентами связ-
ности. Отсюда следует, что максимальное число ребер должен
иметь граф, состоящий из k — 1 изолированной вершины и одно-
го полного подграфа с п — k + 1 вершинами.
• Следствие. Граф с п вершинами и числом ребер, большим чем
("-'И"-
2
), связен.
6.6. Выделение компонент связности
Рассмотрим алгоритм нахождения числа компонент связно-
сти, а также выделения этих компонент на неориентированном
графе. Подобным образом решается задача и для ориентирован-
ного графа. В основу рассматриваемого алгоритма 6.3 выделения
компонент связности положена описанная ранее техника поиска
в глубину на графе Г(Х, U, Ф). Структура алгоритма 6.3 является
модификацией в сторону упрощения основного алгоритма 6.1
поиска в глубину. Работа алгоритма 6.3 направлена на формиро-
вание вектора Mark[x] меток вершин х е X графа. Элементу
Mark[x] присваивается общий номер той компоненты, которой
принадлежит вершина х е X. Сложность алгоритма 6.3, как и ал-
горитма 6.1, составляет 0(Х + U).
Алгоритм 6.3. Выделение связных компонент
неориентированного графа
for v e Xdo Mark[v] = 0; {Начальная установка}
count = 0; {Счетчик числа компонент}
for v e Xdo ifMark[v] = 0 then begin
count^ count+ 1;
Component(v, count);
end;
6.6. Выделениекомпонентсвязности 127
Procedure Component(x, count)',
Mark[x] = count',
for v e Adj[x] do ifMark[v] = 0 then
Component(v, count);
end;
Программная реализация выделения компонент связности
представлена в алгоритме 6.4, который близко соотносится с со-
ответствующим множественным описанием алгоритма 6.3. Рас-
смотрим пример расчета по программе алгоритма 6.4 выделения
компонент связности графа, представленного на рис. 6.14.
•4 Т
Рис. 6.14. Пример выделения компонент связности графа
Для программы алгоритма 6.4 исходные данные структуры
смежности Adj[x] графа на рис. 6.14 задаются в текстовом файле
Connect.in. Структура (правило) заполнения файла одинакова с
той, которая описана в рассмотренном примере поиска в глубину
при расчете по программе алгоритма 6.2.
Данные файла Connect.in для примера на рис. 6.14:
11
1
2
9
8
12
14
3
4
7
15
21
3
2
1
1
3
2
3
2
2
2
1
2
3
7
7
14
12
2
1
9
14
12
3 4
1
15
15
1 4
3
8
12
21
Результаты расчетов сохраняются в выходном файле Соп-
nect.out со следующей структурой:
1 2 9 8 12 14 з 4 7 15 21 — номера вершин графа;
1 1 2 2 3 3 1 1 2 3 3 — номера компонент связности.
128 Глава 6. Введение в теорию графов. Алгоритмы на графах
Алгоритм 6.4. Программа выделения связных компонент
неориентированного графа
Program ConnectComponent; {Выделение компонент
связности графа}
uses CRT,DOS;
Const
nVertex=100; {Максимальное количество вершин}
nAdjacent=1000; {Максимальная длина списка смежности}
Туре
TypeVertex=array[1..nVertex] of Integer;
TypeAdjacent=array[1..nAdjacerit] of Integer;
Var
f :Text; { Текстовый файл }
n :Integer; { Количество вершин }
Adj :TypeAdjacent; { Список смежности графа }
Fst :TypeVertex; { Указатели вершин списка смежности}
Nbr :TypeVertex; { Количество вершин в списке
смежности}
Vtx :TypeVertex; { Список вершин графа }
Mark :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 [ij-t-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: =1 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,'Плохая структура смежности графа!');
C l o s e ( f ) ;
exit;
end;
5—2697
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. Если вершины а и Ъ являются началом и концом цепи и
а # Ь, то степени их нечетные;
4. Если вершины а и b являются началом и концом цепи и
a = b,io степени их четные.
Доказательство. (=>) Дано, что существует эйлерова цепь
aulx2u2...xnunb, где а, Ь, *, е X, и, е U, в которрй содержатся все
ребра по одному разу. Такая цепь включает все вершины графа,
если граф не содержит изолированных вершин. Докажем условия
1—4: 1) по данной цепи из любой вершины можно попасть в лю-
бую другую, значит, граф связный; 2) каждая тройка цепи «/_Л«,
привносит вершине х, степень два, а так как все ребра и, в цепи
различные, то степени внутренних вершин четные; 3) и 4) доказа-
тельства повторяют доказательство пункта 2.
(<=) Даны условия 1—4. Построим эйлерову цепь. Предварите-
льно приведем условие 3 к условию 4 включением в граф фиктив-
ного ребра и*, которым свяжем вершины а и Ь. Теперь и в случае 3
все вершины будут иметь четную степень. Пусть А е X— произво-
льная вершина (рис. 6.16). Из нее будем строить цепь, выбирая в
качестве продолжения пути ребро, которое еще не пройдено. Эта
цепь (цикл /) может закончиться только в вершине А, так как, при
входе в любую другую вершину, всегда существует ребро, по кото-
рому можно выйти из нее (степени вершин четные).
Возможны два случая: 1) построенный цикл Tj содержит все
ребра графа, тогда теорема доказана; 2) /i содержит не все ребра
графа. Во втором случае рассмотрим граф ГГ1г
полученный уда-
лением из Гвсех ребер, входящих в /. Граф Г  Г{
вновь содержит
вершины только с четными степенями (у каждой вершины удали-
ли по четному числу ребер). Так как Г— связный граф, то сущест-
вует вершина в /, инцидентная ребру из Г  Г^ Пусть это верши-
на В е X. Построим из нее цикл Г2
так же, как строили цикл Г^
Построим общий -Г12
цикл из / и Г2
так, как это сделано на
рис. 6.16. Для Гп
вновь проверяем рассмотренные выше два слу-
чая, как для
Рис. 6.16. Объединение двух циклов в один цикл
132 Глава 6. Введение в теорию графов. Алгоритмы на графах
Процесс расширения продолжаем до тех пор, пока не будут
включены все ребра графа в один цикл: Aul
x2
...au*b...un
A. Разры-
ваяданный цикл по ребру и*, получим эйлерову цепь flw1/2.,./nwn£,
где t; e X, Wj e U.
Конструктивный характер доказательства теоремы позволяет на
формальном уровне в алгоритме 6.5 записать рассмотренный по-
иск эйлеровой цепи. Исходный граф представлен своей структурой
смежностиAdj[x], где А#[х] — множество вершин, смежных с х е X.
Результирующая эйлерова цепь формируется в множестве Z.
Алгоритм 6.5. Алгоритм поиска эйлеровой цепи графа
3v e X', (Вершина начала эйлеровой цепи}
Z- {v}; (Начало строящейся эйлеровой цепи}
R = 0; {Частный расширяющийся цикл эйлеровой цепи}
repeat
Cycle(v, R);
Z= Z^i R, {Объединение циклов в один цикл}
until Not 3v e Z Adj[v] > 0
Procedure Cycle(v, R)
R= {v}; (Построение отдельного цикла эйлеровой цепи}
repeat
w = Adj[v];
R=Rv(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 (а значит, и в Z),
удаляются как пройденные из структуры смежности Adj[x] (из
графа). Формирование расширяющих циклов R осуществляется
до тех пор, пока структура смежности графа содержит хотя бы
одно ребро.
• Сложность алгоритма поиска эйлеровой цепи. Число обраще-
ний к процедуре Cycle не более, чем число вершин Х. При
каждом обращении количество производимых действий про-
порционально числу ребер, входящих в выделенный цикл.
Сложность суммарной работы процедуры Cycle пропорциона-
6.7. Эйлеровы графы 133
льна количеству ребер Us графе. Поэтому сложность выделе-
ния эйлеровой цепи составляет О(Х + U).
Программная реализация поиска эйлеровой цепи представле-
на в алгоритме 6.6, который соответствует множественному опи-
санию соответствующего алгоритма 6.5.
Алгоритм 6.6. Программа поиска эйлеровой цепи графа
Program EilerWay; {Эйлерова цепь в псевдографе}
uses CRT,DOS;
Const
nVertex-100; {Максимальное количество вершин}
nAdjacent=1000; {Максимальная длина списка смежности}
Туре
TypeVertex=array[1..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;
A d j ( F s t [ i j + 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 N b r f 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
Degfi]:=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:=l; 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]-1;
break;
end;
v:=w;
until Not( Nbr[v]>0 );
end;
Procedure Eiler; { Построение эйлеровой цепи z[] }
Var
v,w :Integer;
i,j,kt :Integer;
count :Integer;
yes :Boolean;
begin
v:=ks; kz:=l;
kt:=kz; z[kz]:=v;
Write (f,'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+l];
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}
Assignff,'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 do Write(f,Vtx[z[i]]:3); WriteLn(f);
Close(f);
end. {Main}
Рассмотрим пример расчета по программе алгоритма 6.6 поис-
ка эйлеровой цепи в графе, изображенного на рис. 6.17.
Рис. 6.17. Пример расчета эйлеровой цепи графа
6.8. Остовные деревья 137
Для программы алгоритма 6.6 исходные данные структуры
смежности Adj[x] графа на рис. 6.17 задаются в текстовом файле
Eiler.in. Структура (правило) заполнения файла совпадает с той,
которая описана в рассмотренном примере поиска в глубину при
расчете по программе алгоритма 6.2.
Данные файла Eiler.in для примера на рис. 6.17:
9
1
2
3
4
5
6
7
8
9
4
4
4
4
4
2
2
2
2
2
1
1
1
1
2
2
3
4
3
3
2
5
4
5
3
4
5
Результаты расчетов сохраняются в выходном файле Eiler.out
со следующей структурой:
Z= 1
R = 1 2 3 1 4 5 1
Z = 1 2 3 1 4 5 1
R= 5 6 2 7 3 8 4 9 5
Z = 1 2 3 1 4 5 6 2 7 3 8 4 9 5 1
0 = 1 2 3 1 4 5 6 2 7 3 8 4 9 5 1 .
На каждом шаге показана строящаяся эйлерова цепь Z, кото-
рая расширяется выделенным R циклом. Результирующая эйле-
рова цепь графа отмечена признаком О в начале строки.
6.8. Остовные деревья
• Определение. Остовным деревом связного неориентированно-
го графа Г= (X, U, Ф) называется дерево Г0
= (X, U0
, Ф), явля-
ющееся подграфом графа Г и содержащее все его вершины
(рис. 6.18).
Рис. 6.18. Связный граф и два остовных дерева
138 Глава 6. Введение в теорию графов. Алгоритмы на графах
• Утверждение 6.8.1. Дерево с и вершинами содержит п - 1 ребро.
Доказательство. Доказательство проведем по индукции числа
вершин. Заметим, что в дереве найдется вершина, степень которой
равна единице (висячая вершина). Действительно, в противном
случае, если степени вершин > 2, можно построить цикл, что про-
тиворечило бы определению дерева. Цикл строится следующим
образом. Выполним проход по ребрам графа, начиная с произво-
льной вершины. Так как степени > 2, то, попав в вершину первый
раз, можно всегда из нее выйти. Исходный граф — конечный и
связный. Следовательно, наступит момент, когда вновь попадем в
пройденную уже вершину, что доказывает существование цикла.
Условие индукции для п = 2 выполняется, дерево с двумя вер-
шинами содержит одно ребро. Предположим теперь, что утверж-
дение выполняется для деревьев, число вершин у которых меньше
п. Рассмотрим дерево с п вершинами. Удалим из этого дерева ви-
сячую вершину и инцидентное ей ребро. Очевидно, что остав-
шийся граф будет связным и без циклов, т.е. будетдеревом с п — 1
вершиной. Тогда по предположению индукции оставшаяся часть
графа содержит п — 2 ребра, а значит, исходное дерево должно
иметь их п — 1.
Практическую значимость остовных деревьев дает популярная
форма задачи Кэли. Необходимо соединить п городов железнодо-
рожными линиями так, чтобы не строить лишних дорог. Известна
стоимость строительствадля каждой пары городов. Каковадолжна
быть сеть дорог, соединяющая все города и имеющая минималь-
ную возможную стоимость?Аналогичные вопросы возникают при
проектировании линий электропередач, сетей ЭВМ и др.
В терминах теории графов задачу можно сформулировать сле-
дующим образом. Рассмотрим граф Г= (X, U, Ф), где X— города,
U— дороги. Каждому ребру и & Uназначим вес са(м) — стоимость
строительства дороги и. Задача состоит в том, чтобы построить
связный граф Г о = (X, U0
, Ф), содержащий все вершины, с мини-
мальным весом W(r0
)= ^со(и). Очевидно , что Г0
— дерево,
"*%° кв противном случае можно было бы удалить одно ребро, не нару-
шая связности То
и уменьшая сумму весов его ребер.
• Определение. Минимальным остовным деревом (лесом) назы-
вается остовное дерево (лес) с минимальным общим весом его
ребер.
6.8. Остовные деревья __ 139
6.8.1. Жадный алгоритм построения
минимального остовного дерева
Минимум остовныхдеревьев графа Г= (X, U, Ф) можно найти,
применяя процедуру исследования ребер в порядке возрастания
их весов. Другими словами, на каждом шаге выбирается новое
ребро с наименьшим весом, не образующее циклов с уже выбран-
ными ребрами. Процесс продолжается до тех пор, пока не будет
выбрано Х — 1 ребро. Рассмотренная процедура называется
жадным алгоритмом.
Реализация данной схемы может быть выполнена следующим
образом. Для каждой вершины Х= {xl5 х2,..., х„} графа Г= (X, U, Ф)
формируются начальные тривиальные компоненты связности
1*1
Т, = (Xif и„ Ф), где X, = {х,}, Ui = 0,
2,..., Х. Компоненты Заявляются деревьями, объединение Т =(JT(
которых дает начальное приближение строящегося остовного де-
рева Г0 = (Х, и0,Ф).
Включение в строящееся остовное дерево Г0 выбранного ребра
на очередном шаге жадного алгоритма выполняется слиянием
7} = 7} u TJ (Xt
I = Xj vXj и Ц = U, i u ф двух компонент 7) и 7j, которым
принадлежит по вершине новогоребра, и включением самого ребра
в объединенное множество Ц=11^Ц ребер. Процесс роста объе-
динения Т =[_)Tj компонент к остовному дереву Го
= (X, U0
, Ф)
i
продолжаем до тех пор, пока не будет включено Х — 1ребро.
Справедливость жадного алгоритма является следствием сле-
дующих двух лемм.
• Лемма 6.8.1. Пусть Г= (X, U, Ф) — связный неориентирован-
ный граф и Г0
= (X, U0
, Ф) — произвольное остовное дерево
для него. Тогда:
1) V xi, x2
е ^существует единственная между ними цепь в Г0
;
2) если к Г0добавить ребро из U  U0
, то возникнет ровно один
цикл.
Доказательство. Утверждение 1 верно, т.к. в противном случае
в Г0
существовал бы цикл, что противоречит дереву Го
. Утвержде-
ние 2 верно, поскольку между вершинами добавляемого ребра
уже есть одна цепь, а значит, возникнет один цикл.
140 Глава 6. Введение в теорию графов. Алгоритмы на графах
• Лемма 6.8.2. Пусть Г= (X, U, Ф) — связный неориентирован-
ный граф, для каждого ребра и е U определен вес со(и), и
Tj = (Xj, Uj, Ф) — компоненты связности жадного алгоритма,
объединение которых Т = у Tj, согласно алгоритму, растет к
остовномудереву Г0 = (X, U0, Ф), где / = 1,2,..., k и k > 1. Пусть
следующим найденным для включения ребром является ребро
Е = (х, у) наименьшего веса из оставшихся U у £/, и пусть х е Х1
i
ну £ Х. Тогда найдется остовное дерево Г0дляГ= (X, U, Ф), со-
держащее ребра ус/, U{E}, вес которого не больше любого
другого остовного дерева, содержащего ребра у С/,.
Доказательство. Допустим противное. Пусть существует ос-
товное дерево Г'0 = (Х,и'0,Ф)ддя Г, содержащее у С/, и не содер-
i
жащее ребра Е, вес которого меньше весалюбого остовногодерева
для Г, содержащего у С/, и{Е}. По утверждению 1 леммы 6.8.1, при
у- добавлении Е к Г'0 образуется цикл. Этот цикл
должен содержать такое ребро Е'= (х', у), от-
личное от Е, что х' Е Х1 и у' г Xi, т.к. цикл вхо-
(у дит в С/1 по ребру (х, у) и у g A^, то он должен и
выйти из С/! (рис. 6.19). Из условия следует, что
Рис. 6.19 вессо(Е) < со (Е), так каку С/, с U0
иус/,- с U'0
и
ребро Е выбиралось с минимальным весом из оставшихся ребер
С/ЛУ Uj без образования циклов, в противном же случае выбор
должен был бы пасть на Е ', т.к. оно тоже не образует циклов с уС/,.
Рассмотрим граф Го
= (X, U0
, Ф), образованный добавлением Е к
Г'0
и удалением Е 'из Г'0
. В Г0
нет циклов, так как единственный
цикл разорван удалением ребра Е '. Г0
остался связным* так как
осталась цепь между х'иу'. Таким образом, Г0
— остовное дерево.
Учитывая, что со(Б) < СО(Е ), то вес дерева Го
не больше веса Г'0
. Ос-
товное дерево Г0
содержит у С/, и Е, а это противоречит предпо-
ложению минимальности Г0, что доказывает справедливость
жадного алгоритма.
6.8. Остовные деревья 141
Реализация «жадной» схемы формирования остовного дерева
представлена в алгоритме 6.7. Используемые при его описании
обозначения соответствуют тому, что вводилось при обоснова-
нии жадной схемы. Вектор Mark[x] меток вершин х е X графа
поддерживает их принадлежность компонентам связности Uit
из
которых формируется реберный список остовного дерева. Нача-
льные величины Mark[x,] устанавливаются равными порядковым
номерам соответствующих вершин х, е X. Далее значения
Mark[Xj] корректируются по мере слияния компонент Uit
сохра-
няя соответствие принадлежности им вершин. Исходный граф
задается реберным списком U, выходное остовное дерево также
формируется реберным списком Uo
.
Алгоритм 6.7. Жадный алгоритм минимального остовного дерева
for Xj e Xdo Markfa] = i;
Sort(U)', {Сортировка списка ребер по их весам)
U0 = 0;
while UJi<X- I do begin
(х, у) е U {Ребро с win весом из оставшихся)
ifMark[x] Ф Mark[y] then begin
U0
= U0
u {(х, у)}', {Включитьребро в остовное дерево)
Z = Mark[y]; {Слияние Ux
uUy
)
for v 6 Xdo ifMark[v] = z then
Mark[v] = Mark[x]
end;
U= U{(x, у)}; {Удалить ребро с min весом из списка]
end;
• Сложность жадного алгоритма. Жадный алгоритм требует
предварительной сортировки ребер по их весам. Стандартные
методы сортировки имеют сложность O(U
2
). Сложность ал-
горитма 6.7 помимо сложности сортировки зависит от слож-
ности реализации слияния подмножеств Ux
и Uy
. Сложность
данной операции при полном переборе вершин данных под-
множеств (как представлено в алгоритме 6.7) составляет
0(Х
2
). Значит, сложность жадного алгоритма О(Х|
2
) + | J7|
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+l]:=w;
w:=U[2*j-l]; U[2*j-l] :=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 : =1 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] OMark [у] then begin
nUo:=nUo+l;
Uo [nUo] :=sU; {Добавить ребро в остовное дерево}
z:=Mark[y]; {Слияние Ux и Uy}
for i:=l to nX do if Mark[i]=z then
Kark[i]:=Mark[x];
end;
sU:=sU+l; {Удалить ребро (х, у) из списка 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-l] ) ; { Первые вершины
ребер }
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(f,'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) ;WriteLri (f) ;
Ostov;
W r i t e ( f , ' u o l = ' ) ;
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=',Wt:3);
Close(f);
end. {Main}
Рассмотрим пример построения минимального остовного дере-
ва графа, изображенного на рис. 6.20, по программе алгоритма 6.8.
х5 х4
Рис. 6. 20. Пример расчета остовного дерева
Для программы этого алгоритма исходные данные графа на
рис. 6.20 задаются реберным списком в текстовом файле Hung-
ry.in со следующей структурой:
• в первой строке файла содержится количество ребер в списке
(12);
• во второй и третьей строках указываются ребра своими верши-
нами: одна вершина во второй строке, другая вершина ребра в
третьей строке;
6.8. Остовные деревья 145
• в четвертой строке располагаются значения весов соответству-
ющих ребер.
12
7 7 7 7 7 7 1 2 3 4 5 б
1 2 3 4 5 6 2 3 4 5 6 1
1 4 9 16 25 36 20 15 3 17 28 23
Результаты расчетов сохраняются в выходном файле Hung-
ry.out со следующей структурой:
nU = 12
пХ = 7
Х = 7 1 2 3 4 5 6
ul = 7 3 7 7 2 7 4 1 6 7 5 7
u 2 = 1 4 2 3 3 4 5 2 1 5 6 6
We = 1 3 4 9 15 16 17 20 23 25 28 36
uol= 7 3 7 7 4 6
uo2= 1 4 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. Построение остовного дерева Г0
начинается с произвольной
вершины Xj.
2. Затем среди ребер, инцидентных х±, выбираем ребро (xj, x2
) с
наименьшим весом и включаем его в дерево Г0
.
3. Повторяя процесс, выполняем поиск наименьшего по весу реб-
ра, соединяющего вершины xl
и х2
с некоторой другой верши-
ной графа х3
.
146 Глава 6. Введение в теорию графов. Алгоритмы на графах
4. Процесс включения ребер продолжаем до тех пор, пока все вер-
шины исходного графа Г не будут включены в дерево Г0. По-
строенное дерево будет минимальным остовным.
Доказательство того, что последовательность шагов 1—4 при-
водит к построению минимального остовного дерева, аналогично
доказательству для жадного алгоритма. Реализация схемы бли-
жайшего соседа формирования остовного дерева выполнена в ал-
горитме 6.9, где исходный граф Г= (X, U, Ф) представляется мат-
рицей весов We = [щ], веса несуществующих ребер полагаются
равными +оо. Под весами ребер понимаются их длины. Остовное
дерево Го = (Х0> U0, Ф) формируется посредством реберного спи-
ска Uo и списка вершин Хо. В качестве меток вершин устанавли-
ваются их порядковые номера Х= {1, 2,..., п}. Для каждой верши-
ны х е Хграфа, еще не включенной в остовное дерево, поддержи-
вается минимальное расстояние до множества ранее включенных
вершин в Х0. Это осуществляется с помощью двух векторов dist[x]
nprev[x], где dist[x] равно минимальному расстоянию от* е Хдо
вершины prev[x] е Х0. Обновление значений векторов dist[x] и
prev[x] выполняется на каждом шаге алгоритма при пополнении
Х0 новой вершиной.
• Сложность алгоритма ближайшего соседа. Сложность алгорит-
ма определяется двумя вложенными циклами по числу вер-
шин. В каждом из циклов выполняется константное число
операций. Следовательно, сложность составляет
Алгоритм 6.9. Алгоритм ближайшего соседа для остовного дерева
Х= {1, 2,..., я}; {Метки вершин графа}
пХ= Х; {Количество вершин в графе]
v = rand(, Х); {Произвольная вершина v е X]
XQ - Mi {Вершины остовного дерева}
X=X{v}; {Удалить v изХ}
U0
= 0; {Ребра остовного дерева}
WT
= 0; {Вес остовного дерева]
for x e Xdo begin
disfix] = We[x, v]; {Минимальное расстояние от х до v е Х0
}
prev[x] = v; {Ребро (v, х), длина которого dist[x]}
end;
while X0 *nXdo begin
dist[v] = min dist[x]; { v е Х— вершина для включения}
xsX
6.8. Остовные деревья 147
Х0 = Х0 u {v}; {Добавить вершину]
X=X{v] {Удалить вершину]
U0= U0^j {prev[v, v}; {Добавитьребро]
WT= WT+ dist[v; {Поправить вес дерева]
{Поправить dist[x] — вектор расстояний]
forx e Xdo ifdist[x] > We[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..nVertex] of Integer;
Var
f :Text; { Текстовый файл }
nX :Integer; { Количество вершин в графе }
nXo :Integer; { Количество вершин в остовном дереве}
nUo :Integer; { Количество ребер в остовном дереве }
X :TypeVertex; { Список вершин графа }
Хо :TypeVertex; { Список вершин остовного дерева }
Uo :TypeRib; { Ребра остовного дерева }
Prev :TypeVertex; { Список ближайших вершин }
Dist :TypeRib; { Расстояния до ближайших вершин }
We :TypeWeight; { Матрица весов ребер графа }
Wt :LongInt; { Вес минимального остовного дерева }
Procedure minDist( Var v :Integer );{Поиск v - ближайшего
соседа}
Var i,d :Integer;
begin
v:=X[l];
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=Xv - удалить 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=Xv - удалить 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[i,j]:=$7fff; {+бесконечность}
W e [ j , i ] : = W e [ i , j ] ;
end;
end;
C l o s e ( 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[i,j]=$7fff then continue;
nUo:=nUo+l;
Uo[2*nUo-l]:=i;
Uo[2*nUo]:=j;
end;
WriteLnff,'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*1-1]:3);
WriteLn(f); Write(f,'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(f,We[Uo[2*1-1],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); Writeff,'u62=');
for i:=l to nUo do Write(f,Uo[2*1]:3);WriteLn(f);
150 Глава 6. Введение в теорию графов. Алгоритмы на графах
Write ( f , ' W o e = ' ) ;
for i:=l to nUo do Write(f,We[Uo[2*i-l],Uo[2*i]]:3);
W r i t e L n ( f ) ; Wt:=0;
for i:=l to nUo do Wt:=Wt+We[Uo[2*1-1],Uo[2*i]];
W r i t e ( f , ' B e c = ' , W t : 3 ) ;
C l o s e ( 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
Х = 1 2 3 4 5 6 7
ul = 1 1 1 2 2 3 3 4 4 5 5 6
u 2= 2 6 7 3 7 4 7 5 7 6 7 7
We = 20 23 1 15 4 3 9 17 16 28 25 36
uol= 1 7 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
определен вес ю(м) > 0. Найдем кратчайший путь между выделен-
ными вершинами х$ и z (рис. 6.21). Несуществующие ребра будем
считать ребрами с бесконечными весами. Сумму весов ребер в
пути будем называть весом или длиной пути. Обозначим
w,y = co(w) — вес ребра и = (х,-, xj). Алгоритм поиска кратчайшего
пути, начиная из вершины XQ, просматривает граф в ширину, по-
мечая вершины Xj значениями—метками их расстояний от XQ. Мет-
ки могут быть временные и окончательные. Временная метка вер-
шины Xj — это минимальное расстояние от XQ до Xj, когда в опреде-
лении пути на графе учитываются не все маршруты изXQ вх,. Окон-
чательная метка Xj — это минимальное расстояние на графе OTXQ до
Xj. Таким образом, в каждый момент времени работы алгоритма
некоторые вершины будут иметь окончательные метки, а осталь-
ная их часть — временные. Алгоритм заканчивается, когда верши-
на z получает окончательную метку, т.е. расстояние от XQ до z.
Вначале вершине XQ присваивается окончательная метка 0 (ну-
левое расстояние до самой себя), а каждой из остальных Х — 1
вершин присваивается временная метка да (бесконечность). На
каждом шаге одной вершине с временной меткой присваивается
окончательная и поиск продолжается дальше. На каждом шаге
метки меняются следующим образом.
1. Каждой вершине х,, не имеющей окончательной метки, присва-
ивается новая временная метка — наименьшая из ее временной
и числа (wy + окончательная метках,), где х, — вершина, которой
присвоена окончательная метка на предыдущем шаге.
2. Определяется наименьшая из всех временных меток, которая и
становится окончательной меткой своей вершины. В случае
равенства меток выбирается любая из них.
152 Глава 6. Введение в теорию графов. Алгоритмы на графах
Циклический процесс п.1+п.2 продолжается до тех пор, пока
вершина z не получит окончательной метки. Легко видеть, что
окончательная метка каждой вершины — это кратчайшее рассто-
яние от этой вершины до начала XQ.
Рассмотрим пример поиска кратчайшего пути на графе, пред-
ставленном на рис. 6.21.
2 х2 5 хЗ 7
Рис. 6.21. Простой взвешенный орграф
х5
Процесс назначения меток вершинам графа на каждом шаге
удобно представить в виде следующей таблицы.
xl х2 хЗ х4 х5
10 15
13 15
Квадратами выделены окончательные метки, т.е. расстояния от
них до х0
. По такой таблице легко восстановить путь перемеще-
ния от z к XQ, который отмечен ломаной кривой.
Реализация рассмотренной схемы поиска кратчайшего пути
представлена в алгоритме 6.11, где граф Г= (X, U, Ф) представля-
ется матрицей весов We = [w,-,], веса несуществующих ребер пола-
гаются равными +оо. Вектор Mark[x] меток вершин устанавливает
принадлежность вершины х Е ЛГпостоянной (TRUE) или времен-
ной (FALSE) метке. Вектор Dist[x] в алгоритме фиксирует теку-
щие значения меток вершин. Вектор Prev[x] позволяет восстано-
вить в обратной последовательности вершины кратчайшего пути.
6.9. Кратчайшие пути на графе 153
Алгоритм 6.11. Алгоритм кратчайшего пути на орграфе
for x e X do begin
Mark[x] = FALSE;
Dist[xJ = oo;
end;
У = ХО',
Mark[xQ = TRUE;
Dist[xQ] = 0;
while not Mark[z do begin
for x e X do
if not Mark[x] and dist[x] > disty] + w[y, z] then begin
dist[x] = disty] + w[y, x];
prev[x]=y;
end;
{Поиск новой вершины у е X с минимальной временной меткой}
disty] = min distx
xsXand Mark[x]=FALSE
Marky] = TRUE;
end.
Prev[x] указывает на вершину с окончательной меткой, бли-
жайшую к вершине х. Последовательность вершин кратчайшего
пути будет имеет следующий вид:
z, prev[z], prevprev[z]], prevprevprev[z]]], ... , х0,
а значение Dist[z] составит длину пути из XQ в z- Очередная новая
вершина, претендующая на постоянную метку, обозначается че-
рез у.
• Сложность алгоритма, Алгоритм обращается к телу цикла whi-
le не более Х — 1 раз, и число операций, требующихся при
каждом таком обращении, равно 0(Х |). Тогда сложность алго-
ритма составит 0(1-^1 ).
Интересно заметить, что если требуется найти длины кратчай-
ших путей от х0 до всех вершин графа, то в алгоритме 6.11 условие
цикла while not Mark[z] do begin надо заменить на условие while
v not Mark[x] do begin. При этом сложность алгоритма останется
хеХ
прежней.
Программная реализация алгоритма поиска кратчайшего пути
представлена в алгоритме 6.12 на Pascal'e, который близко соот-
ветствует множественному описанию алгоритма 6.11.
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
f :Text; { Текстовый файл }
nX :Integer; { Количество вершин в графе }
Mark :TypeMark; {Признаки временных и постоянных меток}
Dist :TypeDist; { Значения текущих меток вершин
(расстояния)}
Prev :TypePrev; { Указатель на ближайшую вершину }
We :TypeWeight; { Матрица весов ребер графа }
хО :Integer; { Вершина начала пути }
z :Integer; { Вершина конца пути }
у :Integer; {Последняя вершина с постоянной меткой}
Var
i,j,х :Integer;
weight :Longlnt;
begin
Assign(f,'Short.in');
Reset(f);{Файл открыт для чтения}
{Ввод исходных данных}
Read(f,xO); {Начальная вершина пути}
Read(f,z); {Конечная вершина пути}
Read(f,nX); {Количество вершин в графе}
пХ:=пХ-1; (* Х={О,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 х:=0 to nX do begin
Mark[x]:=FALSE;
Distfx]:=$7fffffff;
end;
6.9. Кратчайшие пути на графе 155
у:=хО; {Последняя вершина с постоянной меткой}
Mark[у]:=TRUE;
Dist[y]:=0;
while not Mark[z] do begin
{Обновить временные метки]
for x:=0 to nX do if not Markfx] and
( Dist[x]>DistCy]+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
W r i t e ( f , x : 2 ) ;
x:=Prev[x];
end;
WriteLn(f,x:2);
WriteLn(f, ' Длина пути=  D i s t [ z ] ) ;
Close(f);
end.
Рассмотрим пример расчета по программе алгоритма 6.12 по-
иска кратчайшего пути на графе, показанном на рис. 6.21. Исход-
ные данные графа представляются матрицей весов его ребер в
текстовом файле Short.in со следующей структурой:
• в первой строке определяется номер начальной вершины пути л^;
• во второй строке определяется номер конечнойвершины путиz',
• в третьей строке указывается количество пХвершин в графе;
• в следующих дАГстроках определяются строки матрицы весов [щ]
графа.
о
б
7
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
6
0
Результаты расчетов сохраняются в выходном файле Shortcut
со следующей структурой:
Вершины пути= 6 4 3 1 2 0
Длина пути= 11.
6.10. Потоки в сетях
• Определение. Транспортной сетью называется связный ориен-
тированный граф без петель Г= (X, U, Ф) с выделенной парой
вершин д:0
и z (рис. 6.22). Вершина х0
— начало транспортной
сети, из которой дуги только выходят. Вершина z — конец
транспортной сети, в которую дуги только входят. На множе-
стве дуг и е U задана целочисленная функция с(и) > О, где
с(и) — пропускная способность дуги.
Рис. 6.22. Транспортная сеть
Определение. Потоком по транспортной сети называется цело-
численная функция ф(м) > 0 , заданная на множестве дуг и elf
и обладающая следующими свойствами:
Уие£/"ф(ы)<С(ы) и £>(«)= £>(и), (6.10.1)
где х — внутренняя вершина графа, т.е. х Ф х0
, х * z',
UZ — множество дуг, заходящих в вершину х;
U~ — множество дуг, выходящих из вершины х (рис. 6.22).
6.10. Потоки в сетях _ 157
На рис. 6.22 напротив каждой дуги стоит дробь, числитель ко-
торой — пропускная способность дуги, знаменатель — поток по
дуге. Свойство (6.10.1) утверждает, что поток, входящий в верши-
ну, равен выходящему потоку (поток в вершинах не скапливает-
ся). Обозначим
„
где ф(г)— поток, входящий в вершину z;
ф(*о) — поток, выходящий из вершины л^.
• Утверждение 6.10.1. ср(г) = ф(х0
).
Действительно, сумма £[ ^ф(и)- ]>]ф(м)]=0, так как V« e U
величина ф(м) суммируется дважды — со знаками + и -. Здесь
где первая часть выражения равна нулю вследствие 6.10.1.
• Определение разреза. Пусть А с X— множество вершин транс-
портной сети: х0
g A, z^A. Обозначим через U^ множество
дуг, входящих в А. Это множество дуг будем называть разрезом
транспортной сети.
с(и) /
с(и
Рис. 6.23. Разрез транспортной сети
С(А) = ]Гс(и) — называется мощностью разреза. Это максимально
ие(/^ возможный поток, входящий в А по дугам разреза.
ф(4) = ^ ф(м) — поток, входящий в А по дугам разреза. Ясно, что
и<=и
+
А
ср(Л) < С(А), так как Vw e U ф(ы) < с(и).
• Утверждение 6.10.2. ф(г) < С(А).
Действительно, из рис. 6.23 видно, что не весь поток, входя-
щий в А, скатывается в z. Часть потока может выходить из А. Зна-
чит, ф(г) < у(А), но ф(Л) < С(А), тогда и ф(г) < С(А).
158 Глава 6. Введение в теорию графов. Алгоритмы на графах
Теорема 6.10.1 Форда и Фалкерсона. Максимальный поток по
транспортной сети равен мощности минимального разреза, т.е.
max (р(г ) = тптС(А).
Доказательство теоремы — это алгоритм определения макси-
мального потока по сети. Алгоритм состоит из двух частей.
1. Насыщение потока. Поток называется насыщенным, если лю-
бой путь из XQ в z содержит дугу и s U, для которой ср(и) = с(и).
Задача первой части алгоритм состоит в насыщении потока.
1.1. Зададим произвольный начальный поток. Например, нуле-
вой на всех дугах: Vu e Uq(u) = 0.
1.2. Поиск пути из XQ в г. Если путь найден, то переход к пункту
1.3. Если путь не найден, то переход к пункту 1.5.
1.3. Увеличиваем поток по найденному пути таким образом, что-
бы одна из дут стала насыщенной.
1.4. Условно разрываем насыщенную дугу и переходим к пункту
1.2, на поиск пути из х$ в z.
1.5. Сеть насыщена и «разорвана».
2. Перераспределение потока. Итак, поток насыщен, как в приме-
ре на рис. 6.24. Пометим рекурсивным образом все возмож-
ные вершины х, сети.
-2 Xl
х2 +о х2
Рис. 6.24. Насыщенная транспортная сеть и пометка вершин
2.1. Вершину XQ пометим —0.
2.2. Пусть Xj — любая из уже помеченных вершин; у — произволь-
ная непомеченная вершина, смежная л:,. Вершину у помечаем
+/, если данные вершины соединены ненасыщенным ребром
Xj-*y(+i), и помечаем —/', если соединены непустым ребром
х
/ <- Х~0- После пометки вершин возможны два случая: вер-
шина z оказалась либо помеченной, либо непомеченной.
6:10. Потоки в сетях 159
2.3. Вершина z оказалась помеченной. Значит, существует после-
довательность помеченных вершин от х0 к z. В этой последо-
вательности каждая последующая вершина помечена номе-
ром предыдущей, как на рис. 6.25. Определим на дугах новый
поток, увеличивая на единицу поток на дугах, ориентирован-
ных по направлению движения от х$ к z, и уменьшая поток на
единицу на дугах, направленных против этого движения, как
на рис. 6.25.
1 1 3 1 1 3
-О 1 +0 1 -2 1 +1 2 0 2
хО
+0
-*-••«
х2 хО х2 xl
Рис. 6.25. Перераспределение потока на основе пометки вершин
Заметим, что поток можно увеличивать (уменьшать) на пря-
мых (обратных) дугах настолько, пока одна из дуг не станет
насыщенной (пустой). Далее вновь переходим к пометке вер-
шин (пункт 2.1). Выполненное перераспределение потока со-
храняет все его свойства и увеличивает на единицу поток в
вершину z. Таким образом, пометка вершины z позволяет
увеличить поток как минимум на единицу, а значит, алго-
ритм конечен, т.е. наступит момент, когда вершина z оста-
нется непомеченной.
2.4. Вершина z осталась непомеченной. В рассматриваемом при-
мере это показано на рис. 6.26. ПустьА* — множество всех не-
помеченных вершин. Тогда дуги, входящие в эти вершины,
насыщенные, а выходящие — пустые. В примере А* = {xlt
z}-
Множество А* определяет разрез, так как XQ <£ A*, z e А*. Та-
ким образом, мы нашли поток ф* и разрез А*, для которых вы-
полняется ф*(Л*) = С(А*). Учитывая, что выходящие дуги изЛ*
пустые, то весь поток у*(А*) скатывается в z, т.е. ф*(г) = С(А*).
xl
Рис. 6.26. Максимальный поток
162 Глава 6. Введение в теорию графов. Алгоритмы на графах
• Определение независимого множества вершин. Пусть граф
Г= (X, U, Ф) — неориентированный и без петель. Множество
/ с f/вершин называется независимым, если между любыми
его вершинами нет соединяющих ребер. В зависимом множе-
стве хотя бы две вершины соединены ребром. Множество Q
полностью зависимое, если каждая пара его вершин соединена.
Вершины графа, составляющие Q, образуют полный подграф.
• Определение. Максимальное независимое множество есть неза-
висимое множество, которое становится зависимым после до-
бавления к нему любой вершины. Заметим, что каждое неза-
висимое множество содержится в некотором максимальном
независимом множестве. Максимальное число р(7) вершин,
составляющих независимое множество, называется числом
(вершинной) независимости графа.
• Определение независимого множества ребер. Подобно незави-
симым множествам вершин рассматриваются независимые
множестваребер, состоящие из ребер, не имеющих общих вер-
шин. Каждое независимое множество ребер содержится в не-
котором максимальном независимом множестве. Число ребер
в максимальном независимом множестве называется числом
реберной независимости (Зи(7).
При представлении игр графами независимые множества вер-
шин являются такими множествами позиций, что никакая из них
не может бытьдостигнута издругой за один ход. Примеромявля-
ется задача о расположении максимального числа ферзей на шах-
матной доске так, чтобы ни один них не мог побить другого. Это
максимальное число равно (3(/) = 8.
• Утверждение 6.11.1. Независимое множество максимально
тогда и только тогда, когда оно доминирующее, а значит,
р(7) > 5(/)— число (вершинной) независимости не может быть
меньше числа доминирования.
Доказательство. (=>) Если 7с U— максимальное независимое
множество, то не может быть вершин k е 7, не соединенных с
ребром, так как в противном случае множество k u /также было
бы независимым, но 7— максимальное по условию. Отсюда 7 —
доминирующее. (<=) Пусть 7— независимое доминирующее мно-
жество. Тогда никакое k нельзя перевести из 7 в /так, чтобы k <u I
осталось независимым, а значит, 7 — максимальное.
6.11. Клики, независимые множества 163
Определение. К/гика есть полностью зависимое множество, ко-
торое теряет это свойство после добавления любой вершины.
Клики графа представляют «естественные» группировки вер-
шин в максимальные полные подграфы. Определение клик
графа полезно в кластерном анализе в таких областях, как ин-
формационный поиск, в социологии и др. В качестве примера
на рис. 6.31 показан граф и его клики.
6 7 1 4 4
Рис. 6.31. Граф и его клики
7 7
• Замечание. Если предположить, что граф Г= (X, U, Ф) про-
стой, то полностью зависимые множества (клики) в Г стано-
вятся максимально независимыми множествами в дополните-
льном графе Г, верно и обратное.
При алгоритмическом подходе к выделению клик в графе при-
меняют метод поиска с возвращением по специальному дереву по-
иска, устроенному следующим образом. Каждый узел в дереве по-
иска соответствует полному подграфу исходного графа, и каждое
ребро дерева поиска соответствует вершине исходного дерева.
Вершины (множества) дерева поиска определим рекурсивно. Ко-
рень дерева поиска — пустое начальное множество S = 0. Пусть
теперь S — произвольная вершина дерева поиска какого-либо
уровня. Тогда вершиной следующего уровня дерева поиска будет
вершина S u {х}, если х eS и х смежна с каждой вершиной из S. В
дереве поиска такие вершины S и S и {х} соединяются ребром,
которое соответствует вершине х. На рис. 6.32 показаны некото-
рый граф Гидерево поиска Т, которое исследуется в процессе по-
иска с возвращениями клик графа полным перебором.
Заметим, что каждая клика порождается много раз: клика
{1,2,3} порождается 3! раз, клики {3,4} {4,5} порождаются 2! раз. В
общем случае клика размера &порождается k раз. Все тонкие реб-
ра на рис. 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(Sc X— подмножество вершин графа).
Вершина Sдерева поиска уже обработана и первой вершиной,
которую надо исследовать, является множество .У и {х}, как на
рис. 6.33, вершина х смежна с каждой вершиной из S. Пусть
все поддеревья узла Sv {х} в дереве Гуже исследованы и по-
рождены все клики, включающие S^j {х}. Тогда необходимо
исследовать только те из вершин Su {v,-}, для которых
v g Adj[x] (рис. 6.33).
Рис. 6.33
Поддеревья
с корнями Su {v/}
(эти вершины
смежны с 5)
• Утверждение 6.11.3. Пусть S — узел в дереве поиска Т, и пусть
S с S — предок SB Т. Если все поддеревья узла Su{x}уже ис-
следованы, так что порождены все клики, включающие S и{х},
то все неисследованные поддеревья с корнями Ju{x} можно
игнорировать.
Алгоритм 6.13 порождения клик графа представляет собой про-
цедуру поиска с возвращением и является наиболее сложным из
всех ранее рассмотренных алгоритмов. Рекурсивная процедура
CLIQUEимеет два параметра: Nn D. Для рассматриваемого узла S
6'. 11. Клики, независимые множества 165
поиска объединение Nи/) представляет множество вершин,
смежных с каждой вершиной из S, т.е. N<uD— множество вершин,
которые могут выступать в качестве продолжения поиска клик из
вершины S. Множество Nсостоит только из новых вершин, кото-
рые могут быть добавлены к S в процессе поиска клик, т.е.
N= (x е A]|(A:,J) e UVs е-УлУб
1
с S ни одно из поддеревьев S w {x} не исследовано}.
Алгоритм 6.13. Порождение клик графа
5=0; {Начальная вершина дерева поиска Т}
N=X;
D = 0;
Z=X;
CLIQUE(N, D, Z); {Рекурсивный проход по дереву поиска Т}
Procedure CL1QUE(N, D, Z)
i/TV и D = 0 then вывести S, которое является кликой
else ifN*0 then begin
x e N; {Исследовать первое поддерево}
View(x); {Исследовать поддеревья}
{Исследовать оставшиеся поддеревья уровня]
Z=Z(x};Z=ZAdj[x-
while Z#0 do begin
veZ;
View(v); {Исследовать поддеревья}
Z e Z{v};
end',
end;
end;
Procedure View(v) {Исследовать поддеревья}
N= N{v};
S=S{v};
D = Dv{v};
end;
Процедура CLIQUE выбирает произвольную вершину x e N,
удаляет ее из N и исследует поддерево S= Su{x}, обращаясь к
процедуре View. Далее, согласноутверждениям 6.11.2и 6.11.3, при
помощи процедуры исследуются только поддеревья S= Su {v},
где v е Л^ v g vl$[;c] что соответствует условию v e Z. Множество
166 Глава 6. Введение в теорию графов. Алгоритмы на графах
Zсостоит из вершин одного уровня дерева, которые должны быть
исследованы при рекурсивном проходе по дереву поиска, чтобы
не потерять ни одной клики графа.
Второй параметр D процедуры CLIQUE представляет собой
множество вершин, смежных со всеми вершинами из S, но таких,
которые не надо добавлять к S на предмет продолжения форми-
рования клик.
D = { x z X}(x,s) et/Vs eSu noddepeeoS u{x) исследовалось для некоторых S ^S].
По алгоритму множество S с X является полным подграфом гра-
фа Г= (X, U, Ф) и TVu D — множество всех вершин, смежных с
каждой вершиной в S.
• Множество S будет кликой тогда и только тогда, когда
• Условие N= 0 и Z) * 0 обозначает, что все клики, включающие
S, уже ранее порождались.
• При N* 0 могут оставаться клики, включающие S, которые
еще не порождались. Исследование таких поддеревьев S u {х},
х е N необходимо продолжить.
Основные усилия алгоритма 6.13, порождения клик графа, на-
правлены на поддержание множеств N к D, текущее состояние
которых, согласно перечисленным выше условиям, предопреде-
ляет исследования по дереву поиска.
Программная реализация алгоритма порождения клик графа
представлена в алгоритме 6.14 на Pascal'e, который близко соот-
ветствует множественному описанию алгоритма 6.13. Отметим,
что в программной реализации передача множеств N, D, ZB каче-
стве параметров процедур выполнена посредством указателей
kN, 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 - указатель начала и количества вершин в списке 2}
Procedure PrintClique; FORWARD;
Procedure Subtract; x:Integer; Var kZ,nZ:Integer ); FOR-
WARD;
Procedure Intersection( v,kM,nM:Integer; Var kMw,nMw:In-
teger; Var M:TypeVertex ); FORWARD;
Procedure View( v:Integer; Var kN,nN, kD,nD, kZ,nZ:Inte-
ger ); 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:=1 to Nbr[i] do begin
yes:=FALSE;
for k:=l to m do
if A d j [ F s t [ i ] + j ] = V t x [ k ] then begin
yes:=TRUE;
A d j [ F s t [ 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+l;
M[kMw+nMw] :=M[kM+i];
break;
end;
end;
Procedure Subtract( x:Integer; Var kZ,nZ:Integer );
(* Формирование разности множеств Z=Z{x} и Z=ZAdj[x] *)
Var
i,j,k :Integer;
yes :Boolean;
begin
(* Формирование Z=Z{x} *)
for i:=l to nZ do
if Z[kZ+i]=x then begin
nZ:=nZ-l;
for k:=i to nZ do Z[kZ+k]:=Z[kZ+k+1];
break;
end;
(* Формирование Z=ZAdj[x] *)
6.11. Клики, независимые множества 169
for j:=l to Nbrfx] 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 :Integer;
begin
if (nN=0) and (nD=0) then {Клика найдена}
PrintClique {Печать клики)
else if nN<>0 then begin (Продолжить исследование
поддеревьев}
x:=N[kN+nN]; {Перебор с конца вершин множества N}
View(x,kN,nN,kD,nD,kZ,nZ); {Исследовать первое
поддерево уровня}
Subtract(x,kZ,nZ); (* Z=Z{x} и Z=ZAdj[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]:=0; {Указатель начала первой строки списка}
for i:=l to m 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,'Clique.out');
Rewrite(f); {Файл открыт для записи}
Init(yes);
if not yes then begin
WriteLn(f,'Плохая структура смежности графа!');
Close (f);
exit;
end;
6.11. Клики, независимые множества 171
{Формирование начальных множеств: S, D, N, Z}
nS:=0; (S - пустое}
kD:=0; nD:=0; {D - пустое множество}
kN:=0; nN:=m; {N - все вершины графа)
for i:=l to m do N[i]:=i;
kZ:=0; nZ:=m; {Z - для исследования доступны все вершины}
for i:=l to m do Z[i]:=i;
Clique(kN,nN,kD,nD,kZ,nZ); {Рекурсивное выделение
клик графа}
Close (f);
end.
Воспользуемся данной программой в качестве примера для ре-
шения следующей задачи.
Задача. Симпатичный прием. Генерал желает устроить свой
юбилей с максимальным числом гостей из своих знакомых. Стре-
мясь сделать юбилейный вечер приятным, он должен организо-
вать все так, чтобы на нем присутствовали люди, симпатизирую-
щие друг другу. Для достижения цели ему придется находить мак-
симальную клику графа своих знакомых. Этот граф устроен следу-
ющим образом. Вершины его — знакомые юбиляра. Две вершины
смежные, если соответствующие знакомые симпатизируют друг
другу. Нетрудно понять, что клика этого графа с максимальным
числом вершин и представляет тот самый максимальный контин-
гент приглашенных, который может позволить себе юбиляр.
«Симпатичный» граф знакомьрсгенерала представлен на рис. 6.34.
Рис. 6.34 !*. „2
Пример порождения клик графа
7
Для программы алгоритма 6.14 исходные данные структуры
смежности AdJ[x] этого графа задаются в текстовом файле CU-
que.in. Структура (правило) заполнения файла совпадает с той,
которая описана в примере поиска в глубину при расчете по про-
грамме алгоритма 6.2.
Данные файла Clique.in для примера на рис. 6.34:
7
3 3 1 4 7
1 4 3 4 5 2
172 Глава 6. Введение в теорию графов. Алгоритмы на графах
4 4 3 1 2 5
7 2 3 6
2 4 1 4 5 6
5 4 4 1 2 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, U0
, Ф) графа Г= (X, U, Ф). Лю-
бое ребро, не принадлежащее U0
, т. е. любое ребро из UU0
, по-
рождает в точности один цикл при добавлении его к U0
. Такой
цикл является элементом фундаментального множества циклов
графа /относительно дерева Г0
. Так как каждое остовное дерево
графа /включает Х — 1 ребро, в фундаментальном множестве
циклов относительно любого остовного дерева графа / имеется
U — Х + 1 циклов.
Полезность фундаментального множества циклов вытекает из
того факта, что это множество полностью определяет цикличе-
скую структуру графа: каждый цикл в графе может быть представ-
лен комбинацией циклов из фундаментального множества. Пусть
F= {Q, С2
,..., С|^|_|д-|+1
} — фундаментальное множество циклов, где
каждый цикл С,является подмножеством ребер С, с U. Тогдалюбой
цикл графа / можно записать в виде ((...(С, Ф С,-,г
)Ф...) Ф С, ), где
символ Ф обозначает операцию симметрической разности,
Ср Ф Cq = {и | и zCp
uC? ли еСр
пС„}.
6.12. Циклы, фундаментальные множества циклов 173
Например, на рис. 6.35 показан граф и фундаментальное мно-
жество циклов, получающихся из выделенного жирной линией
остовного дерева графа. Цикл графа (х{
, х2
, х5
, х3
) есть
С1
© С3
® С4
или цикл (XL х2
, х4
, д/з) есть С1
Ф С2
. Отметим, что в
общем случае не каждая сумма циклов будет являться циклом
графа.
2 хЗ х2
Р
х 4
Рис. 6.35. Граф, его остовное дерево и фундаментальное множество
циклов
При порождении фундаментального множества циклов удобно
использовать метод поиска в глубину; он строит остовное дерево и
каждое обратное ребро порождает цикл относительно этого дере-
ва. Для того чтобы следить за ребрами дерева, используется поиск в
глубину со стеком, в котором хранятся все текущие вершины
пройденного пути в данный момент. Когда попадаем на обратное
ребро, обнаруженный цикл будет состоять из этого ребра и ребер,
соединяющих вершины из верха стека. Реализация рассмотренно-
го подхода представлена в алгоритме 6.15, который строит фунда-
ментальное множество циклов F= {Q, С2
,..., С^ц^^} графа
Г= (X, U, Ф).
Программная реализация поиска фундаментального множест-
ва циклов представлена в алгоритме 6.16.
Алгоритм 6.15. Фундаментальные циклы графа
for v <= X do Mark[v] = 0; {Начальные метки вершин}
count - 0;
jC= 0; {Счетчик числа циклов}
пС- 0; {Вершина стека циклов}
for v 6 X do if Mark[v] = 0 then begin
174 _ Глава 6. Введение в теорию графов. Алгоритмы на графах
Cycle(v, 0);
пС= пС- 1;
end',
Procedure Cycle(x, у)
count= count + 1;
Mark[x] = count; {Вершина исследована}
for v s Adj[x] do begin
nC=nC+ 1;
C[n C] = v; {Вершину в стек}
ifMark[v] = 0 then Cycle(v, x)
else ifMark[v] < Mark[x] л v * у then begin
jC=jC+ 1; {Обратное ребро (х, v), найден цикл}
WriteCycle(v, С, nC); {Печать цикла]
end;
nC=nC - 1; {Удалить исследованную вершину из стека}
end;
end;
Procedure WriteCycle(x, С, пС)
printjC; {Печать номера цикла]
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 :Text; . { Текстовый файл )
n :Integer; { Количество вершин }
nC :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:=1 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 (f,jC,'')');
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
178 Глава 6. Введение в теорию графов. Алгоритмы на графах
6.13.1. Листы
• Определение. Пусть Г= (X, U, Ф) — неориентированный граф.
Ребро и-(а,Ь)& U называется циклическим ребром, если оно
принадлежит некоторому циклу. Петля является циклическим
ребром. Никакое концевое ребро (инцидентное висячей вер-
шине) не может быть циклическим. Например, дерево не име-
ет циклических ребер, и, обратно, связный граф без цикличе-
ских ребер является деревом.
• Определение. Ребро и = (х, у) s i/называется разделяющим реб-
ром (или мостом, или разрезающим ребром) в Г, если в графе Т,
получающемся после удаления ребра и, вершины х и у не свя-
заны. Тогда граф Г можно представить как объединение гра-
фов
Г =/1
иГ2 >
(6.13,1)
где / п Г2
= 0, и / содержит х, Г2
содержит у.
• Утверждение 6.13.1. Ребро и = (х, у) е Uявляется разделяющим
тогда и только тогда, когда оно не является циклическим.
Доказательство. (=>) Допустим, что разделяющее ребро «явля-
ется циклическим. Тогда после его удаления вершины х и у оста-
нутся связанными, а значит, разложение (6.13.1) невозможно, что
противоречит условию: и — разделяющее ребро. (<=) Теперь и = (х,
у) — не циклическое ребро, т.е. не существует цепей, соединяющих
х и у и не содержащих и. Отсюда и — разделяющее ребро.
• Определение. Будем говорить, что две вершины х0
и хп
цикличе-
ски-реберно связаны, если существует такая последователь-
ность простых циклов С1;
С2
,.-., Ck
, что х0
е Cj, *„ е Ck
и каж-
дая пара соседних циклов имеет хотя бы одну общую вершину.
Условно взаимное расположение вершин и циклов можно
представлять так, как показано на рис. 6.36.
Рис. 6.36. Вершины циклически-реберно связаны
Утверждение 6.13.2. Циклически-реберная связность опреде-
ляет отношение эквивалентности (см. п.6.4) на множестве вер-
шин графа Г= (X, U, Ф). На рис 6.37 показано разбиение Гна
компоненты циклически—реберной связности.
6.13. Листы и блоки 179
Рис. 6.37. Компоненты Г(^) циклически-реберной связности графа.
Компоненты /~(£А
) связности графа.
Компоненты /""(£,/) s Г (Ц связаны мостами
• Определение. Множество всех вершин, циклически—реберно
связанных с данной вершиной х, называется листовым множе-
ством L(x), которому принадлежит х. Отметим, что листовое
множество может состоять только из одной вершины х, тогда
листовое множество называется особым. Далее будет показано,
что это возможно тогда и только тогда, когда все ребра, инци-
дентные вершине х, являются петлями или разделяющими
ребрами.
• Определение. Подграф Г(L), определяемый листовым множе-
ством L, называется листом.
• Утверждение 6.13.3. Отметим следующие очевидные свойства
листа Г(1).
1. Граф f(L) циклически замкнут, т.е. если какой-нибудь
простой цикл С в /имеет общую вершину с L, то весь про-
стой цикл С содержится в Г(Ь).
2. Не может быть более одного ребра, связывающего два раз-
личных листовых множества L и L2
, так как иначе эти ребра
оказались бы циклическими и множества L^ и Z,2
должны
были бы совпадать. Связывающие одиночные ребра различ-
ные листовые множества L{
и L2
являются мостами для гра-
фа. Ниже показано, что они будут являться и блоками, со-
стоящими из одного ребра.
3. Все ребра в P(L) являются циклическими. Пусть ребро (х, у)
лежит вГЩ. Покажем, что оно циклическое. Действитель-
но, если, например, вершины х и у в L соединены ребром,
тогда (х, у) циклическое по построению L. Если же х и у в L
не соединены ребром, то, добавив данное ребро (х, у) к L,
180 Глава 6. Введение в теорию графов. Алгоритмы на графах
получим цикл, так как вершины х, у связаны в L по построе-
нию. Отсюда следует, что ребро (х, у) циклическое.
4. По определению граф Г(Ь) связный. Из предыдущего пунк-
та следует, что маршрут в Г(Ь), соединяющий произволь-
ные две его вершины, будет состоять исключительно из
циклических ребер.
6.13.2. Блоки
• Определение. Пусть Г= (X, U, Ф) — неориентированный граф.
Два ребра и, v e U называются сильно циклически связанными,
если существует такая последовательность простых циклов С{,
С2,..., Ck, что и e C1; v e Ck, и любая пара соседних циклов С,,
Ci+i имеет, по крайней мере, одно общее ребро. Условно вза-
имное расположение ребер и циклов можно представлять так,
как показано на рис. 6.38.
Рис. 6.38. Сильно циклически связанные ребра и, v
• Определение. Множество всех ребер, сильно циклически свя-
занных с ребром и e U, образует некоторую часть графа Г (£*),
называемую блоком, определяемым ребром и. Множество вер-
шин L этого графа называется блоковым множеством, опреде-
ляемым ребром и. Блок является связным графом и может со-
стоять из единственного ребра.
• Лемма 6.13.1. Два ребра сильно циклически связаны тогда и
только тогда, когда существует простой цикл, содержащий оба
эти ребра. Справедливость данного утверждения следует непо-
средственно из структуры сильно циклической связанности
ребер (рис. 6.38).
• Лемма 6.13.2. Если Р(х, у) — простая цепь, связывающая две
различные вершины х, у e L
b
блокового множества, то все реб-
ра цепи Р(х, у) принадлежат блоку Г(Ь
Ь
).
Доказательство. Если предположить, что утверждение леммы
не выполняется, то существует участок цепи Р(х, у), ребра кото-
рого не принадлежат данному блоку Г(Ь
Ь
). Не уменьшая общнос-
6.13. Листы и блоки 181
ти, будем считать, что этим участком является исходная цепь
Р(х, у). Так как х, у Е Lb
, то в блоке / (Ьь
) существует простая цепь
Q(x, у), связывающая х, у. Тогда объединение простых цепей
Р(х, у) u Q(x, у) составит простой цикл. Согласно лемме 6.13.1,
ребра этого цикла будут сильно циклически связаны, а значит,
все ребра простой цепи Р(х, у) должны лежать в Г (Lb
), что проти-
воречит предположению.
• Утверждение 6.13.4. Из леммы 6.13.2 следует, что блок Г(ЬЬ
)
является подграфом. Он циклически сильно замкнут, в том
смысле, что если простой цикл Симеет хотя
бы две вершины, общие с Lb
, то все ребра
цепи С принадлежат Г (Lb
). Поэтому два
различных блока могут иметь не более одной
общей вершины (рис. 6.39). В противном слу-
чае блоки должны совпадать.
• Утверждение 6.13.5. Из определения блокового множества Lb
следует, что все его вершины являются циклически-реберно свя-
занными при условии, что число ребер в блоке Г (L ) более од-
ного. Отсюда заключаем, что Lb
с L, где L — листовое множе-
ство вершин Ьь
, и каждый лист Г (L) имеет непересекающееся
по ребрам разложение
Д£)=дДФ (6.13.2)
I
на семейство блоков.
• Определение. В графе Г= (X, U, Ф) вершину х <= Хназываютраз-
деляющей вершиной (разрезающей или точкой сочленения),
если имеет место прямое по ребрам разложение (рис. 6.40)
Г=Г(УдиГ(У2), V=V^V2, V^V2 = x. (6.13.3)
Рис. 6.40
Прямое по ребрам разложение графа
• Утверждение 6.13.6. Блок Г(ЬЬ
) не имеет разделяющих вер-
шин, так как все его вершины циклически-реберно связаны.
На основании разложения (6.13.2) любого листа Г (L) на непе-
ресекающееся по ребрам разложение на блоки Г(Ь
Ь
) и последне-
го утверждения, составление листа Г (L) из блоков Г(Ь) может
быть представлено кактусообразной фигурой, как на рис. 6.41,
182 Глава 6. Введение в теорию графов. Алгоритмы на графах
в которой различные блоки соприкасаются в
своих соединяющих вершинах. Соединяющие
вершины блоков являются разделяющими
вершинами графа. Разложение (6.13.2) листов
на блоки Г(Ьу)=[_)Г(1^) позволяет теперь
А
уточнить структуру графа (рис. 6.37): каждый
лист ГL. можно представить в виде кактусооб-
разной'"схемы (рис. 6.41) составляющих его
блоковr(L
b
k).
Рис. 6.41
6.13.3. Поиск блоков в глубину
Разложение графа на блоки и выделение их имеет важное прак-
тическое значение. Иногда недостаточно знать, что граф связен;
может интересовать насколько «сильно связен» связный граф.
k
Ь)
с)
Рис. 6.42. Исходный граф (а); блоки графа (Ь); листы (с), (е) и один
мост (d); точки сочленения: b, f, j, i
Например, удаляя вершину сочленения двух блоков (рис. 6.40)
и инцидентных ей ребер, нарушим связность графа. Связность
графа не нарушится, если удалить внутреннюю вершину блока и
инцидентные ей ребра. Про такие компоненты графа говорят, что
они двусвязные. Отыскание точек сочленения и блоков графа важ-
но при изучении надежности коммуникационных и транспорт-
6.13. Листы и блоки 183
ных сетей. Это важно также и при изучении других свойств графа,
таких, например, как планарность, так как часто полезно разло-
жить граф на его двусвязные компоненты (блоки) и изучать каж-
дую из них в отдельности.
На рис. 6.42 в качестве примера изображен связный граф и его
блоки (двусвязные компоненты). Здесь же показано разложение
графа на листы.
Для нахождения блоков и точек сочленения применим извест-
ный метод поиска в глубину на неориентированном графе
Г= (X, U, Ф). Основу алгоритма выделения блоков и точек их со-
членения легче понять, рассмотрев пример на рис. 6.43, где схе-
матически изображен связный граф, состоящий из шести блоков
rt, i = 1,6, и четырех точек сочленения Xj, j = 1,4.
Рис. 6.43. Схематическое изображение графа с шестью блоками
и четырьмя точками сочленения
Если начать поиск в глубину, скажем, из вершины s e Г2
, то мо-
жем перейти из Г2
в /i, проходя через вершину xt
. Из свойства по-
иска в глубину, все ребра в / должны быть пройдены до того, как
вернемся в Xj. Поэтому / состоит в точности из ребер, которые
проходятся между входом и выходом из вершины х^ Для других
блоков дело обстоит несколько иначе. Так, например, если уйти
из TI в Г5
, а оттуда — в Г^ через х4
, то окажемся в Г6
, пройдя ребра
из Г2
, /5 и Г6
. Если хранить ребра в стеке, то во время прохождения
назад из Г6
в Г5
через вершину Jc4
все ребра Г6
будут на верху стека.
После их удаления на верху стека останутся ребра Г5
и снова про-
должим проход блока Г5
. Таким образом, если можно распозна-
вать точки сочленения во время обхода, то применяя поиск в глу-
бину и храня ребра в стеке в той очередности, в которой они про-
ходятся, можно также определить и блоки (двусвязные компо-
ненты). Ребра, находящиеся на верху стека в момент обратного
прохода через точку сочленения, составляют блок.
Реализация рассмотренного подхода выделения блоков графа
представлена в алгоритме 6.17. В векторе Mark[x] меток вершин
х е Аграфа фиксируются порядковые номера обхода соответст-
184 Глава 6. Введение в теорию графов. Алгоритмы на графах
вующих вершин. В этом случае метка вершины сочленения при
входе в блок получит наименьший номер из всех остальных вер-
шин блока. Таким образом, для определения точки сочленения
выхода из блока достаточно найти вершину этого блока с мини-
мальной меткой. Свойство циклической замкнутости блока по-
зволяет это сделать лишь на основе вектора меток Mark[x], не
привлекая дополнительной информации. На рис. 6.44 схематич-
но представлен блок, где вершина w — точка
входа в блок и точка сочленения. Вершина х —
следующая обследованная вершина блока после
w. Свойство циклической замкнутости блока
позволяет утверждать, что существует по край-
г, Рис. 6.44
ней мере еще одна вершина у, смежная w. Рекур-
сивный характер алгоритма поиска в глубину на
графе позволяет утверждать, что в этом случае ребро блока (у, w)
будет пройдено как обратное, и, значит, метка Mark[w] точки со-
членения блока будет доступна до выхода из блока по ребру входа
(z, x). Поэтому, сохраняя минимальное значение меток обследо-
ванных вершин (включая и по обратным ребрам поиска в глуби-
ну), будем проверять при рекурсивном выходе из поиска в глуби-
ну совпадает ли это минимальное значение с меткой вершины
выхода. Если ответ положительный, то найдена точка сочлене-
ния. В алгоритме значения минимальных меток фиксируются в
векторе Virtual[x] для каждой вершины х е X, как наименьшее
значение из Marky], где у — вершины графа, которые достижимы
из jc при проходе графа в глубину.
Алгоритм 6.17. Выделение блоков графа
count= 0;
Stack =0;
for v е Xdo Mark[v] = 0; {Начальные метки вершин]
for v&Xdo ifMark[v] = 0 then Block(v, 0);
Procedure Block(x, w)
count= count+ 1;
Mark[x] = count; {Вершина исследована}
Virtual[x] = count; {Напольная минимальная метка}
for v e Adj[x]X do
ifMark[v] = 0 then begin
Stack = Stack u (x, v);
6.14. Двудольные графы 185
Block(v, x);
Virtual[x]=rmn(Virtual[x], Virtual[v);
if Virtual[v] > Virtual[x] then begin
В этой точке х — либо корень дерева, либо
точка сочленения. Образовать новый блок.
состоящий из всех ребер стека, включая (х, v).
end,
end',
else if Mark[v < Mark[x] and v*w then begin
{ (x, v) — обратное ребро}
Stack = Stack и (х, v);
Virtual[x] =rmn(Virtual[x], Virtual[v]);
end;
end.
6.14. Двудольные графы
• Определение. Граф Г= (X, U, Ф) называется двудольным, если
множество его вершин можно разбить на два
независимых подмножества Vb
V2
таких, что
Х= FJ и V2
и Fj г V2
= 0. Такой граф будем
обозначать как Г= (V и V2
, U, Ф).
На рис. 6.45 изображен типичный двудольный
граф. Двудольные графы играют заметную роль в
различных приложениях.
6.14.1.Условиясуществованиядвудольных
графов
• Теорема 6.14.1. Граф Г= (X, U, Ф) являетсядвудольным тогда и
только тогда, когда любой его простой цикл четной длины.
Доказательство. (=>) Ясно, что данное условие для двудольно-
го графа всегда выполняется. (<=) Разобьем граф Гна компоненты
связности Гь
Г2>
...,Гт
. Пусть Fk
= (Xk
, Uk
, Ф) одна из них и а е Xk
—
произвольная вершина. Разобьем множество вершин Xk
на непе-
ресекающиеся Vki
и Vk2
, где Vkl
— вершины, расстояние до кото-
рых от а нечетно; Vk2
— вершины, расстояние до которых от а чет-
но, а е Vk2
. Множества Vkl
и Vk2
являются независимыми. Дейст-
вительно, если предположить, что вершины b и с смежные и
186 Глава 6. Введение в теорию графов. Алгоритмы на графах
Ь, с е Vkl или Ь, с е Vk2, то существовал бы УП '-
цикл нечетной длины, соответственно «а
нечетная длина Ь длина единица с нечетная —
длина а» или «а четная длина Ь длина единица y2t =r^rrzn
с четная длина а», что противоречит усло-
вию. Рассмотренное разбиение вершин вы-
полним для каждой компоненты /1; Г2,...,Г„, v;
связности. На рис. 6.46 показано объедине-
ние независимых компонент Vkl и Vk2 в не- Рис. 6.46
зависимые компоненты F, =МКЛ1 и
k2
6.14.2. Паросочетания
.• Определение. Паросочетанием в двудольном графе
Г = ( У 1 < и V2, U, Ф) называется независимое подмножество ре-
бер л с U, ребра л не имеют общих вершин. s . _ ,
Для графа, изображенного на рис. 6.47, в качест- h —- •^£
— -2
ве паросочетания можно взять множество ребер *
з
n = {(si, I), (s2, 2)}, n = {(s3, 1), (s2, 2)} и т.п. РИС. 6.47
• Определение максимального паросочетания. Па-
росочетание называется максимальным, если любое другое
паросочетание содержит меньшее число ребер.
6.14.3. Алгоритм определения максимального
паросочетания
Пусть /= ( F| u V2
, U, Ф) — двудольный граф и п — произволь-
ное паросочетание. Множество вершин А^ с J^ и А2
с V2
(рис.
6.48). Чередующейся цепью относительно паросочетания я назы-
вается цепь С, в которой ребра пооче- к
редно принадлежат С/" и тс и которая на-
чинается ребром, не принадлежащим п.
Заметим, что ребра в цепи не повторя-
ются. Пусть al
e А — произвольная
вершина и MJ = (a{
, v2n
) — ребро, инци-
дентное вершинам из А^ и V2x
. Постро-
им чередующуюся цепь С= (щп^п^..
и„_1л:„_1«л) и допустим, что по такой
цепи можно достичь вершины а2 е А2. рис_ е.48
6.14. Двудольные графы 187
Такую цепь Сможно использовать для получения нового паросо-
четания я, которое содержит на одно ребро больше, чем исходное
паросочетание я. Действительно, в я можно включить все ребра я,
удалив rcj, тс2,..., лл_1 идобавив wb м2,..., ип_ь и„. Полученное таким
образом п содержит несмежные ребра, а значит, я — паросочета-
ние. Говорят, что я получено из я чередующимся расширением.
Пример. Дан двудольный граф Г= (Fj u V2, U, Ф), где Vl = {sb
s2,..., s6} и V2 = {1, 2,..., 6}. Соединение вершин V{ и К2 задано соот-
ношениями: st -> {4}, s:2 ->• {1, 6}, .УЗ -> {4, 5, 6}, j4 -> {1, 3), ss -> {2},
,у6 -> {1, 3}. Найти максимальное паросочетание.
Выберем начальное паросочетание я таким образом, что вер-
шину jj e F! соединяем с вершиной j & V2 первой незанятой ра-
нее из списка соединений для jj. На рис. 6.49 изображено исход-
ное паросочетание я = {(s{, 4), (s2, I), (s3, 5), (s4, 3), (ss, 2)}, |я| = 5.
Вершины s6 и 6 не вошли в паросочетание. По-
пытаемся увеличить я, используя алгоритм че-
редующихся цепей. Обозначим >переход по
ребрам графа из FJ в V2 и > переход по реб-
рам паросочетания я из F2 в FJ. Так, s6 Ц1,3}
означает, что из s6 можно перейти в вершины 1
и 3, и {1,3} >{s2,s4} означает, что из вершин 1 Рис 6 4д
и 3 можно достичь по ребрам паросочетания
вершин s2 и J4- По алгоритму исходной верши-
ной цепи является s6. Тогда множество всех чередующихся цепей,
начало которых в s6, можно представить: s6 »{1,3} >{s2,s^}
»{1Д6}. Переходы следует закончить, если вершина 6 достиг-
нута или подмножество вершин К2, доступных из s6, повторилось
в чередующейся цепи. В последнем случае вершина 6 не доступна
из s6 и, значит, исходное паросочетание л максимальное. В нашем
случае вершина 6 оказалась доступной. Для выделения исходной
чередующейся цепи из всего множества расширяющихся цепей
выполним обратный ход: 6 >s2 >1 >s6. Теперь новое па-
росочетание строим из старого, исключая из него ребро (s2, 1) и
включая ребра (6, s2), (I, s6). Процесс включения также показан на
рис. 6.49. Максимальное паросочетание содержит ребра (j1} 4),
(s3
, 5), (j4
, 3), (s5
, 2), (s2
, 6), (дб>
1) и |я| = 6.
188 Глава 6. Введение в теорию графов. Алгоритмы на графах
• Теорема 6.14.2 о максимальном паросочетании.
Пусть Г= ( Fj u V2, U, Ф) — двудольный граф. Тогда количест-
во ребер в максимальном паросочетании равно
(*)Л
Ь=" i
где ДЛ = {у е V2 Вх & F, л (х, у) е V) с V2.
Доказательство. Пусть л — максима-
льное паросочетание в исходном двудо-
льном графе (рис. 6.50). Паросочетание
я позволяет рассматривать его как ото-
бражение я: V2 > Vl вершин множест-
ва V2 в вершины множества V{ по ребрам
паросочетания я.
Аналогично, под Д будем понимать ото-
>У2 вершин МНОЖе- Рис. 6.50. максимальное
паросочетание л
бражение Д: V{
ства FJ в вершины множества V2
по
рам Uграфа. Вершины множеств <о и Z
(рис. 6.50) несмежные, так как паросочетание я является макси-
мальным.
Рассмотрим процесс насыщения множества ш. Под со ->дюл бу-
дем понимать последовательное выполнение двух отображений
7i(A(ra)) с K! множества со. Далее применим отображения Д и я к
полученному множеству: д
юл
^•д
(д
со7Г
)к
с ^ и т.д. Ясно, что
каждая пара отображений приводит к расширению исходного
множества д
сол
сД
(д
со11
)7t
. Учитывая конечные размеры исходного
графа, наступит момент, когда отображаемое множество переста-
нет расширяться. Таким образом, процесс насыщения отобража-
емого множества можно представить следующим образом:
Для множества А выполняется условие А = АА, в противном
случае множество А можно было бы еще расширить. Следствием
расширения множества Дсо в процессе его отображения является
включение Дсо с ДА
Обозначим множество со u A = В. Покажем, что найденное
множество В удовлетворяет условию (*) теоремы, т.е. я(/
т
) = |Fj| —
- (!•# | - |Д5 1). Имеем |д£ | = |Д(со и А) = |Дсо и Д<4)| = |ДЛ| , следова-
тельно, | Fj| - (|5 1 - |Д5 1) = | KJ - (|со | + И| - М|) = | ?i| - |со | = я(Г).
6.14. Двудольные графы 189
Покажем теперь, что /А с FJ условие (*) теоремы записывается в
следующем виде: п(Г) < У{ — (А — |ЛЛ|). Тогда ранее найденное
множество В, для которогоданное неравенство обращается в равен-
ство, будет доказательством условия (*) теоремы. Пусть
AI =А(к>г>А), тогда А = (ю глА) Uv4j. Отметим, что VAlc КД(ю rAi)
выполняется неравенство А^ < &Ai, так как вершины множества
F!(CQ n FJ) составляют паросочетание. Тогда верно, что
А = |со глА + А! < |<о | + А{ < |со | + |A/4j| < |со + |д/4| или А — АА < к>.
Теперь количество ребер в максимальном паросочетании можно
оценить: и(Г) = |Fj| — |со| < V^ — (А — |ДЛ|). Теорема доказана.
6.14.4. Системы различных представителей
Рассмотрим пять множеств: Sl = {2, 3}, S2 = {I, 2, 4}, 53 = {1, 2, 5},
,У4 = {3, 4, 5}, 1% = {3,4, 5}. Требуется выбрать такие различные чис-
ла^, х2, х3, Хц, х5, чтоXj e Sf, i = 1,2,..., 5. Дляданного примерах! = 2,
х2 = 1, х3 = 5, jc4 = 3, х5 = 4. Однако если взять множества 7} = {1, 2},
Т2 = {1, 2}, Гз = {1, 2}, Г4 = {3,4, 5}, Т5 = {3, 4, 5}, то такой выбор ока-
зывается невозможным.
Рассмотримданную задачу в общем случае. Пусть 5= {1, 2,..., и}.
M(S) — система подмножеств S{, S2,..., Sn множества S. Будем го-
ворить, что M(S) имеет систему различных представителей, если
для всех /' = 1, 2,..., п существуют различные xt
e St
.
6.14.5. Связь системы различных
представителей и двудольных графов
Определим двудольный граф
Г= (F! uF2
, С/, Ф), соответствующий системе
подмножеств. Пусть M(S) = {S{
, S2
,..., Sn
} — сис-
тема подмножеств S^ S2
,..., Sn
множества S. По-
ложим Si, S2
,..., Sn
вершинами V графа, которые
соединены ребрами со своими элементами —
смежными им вершинами из V2
(рис. 6.51).
Рис
-
6
-
51
• Лемма 6.14.1. Двудольный граф F=(Vl
jV2
, и,Ф), отвечаю-
щий системе подмножеств M(S) = (S^, S2
,..., Sn
}, имеет макси-
мальное паросочетание из п ребер тогда и только тогда, когда
M(S) имеет систему различных представителей. (Доказатель-
ство вытекает из определения построения двудольного графа,
отвечающего системе различных представителей).
190 Глава 6. Введение в теорию графов. Алгоритмы на графах
• Теорема 6.14.3 Ф. Холла о существовании системы различных
представителей. Система M(S) = {Sb S2,..., Sn} имеет систему
различных представителей тогда и только тогда, когда для лю-
бой подсистемы {.У, ,Sj ,...,Sj } с M(S)выполняется неравен-
k
ство (J Sj >k, т.е. количество элементов в объединении лю-
М
бых k подмножеств должно быть не менее k.
Доказательство. (=>) Необходимое условие теоремы следует из
определения системы различных представителей. Каждое под-
множество St е. M(S) содержит элемент х, е S{., отличный от
К
элементов других подмножеств, а значит
(<=) Пусть Г= (Fj u^2, U, Ф) —двудольный граф, соответству-
ющий системе подмножеств M(S) = {S, S2,..., Sn}. Покажем, что в
данном графе существует максимальное паросочетание, количе-
ство ребер в котором равно п. Тогда из леммы 6.14.1 будет следо-
вать достаточное условие теоремы. Из теоремы 6.14.2 имеем, что
число ребер в максимальном паросочетании равно л(/) = |Fj| —
-тах(|Л| -|ДЛ|), где М. = {у е V2  Зх е FJ л (х, у) е V} с F2. В рам-
ках принятой интерпретации A ={St
,Si2
,...,St
}, A = k и
k
АЛ = (J Si : .. По условию теоремы ЛА > k. Таким образом, VA с FJ
7=1
А - М ^ 0. а значит, n(r)=|K1
|-max(M-|A4)^|Ki|. Однако
< |Fi|, следовательно, п(Г) = V^ = л (достаточное условие до-
казано).
6.14.6. Задача о назначениях
Существует множество задач, постановки которых укладыва-
ются в рамки задачи о назначениях. Рассмотрим две такие поста-
новки.
Задача. Предположим, что вычислительная сеть объединяет п
специализированных ЭВМ. На вход сети поступают задачи. Изве-
стно, что наибольшая производительность конкретной ЭВМ сети
достигается на определенном классе задач. Это выражается коэф-
фициентом ay использования /-и ЭВМ при решенииу-го класса за-
6.14. Двудольные графы 191
дач. Найти оптимальное распределение задач по сети таким обра-
зом, чтобы эффективность ее использования была наибольшей.
Задача. Группа лиц может выполнить п видов работ. Эффек-
тивность использования /-го лица нау'-й работе определяется ме-
рой ценности Ду. Найти оптимальную расстановку людей по ви-
дам работ.
• Теорема 6.14.4 — алгоритм поиска оптимальной перестановки я.
Пусть А = [ау, i,j= ,n — матрица целых чисел. Тогда макси-
мум
X(
(6.14.1)
* /=i
по всем перестановкам я равен минимуму
mmHj>,+£v,| (6.14.2)
«i+'^ft ,tl )
по всем числам м, и v,- таким, что
ut
+ Vj>av>
V/,y=l7ii. (6.14.3)
Минимум суммы (6.14.2) достигается на перестановке я такой, что
Доказательство. Пусть я — произвольная перестановка. При
изменении / от 1 до л величины л, принимают все значения множе-
ства {1, 2,..., п}. По условию u, + v, > a,j, Vi,j= 1, п, а значит, и для
j = щ верно и, +у„ =а,-п
. . Установим связь сумм (6.14.1) и (6.14.2).
i=l y=l 1=1 ;=1 »=1 /=1
Таким образом, сумма (6. 14.1) для любой перестановки я не боль-
ше суммы (6.14.2). Отсюда следует, что теорема будет верна, если
мы найдем такие м, и v, и перестановку я, что (6.14.1) и (6.14.2)
совпадают.
Шаг 0. Поиск начальных и;
и v,, удовлетворяющих ограничени-
ям щ r + v,> ay, V/, j = 1, п. Положим v,- = 0 и ui
= max a^— максима-
льный элемент в /-и строке; условие (6.14.3) м, +Vj =maxOj, >o,y
выполняется. Для матрицы ценностей на рис. 6.52 справ4 и снизу
указаны начальные значения, соответственно м, и v,-.
192 Глава 6. Введение в теорию графов. Алгоритмы на графах
«I
«2
«3
«4
V]
3
1
6
6
0
V2
4
4
5
4
0
УЗ
2
3
2
5
0
V4
1
3
5
5
0
4
4
6
6
Рис. 6.52. Начальная матрица ценностей
Шаг 1. Фиксируем все v,-, j= l,n и уменьшаем значения м„
/ = 1,л до тех пор, пока одно из неравенств и, + v, > а,-, не обратится
в равенство », + v,- = и,-,. Эту процедуру выполняем для каждой
строки /= 1,л. В рассматриваемом примере на рис. 6.53 звездоч-
ками отмечены совпадения.
1/1
«2
«3
1/4
V]
*
*
0
V2
*
*
0
V3
0
V4
0
4
4
6
6
Рис. 6.53. Матрица совпадений
Шаг 2. Для каждого м„ /= 1,л определим множества совпаде-
ний
Если обратиться к примеру^го ^ = {2}, S2
= {2}, ^3
= Ш, ^4 = {!}•
Система множеств Sh
i= l,n может иметь систему различных
представителей: у е Slt
j2
e S2
,...,jn
e Sn
, где^, /2
,...,7Я
— все раз-"/" * Л
личные. Тогда на перестановке я = . ••• выполняется со-
72 ••• JnJ
отношение ы, +v_,- =м, +ул
=аь
. , а значит, найденная переста-
новка л является оптимальной.
Шаг3. Предположим, что S, S2
,..., Sn
не имеют системыразлич-
ных представителей, как в рассматриваемом примере. Тогда нару-
шается условие теоремы Ф. Холла, т. е. существуют
j u u
полагая
такие, что S^ uSi2
u...uSik
<k. В нашем примере
64! = 2 < 4. Перейдем к новым значениям м;
* и vj ,
и* =н,1
-1, м*2
=м/2
-1,..., M,*t
=ii/t
-1 и
vj =vy
+1, если индекс у E.S,-
6.14. Двудольные графы 193
Остальные и, и v, остаются без изменений. Обратимся кнашему при-
меру. На рис. 6.54 показаны новые значения переменных и* и v).
"1
_"2__^
И3
-J4
V]
3
1
6
6
0
1
V2
4
4
5
4
0
1
V3
2
3
2
5
0
0
V4
1
3
5
5
0
0
4 3
4 3
6 5
6 5
Рис. 6.54. Новые значения и' и и*-
«1
«2
«3
«4
VI
*
*
0
1
V2
*
*
0
1
V3
*
*
0
0
V4
*
*
*
0
0
4 3
4 3
6 5
6 5
Рис. 6.55. Матрица совпадений для новых значений и* и v'j
При такой saMeHejnepeMeHHbix не нарушается основное усло-
вие ut
+ Vj > Ojj, V/,7 = 1, и. Действительно, возможныдва случая:
l.jeS^ u Sj2
v...vSik
, тогда и* +v* =(щ -l) + (Vj +1)=ы, +v}
>av
.
2. j % Sj <uSi2
u...u Sj , а значит, v* =Vj и м, + v,- > e&
- или
и- + V> a+ 1. Отсюда и* +v* =(м, -l) +v^- >fly +1-1=Яу.Vj>
f ui1
,, =t <k, тогда новая сумма (6.14.2)Обозначим
Сумма уменьшилась на k — t. Если теперь перейти к шагу 2, то
в случае существования различных представителей для новых
значений и* иvj , задача будетрешена, в противном случае шаги 2
и 3 алгоритма продолжаем. Так как каждое повторение шагов ал-
горитма приводит к уменьшению суммы (6.14.2)
п п
^Uj '+ ^Vj на k — t единиц,
следовательно, процесс закончится, что доказывает теорему.
7—2697
194 Глава 6. Введение в теорию графов. Алгоритмы на графах
• Замечание. При решении практических задач изменение пере-
менных Uj и v,- на 1 может затянуть получение ответа. Заметим,
что алгоритм допускает изменение переменных м, и v, на лю-
бую величину, не_ нарушая при этом основного условия:
В рассматриваемом примере сумма уменьшилась на 2, так как
l^i u S2 u S3 u 5*4! = / = 2 и k = 4. Необходимо вернуться на шаг 2.
Матрица совпадений примет вид на рис. 6.54, 6.55. Составим для
нее систему множеств совпадений S{ = {2}, S2 = {2, 3,4}, S3 = {I, 4},
•5*4 = {1, 3,4}. Проверим наличие системы различных представите-
лей для данных множеств. Обращаясь к интерпретации системы
различных представителей в терминах двудольного графа, надо
проверить, что максимальное паросочетание равно 4 для графа
Г= ( У! uF2, U, Ф), где F, = №, S2, S3, SJ, F2 = {1, 2, 3, 4}, и связь
вершин S{ -> {2}, S2 -> {2, 3, 4}, S3 -> {1, 4}, S4 -> (1, 3, 4}. Решая,
можно установить, что существуют три таких паросочетания:
тг, = {(Si, 2), (S2, 3), (5з, 1), (£,, 4)},
я2 = {№, 2), (5-2, 3), (5з, 4), (£,, 1)},
я3 = {№, 2), (S2, 4), (£3, 1), №. 3)}.
Таким образом, существуют три оптимальных назначения:
'1 2 3 4^1 _(1 234} _(1 2 3 4Л
3 1 4/ ™2-[2 3 4 1/ "3
~U 4 1 3j"
Ценность назначения составляет aJ2
+ а23
+ «31
+ а
44
=
1^-
6.15. Хроматические графы
Пусть Г= (X, U, Ф) — простой граф. Граф /называется k-pac-
крашиваемым, если существует такое разложение множества его
вершин Хна k непересекающихся подмножеств (компонент) Сь
С2
,..., Ck
таких, что
X=JC,, С, пС7
=0 при/*./ (6.15.1)
и вершины в каждой компоненте С, независимы, т.е. ребра в /со-
единяют вершины только из разных компонент (рис. 6.56). Пред-
ставление (6.15.1) называется k-раскраской графа Г. Вершины
этого графа можно раскрасить k красками так, чтобы смежные
вершины всегда были окрашены в разные цвета. Для этого доста-
точно вершины каждой компоненты С, покрасить своей краской.
6.15. Хроматические графы 195
Наименьшее возможное число
£ = х(-0 компонент в разложении
(6.15.1) называется хроматическим чис-
лом графа Г.
Рассмотрим несколько примеров
хроматического разложения графов.
• Утверждение 15.1. Полный граф
Г= (X, U, Ф) на 1^1 = п вершинах
имеет хроматическое число хСО = n.
Здесь каждая компонента С,, /= ,п Рис 6 56
разложения (6.15.1) состоит из одной
вершины, |CJ = 1, /'= 1,л.
• Утверждение 15.2. Граф Г= (X, U, Ф) содержит максимальный
подграф (клику) из k вершин тогда и только когда, когда его
хроматическое число %(Г) равно k.
Доказательство. (=^>) Пусть {лс1; х2,..., xk} e А"вершины макси-
мального подграфа. Для разложения (6.15.1) максимального под-
графа требуется А: компонент Сь С2,..., Ckтаких, что х, е С,. Пока-
жем, что этого числа компонент достаточно для разложения
(6.15.1) всего графа Г. Пусть_у е X— произвольная вершина и
у £ {xi,x2,...,xk. Среди Xj, /= 1,А: существует такая вершинах,- е С,,
которая несмежна су, в противном случае существовал бы макси-
мальный подграф из k + 1 вершины. Вершину у включаем в ком-
поненту Cj. Следовательно, %(Г) = k.
(<=) Имеем х(Г) = k. Предположим, что максимальный под-
граф в /"содержит т вершин и т Ф k. Необходимое условие теоре-
мывэтомслучаеутверждает: хСО = т, чтопротиворечитусловию.
• Утверждение 15.3. Граф /= (X, U, Ф) является двудольным
тогда и только тогда, когда х(Г) = 2.
• Утверждение 15.4. Хроматическое число дерева равно 2, так
как дерево является двудольным графом.
• Теорема 6.15.1. Для числа р(Г) вершинной независимости и
хроматического числа %(Г) графа Г=(Х, U, Ф), Х = п выпол-
няется соотношение
р(Г)х(Г)>л. (6.15.2)
Доказательство. В разложении (6.15.1) все компоненты С,яв-
ляются независимыми. Из определения числа р(Г) следует, что
196 Глава 6. Введение в теорию графов. Алгоритмы на графах
|С,|< PC/
1
). Суммируя по всем компонентам, получим
Задача. Для графа Гна рис.
6.57 найти разложение (6.15.1)
и установить, что хроматиче-
,_. _ Рис. 6.57
ское число х(Г) = 3.
Задача. Пусть / — длина самой длинной простой цепи в графе
Г. Показать, что %(Г) < 1+ 1.
Решение. Предположим, что -)(_(Г)>1 + 2. Тогда утверждение
15.2 позволяет сделать заключение, что граф Гсодержит максима-
льный подграф (клику) из / + 2 вершин или более. Такой подграф
содержит простой цикл из / + 2 ребер и простую цепьдлиной / + 1.
Это противоречит условию задачи, так как любая простая цепь
графа не может превосходить длины /. Отсюда следует, что
6.16. Диаметр, радиус и центры графа
I. Пусть Г= (X, U, Ф) — конечный связный псевдограф. Обо-
значим через d(x, у) длину минимального маршрута между вер-
шинами х, у e X. Величина d(F) = maxd(x,y) называется диамет-
ром графа.
П. Пусть х е X — произвольная вершина графа. Величина
r(x) =maxd(x,y) называется максимальным удалением в графе Г
"
от вершины х.
III. Радиусом графа Г называется величина г(Г) =minr(x).
хеХ
ТУ. Любая вершина z е X, для которой r(z) = г(Г), называется
центром графа.
Задача. Для графа Гна рис. 6.58 най-
ти диаметр, радиус и все центры.
Решение. Диаметр d(f) =max.d(x,y) =
= 3. !•(*!>= 3, Г ( Х 2
) = 2, f ( * 3
) = 3,
г(*4
) = 2, г(х5
) = 3, ге(*6
) = 2. Следовате-
льно, радиус графа г(Г) =min/-(x) = 2.
"
Центры графа: х2
, х4)
х6
.
Введение в теорию групп.
Приложения
7.1. Определение группы
• Определение. Группой называется непустое множество G с би-
нарной алгебраической операцией • (будем называть умноже-
нием) такой, что выполняются следующие аксиомы:
1. Va,b &G3c &Gа-b =с — замкнутость относительно операции •.
2. fa,b,c eC a-(b-c)=(a-b)-c — ассоциативность операции •.
3. 3le<=G/aeG e-a=a-e=a — существование единичного эле-
мента е.
4. VfleCrBla"
1
&G а-а~
1
=а~
1
-а=е — существование обратного
элемента а .
• Определение. Группа называется коммутативной, если выпол-
няется аксиома коммутативности:
5. Va,b &G a-b =b-а— коммутативность операции •.
Примеры групп
1. GI = {п | п е 2} — группа с операцией сложения чисел, где Z —
множество целых чисел. Действительно, 0 — единица группы;
я"
1
= (-«) — обратный элемент к л е Gv
2. GI = {In | п е Z} — группа с операцией сложения чисел.
3. G3
= {2
я
| л е Z}— группа с операцией умножения чисел.
4. <74
— множество квадратных матриц порядка я, определитель
которых не равен нулю, является группой с операцией умно-
жения матриц.
5. С5
— множество ортогональных матриц порядка п является
группой с операцией умножения матриц.
6. G6
= {1, —1} — группа с операцией умножения чисел.
7. G7
— множество рациональных чисел является группой отно-
сительно операций сложения и умножения (без нуля).
8. G8 — множество вещественных чисел является группой отно-
сительно операций сложения и умножения (без нуля).
198 Глава 7. Введение в теорию групп. Приложения
9. G<) = Sm
— множество подстановок (перестановок) является
группой с операцией умножения подстановок (симметриче-
ская группа Sm
, см. п.7.6).
• Определение. Hc,G называется подгруппой группы G, если
Н— группа относительно бинарной операции, определенной
в G, т.е. для элементов //выполняются аксиомы 1—4. Так, на-
пример, являются подгруппами: G2
с Glt
G5
с G4
, G7
с G8
.
• Утверждение 7.1.1. Пусть М — подмножество группы G и
Va,b е М выполняется ab~l
е М. Показать, что М — подгруп-
па. Данное условие можно рассматривать как характеристиче-
ское свойство группы.
Доказательство. Проверим выполнение аксиом группы.
1. Существование единичного элемента. Пусть а е М, тогда
аа~
1
е М или е е М.
2. Существование обратного элемента. Пусть а е М и так как
е е М, то е • а~1
е М или а~ е М.
3. Замкнутость. Пусть a, b е М, тогда и b~l
е М. Значит, и
а • (b~l
)~l
е М или ab е М.
7.2. Гомоморфизм групп
• Определение. Гомоморфизмом группы Gl в G2 называется ото-
бражение /:GI -» G2, сохраняющее операции: /a,b sG{
f(a °b) =/(«) •/(£), где о — операция в группе GI, • — операция
в группе G2. Если/— взаимно однозначное отображение, то/
называется изоморфизмом.
Свойства гомоморфизма
Свойство 1. Единичный элемент переходит в единичный. Пусть
е е С^ — единица G{, тогда/^) = е2 е G2 — единица G2. Действи-
тельно, VoeG./a) =.AaM<?i) =MM<0, так какДа) =
и АО) =Мо) =М)Ля). В группе Эе2 е (?2 Да) =
Значит, А£[) = ^2-
Свойство 2. Обратный элемент переходит в обратный. Пусть
а е GI, тогда Да"1
) = (Да))"1
. Действительно,Да)Да""1
) =Дй"1
)Да) =
= <?2, так как Д^Ло"1
) =Доо"1
) =Де,) = Да^а) =Да~1
)Ло), где
М) = е2. В группе 3!(Да)ГГ
б С2 Дя)^^)-1
= <№)'№) = е2. Сле-
довательно, Да ') = (Да)) !
.
7.3. Смежные классы _ 199
• Определение. Образомгомоморфизма/называетсяподмножество
Im/= {а2
e G2
 За, е Gt
а2
=/(а,)} с G2
.
• Определение. Ядром гомоморфизма/называется подмножество
Кег/= {GI е G! |/(0l
) = е2 6
G2
} с С?!.
• Утверждение 7.2.1. Im/c G2
— подгруппа.
Доказательство. Проверим все свойства (аксиомы) группы.
1. Замкнутость. Va2
,b2
е Im/ 3flj,ii е Gj /(а^ = а2
A/(&J) = £2.
Тогда а2
Ь2
=/(fli)/(*i) =/(«^1) е Im/
2. Существование единичного элемента. Так как е2
=f(e{) е Im/
3. Существование обратного элемента. V«2
е Im/ 3aj e Gj
/(fll
) = «2
. Тогда и «21
=(/(«! ))-!
^/(flf1
) elm/.
• Утверждение 7.2.2. Кег/с Gt
— подгруппа.
Доказательство. Проверим все свойства (аксиомы) группы.
1. Замкнутость. Vflj,^ е Кег/ /(a^j) =f(a^)f(b^ = e2
e2
= е2
. Сле-
довательно, fljij е Кег/
2. Существование единичного элемента. Так как/Xej) = е2
, значит,
el
е Кег/
3. Существование обратного элемента.
Vfll£ Кег/ /(or1
) =(/(ai))"1
^e^1
=е2
7.3. Смежные классы
• Определение. Пусть Н= {е, h, H2,..., /Jm_i} — подгруппа группы
G. Множество gH= {ge, ghb gh2,..., gAm_i}, полученное умноже-
нием элементов Н слева на элемент g e G, называется левым
смежным классом группы G по подгруппе Н.
• Лемма 7.3.1. Пусть Я — подгруппа группы G, тогда V/z е Н
hH=H.
Доказательство. Пусть Н- {е, Нъ Н2,..., hm_l]. Vhk е Н hhk е Н
- замкнутость подгруппы, значит ЛЯ с Я. С другой стороны,
УЛА е Н hk = ehk = (hh~l
)hk = h(h~l
hk) е ЛЯ, откуда Яс ЛЯ. Таким
образом, УЛ е Я ЛЯ= Я.
• Лемма 7.3.2. Пусть Я — подгруппа группы G. Если
0, то£i#=ft-ff,гдеgb
g2
e G.
200 _ Глава 7. Введение в теорию групп. Приложения
Доказательство. Пусть Ге gl
Hr>g2
H, тогда ЭА1;
И2
е Я такие,
что t = gj/j) = g2
fi2. Рассмотрим левый смежный класс Ш= (gihl
)H=
= №)#= g^H) = й(А2
Я), откудаД
Я=&
Я.
• Лемма 7.3.3. Пусть Я — подгруппа группы G, тогда V# e G
Доказательство. Для доказательства достаточно показать, что
все элементы в gff различные. Пусть 3Ai * А2
е Я такие, что
ghi = gh2
. Тогда g l
(gh{
) =g I
(gh2
) или (g"V)^i = (gl
g)h2
, откуда
A! = A2
> что противоречит предположению.
• Лемма 7.3.4. Группа G распадается на непересекающиеся ле-
вые смежные классы по подгруппе Я, т.е. G = gHv g2
Hu...
и &Я, где все&, #2
,..., gs
— различные; #,Яn gfl= 0, если ft # ft.
Доказательство. Пусть <?={£* ,#Л
,.••>#£ }• Ясно, что
G=gk
H<ugk
H^j...(jgk
H. Воспользов'авшись лелшом 7. 3.,2и уда-
лив совпадающие левые смежные классы из последнего разложе-
ния, получим искомое разложение группы
• Теорема 7.3.1 Лагранжа. Порядок конечной группы G кратен
порядкулюбой из ее подгрупп Яи G  = |Я| • G : Я|, где G : Н
— целое число, называется индексом подгруппы Яв группе G.
Доказательство. Лемма 7.3.4 позволяет записать разложение
группы G = g1Hvg2Hv...ugsH, где gfHrg:H=0 при ft*ft. Из
леммы /.З.Зимеем Vft gjH  = Н, тогда G = glHvg2H<u...vgsH =
= SH + g2H + ... + |&Я| = s • Н. Следовательно, G  = |Я| • G : H,
Определение. Пусть G — группа. Порядком элемента g e G
(g -Ф e) называется наименьшее целое k такое, что gk
= e.
Утверждение 7.3. L Пусть G — группа и g e G — произвольный
элемент порядка k. Тогда множество Я= {g, #,..., g = e} назы-
вается циклической подгруппой, a g есть образующий ее эле-
мент.
Утверждение 7.3.2. Порядок группы | G  кратен порядку любо-
го элемента^ e G. (Следствие теоремы 7. 3.1Лагранжа и утвер-
ждения 7.3.1).
Утверждение 7.3.3. Всякая циклическая группа коммутативна
(абелева).
Теорема 7.3.2. Всякая подгруппа циклической группы сама яв-
ляется циклической.
7.3. Смежные классы 201
Доказательство. Пусть G — циклическая группа с образую-
щим элементом £ е G и Яс G — подгруппа. Предположим, что
наименьшая положительная степень элемента g, содержащаяся в
Н, есть g
k
. Покажем, что элемент g
k
— образующий элемент под-
группы Н. Допустим, что в Ясодержится элемент^
7
, где /* О и /не
делится на k. Пусть d = (I, k)— наибольший общийделитель, тогда
существуюттакие целые числа и и v, что k • и + I • v = d(см. п. 8.1).
Следовательно, подгруппа Яв этом случае должна содержать эле-
мент g
d
= (g*)"(gV = &
h
'. Так как d < k, то приходим к противоре-
чию относительно выбора элемента g
k
. Таким образом, g
k
— обра-
зующий элемент подгруппы Яс (Я
• Утверждение 7.3.4. Число образующих циклической группы
G={g,g
2
,...,g" = e} равно значению функции Эйлера ф(«) — ко-
личество чисел из множества {1,2.,..., п—1} взаимно простых с п.
Доказательство. Пусть г е {1,2,..., п—1} и (г, п) = 1 — НОД (см.
п.8.1), т.е. run — взаимно простые. Если предположить, что на-
ступит (g
r
)
k
= f
k
- едля некоторого k<n,ior-k = n- /для некото-
рого t, таккакп — порядокэлементаg. Из г • k= п • tследует, чтоп
делит k, так как (г, и) = 1. Это противоречит предположению
k < п. Следовательно, порядок элемента £ = п.
Пусть теперь (г, п) = s и s > 1, т.е. /•= s • р и п = s • q, где
(р, q) = 1. Тогда (/)" = (/У = Я*
4
= tf
9
? = G?Y = # = е, а значит
порядок элемента | /1 = q < п. Действительно, порядок | /1 не ме-
ньше q, в противном случае имеем (jf)
9
= (/)* = е, где k < q, и
r-k = n-t, так как п — порядок элемента#. Как и в первом случае,
из/••&=«• f, s-p-k = s-q-t,p-k=q-t следует, что q делит k,
т.к. (р, q) - 1. Это противоречит предположению k < q.
• Определение. Подгруппа Я группы G называется нормальным
делителем, если правые смежные классы совпадают с левыми:
Vg е G gH= Hg.
• Утверждение 7.3.5. Множество смежных классов группы G по
нормальному делителю Яявляется группой с операцией умно-
жения смежных классов. Такая группа называется фактор-
группой и обозначается G/H. Элементами этой группы являют-
ся смежные классы разложения группы G = gl
H<ug2
Hи...
u gs
ffna непересекающиеся левые смежные классы, т.е. G/H=
= {g{
H, g2
H,..., gs
H}.
202 _ Глава 7. Введение в теорию групп. Приложения
Доказательство. Проверим выполнение аксиом группы.
1. Замкнутость. У^Д&Яе G/H Sl
H- g2
H=gl
(Hg2
)H=gi(g2
H)H=
= £1й(ЯЯ) = (gig-^ff 6 G/H. Произведение двух классов — это
умножение каждого с каждым элементов указанных классов.
2. Существование единичного элемента. Так как (eH)(gH) =
= (gH)(eH) = (eg)H=gH, то еН= Н— единица факторгруппы G/H.
3. Существование обратного элемента. Так как (gH)(g~l
H) =
= (g"l
H)(gH) = (&ОЯ= Н, то g~l
H е G/Я— обратный элемент
к элементу gH е G/H.
• Теорема 7.3.3. Для любого нормального делителя Н группы G
отображение
/:<?-» G/H, где VgzG /(g) = gH,
является гомоморфизмом, ядро которого Н, G/H— фактор-
группа.
Доказательство. Проверим свойство гомоморфизма сохране-
ния операций: /(^ -g2
)=(gi -giW =(gl
H)°(g-i
H)=f(gl
)° f(g2
).
Единицей факторгруппы G/Hявляется Н, тогда
Кег/= {£е(?|/(£) = Я}.
Имеем VA s Я/(Л) = АЯ= Я, откуда Яс Кег/ С другой стороны,
Vg g Я /(g) = #Я* Я. В противном случае, если gH= H, то суще-
ствует такое Л е Я, что gh = e или g=h~ e Я, что противоречит
предположению g g Я. Таким образом, только Яс Кег/ а зна-
чит, Кег/= Я.
• Теорема 7.3.4. Ядро произвольного гомоморфизма есть норма-
льный делитель.
Доказательство. Пусть/: G -> AT, где G, AT— группы,/— гомо-
морфизм. Кег/= {Л e G|/(/J) = е еф. Обозначим Я= Кег/—
подгруппа. Покажем, что V£ e G gH= Eg, т.е. Я— нормальныйде-
литель.
Рассмотрим множество S= {g e G f(g) = k eЩ, где k — фиксиро-
ванный элемент. Покажем, что S-gH, где geS — произвольный
фиксированный элемент. Пусть gr еб1
, тогда f (gg~l
) =
=f(Sii ) f ( g ~ = kk~ = e и /СГд) =/Gf Ы = = e. Отсюда
еЯ ng ^еЯ или g^Hg и ^е^Я Таким образом, S^gHn
egeS.C другой стороны, УЛ &Нf(gh) =f(g)f(ti) =f(g)e = fc.
Отсюда gh <=Sили ^Яс S. Так же проверяется, что и Hg^S.
Получили, что gH= S= Hg, т.е. Я— нормальный делитель.
7.4. Строение коммутативных (абелевых) групп __ 203
7.4. Строение коммутативных (абелевых)
групп
• Определение. Группа С
1
является прямым произведением своих
подгрупп Gi и G2, т.е. G = G{ x G2, если выполнены следующие
условия:
1. Пересечение подгрупп Gj n G2 = e.
2. Любой элемент g е G однозначно представим в виде произ-
ведения элементов g = gig2... gk, где g, &С^ G2.
3. Если^ eGj Hgr2 &G2, то g^g^ =g^g^. Коммутативность
указанных элементов позволяет записать представление
в Bnaeg=gg , rae eG и
gi2 е(72. Лемма 7.4.1 утверждает, что это представление од-
нозначное.
• Лемма 7.4.1. Пусть G — группа и Glt G2 — ее подгруппы, для
которых пересечение Gi n G2 = е. Тогда, если g^g2 =g'lg'2, то
gl =g Hg2 =g;>> где ^,^1 eGj и^2,^2 еС?2.
Доказательство. Действительно, если g^g2 =g[g'2> то^"
1
^^ =
=£21
S>
2 =e
< T
-K
- GlrG2 = e. Следовательно, gl
=g и g2
=g'2
.
• Теорема 7.4.1. Группа Gявляется прямым произведением сво-
их подгрупп GI и G2
тогда и только тогда, когда выполняются
условия:
1. Пересечение подгрупп GI г G2
= е.
2. Любой элементу е G однозначно представим в виде произ-
ведения элементов g = gift— &. где g, e Gl
u G2
.
3. Подгруппы G! и G2
являются нормальными делителями.
Доказательство. (=>) Очевидно, что если группа G является
прямым произведением своих подгрупп GI и G2
, то условия 1—3
выполняются.
(<=) Достаточно показать, что если gj e G
1
! и g2
e G2
, то gjg2
=
= g2g!. Имеем g!g2
e g^G2
и g!G2
= G^, тогда gt
g2
e G^, откуда
gig2 =8281- Также gjg2
e G{
g2
и Gl
g2
= g2
Gl
, тогда gjg2
e g2
G
!
1
и,
значит, gjg2 =g2gj. Итак, g{g2 =g'2gi =g2g[, а так как GI n G2 = e,
то из леммы 7.4.1 следует, что g2
=g2
и gj =gl
. Следовательно,
SS2 = 8281-
204 _ Глава 7. Введение в теорию групп. Приложения
• Утверждение 7.4. 1. Пусть G — конечная абелева группа поряд-
ка С = р"
1
р%
2
•••P^
k
>
f
R
s
Pi,P2>--->Pk ~~ простые различные чис-
ла. Множество А(р) = {х е G  |х| =ра
}, где а принимает произ-
вольные целые значения, является подгруппой и называется
примарной подгруппой группы G, соответствующей простому
числу р.
• Теорема 7.4.2. Всякая конечная абелева группа G разлагается
в прямое произведение своих примарных подгрупп A(p^,
А(рг
),..., A(pk
), где G = р^р^ ...pa
k
k
.
Доказательство — индукция по числу простых в разложении
порядка G = р*1
р2
2
•••/>£* • Очевидно, что для G  =ра
справедли-
во, т.к. в этом случаеА(р) = G. Пусть теперь G=pa
g^, где (p,q) = 1.
Покажем, что G представимо в виде G = А(р) х A(q). Проверим
свойства разложения.
1. А(р) rA(q) = е. Если предположить, что Зх е А(р) х A(q) и
х * е, то | jc | =ра
и | х  = (р, тогда и ра
= <р, что противоречит усло-
вию (р, q) = 1.
2. Покажем, что любой элемент х е G можно представить в
виде х = у • z, где у е А(р), z е A(q). Поскольку порядок | х  делит
| С^тоИ^'^.гдеА., <аД2 <р.Таккак(рХ 1
,#Х 2
)=1— взаимно
простые, то существует представление р*"1
-m+q^1
-n =1 (см. п.8.1
алгоритм Евклида), где т, п — целые. Тогда хр
' 'т+9 2
" =х
х = у • z, где^ =xq 2
'" и z =хр
' 'т
, для которых ур
' =[ хр lq г
] =е
и z?
"2
=1 хр
'g 2
J = е . Проверить, если у^ = е, то порядок | у  де-
лит N. Отсюда у е А(р) и г е A(q).
Пусть разложение верно для l<k, т.е. для |Сг|= р^р^1
•••?"'•
РассмотримгруппупорядкаG =р"'р%2
...р^k
,тогдавозможнопря-
мое разложение G=-A(pl, p2,..., Pk-i)*A(pk), теА(рь р2,..., р^) =
= {х е G | х=р^ру
2
2
---Р^ }, у, ^ «,, — это доказывается как и для
случая |(7| =pa
q^. Имеем: группа A(pk
) — примарная, группа А(р{
,
Ръ~~> Pk-i) по
предположению индукции разлагается в прямое про-
изведение своих примарных подгрупп; теорема доказана.
7.4. Строение коммутативных (абелевых) групп 205
• Утверждение 7.4.2. Порядок конечной примарной группы
(подгруппы) А(р) = {х  х  = р
а
} равен | А(р)  =р", где п — неко-
торое положительное целое; а принимает произвольные це-
лые значения.
Доказательство. Рассмотрим следующее разложение примар-
ной группы. Пусть А1 ={а,а
2
,...,а
р
=е}сА(р) — циклическая
подгруппа максимального порядка A{=p
ai
. По теореме Лагран-
жа (см. теорему 7.3.1) А(р) = А{ • А(р)/А^, где А(р)/Аг = {х^А,
х2А,..., xkA} — факторгруппа по подгруппе А±. Ясно, что
/XjA е A(p)/Ai (XjA)
p
* =е и, значит, В(р) = А(р)/А{ — примарная
группа, которая вновь допускает разложение на смежные классы
по циклической подгруппе А2 с В(р) максимального порядка, т.е.
А(р) = А) • А2 • В(р)/А2, тлеА2=р
а2
. Исходная примарная груп-
па А(р) конечного порядка и, следовательно, за конечное число т
шагов получим разложение А(р) = А • А2 •...• Ат, или | А(р) =
• Лемма 7.4.2. Пусть А(р) — примарная группа (подгруппа),
А с А(р) — циклическая подгруппа максимального порядка
| А  -р" с образующим элементом а, А(р)/А — факторгруппа,
у е А(р)/А — класс смежности порядка | у  =р
а
, т.е. у
р
" = ё =А,
тогда существует элемент у е у того же порядка | у  =р
а
.
Доказательство. Так как у
р
" =А, то для любого у е у выполня-
ется у
р
" е А, где А — единица факторгруппы А(р)/А. Следователь-
но, у
рЛ
=а
с
-a
Cl
'
p
, где (сь
р) = 1 и р < п. Положим г =я
с
' —обра-
зующий элемент группы А, тогда у
р
" = z
p
и I У
Р
] =( z
p
)
= z
p
" =e или у
р
^ =е. Так как z — образующий элемент А, то
^а+л-р _ дордцок j Вследствие максимального порядка подгруп-
пы | А  =р", порядок | у  <р". Отсюда р
а+
"'
?
<р" или а < р. Теперь
И fl / 6-IX Ра
равенство у
р
" = z
p
можно записать в виде у
р
-z
p
=Z
P
j ,a
таккак^^^^ " еД то^
р
" =г[°или (уг~
1
)
р
* =е. Таким образом,
элемент у± =yz~l
е у, порядок которого | yl
 =ра
.
206 _ Глава 7. Введение в теорию групп. Приложения
• Теорема 7.4.3. Всякая конечная примарная группа (подгруппа)
разложима в прямое произведение своих циклических под-
групп. ЕсянА(р) = {х е G  х  =/} яА(р) =/, тоДр) =С(/' )х
)х. . .хС(рХт
), где С(рк
' ) — циклическая подгруппа поряд-
ка < ) =Р
, Xj < Х2
< ... < Хм
и ^ + Хз + ... +*„=*.
Доказательство — индукция по числу л. Для п = 1 теорема вер-
на, т.к. (показать) группаЛ(р) порядка А =р, тер — простое, яв-
ляется циклической и не содержит подгрупп. Предположим, что те-
орема верна для всех групп меньшего порядка /Л Пусть ^4 с Л(р) —
циклическая подгруппа максимального порядка А =ра
. Рассмот-
рим факторгруппу А(р)/А = (х^А, х^А,..., х/А}. Данная группа являет-
ся примарной порядка | А(р)/А  <р", т.к. | А(р)  =  А  -  А(р)/А .
Предположение индукции позволяет записать для нее разложение
A(p)/A = C(pai
)xC(pa
*)x...xC(pa
"). Обозначим через г, zC(p"' :
)
образующие циклических подгрупп. Лемма 7.4.2 утверждает, что
существует у, е ^,- и | yt
 =  £,• | и можно положить г, = уА. Из пря-
мого разложения факторгруппы следует, что любой класс смеж-
ности х е А(р)/А можно представить в виде х = z'l
l
zt
2
1
---^ , или
х =y'iy'£ ...у'^А, где 0 </,<а,. ТаккакА(р) =х{
А ^jx-^A u...ux^, то
произвольный элемент х е А(р) представим как х =у[1
У22
•••У'^а
' •
Таким образом, искомое прямое разложение на циклические
подгруппы найдено.
Покажем, что представление А(р) = С(р^1
)хС(рХ2
)х...хС(рХт
)
единственно. Доказательство единственности — индукция по
числу п. Для п = 1 имеем А(р) = С(р) — свойство выполняется.
Пусть оно верно для всех k < п. Покажем, что верно и для групп
порядка р". Предположим существование другого разложения
группы А(р) =С(/' )х С(/2
)х...х C(pftl
), где р! < р2 < ... < р, . Ясно,
ЧТО ПОрЯДОК A(p) = p
Ki
-р
Кг
:..-р
Кт
=/J
Pl
-p^
2
-...-J
p
P
' =p
n
.
Запишем разложение группы в уточненном виде
)хС(р)хС(р)х...хС(р) и
т-?]
2
)хС(р)хСр>)х.-хСО>).
7.5. Строение некоммутативных групп 207
Рассмотрим группу (подгруппу) [А(р)]р
= {х?
 х е А(р)}. Для
этой группы справедливы разложения:
~ l
) и (*)
-
1
), (**)
x2
* ,...,x"a
=e}.
Порядок | [A(p)]p
| < | A(p) | и, следовательно, по предположе-
нию индукции разложения (*) и (**) совпадают, т.е. 11 = рь
/2 = Р2,."Л, =Р(2, h = t2, а значит, nm-tl = l-t2 или т = /. Единст-
венность разложения доказана.
Пример. Пусть G — коммутативная группа порядка | G  = 42.
Так как 42 = 2 • 3 • 7, то группа разложима в произведение следу-
ющих своих циклических подгрупп G= С(2) х С(3) х С(7).
Пример. Пусть G— коммутативная группа порядка | G  = 4. Так
как 4 = 22
, то группа разложима в произведение следующих своих
циклических подгрупп G = С(4) или G = С(2) х С(2) и в явном
виде G = {х, х2
, х3
, х4
= е} — циклическая или G = {х, у, ху, в] =
= {х,х
2
= е}х {у, у
2
= е}.
7.5. Строение некоммутативных групп
• Определение. Пусть G — конечная группа. Подгруппа HcG
называется ^-подгруппой, если порядок ее Н =р
а
.
• Определение. /7-подгруппа называется силовской, если порядок
ее р
а
имеет максимальную степень в разложении порядка
групп G.
• Теоремы 7,5.1 (Силова). Пусть G — конечная группа порядка
G = P^Pi
г
•••p
a
k
k
, тер, — простые числа.
1. Для каждого pf существует силовская подгруппа группы G.
2. Всякая /ьподгруппа группы G содержится в некоторой си-
ловской подгруппе.
3. Все силовские подгруппы сопряжены, т.е. если Н, Р—сп-
ловские подгруппы, то существует такое t е G, что Н= tPt
1
.
4. Количество силовских/ьподгрупправнор • k+l, где А;—не-
которое целое.
Пример. Пусть G — группа порядка G  = 28 = 2
2
• 7
1
, тогда су-
ществуют силовские подгруппы Щ,  Н^  = 4 и Н2,  Н г  = 1.
имеем
208 Глава 7. Введение в теорию групп. Приложения
7.6. Симметрическая группа подстановок
Пусть S — конечное множество из т элементов. Множество
всех взаимно однозначных отображений множества S на себя на-
зывается симметрической группой Sm степени т. Без ограничения
общности можно считать, что множество S состоит из элементов
{1, 2,..., /т?}. Каждое такое отображение л : 5
1
-» S называется под-
f 1 1 Л
становкой или перестановкой и записывается л = "'
т
 где
V
я
! Л
2 •-•я
т/
я, = я(/) — образ элемента / = 1,/я. Произведением подстановок яв-
ляется композиция отображений (операция группы) (лст)(/) = ст(я(/)).
Например, для подстановок л = ~ ; :
1
: ] и а = , 5 ' 7
:
э
-> *• *J ^
l
э
яа =( J ? ~ ] истл=( ~ ~ ?). Данный пример показывает, что сим-
ч-
5 А
^/ v^ J
v
метрическая группа Sm не является абелевой (некоммутативная)
при т > 3. Порядокданной группы Щ = т — количество всех пе-
рестановок из т элементов. Единичная (тождественная) подста-
( 9 т
новка обозначается е = | f " ' > которая удовлетворяет Уя е ^т
^ 1 9 ^яе = ея = я. Обратной к я= i ... т ЯВЛяется подстановка
Hi "2 ••• KmJ
I Я| Лт ... Я„. | -1 -1
л = / • "' I для которой верно, что ля = я я = е.
U 2
•••
w
/
• Утверждение 7.6.1. Симметрическая группа ^ степени 2 —
абелева.
• Определение. Подстановка я, перемещающая элементы гь
/2
,---,
/^так, что л(/!) = /2
, л(/2
) = /з,...,я(/л
) = /i и оставляющая на месте
остальные элементы, называется циклом длины А: и обознача-
ется (/ь
/2,..., /J.
• Равносильное определение. Подстановка называется цикличе-
ской, если каждый из ее действительно перемещаемых элемен-
тов г'ь
/2,..., 4 можно перевести в любой другой (из действительно
перемещаемых элементов), если подстановку применить доста-
точное число раз. Например, л(/1
) = /2
, л
2
^) = я(л(/!)) = я(/2
) = /3
,
rc^Oi) = '*>—, я
*('1) = 'i- Теперь цикл можно записать: (/ь
/2
,...,
7.6. Симметрическая группа подстановок 209
Пример. I ~ j 4 5 6 7 3 )=
^' ^' ^4>
^' ^' ^ ~~цикл
A™1
™ семь.
• Определение. Два цикла называются независимыми, если они
не содержат общих действительно перемещаемых элементов.
Например, (1, 2, 3, 5, 9) и (7, 8) — независимые циклы.
• Теорема 7.6.1. Каждую нетождественную подстановку Sm
мож-
но разложить единственным образом в произведение незави-
симых циклов.
Доказательство. Пусть я е Sm
и i,j e S. Элементы /иу назовем
эквивалентными i~j, еслиу' = л*(/) для некоторого целого числа k.
Введенное отношение есть отношение эквивалентности на мно-
жестве S. Оно разбивает множество ^на непересекающиеся клас-
сы эквивалентности по этому отношению S= Sl
^j S2
u...u Sr
.
Каждый элемент / e 51
принадлежит одному и только одному клас-
су S,, причем множество S, состоит из образов элемента / при дей-
ствии степеней подстановки л: S, = {/,л(/),л2
(/),....я*'"1
(/')}, где k,—
количество элементов в St
. Множества .У,еще называют л-орбита-
ми. Выберем в каждом классе S, по одному представителю /, и по-
ставим ему в соответствие цикл я, ={/,,тг(/,),тг2
(/,),...,nk
'~l
(i,)}.
Так как любой элемент, не принадлежащий S,, остается на месте
при действии степеней к,, то перестановка л есть произведение
независимыхцикловл=л^.-.л,..
• Замечание 1. Если цикл л, = (/',) имеет длину 1, то он действует
как тождественная подстановка. Такие циклы в записи
л = Л1Л2...лл можно опускать.
• Замечание 2. Независимые циклы в записи л = л1л2...ллможно
произвольным образом переставлять между собой. Так,
л =лА .1 Л^...л^,где{лА 1 ЛА 2 ...лА г }={л1 ,л2 ) ...,лг }.
Пример.^ 2 3 4 5 £)= (1345)(2)(6)41345),
3 2 1 5 4
Определение. Декрементом (d) подстановки называется раз-
ность между числом действительно перемещаемых элементов
и числом независимых циклов, на которые она раскладывает-
ся. Подстановка называется четной, если d — четное число и
подстановка нечетная, если d — нечетное. Введем функцию
210 Глава 7. Введение в теорию групп. Приложения
+1, если я - четная подстановка,
sgn(rc) =<
[-1, если л -нечетная подстановка,
где я е Sm, тогда sgn(rc) = (~l)
d
.
Например, для подстановкиI i ? т 5 4 6 ] = (132)(45)декремент
равен d= 5 - 2 = 3, следовательно, подстановка нечетная.
• Определение. Цикл длины 2 называется транспозицией
т = (ар). Для транспозиции декремент d = 2- 1 = 1 — нечетное
число.
• Теорема 7. 6.2. При умножении подстановки л е 5^ на транспо-
зицию т = (ар) она меняет свою четность.
Доказательство. Пусть л = (/1/2.../г)(Д/2-"Л)---(^2---'Р — разло-
жение подстановки в произведение независимых циклов. Умно-
жим ее на транспозицию т = (ар). Рассмотрим все возможные
случаи:
1. a ё л, р ё л.
2. а е л, Р g тг.
3. а g л, р е л.
4. а е л, р е л, а и р принадлежат одному и тому же циклу.
5. а Е л, р е л, а и р принадлежат разным циклам.
Пусть k — число действительно перемещаемых элементов л; / —
число независимых циклов в разложении л. Декремент подста-
новки d(n) = k- I.
1. Пусть а 0 л, р $. тг, тогда лт = (/^../^(/^...^...(^^.../^(ар). Дек-
ремент </(пт) = (£ + 2) - (/+ 1) = £- /+ 1.
2. Пусть а е л, р g я. Будем считать, что iv
= а. В этом случае
лт= (а/2
.../г
)(/у2
...л)...(/1
/2
...д(ар) = (а/2
.../^)(/У2
-Л)-(^2-У-
Декремент </(ят) = (&+!) - / = & - / + ! .
3. Случай a g л, р е л рассматривается подобно а е я, р г л.
4. Пусть а е л , Р е л , а и р принадлежат одному и тому же циклу.
Тогда лт = (а/2
.../от
р/ш+2
.../г
)(/'1
/2
..:
/;)...(/1
/2
...//
,)(ар) =
Декремент й?(лт) =k-(l +!) = &-/-!.
5. Пусть а е я , р е я , а и р принадлежат разным циклам. Тогда
лт = (a/2
.../r
)(py2
...^)...(/1
/2
.../;
,)(ap) = (а/г.../^...;;)...^.../,).
Декремент й?(лт) = &-(/- !) = &-/+!.
7.6. Симметрическая группа подстановок 211
Таким образом, во всех случаях з§п(ят) = (-1)*~
/±!
=
= (-1)
±L
(-!)*"'=-sgn(u) четность подстановки лт меняется.
• Теорема 7.6.3. Каждая подстановка я е Sm
разлагается в произ-
ведение транспозиций не единственным образом, однако чет-
ность числа транспозиций постоянна и совпадает с четностью
самой подстановки.
Доказательство. п = (/i/2—V)(/i/2—Л)—(/i(2—^) ~ разложение под-
становкив произведение независимыхциклов. Каждыйцикл разла-
гается в произведение транспозиций (/Y/2-••'/•) = ('i^X'i's)—('ifs)- Та-
ким способом можно разложить в произведение транспозиций все
циклы подстановки я = т1
т2
...т„, где т., — транспозиции. Теорема
7.6.2 позволяет записать sgn(Ti) = 8§п(т1
т2
...тл
) =
=sgn(t1
T2
...Vl
)-(-l)=sgn(T1
T2
...Tn
_2
)-(-l)(-l)^
Таким образом, четность подстановки sgn(n) - (-1)" совпадает
с четностью числа транспозиций п в разложении л = т^...-c,,.
• Следствие 1. sgn(crr) = sgn(cr)-sgn(T), ст, т — произвольные под-
становки.
Доказательство. Пусть u = sl
s2
...sr
и т = Цг
..Л}
— разложения
в произведение транспозицийsf
, tj. Тогда от =j^-.Vilz—'/~~ Р
аз
~
ложение в произведение транспозиций. Из теоремы sgn(crr) =
= (-1/
+/
= (-1)
Г
Н)'= sgn(a)-sgn(T).
• Следствие 2. sgn(a~
l
) = sgn(<r), ст"
1
— обратная подстановка.
Доказательство. Пусть a= sl
s2
...sn
тогда и"
1
= sr
..s2
Si, так как
стст"
1
= ^...^Х^..^^) = (Si(s2
(...(sr
sr
)...)s2
)si
) = en(SiS,) = е —тож-
дественная подстановка, где st
— транспозиции. Первое следст-
вие позволяет записать sgn(acf') = sgn(cj)-sgn(cr"
1
). С другой сто-
роны, ста'
1
= е — тождественная подстановка и sgn(e) = 1. Тогда
sgn(a)-sgn(cj~
1
) = 1 и, следовательно, sgn(cf
L
) = sgn(a).
• Теорема 7.6.4. Число четных подстановок Ат
с Sm
равно числу
нечетных.
Доказательство. Достаточно показать, что Ат
 = т/2, так как
Sm
 = ml. Для этого установим взаимно однозначное соответствие
между четными и нечетными подстановками.
Пусть т — произвольная фиксированная транспозиция. Рас-
смотрим отображение ср : Sm
-» Sm
, где Уп&5т
ф(я) =ят. Пусть
а е Ат
— произвольная четная подстановка, тогда cp(a) = at — не-
четная подстановка.
212 _ Глава 7. Введение в теорию групп. Приложения
Свойство 1. Для ф верно, что V^ * а2
& Ат
cp(aj) Ф у(а2
), в про-
тивном случае ар = а2
-с. Отсюда, умножая справа последнее ра-
венство на т, получим а^тт) = а2
(тт), а так как тт = е, то а± = а2
, что
противоречит выбору а{
Ф аг
.
Свойство 2. Для любой нечетной подстановки b существует
прообраз £т е Ат
четной подстановки, так как ф(йт) = (6т)т =
= *>(тт) = и.
Свойства 1, 2 позволяют утверждать, что отображение ф явля-
ется взаимно однозначным.
• Утверждение 7,6,2, Ат
— подгруппа симметрической группы Sm
.
• Теорема 7.6,5 Кэли. Всякая конечная группа G порядка т изо-
морфна некоторой подгруппе симметрической группы Sm
.
Доказательство. Для любого элемента а е G рассмотрим ото-
бражение La
: G -> G, состоящее в умножении всех элементов
G={gi, &>>•••= gm
}
сл
ева на а: £0(&) = agf. Свойство группы aG= G
позволяет утверждать, что La
— взаимно однозначное отображе-
ние (подстановка). Обратным к La
будет отображение Z,"
1
-L „, ,
единичным отображением является Le
. Вследствие ассоциатив-
ности умножения в группе G имеем замкнутость: (La
Lb
)(g) =
= Lb
(La
(g)} = b(ag) = (ab)g = Lab
(g), т.е. La
Lb
= Lab
. Отсюда следует,
что множество Н ={Lgi
,Lg2
,...,Lgm
}образует подгруппув множе-
стве всех взаимно однозначных отображений GB себя, т.е. в сим-
метрической группе ,5^. Тогда отображение ф : G -> Не Sm
такое,
что Va e Gy(a) = La
есть изоморфизм, поскольку ф — взаимно од-
нозначное и выполняется свойство ф(а£) = Lab = LaLb = ф(а)ф(й)
сохранения операций.
7.7. Действие групп на множестве
• Определение. Говорят, что задано действие группы Она множе-
стве S= (1, 2,..., т}, если определен гомоморфизм Ггруппы G
в симметрическую группу Sm
подстановок: Т : G -» Sm
. Свойст-
во сохранения операций для гомоморфизма: V^, g2
е G
u
e
1 2 ... m"
(  о Л
Далее полагаем, что g, = '" m

Ч
а
1
a
2 •••
a
m )
7.7. Действие групп на множестве 213
• Замечание. Чаще всего бывает так, что действие Сна *Увозни-
кает естественным образом, как группа симметрии структуры,
определенной на S.
Пример. Пусть S = {1, 2, 3, 4, 5} — вершины графа
на рис. 7.1. Найти G — группу самосовмещений дан-
ного графа.
Решение. Исходное множество элементов ^являет-
ся связанным или структурой. Группа G, действую-
щая на S, — группа самосовмещений: G = {e, a, b, ab),
где
е
11 9  4 S — тождественное преобразование;
а
={ ?  11 = (
45
> - поворот Таблица 7.1
Д 2 3 5 4
ab
вокруг горизонтальной оси;
ab
'=
(l 3 2 4 }"^~~ поворот
юкруг вертикальной оси;
<*Ь =(}    Г) =(23)(45) - поворот
ab
ab
ab
1 3 2 5 ~
М
~
вокруг горизонтальной оси и вертикальной. В табл. 7.1 содержат-
ся все возможные произведения элементов рассматриваемой
группы. Из табл. 7.1 видно, что G — коммутативная группа и
G={e, а}*{е, Ъ].
• Определение. Элементы sl5
s2
e S называются g-эквивалентны-
ми и записывают sl
~ s2
, если 3g e G, который, действуя на
множестве S, переводит Si в s2
, т.е. g =
S{
'"
т
или
^«1 а
2 •••
S
2 •••
a
mj
более короткая запись этого gsl
= s2
.
• Утверждение 7.7.1. Определенная g-эквивалентностъ на мно-
жестве S является отношением эквивалентности.
Доказательство. Проверим свойства отношения эквивалент-
ности.
1. Vsj e S si ~ s2
.
Действительно, es^ = s^, где e e G — единичный элемент.
2, V5j, S2 G О 5j ~ S2 —> ^2 ^1-
Имеем Sj ~ ^2, тогда 3g s G gSi = s2
ns2
= g~l
s{
, а значит, s2
~ s^
j. VtSi j S^y S^ £ tJ iS1
]^ ^т A iSS "^ -Уз —^ S *^з>
214 _ Глава 7. Введение в теорию групп. Приложения
Имеем, что 3t, g e G ts^ = s2
л gs2
= s$, откуда (tg)sl
= g(tsi) =
= gs2
= s3
. Следовательно, s{
~ s3
.
• Утверждение 7. 7.2. Группа G={gi,g2
,..., g^} , действуя на мно-
жестве S, порождает его разбиение на непересекающиеся под-
множества — классы эквивалентности (рис. 7.2):
, где Vsl
,s2
eSa
Э# e (?
NG
— количество классов эквивалентности.
Рис. 7.2
Пусть л1
! eSa
, тогда класс эквивалентности
Sa
составят все различные элементы множества Sa
=
Определение. Множество Z(jj) = {g e G  gs{
= sb
s^ e S} называ-
ется стабилизатором sl
e S. Элементы стабилизатора оставля-
ют jj на месте.
Пример. Продолжим рассмотрение примера на рис. 7.1.
'= {1, 2, 3, 4, 5} — вершины графа на рис. 7.3. На б1
действует
группа самосовмещений G= {e, a, b, ab}, где
' 1 2 3 4 5 "
2 3 4 5/ ~l 2 3 5 4
! 2 3 45"i д А = ( 1 2 3 4 5
3 2 4 5
aft
" 3 2 5 4
Найдем все классы эквивалентности.
Sl= Ml), в(1), 6(1), eft(l)} = {1, 1, 1, 1} = {!},
S2= (e(2), a(2), b(2), ab(2)} = {2, 2, 3, 3} = {2, 3},
S3= M4), a(4), 6(4), ab(4)} = {4, 5, 4, 5} = {4, 5}.
S = Sl uS2 и^з— всего три класса эквивалентности.
Определим стабилизаторы для вершин графа{1, 2, 3, 4, 5} .
Z(l) = (е, а, Ъ, ab}, Д2) = ДЗ) = {е, а}, Д4) = Д5) = {е, 6}.
• Утверждение 7. 7.3. Z(s^) с G — подгруппа группы G.
Доказательство. Проверим свойства группы.
1. Замкнутость. V&, g2 e Z(^t) g^ = st, g^ = sl} тогда и fag^ =
= gi(SiSi) = fe^i = •*!> следовательно, ^2 e Z^j).
2. Единичный элемент e & Z^j), так как ejj = jj.
3. Обратный элемент. Пусть g e Z(j1), тогда ^! = sl, откуда
jj =g ^i, следовательно, g~l
e Z^).
7.7. Действие групп на множестве _
• Утверждение 7.7.4. Vsj, s2
e Sa
Z(si) = Z(s2
) n3t&G Z(sl
) =
= tZ(s2)f
l
— в этом случае говорят, что подгруппы Z(sl), Z(s2)
сопряжены.
Доказательство. Имеем sl, s2 e Sa, следовательно, 3teG
tsl = s2. Vg e Z(s2) (tg)s{ = g(tsi) = gs2 = s2 = ts^ или (te)^ = ts{. Отсю-
да (#ГVi = r
l
(tg)si = t~
l
(tsi) = (ff'Vi = si, т.е. tgr
1
e ад. Полу-
чили, что Vg e Z(s2) tgt e Z(jj). Заметим, что Vg, *£2
6
Д
5
2)
(git'
1
* tg2t~ значит, |Z(52)| = tZ(s2)r
l
 < Z(Sl) или Z(s2) < Z(si).
Подобным образом доказывается в обратную сторону:
Z(s2) ^ |Д^1)|, следовательно, Z(si) = Z(s2). Показали, что 3/ &G
/g e Z(s2) tgt~
l
e Z(si) и |Z(jt)l = 1Д^)1 = tZ(s2)t~ отсюда
"
• Утверждение 7.7.5.  Sa= ' ' , где ^ e ^a-
l^(*i)l
Доказательство. Пусть G = {gv, g2,..., gk]. Из утверждения 7.7.2
следует, что Sa= {giSi, g^b--, g^}, однако среди выписанных эле-
ментов множества Sa могут встречаться одинаковые. Назовем
gj ,gi2 e G эквивалентными gj ~ gi2, если они действуют на эле-
мент jj одинаковым образом, т.е. gt s{ =gl г jj . Данное отношение
является отношением эквивалентности. Введенная эквивалент-
ность разбивает группу G на классы, количество которых равно
числу различных элементов среди выписанных Sa
= {gis{
, g2
Si,...,
&s,b т.е. равно |,У0
|.
Пусть g^s^g^Si (ftj-ftj) или fe1
^2
1
)*i=?r2
1
fe1
^i) =
=^,
r
2
1
fe^i) = fe2
^
:
2
1
)5i =•*!. следовательно, д^,/ eZ(5j) или
^(i
eZ^j^j. Верно и обратное, если g^ eZCSj)^, то
й^^
1
eZ^^^nfe^,-
1
^! =*!- Отсюда^,^! =g,2
sl
wuig^-g^.
Таким образом, gj ~ gt2
тогда и только тогда, когда gt
, gj2
лежат в
одном правом классе смежности по стабилизатору Z(jj)
(gj e Z(sj )gt2
), а значит, и число элементов в i
1
,,; равно количест-
ву правых смежных классов в (7по подгруппе Z^j). Согласно тео-
реме 7.3.1 Лагранжа,  Sa= -^— ЦG : Z(sl )| .
216 Глава 7. Введение в теорию групп. Приложения
• Лемма 7.7.1 Бернсайда. Число классов Sa эквивалентности, на
которые распадается множество S = Sl <uS2^j...uSNc под дей-
1
ствиемгруппы G, равноNG = г—- /JvC?)!, wej/(g) = {.ye.S'l.g^S'}.
Доказательство. Подсчитаем двумя различными способами
множество всех таких пар элементов, что V# е G Vs е S
{(s>
s
) S
s
= s}. Это можно выполнить следующим образом:
Nq
Первая сумма ]T|Z(.y)| = ]T ]£|Z(,y)|. Так как Vsl,s2eSa
seS i^seSf
, то ^Z(S)=Sa.Z(sa)^-^—Z(Sa)=G, где
seSa ^(
S
a)
S(l eSa. Таким образом, £|Z(j)|= ^Z(s) = G=NG-G.
s^S i=lstS,
Получили, что Л^с -|G|= ^1vfe)l. откуда
'=1
Пример. Продолжим рассмотрение примера на рис. 7.3. S = {1,
2, 3, 4, 5} — вершины графа. На 5
1
действует группа самосовмеще-
ний G={e, a, b, ab}, гдее=[| 2 М 2),
fl
=[i о ч < llV X л О т" JJ L ** Э J ./
2 3 45")
3 2 5 4/
Полным перебором установили, что под действием Gмножест-
во 5распадается на три класса эквивалентности: S = Sl
uS2
uS3
,
где Sj ={!}, ^2 ={2,3}, S3
={4,5}. Установим данный факт, приме-
j
няялемму 7.7.1 Бернсайда: NG
=—- У|у(^)| — число классов экви-
валентности.
Ч/(*)=фб,У |ег = *} = {!, 2, 3, 4, 5},
{je J|os = j} = {l, 2,3},
7.8. Цикловой индекс группы ___ 217
Отсюда следует, что число классов эквивалентности
ArG=-l(|vl/(e)HM,(a)H4/(6)|+|vl/(flft)|) =1(5+3+3+1) =3.
Замечание. Рассмотрению более содержательных задач, при
решении которых возможно применение изложенной выше тех-
ники подсчета классов эквивалентности, предварим изложение
теории перечисления Пойа. Это позволит нам с более формаль-
ных позиций подойти к пониманию самой техники подсчета и к
применению ее для решения задач.
7.8. Цикловой индекс группы
Пусть группа G действует на множестве S= {1, 2,..., т} и
Т : G ->• Sm — гомоморфизм в симметрическую группу Sm. Рас-
смотрим разложение g e G на независимые циклы
где ki — количество циклов длины 1;
k2 — количество циклов длины 2;
km
— количество циклов длины т.
Набор (kb
k2
,..., km
) называется характеристикой элемента
g & G, где 1- fcj + 2 • k2 + ... + т • km - т.
• Определение. Цикловым индексом Z(G,Xl
, x2
,..., xm
) группы G,
действующей на множестве S, называется полином от пере-
менных Xi, х2
,..., хт
, определяемый формулой
где (ki, k2
,..., km
) — характеристика элемента g &G.
Пример. Продолжим рассмотрение примера на рис. 7.3. S = {1,
2, 3, 4, 5} — вершины графа. На £действует группа самосовмеще-
ний G=(c, а, Ъ, аЬ], где,=(} 2 3 4 5 ^ e=
Q 2 3 4 5 ^
2 3 5 4
12 3 4 5
l 3 2 4 5
( 2 3 4 5" тт -
, аЪ = | t ~ 5 4г"
аидем
Цикловой индекс группы
G, для этого выполним разложение на независимые циклы под-
становок элементов G и установим их характеристики:
218 Глава 7. Введение в теорию групп. Приложения
е= (1)(2)(3)(4)(5), (k{k2...km) = (5, О, О, О, О);
а = (1)(2)(3)(45), (k^.-.kj = (3, 1, О, О, О);
Ъ = (1)(23)(4)(5), (k,k2...km) = (3, 1, О, О, О);
аЬ= (1)(23)(45), (Аг^...**) = (1, 2, О, О, О).
l f v
5
Y ° V
0
V ° Y
0
-1- v
3
Y
1
V
0
V
0
V ° - l - V
3
V
1
V
0
V
0
r
0
J.
~' +
2
7.9. Теория перечисления Пойа
Введем следующие обозначения.
D= {db d2,..., dm} — конечное множество.
G= (Sb 821 ftj--} — конечная группа, действующая на D.
R = {гь г2, г3,...} — конечное множество качественных признаков
(цвета).
S= (ff: D ->/?} — множество функций; каждая функция/опре-
деляет качественные признаки элементов D.
Q = {coj, a>2, й>з>"-} — множество весов.
о : R —> Q — весовая функция, назначает веса о(г) е Q признакам
reR.
Дю) = 2]<о(г) — сумма весов элементов г <=R или
, где Сш
— число элементов г <=R с весом ш е Q,
множество { Сю
} — перечень J? относительно весовой функции
ш(г).
Рассмотрим введенные понятия на следующем примере, к ко-
торому ниже не раз будем возвращаться.
Пусть D= {c?i, d2
, с?3
} — вершины правиль-
ного треугольника (рис. 7.4). Треугольник
нанизан на вертикальную ось, вокруг кото-
рой он свободно вращается. /? ={», °} — мно-
жество из двух красок. Найти количество
различных раскрасок вершин треугольни-
Рис. 7.4 ка
7.9. Теория перечисления Пойа 219
На D действует группа самосовмещений G= {e, а, а
2
}, где
тождественное совмещение, а =   — поворот во-
^z з .)
круг оси на 120°, а
1
=( | ? |) — поворот на 240°.
Q = {х, у, х~
1
, у"
1
и их произведения}— множество весов.
S = ff'- D -> R} — множество раскрасок. В треугольнике три вер-
шины и каждую допускается окрашивать в любой из двух цветов
R- = {•> °К следовательно, всего функций 2
3
. Такое количество рас-
красок будет, если треугольник сделать неподвижным (рис. 7.4).
Если допустить вращение, то различные раскраски неподвижно-
го треугольника становятся одинаковыми для вращающегося
треугольника. Приведем пример трех раскрасок: f,fi,fi-
Очевидно, что для решаемой задачи раскраски^ и/3
совпада-
ют.
Назначим краскам R ={•, о} веса: со(») -х и ю(°) =у.
• Замечание. Отметим, что назначенные веса элементов со(») =х
и са(о) =у позволяют сравнивать признаки количественно, за-
бывая, в какой— то степени, о качественном их содержании.
• Определение. Для каждой функции feS определим вес
В нашем примере W(fl
) = со(»)со(»)ш(о) =хху =х у,
Определение. Группа G, действуя на D, индуцирует (наводит,
создает, определяет) свое действие на множество функций S.
Положим У/еб
1
V g e G gf=f(g(d))— это рассматривается
220 _ Глава 7. Введение в теорию групп. Приложения
В нашем примере рассмотрим действие элемента а е G на
/2
е S.
/ ( «
2
( ) ) = / ( ^ ) = ° и /) = °,
Таким образом, элемент группы а переводит/ в/3 или, в при-
нятых обозначениях, a
2
f2 =/.
• Определение. Положим/ ~f2, если 3g &G/d eD f(gd) =f2(d).
Такие /i и /2 определяют одинаковые раскраски элементов
s Введенная эквивалентность функций есть от-
ношение эквивалентности, которое порождает
разбиение множества элементов/е .Уна непере-
секающиеся классы эквивалентности (рис. 7.5):
г ч_
Рис. 7.5
И V/
i
е
^«
V
/2 e£p VgeGgft *f2,Sa ^5p, NG -
количество классов эквивалентности. Каждый
класс эквивалентности определяет отдельную рас-
краску элементов d e D. Таким образом, количество различных
раскрасок равно NG
. Для определения NG
воспользуемся леммой
7.7.1 Бернсайда: NG
= -~^i(g), в данном случае
{/e Sgf=fwmf(gd) =Л$ Vrf e D}.
Вернемся к нашему примеру на рис. 7.4 и найдем для него чис-
ло NG
. у(е) = {/e S ef=f] удовлетворяют все/е S, откуда |vj/(e)| =
= 2
3
= 8. у(а) = { f e S  af=f} — это такие раскраски/вершин, ко-
торые допускают совмещение с эквивалентной из раскрасок вра-
щением треугольника на 120°. Это возможно, если все вершины
либо белые, либо черные. Итак, |vj/(a)| = 2. Подобным образом
устанавливается, что и |у(я
2
)| = 2. Следовательно,
• Утверждение 7.9.1. Если/! ~f2
, то Wlf^ = W(fl), т.е. эквива-
лентные функции имеют одинаковые веса.
Доказательство. D = {аъ
d2
, d3
,...} и D - (gdb
gd2
, gd^,...} — вер-
но Vg e G, так как G действует на D и g = j ,
2
,
3
'" — это
7.9. Теория перечисления Пойа __ 221
подстановка. Теперь W(f{} = J7o)(/1(uf)) = J^oX/j (#</)). Имеем
deD dsD
fi ~/2, тогда 3g e G VdeD a>(fi(grf)) = ю(/2(^). Отсюда
Определение. Последнее утверждение позволяет определить
вес каждого класса эквивалентности 5, в разложении S - Sl и
<uS2 и. . .vSNc , как W(Sj ) = W(f), где / e St . Определение кор-
ректно, так как каждый класс St состоит из эквивалентных
функций/ веса которых совпадают.
Теорема 7.9.1 Пойа. ]£Сш • ш = Z(G,R(<s>
1
),R(&
2
),...,R(a
m
)), где
Сю— число классов эквивалентности S = Sl u S2 v. . -^>SN(! с ве-
сом о e Q, Z(G,x ' ,х2
2
,...,х^
т
) — цикловой индекс группы G,
действующей на множестве D={d^, d2>..., dm}. Отметим, что
гаеП
Доказательство. Пусть «А»— разбиение множества D на непе-
ресекающиеся подмножества:
2l
+D22+
...+
D2k2+
...+
Dml
+Dm2
+...+Dmkm
,
где |Dy| = /, D| = m, 1 • k{
+ 2 • k2
+ ... + т • km
= m.
• Определение. Говорят, что/е ^подчинена разбиению «Д» мно-
жества D и записывают/е Д, если/постоянна на каждом под-
множестве Dy из разбиения: yd e Dv
f(d) = гф
где Гу e R.
Функция/, подчиненная разбиению «Д», взаимно однозначно
определяется набором (ги
г12
...гщ
r2l
r22
...г2
^...rml
rm2
...rmkm
), где
r
'J
&R
- ~^~ ~^Г ~£Г
Все такие наборы составляют множество:
_
где Sy - R, i = l,m, j = l,kt
. Полагая веса элементов Sy e Sy равны-
ми юЦ) = [4)(riJ
)]'nBQCs = (sll
sl2
...slki
S2l
s22
...s2k2
...sml
sm2
...smkm
) 6 S
2 2 2 Г л а в а 7 . Введение в теорию групп. Приложения
равным произведению весов <o(s)
имеем o(s) = W(f), где/s А подчинена разбиению.
Для множества .У выполнены все условия правила обобщенно-
го произведения, тогда сумма весов элементов данного множест-
ва, а значит, и сумма весов всех функций/е А составит
' т
W(Sy) = Ц[Щ5у )]*', вследствие W(Stti ) = W(SiJ2).
W(Sjj)= ^ d(s) = ^][ш(г)]' =R((a'). Следовательно,
s eS;i rsR
или
АД
Пусть g eC и g = (P1)(p2)...((3,i XP;I )((3,2)... ;..(РЛРЛ...Р7т)
^~ ~*7~ ~~%T
разложение на независимые циклы, где (k^, k2,..., km) — характе-
ристика^и 1 • ki +2 • k2 + ... +т • km =т.Запишемразложениена
независимые циклы в виде
g = (Dn)(Dl2)...(Dlki )(D2l)(D22)...(D2k2 )...(Dm,)(Dm2)...(Dmkm 
^ *2
km
где Dy — цикл длины /', |iy = /.
Обозначим разбиение множества D на Dy через Ag. Элементы
d e Dy одного цикла при умножении на g переходят последовате-
льно по циклу в элементы того же цикла. Указанное свойство по-
зволяет заключить, что Vdb
d2
e Dy 3k ^d{
= d2
.
Пример. Пусть g = (12345)(678), тогда g
2
= (13524)(687).
• Определение. Функция f&S называется неподвижной относи-
тельно g &G, если /d e D f(gd) =f(d).
• Утверждение 7.9.2. Функция /eS неподвижна относительно
g e G тогда и только тогда, когда/e Ag подчинена разбиению
А?.
Доказательство. (=>) Пусть db d2 e Dy — принадлежат одному
циклу. Следовательно, 3kg
k
d1 = d2. Тогда f(d2) =f(g
k
dl) =
~Х)=/(/~Х)=•••=/(М)=f(
d
i) > где каждый переход
7.10. Цикловая структура групп подстановок _ 223
обусловлен неподвижностью/: /d sD f(gd) =f(d). Таким обра-
зом, Vrflf d2 e Dtj /(4) =/(rf2), т.е. /e Ag.
(<=) Пусть d eDy , тогда и gd eDy — свойство циклов. Имеем
/e Д? или Vtfj, d2 e Dy f(d{) =f(d2), следовательно, nf(gd) =f(d),
тогда /есть неподвижная относительно # e G.
Запишем сумму весов/ подчиненных разбиению Ag, в следую-
щем виде £ W(f) = £a^,ra 'm
'
где й
лг,о> ~ количество функций,
/eAg fflsQ
подчиненных разбиению Дд, с весом ш eQ.
Составим множество всех функций, неподвижных относите-
льно^ e G, с весом ш eQ : ^(g) = (f fd &Df(gd) =f(d) /W(J) = со}.
Утверждение 7.9.2 позволяет записать а^ - 1^(^)1. Величина
Сю — число классов эквивалентности с весом to eQ, на которые
распадается множество функций S -Sl u ^2 u...UA?^ под дейст-
вием группы G. По лемме Бернсайда, Сш = — ^|ч/га(^)| =
I^UeG
= - — Г^ЯА?Ш - Умножив последнее равенство на со и просуммиро-

G
g*G
вав по всем весам из Q, получим, что ^Сш -к> = -— -
шеП
Сумма 2^йд?0)
-со= ^^(/) — сумма весов функций, подчи-
ненных разбиению &g.
Так как W(f)=[R(^)]
ki
[R((a
2
)]^ ..{R(<*
m
)]
km
, то
7.10. Цикловая структура групп
подстановок
Рассмотрим несколько общих примеров, которые в какой-то
степени дают представление о возможностях изложенной выше
техники подсчета классов эквивалентности с использованием те-
ории перечисления Пойа.
224 __ Глава 7. Введение в теорию групп. Приложения
7.10.1. Цикловой индекс группы, действующей
на себе
Пусть группа G действует на множестве S= G следующим об-
разом: Vg е G /s е S g(s) = gs. Если порядок элемента | g | = d, то все
элементы#5, j?s, g3
s,...,/s = sразличны. Группа Gраспадается под
действием g на циклы одинаковой длины. Количество циклов
равно n/d, где n = G — порядок группы. Цикловой индекс груп-
пы примет вид
f, (7.10.1)
где y(d) — количество элементов g е G с порядком | g | = d. Сумми-
рование выполняется по всем делителям d числа п.
7.10.2. Цикловой индекс циклической группы
Пусть S= {О, 1,..., л-1} — множество вершин правильного
л-угольника (рис. 7.6) на плоскости. Группа G — циклическая
группа самосовмещений. Образующий элемент
группы а е G — вращение (отображение) S вокруг
центра на угол 2п/п. Следовательно, G = {а" = е, а,
а2
,..., а"~1
}, где е — тождественная подстановка.
Если обозначить вершины многоугольника {0, 1,...,
«-!} элементами группы {а" = е, а, а
2
,..., а"~
1
}, то
вращение будет эквивалентно умножению верши-
ны на соответствующий элемент группы. Напри-
мер, совмещение при вращений на угол 2п/п рав-
носильно умножению новых меток {а" = е, а, а
2
,...,
о"'
1
} вершин n-угольника на элемент а, действите-
льно, а • е -> а, а • а -» а
2
,..., а • а"'
1
-> а". Таким
образом, можно считать, что циклическая группа G
действует на себе. Согласно (7.10.1) цикловой индекс данной
группы примет вид
' (
7
-
10
-
2
)
d/n d/n
где y(d) = ф (d) — функция Эйлера. Действительно, если порядок
элемента равен d (элемент суммируется в j(d)), то он является об-
разующим элементом подгруппы Яс G порядка Н = d. Пока-
зать, что если порядки элементов циклической группы совпадают
7.10. Цикловая структура групп подстановок _ 225
ak
| = ат
 = d, то они являются образующими одной и той же под-
группы Не G. Число образующих в такой подгруппе y(d).
Найдем количество возможных раскрасок NG
двумя цветами
вершин данного (рис. 7.6) «-угольника. Пусть цвета — ./? ={•,<>}.
Воспользуемся теоремой 7.9. 1 Пойа. Для определения количества
раскрасок положим веса цветов равными Ц») =1 и о>(°) =1 Тогда
d/n
Для треугольника (п = 3) число раскрасок равно
Для шестиугольника число раскрасок равно
NG
=^^d)2n
'd
= 1ф
(1)23
+Ф
(2)23
+Ф
(3)22
+
=i(l-26
+1.23
+2-22
+2.21
)=14.
о
7.10.3. Цикловой индекс симметрической
группы
Пусть S= {1, 2,..., п} — произвольное множество, на котором
действует группа всех подстановок Sn — симметрическая группа,
Sn = п. Рассмотрим произвольную подстановку п s SH с характе-
ристикой (&!, k2,..., kn), где Iki + 2k2 + ... + nkn = п. Подсчитаем ко-
личество подстановок с данной характеристикой. Для этого запи-
шем в цикловом представлении, помещая знаки «—» на местах,
которые должны занять п элементов. Так, для характеристики
(3,2) следует записать (—)(—)(—)( -- )(—). Далее пробелы можно
заполнять п элементами множества S в любом порядке. Это дает
и! подстановок с характеристикой (klt k2,..., kn), которые, однако,
не все различные. Каждый из циклов kr может начинаться с любо-
го своего элемента, не изменяя исходной подстановки и умень-
шая общее число различных подстановок в г раз. Если имеется kr
таких циклов, то их можно переставлять k). способами, что также
не будет приводить к новым подстановкам. Все эти варианты суть
8—2697
226 _ Глава 7. Введение в теорию групп. Приложения
различные обозначения одной и тойже подстановки с характери-
стикой (ki, k2,..., &„). Поэтому различных подстановок с указан-
fil
ной характеристикой будет - '- - . Тогда цикло-
£1!-l*1
£2!-2*2
.../t/I!-«*"
вой индекс симметрической группы можно записать в следую-
щем виде: Z(G, хъ х2,..., х„) =
_
v
Рассмотрим пример определения числа NG раскрасок двумя
цветами/? ={•, о}трехусов S= (1,2, 3} антенны (рис. 7.7). Усы сво-
бодно вращаются в пространстве. Е этом случае на множестве
•У={1, 2, 3} действует симметрическая группа подстановок S3.
Найдем все характеристики (klt k2, k3) разложения числа
3 = 1&! + 2k2 + З&з- Ими будут: (3,0,0), (1,1,0) и (0,0,1). Цикловой
индекс примет вид
2, 3? Z(G, Xi, Х2, Х3
) =
V 1 Ы*'Г*2'
Рис. 7.7 3!(,,U 1!1!ПД2; 1M
Для определения количества раскрасок положим веса цветов рав-
ными со(») =1и (о(°) =1, тогда Дш*) =ш*(•)+со*(°) =2. Следователь-
но,
з =
'
— Глава 8 =====
Элементы теории чисел
I еория чисел занимается изучением свойств целых чисел.
Целыми называются числа Z= {..., -3, -2, -1, О, 1, 2, 3,...}.
Для любых a,b e Zсумма а + Ь, разность а - Ъ и произведение
а • Ъ являются целыми числами. Но частное - от деления а на Ъ
Ъ
(если Ъ не равно нулю) может быть как целым, так и не целым. В
случае, когда частное —является целым, то обозначают а = bq, где
Ъ
q — целое число, а Ъ тогда называют делителем числа а и записы-
вают так: Ьа. В общем случае единственным является представ-
ление a = bq + г, 0 <r<b где г — называют остатком от деления.
8.1. Наибольший общий делитель
В дальнейшем будем рассматривать лишь положительные де-
лители чисел. Всякое целое, делящее одновременно целые а,Ь,...,
с, называется их общим делителем. Наибольший из общих делите-
лей называется наибольшим общим делителем (НОД) и обозначает-
ся (а, Ь,..., с). Если (а, Ь,..., с) = 1, то а, Ь,..., с называются взаимно
простыми. Например, (10, 15) = 5, (8, 21) = 1.
Свойства наибольшего общего делителя
1. Если а = bq, то (а, Ь) = Ь.
2. Если a = bq + r, тогда общие делители чисел а и Ь суть те же, что
и общие делители чисел Ь и г, в частности, (а, Ь) = (Ь, г).
3. Для определения наибольшего общего делителя применяется
алгоритм Евклида. Он состоит в нижеследующем. Пусть а и Ь —
положительные целые числа и а > Ь. Составим ряд равенств:
a = bql
+ r2
, 0 < /2 < Ь,
b = r2q2 + r3, О < /з < /2,
228 Глава 8. Элементы теории чисел
/2 =ОДЗ+ Г
4> 0<Г4 </-3 , (8.1.1)
г*-г = Vi?«-i + Л., < Л, <
г
п-,
гп- = г„д„,
заканчивающийся, когда получается некоторое гп+1 = 0. По-
следнее неизбежно случится, так как ряд Ъ, г2, г3,... убывающих
целыхчисел не может содержать более чем b положительных.
4. Из формул (8.1.1) алгоритма Евклида следует, что
(а, Ь) = (Ь, Л) = (г2, г,) =... = (/•„_!, г„) = /•„.
Наибольший общий делитель равен последнему не равному
нулю остатку алгоритма Евклида.
5. Из формул (8.1.1) алгоритма Евклида следует также, что суще-
ствуют целые ti и t2, что ta + t2b = rn. В частности, если
(а, Ь) = 1, то t{a + t2b = 1.
Пример. Найдем (525, 231).
525 = 231-2 + 63,
231 = 63-3+42,
63 = 42-1 + 21,
42 = 21 • 2.
Последний остаток есть 21, значит, НОД = (525, 231) = 21.
6. Пусть т — любое положительное целое, тогда (am, bm) =
= (a, b)m.
7. Если (а, Ь) = 1, то (ас, Ь) = (с, Ь).
8. Если (а, Ь) = 1 и ас делится на Ь, то с делится на Ь.
8.2. Наименьшее общее кратное
Всякое целое, кратное всех данных чисел, называется их об-
щим кратным. Наименьшее положительное общее кратное назы-
вается наименьшим общим кратным (НОК). Наименьшее общее
кратное двух чисел а и Ь равно их произведению, деленному на их
общий наибольший делитель, т.е. ^|у .
8.3. Простые числа
1. Число 1 имеет только один положительный делитель, имен-
но 1. В этом отношении число 1 в ряде натуральныхчисел сто-
ит совершенно особо.
8.3. Простые числа 229
Всякое целое, большее 1, имеет не менее двухделителей, имен-
но 1 и самого себя; если другихделителей нет, то число называ-
ется простым. Целое, большее 1, имеющее кроме 1 и самого
себя другие положительные делители, называют составным.
2. Наименьший отличный от единицы делитель целого, больше-
го единицы, есть число простое. В противном случае, можно
было бы выбрать делитель еще меньше.
3. Наименьший отличный от единицы делитель (он будет про-
стым) составного числа а не превосходит -Ja. Действительно,
пусть q — именно этот делитель, тогда a = qbnb>q(q — наи-
меньший делитель), откуда а > q или q <Ja.
4. Простых чисел бесконечно много. Это следует из того, что како-
вы бы ни были различные простые числа plt Р2,---, Рь можно
получить новое простое, среди них не находящееся. Таковым
будет простой делитель суммы/?]^---/^ + 1, который, деля всю
сумму, не может совпадать ни с одним из простыхpi,p2,••-,/>*•
5. Решето Эратосфена для составления таблицы простых чисел.
Данный способ состоит в следующем.
Выписываем числа
1, 2, 3,-4, 5,6, 7,8,9,-Ю, 11, . . . , N.
Первое, большее 1, число этого ряда есть 2. Оно делится толь-
ко на себя и на 1 и, следовательно, оно простое. Вычеркиваем из
ряда (как составные) все числа, кратные 2, кроме самого себя.
Первое, следующее за 2 не вычеркнутое число есть 3 — оно также
будет простым. С ним, как и с числом 2, проделываем ту же про-
цедуру и т.д. Если указанным способом уже вычеркнуты все числа
кратные простых, меньших/? (4а <р), то все невычеркнутые, ме-
ньшие р
2
, будут простые.
Составление таблицы простых чисел, не превосходящих N, за-
кончено, как только вычеркнуты все составные кратные простых,
не превосходящих -/Ж
В алгоритме 8.1 реализовано решето Эратосфена для нечетных
чисел 2N+ 1 с предпросеиванием для двойки; другими словами,
начинаем только с нечетных чисел, отсеивая кратные 3, 5, 7,11 и
т.д. Вектор Xявляется двоичным набором индикаторов простых
нечетных чисел. Так элемент вектораXk=, если соответствую-
щее емучисло 2k + 1 — простое; в противном случае, когда Xk
= О,
число 2k + 1— непростое.
230 Глава 8. Элементы теории чисел
Алгоритм 8.1. Решето Эратосфена
А-=(1, 1,..., 1);
for k= 3 to V27V + 1 by 2 do
(X(k-)/2 — индикатор нечетного числа k)
{Вычеркнуть числа кратные k]
tfX(k-)/2 = ! thenfor i = k2
to 2N+ 1 by 2k do X^.^ = 0;
{ Печать простых чисел }
for k=l 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[I..N] of Boolean;
Var
f :Text; {Текстовый файл простых чисел}
X :Vector; {Вектор индикаторов простых чисел}
Procedure Primary; {Генерация простых чисел)
Var
i,k,M,nm :Integer;
begin
nm:=2*N+l;
for k:=l to N do X[k]:=TRUE;
k:=3;
M:=trunc(sqrt(nm));
while k<=M do begin
if X[(k-l) div 2] then begin
i:=k*k; {Исключить числа кратные k}
while i<=nm do begin
X[(i-l) div 2]:=FALSE;
i:=i+2*k;
end;
end;
k:=k+2; {Выбираем нечетные числа k}
end;
8.3. Простые числа _ 231
{Печать простых чисел по индикаторам X[k]}
i:=0;
for k:=l to N do
if X[k] then begin
Write(f,2*k+l,'');
end;
WriteLn(f);
WriteLn (f, ' Количество простых нечетных чисел '+
'вдиапазоне[3,',2*N+1,']равно',i);
end;
begin
Assign(f,'Primary.out' } ; {Файл для записи простых чисел}
Rewrite(f);
Primary;
Close(f);
end.
Алгоритм 8.З. Программа на Си генерации простых чисел
iinclude <stdio.h>
#include <math.h>
ttdefine N 45
char X[N+1]; // Индикаторы простых чисел
// в диапазоне 3,5, . . .,2*N+1}
int main (void) {
FILE *f;
int i,k,M,run;
f =f open ("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++ )
iff X[k]){ i++; fprintf (f,"%d ",2*k+l); }
fprintf (f, "ХпКоличество простых нечетных чисел
в диапазоне [3,%d] равно %d", 2*N+1, i) ;
fclose(f);
return 0;
232 Глава 8. Элементы теории чисел
Исходными данными для программ алгоритмов 8.2 и 8.3 явля-
ется верхняя граница 2N+ 1 диапазона [3, 2/V+ 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, 27Y+ 1], границы которого распечаты-
ваются во второй строке результирующего файла. Во второй же
строке указывается и общее количество найденных простых чи-
сел.
8.4. Сравнения, свойства сравнений
Пусть т — целое положительное число, которое назовем моду-
лем. Будем говорить, что целые числа а и Ъ сравнимы по модулю
т, если а - Ъ = t • т для некоторого целого t, т.е. равны остатки от
деления я и b на т. Сравнение чисел а и Ъ по модулю т будем за-
писывать а = b (mod т).
Например, 77 = 5(mod 8), 102 = 0(mod 3).
Свойства сравнений
1. а = a (mod т) — свойство рефлексивности.
2. a s b (mod т) => b = a (mod m) — свойство симметричности.
3. а = b (mod т), b = c (mod т) => а = с (mod т)— свойство тран-
зитивности.
4. а = b (mod /и) => (а, т) = (Ъ, т).
5. а = b (mod /и), с = d (mod m)=*a + csb + d (mod m).
6. a = b (mod m), c = d (mod m) => ac = bd (mod m).
7. a = ad, b = b^d, (d, m) = 1, a = b (mod m) => a{
= bi (mod m).
8. a = b (mod /и), /иД/п (т{ делит т) => a = b (mod m{).
9. a = b (mod m), da, db, dm => a± = b (mod m{).
8.6. Приведенная система вычетов 233
8.5. Полная система вычетов
Свойства 1—3 сравнений показывают, что операция сравнения
целых чисел по модулю является отношением эквивалентности.
Множество всех целых чисел Zpa36nBaeTCH на классы эквивален-
тности (рис. 8.1), которые называются вычетами по модулю т.
Числа г, s eZлeжaт в одном классе {&,}, т.е. г, s e {&,} тогда и только
тогда, когда г = s (mod т) имеют одинаковые остатки от деления
на т. Числа одного и того же класса имеют с модулем т один и тот
же наибольший общий делитель, т.к. из г, s е {&,} следует, что
(г, т) = (s, т) (см. п.8.4). Особенно важны классы, для которых
этот делитель равен единице, т.е. классы, содержащие числа, вза-
имно простые с модулем.
z
(0) {1} {2} {3} {4} (5}
Рис. 8.1. Полная система вычетов
{т-2} {т-1}
Определение. Множество классов вычетов {0}, {!},..., {т - 1} по
модулю т называется полной системой вычетов (п.с.в.). Пол-
ную систему вычетов можно получить следующим образом.
Пусть Z— аддитивная (операция сложения) группа целых чи-
сел, mZ— подгруппа всех чисел, кратных т. Тогда факторгруп-
па Z/mZ— аддитивная группа вычетов по модулю т (полная сис-
тема вычетов).
8.6. Приведенная система вычетов
Определение. Пусть т — целое положительное число. Множе-
ство классов из полной системы вычетов {0}, {!},..., [т - 1} вза-
имно простых с т называется приведенной системой вычетов,
которую будем обозначать как М„ или Мк
(т). Приведенную
систему вычетов, следовательно, можно составить из чисел
п.с.в., взаимно простых с модулем. Обыкновенно М„ выделя-
ют из системы наименьших неотрицательных вычетов: О, 1,
2,..., т-1.
234 Глава 8. Элементы теории чисел
• Утверждение 8.6.1. Мп
является группой с операцией умноже-
ния.
Доказательство. Проверим все свойства (аксиомы) группы.
1. Замкнутость. Пусть произвольные a, b е Мп
. Покажем, что
аЪ е Мк
. По условию а = 1 (mod т) и b = 1 (mod т), тогда
ab = 1 (mod т).
2. Ассоциативность операции умножения чисел выполняется.
3. Единичный элемент — 1.
4. Существование обратного элемента.
Возьмем произвольный элемент а е Мп
. Покажем совпаде-
ние множеств аМп
= М„. Ясно, что аМп
с Мп
, так какдля М„ вы-
полняется свойство замкнутости. Для доказательства аМп
= Мк
теперь достаточно показать, что все элементы множества
аМк
различны. Предположим, что существуют ^ * Ь2
е
М„, для
которых abi - аЬ2
= 0 (mod т). Отсюда а(Ь± - Ь2
) = 0 (mod т). Атак
как (а, т) = 1 — взаимно простые, то Ь - Ь2
= 0 (mod т) или
bl
= Ь2
(mod т), что противоречит принадлежности их разным
классам.
Таким образом, все элементы множества аМ^ различны, зна-
чит, ЗЬ е М„, что а • b = 1 (mod т). Элемент b является обратным
к а, и по доказательству он единственный такой элемент (сущест-
вование обратного элемента а доказано).
Таким образом, получили, что Мп является группой по умно-
жению. Порядок этой группы равен количеству чисел меньших
т и взаимно простых с ним.
8.7. Функция Эйлера
• Определение. Функция Эйлера <p(w) определяется для всех це-
лых положительных т и равна количеству чисел ряда
1, 2,..., /я-1,
взаимно простых с т, где число 1 полагается взаимно простым
с любым из чисел и ср(1) = 1.
Примеры.Ф(1) = 1,Ф(2) = 1,Ф(3) = 2,Ф(4) = 2, ср(5) = 4, ср(6) = 2.
Замечание. Отметим, что порядок группы Мп
(т) приведенной
системы вычетов по модулю т равен |Afn
(m)| = (р(/п).
8.7. Функция Эйлера _ 235
Свойства функции Эйлера
Свойство 1. Если (mlt
т2
) = 1, то ф^ • т2
) = y(ml
)y(m2
).
Доказательство 1. Пусть С(/и1
/я2
) — циклическая группа по-
рядка |С(/П!/и2
)| = т{
т2
, число образующих ее равно (р(т{
т2
) (
C
M.
утверждение 7.3.4). Так как (т^т-^ = 1, то допустимо разложение
(см. п.7.4) группы С(7И!/Я2) в прямое произведение своих цикли-
ческих подгрупп С(/И!/я2
) = C(/Wj) x C(m2
) и, следовательно, чис-
ло образующих группы С^т^т^ равно (p(/Wi)(p(/H2
)-
Доказательство 2. Достаточно показать, что
1. Заметим, что из (т^т^ — 1 следует существование целых а и
Ъ, для которых выполняется ат2
+ Ьт^ = 1 (алгоритм Евклида см.
п.8.1). Приведем значения целых а и и к значениям а е {1, 2,...,
т^иЬ е {1, 2,..., т2
], для которых a/n2
+ bm^ = I(modm1
/n2
). Пусть
с е {1, 2,..., /ni/«2
}, тогда верно сдт2
+ cbm = c(mod т^т2
) , где зна-
чения са и cb приведены к значениям а е {1, 2,..., /Wj} и
b е {1, 2,..., /и2
}. Таким образом, произвольное число с е {1, 2,...,
mj/w2
} можно записать в виде о/и2
+ Ът = с (mod /njm2
), где
а е {1, 2,..., /nj} и и е {1, 2,..., /и2
}. Данное представление является
однозначным, так как число возможных пар (а, Ь) равно т^2
и та-
кое же количество представляемыхчисел с е (1, 2,..., W!/w2
}- Далее
рассмотрим все представления ат2
+ Ът для всех а е {1,2,..., /wj
и £ е {1, 2,..., т2
}.
2. Пусть а е Мп
(тд и 6 е М^(т2
) , т.е. (о, /Wj) = 1 и (6, /и2
) = 1 и
(/«!, т2
) = 1. Покажем, что (ат2
+• bmlt
/и1
/и2
) = 1. Выражение
(ат2
+ bmi, т^) = 1 эквивалентно (ат2
+ Ъть
т{
) = 1 и (ат2
+
+ bmlt
т2
) = 1. В первом случае — (ат2
+ bm, Wj) = (ат2
, т^) =
= (a, /HI) = 1 и во втором — (ат2
+ Ьт{
, /и2
) = (bmh
т2
) = (Ь, т2
) = 1.
Таких пар (а, Ь), а значит и чисел ат2
+ Ьтг
взаимно простых
с т^2
, равно y(mi) • ф(/я2
). Покажем, что других чисел взаимно
простых с т{
т2
среди ат2
+ bml
нет.
3. Остались не рассмотренными числа ат2
+ bml
, где
а е M^ni]) или Ь <ь М„(т2), для них (ат2 + Ът, т^т^ Ф 1, т.е. та-
кие числа не являются взаимно простыми с т^т^
4. Из пунктов 1), 2), 3) следует, что ф(/Я!/и2
) =
236 Глава 8. Элементы теории чисел
Свойство 2. ф(р") =р
а
-р
а 1
=р
а
1— ,
I Р)
где р — простое число и а > 0.
Доказательство. Числавидаk • р, гдеk={, 2,...,р
а
~
1
} — это все
числа не взаимно простые ср
а
среди 1, 2,..., р
а
, а значит остальные
являются взаимно простыми с р
а
. Отсюда ф(р
а
) =р
а
-р
а
~ .
Свойство 3. Пусть разложение числа т на простые сомножите-
ли имеет вид т=р^
1
р^
2
...р°^ , гдеpi — простые числа, тогда
_*_ *
~1л
в
'И-
Л
Свойство 4. 2^Ф(*/)
=л
>
г
Д
е
^ ~ различные делители числа п.
dn
Доказательство 1. Пустьл =р^
[
р^
2
...p^
k
— разложение числа
п на простые сомножители. Правило обобщенного произведения
(см. п.3.4) позволяет записать:
Сумма
= l + (р - 1) + (р2
-р) + ... + (ра
- р"-
1
) =р°.
Отсюда искомая сумма
Еф(<о=П Z ф(^)=Ш
а
'=«-dn i=ldp°4 i'=l
Доказательство 2. Пусть С(«) — циклическая группа порядка
|С(я)| = я. Для всякого делителя d числа л существует единствен-
ная подгруппа C(d) с С(я) порядка |С(сГ)| = d. Образующие груп-
пы C(d) составляют множество Sd
= (х. е С(я) | | х | = d }. Из утвер-
ждения 7.3.4 следует, что число образующих группы C(d) равно
ср(йО = Sd. Так как Sd r Sd- = 0 для rf 7t d', то [J^j =С(л) или
dn
(/Л
8.7. Функция Эйлера _ 237
• Теорема 8. 7.1 Эйлера. х
ф(ш)
= 1 (mod т), где т > 0 и (х, т) = 1.
Доказательство. Приведенная система вычетов М„ по модулю
т является группой, порядок которой Мп = <р(т). Пусть х — про-
извольное такое, что (х, т) = 1 и х = г (mod т), где г е М^. Из
свойств сравнений следует, что наибольший общий делитель
(г, т) = 1. Теорема 7.3.1 Лагранжа утверждает, что порядок эле-
мента группы кратен порядку этой группы. Пусть k — порядок
элемента г, т.е. г = 1 (mod т). Отсюда ф(/п) = k • d, где d — поло-
жительное целое. Тогда /*
(т)
= /^ = 1 (mod т). Из х = г (mod т)
следует, что л»
(|и)
= /*
(m)
(mod т), а значит, и х
ф<т)
a I (mod /и).
• Теорема $. 7.2 Ферма. х
р
= х (modр), где /) — простое число; х —
произвольное целое положительное число.
Доказательство. Пусть х = 0 (mod р), тогда и х
р
= 0 (mod p).
Пусть теперь х = г (modр), где re {1, 2,...,р- 1} и, значит, (г,р) = 1.
Из теоремы Эйлера следует, что х*^ = 1 (mod р), где q>(p) =p-l.
Отсюда х^
1
= 1 (mod ^) и х
р
= 1 (mod /7).
• Теорема 8. 7.3 Вильсона. (р-1)! + 1=0 (modр), где р — простое
число.
Доказательство. Пусть М„ = {1, 2,...,р- 1} — приведеннаясис-
тема вычетов по модулю р. Мп
является группой. Для любого
л:е{1, 2,..., р - 1} существует единственный обратный элемент
у е {1, 2,..., р - 1} такой, что х • у= 1 (mod/?).
Заметим, чтох • х = 1 (mod;?) выполняетсятолькодлядвухэле-
ментов: л; = 1 и х =р - 1. Действительно х
2
- I = (х- 1)(х + I) =
= 0 (modp) равносильное - 1 = 0 (mod/)) илих + 1 = 0 (mod/)). От-
сюда х = 1 или х =р - 1. Таким образом, обратными элементами к
себе являются только х= их=р-1.
Для любого из оставшихся элементов группы л: е {2, 3, ...,/> - 2}
существует единственный обратный у е {2, 3,..., р - 2} такой, что
ху= 1 (mod/)) и х*у. Тогда верно 2 • 3 •...• (р - 1) = 1 (mod/)). Ум-
ноживпоследнеесравнениена 1 • (р- 1), получим 1 • 2 •...• (р-) =
= (р-) = - (mod/)) или (р- 1)! + 1 = 0 (mod/)).
Задача, Пусть/) — простое и hb H2,..., hn — целые числа. Дока-
зать, что (A! +H2+...+hn У =h*+h
p
2 +...+h
p
n (mod/)).
238 _ Глава 8. Элементы теории чисел
Решение. Согласно теореме Ферма (8.7.2), hf =A,(mod/>),
/ = ,п. Свойства операции сравнения (см. п.8.4) позволяют запи-
сать данные п сравнений hf =hj(modp) в виде их суммы:
h
{ +h2
+...+h% = hi + h2
+...+ hn
(mod/0- С другой стороны, верно и
(Aj + А2
+ ... + Н„У = AJ + А2
+ ... + hn
(mod p), что непосредственно
вытекает из теоремы Ферма.
8.8. Функция Мёбиуса. Формула
обращения Мёбиуса
• Определение. Функция Мёбиуса ц(л) определяется для всех це-
лых положительных я и равна
1, если л = 1,
О, если n=p^pl*...plk
и За,- >1,
1)*, если п^
где п =р" ' р%г
. - .р^k
— разложение на простые сомножители,
pt
— простые числа, а, — кратность pt
в разложении.
Пример. ц(1) = 1, ц(2) = -1, ц(3) = -1, ц(4) = 0, ц(5) = -1, ц(6) = 1,
-1, ц(8) = 0, ц(9) = 0, и(Ю) = 1, ц(И) = -1, ц(12)=0,
ц(14) = 1, ц(15) = 1, ц(16)=0, ц(17) = -1, ц(18) = 0
ц(20) = 0, ц(21) = 1 , ц(22) = 1, ц(23) = -1.
• Лемма 8.8.1. Уц(Ю = {?' если п>1
>
^ [1, если и = 1,
где суммирование идет по всем делителям d числа п.
Доказательство. Если п = 1, то ^ц(б/)=ц(1)=1. Пусть теперь
di
п=р^р^2
•••/>£* Ф — разложение на простые сомножители. Тог-
да £>(</) = £ц(</) = jrcr
k (-IY =(1-1)* =0. Все делители d, для
r=0
которых ц(йО ^ 0, имеют вид р^р^.^р^к ]i(p,1pil...p,r)=(-l)
r
.
Количество таких делителей pt
pi2
...pir
, выбираемых изр1
,р2
,...,
pk
, равно числу сочетаний Cr
k
.
8.8. Функция Мёбиуса. Формула обращения Мёбиуса _ 239
• Теорема 8.8.1. Формула обращения Мёбиуса:
если /(«) = ^g(d то g(n) = £>(</)/(£),
где/(л), g(n)— функции, определенные для всех целых поло-
жительных п.
Доказательство. Выполним подстановку /(4) в сумме
• Заметим, что здесь число п неявно
<Л« Л" »ф
рассматривается в виде произведенияп = d • 5 • г, гдеделители dvi
5 принимают все допустимые значения независимо друг от друга
и порядок суммирования не влияет на значение суммы, т.е.
5>(Л I>(5) = 2Хб 2>0)1 где £ ц(</) = °' ССЛИ
«л* »»ф s« . ф
это вследствие леммы 8.8.1. Тогда
ц(</) = ' ' -
</(f) I1
' если е -я
5«
Задача. Установить связь функций Эйлера ср(л) и Мёбиуса ц(л)-
Решение. ^n(d) =п — свойство 4 функции Эйлера (см. п.8.7).
d/n
К данной сумме применим формулу обращения Мёбиуса:
и, наконец, > =
dn dn dn
Например, для п = 6 имеем q>(6) = 2, вседелители </ е {1, 2, 3, 6},
|д(1) = 1, ц(2) = -1, ц(3) = -1, ц(6) = 1 и, наконец, выражение
^Г^=
Х^^ в этом случае примет вид -+=
^ +^ +-
dn
Пусть п =р^1
?2 г
---Р^ ~ разложение на простые множители.
k ( 
Так как ф(и)=л-]~]] 1 — — свойство 3 функции Эйлера (см.
/=Л Pi J
п.8.7),Т о « . ] 1 - = и . £ или
i=14 Л / <//л 1=14 Л У d/n
Задачи и упражнения
Комбинаторные схемы
1. Доказать комбинаторными рассуждениями (т.е. используя
только определение числа сочетаний) тождества:
я
 Ck
-Ck
4-Г*"1
-а
> Ч - 4-1 + 4-1 •
2. Доказать тождества:
а) ЕС* =2";
А=О
б) ЕЛ-С* ^"-^
д) Х(-1)
А
С* =0.
k=0
т LL, '& Ь ^2, i^
3. Доказать тождество £ £ Z • • • Z Z Z1 =
-2=1 '2=1
4=1 '0=1
4. Доказать, что У ""' =- , п > 1.
'
. п (2л)! (Зл)! (л
2
)! (2л)!
5. Доказать, что следующие числа:
2" ' 2"3"' л" 'л!(л +1)!
являются целыми.
6. Доказать формулу бинома Ньютона (a + b)" =
k
"
k
7. Найти число подмножеств множества М = {alt a2,..., an}.
8. Доказать, что ^Q
2
* =£c
«2
*+1
=2n
~l
.
k k
Задачи и упражнения 241
А п
9. Доказать, что ^С
тС
п =С
п+ти
ZXC
*г ) =С
2п (теорема сложе-
/•=0 *=0
ния).
и и—t
10. Доказать равенство
11.ДоказатьравенствоХтЧ^*=2
^'"1
.
я
12. Доказать равенство ]Г(-1) тЦ-С* =-L .
А=0
-2 i , 1 ^ л-А
13. Найти сумму 2] * -1 + -С„ .
14. Доказать тождество ^ =k", где суммирование рас-
пространяется на все упорядоченные разбиения л на kслагаемых:
л = Л! + л2
+... + nk
, п > 0 — целые числа.
15. Из города А в город 5 ведут семь дорог, а из города В в город
С — три дороги. Сколько возможных маршрутов ведут изА в Сче-
рез город В?
16. Сколькими способами число 11" можно представить в виде
трех сомножителей (представления, отличающиеся порядком со-
множителей, считаются различными; 11° — сомножитель)?
17. Сколькими способами можно указать на шахматной доске
2л х 2л два квадрата — белый и черный?
18. Сколькими способами можно указать на шахматной доске
In х 2л белый и черный квадраты, не лежащие на одной горизон-
тали и вертикали?
19. Какое количество матриц можно составить из л строк и т
столбцов с элементами из множества {0,1}?
20. Сколькими способами можно составить трехцветный флаг,
если имеется материал 5 различных цветов? Та же задача, если
одна из полос должна быть красной.
21. Надо послать 6 срочных писем. Сколькими способами это
можно сделать, если любое письмо можно передать с любым из 3
курьеров?
22. У одного студента 7 книг, у другого 9 различных книг. Сколь-
кими способами они могут обменять одну книгу одного на одну
книгу другого?
242 Задачи и упражнения
23. Сколько различных словарей надо издать, чтобы можно было
переводить с любого из данных п языков на любой другой язык
этого же множества?
24. В правление избрано т человек. Из них надо выбрать предсе-
дателя, заместителя председателя, секретаря и казначея. Сколь-
кими способами можно это сделать?
25. У мамы 5 яблок, 7 груш и 3 апельсина. Каждый день в течение
15 дней подряд она выдает сыну по одному фрукту. Сколькими
способами это может быть сделано?
26. У мамы т яблок и п груш. Каждый день в течение п + т дней
подряд она выдает сыну по одному фрукту. Сколькими способа-
ми это может быть сделано?
27. Найти число векторов а = (а^ а2,..., а„), координаты которых
п
удовлетворяют условию а, = {0, 1}, /= 1, 2,..., п, ^о, =г.
i=i
28. У англичан принято давать детям несколько имен. Сколькими
способами можно назвать ребенка, если ему дают не более трех
имен, а общее число имен равно т?
29. Сколькими способами можно расставить белые фигуры: 2
коня, 2 слона, 2 ладьи, ферзя и короля на первой линии шахмат-
ной доски?
30. Сколькими способами можно расставить k ладей на шахмат-
ной доске размером п х т так, чтобы они не угрожали друг другу,
т. е. так, чтобы никакие две из них не стояли на одной вертикали
или горизонтали?
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. Сколькими способами можно разместить л одинаковых ша-
ров по т различным корзинам при следующих условиях:
а) пустых корзин нет;
б) во второй корзине k шаров;
в) в первых & корзинах соответственно alf
a2
,.., ak
шаров?
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.2)1
55. Сколькими способами можно раскрасить квадрат, разделен-
ный на девять частей, четырьмя цветами таким образом, чтобы в
первый цвет были окрашены 3 части, во второй — 2, в третий — 3,
в четвертый — 1 часть?
56. Определить коэффициент с в одночлене сх^х^х] после разло-
жения выражения (xl
+х2
+ х3
)
10
и приведения подобных членов.
57. Сколько делителей имеет число q =р*
1
р^
г
...р%", где/?, —про-
стые числа, не равные единице, а,- — некоторые натуральные чис-
ла? Чему равна сумма этих делителей?
58. Доказать, что в разложении числа п на простые сомножители
простое число р входит с показателем /" =Иг +Ну +гт +••• •
59. Из выбранных k различных чисел от 1 до л составляют произ-
ведение, k фиксировано. Какое количество полученных таким
образом произведений делится на простое число р < п?
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.2)1
69. Каких чисел больше среди первого миллиона: тех, в записи
которых встречается 1, или тех, в записи которых ее нет?
70. Пусть числа 1, 2,..., л расположены подряд по кругу- Двигаясь
по кругу, вычеркиваем каждое второе число. Показать, что по-
следнее не вычеркнутое число равно 2л-2
[1
°
82
"
1+1
+L
71. Сколькими способами можно число п представить в виде сум-
мы k слагаемых (представления, отличающиеся лишь порядком
слагаемых, считаются различными), если: а) каждое слагаемое
является целым неотрицательным числом; б) каждое слагаемое —
натуральное число?
72. Какова таблица инверсий для перестановки 271845936?
73. Какой перестановке соответствует таблица инверсий 50121200?
74. Пусть перестановке а^.-.а,, соответствует таблица инверсий
dld2.-.dn. Какой перестановке тогда будет соответствовать следую-
щая таблица инверсий (и - 1 - d^)(n - 2 - d2)...(О - dn)?
246 Задачи и упражнения
75. На окружности произвольным образом отмечают п точек бук-
вой Nnm точек буквой М. На каждой из дуг, на которые окруж-
ность делится выбранными точками, ставят числа 2 или 1/2 сле-
дующим образом: если концы дуги отмечены буквой N, то ставят
число 2; если концыдуги отмечены буквой М, то ставят число 1/2;
если же концы дуги отмечены различными буквами, то ставят
число 1. Доказать, что произведение всех поставленных чисел
равно 2""".
16. Сколькими способами можно распределить 3« различных
книг между тремя лицами так, чтобы числа книг образовывали
арифметическую прогрессию?
77. Рассматриваются всевозможные разбиения nk элементов на п
групп по k элементов в каждой, причем разбиения, отличающие-
ся друг от друга только порядком элементов внутри групп и по-
рядком расположения групп, считаются совпадающими. Сколь-
ко существует различных таких разбиений?
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. Доказать, что число упорядоченных разбиений числа л на k
натуральных слагаемых, т. е. число решений уравнения п = xl +
+ х2 + ... + xk, Xj > 0, / = 1,2,..., k, равно С*Г/, а общее число упоря-
доченных разбиений для различных k равно 2""
1
.
87. Сколькими способами можно разложить п различных шаров
по k различным корзинам так, чтобы в первую корзину попало п^
шаров, во вторую корзину попало п2 шаров и т.д., в k-ю корзину
попало nk шаров, где п = п^ + п2 +... + nk?
88. Сколько существует чисел от 0 до 10", которые не содержат две
идущие друг за другом одинаковые цифры?
89. Сколько существует натуральных л-значных чисел, у которых
цифры расположены в неубывающем порядке?
90. Сколько существует натуральных чисел, не превышающих
10", у которых цифры расположены в неубывающем порядке?
91. Сколькими способами можно расставить п нулей и k единиц
так, чтобы никакие две единицы не стояли рядом?
92. Город имеет вид прямоугольника, разделенного улицами на
квадраты. Число таких улиц в направлении с севера на юг равно п,
а в направлении с востока на запад — k. Сколько имеется крат-
чайших дорог от одной из вершин прямоугольника до противопо-
ложной?
93. Как разбить квадратное поле на участки так, чтобы высеять на
нем т сортов пшеницы для сравнения урожайности этих сортов,
исключающего влияние изменения плодородия в пределах участ-
ка? Считаем, что плодородие убывает при удалении от одной сто-
роны поля (неизвестно, какой именно) к противоположной.
94. Бросают т игральных костей, помеченных числами 1, 2, 3, 4,
5, 6. Сколько может получиться различных результатов (результа-
ты, отличающиеся порядком очков, считаются одинаковыми)?
95. Имеем т различных шаров и А:различных корзин. Сколькими
способами можно разместить предметы по корзинам, допускают-
ся пустые корзины?
96. Имеем т различных шаров и & различных корзин. Сколькими
способами можно разместить предметы по корзинам, пустые
корзины не допускаются? Указание: воспользоваться правилом
включения и исключения.
97. Найти число способов разложения т шаров по k корзинам
так, чтобы г корзин остались пустыми. Указание: воспользоваться
правилом включения и исключения.
248 Задачи и упражнения
98. Имеем т различных шаров а±, а2,..., ат и столько же различных
корзин #!, k2,..., km. Сколькими способами можно разместить
предметы по корзинам так, чтобы никакой предмет а, не попал в
корзину kj (допускаются пустые корзины)? Указание: воспользова-
ться правилом включения и исключения.
99. Задача о беспорядках. Имеем т различных шаров alt a2,..., ат и
столько же различных корзин kl; k2,..., km. Сколькими способами
можно разместить предметы по корзинам так, чтобы никакой
предмет о, не попал в корзину &,, пустые корзины не допускают-
ся? Указание: воспользоваться правилом включения и исключения.
100. Найти число перестановок т шаров, в которых ровно г эле-
ментов остаются на месте. Указание: воспользоваться правилом
включения и исключения.
101. Доказать, что г различных вещей можно разделить между
п +р людьми так, чтобы данные п людей получили, по крайней
мере, по одному предмету, способами С®(п + р)
г
-С*(п + р-1)
г
+
+С%(п + р-2)
г
-...+(-1)"С%(п+р-п)
г
. Указание: воспользоваться
правилом включения и исключения.
102. Рыцарские переговоры. К обеду за круглым столом приглаше-
ны п пар враждующих рыцарей, п > 2. Требуется рассадить их так,
чтобы никакие два врага не сидели рядом. Показать, что это мож-
но сделать ]Г(-1)*С^2*(2л-А:)!способами. Указание:воспользова-
*=о
ться правилом включения и исключения.
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 предметов (п одинаковых, остальные различ-
ны). Доказать, что из них можно извлечь п предметов 2
2
" способами.
109. Применяя формулу включения и исключения, определить
количество целочисленных решений системы уравнений и нера-
венств: AC, + х2 +... + хп = г, я,- < Xj <bhi=l,n, ah xh bj — целые числа.
110. Определить количество целочисленных решений системы
х{ + х2 + *3 = 40, х: > 3, х2 > О, х3 > 2.
111. Компания, состоящая из 10 супружеских пар, разбивается на
5 групп по 4 человека для лодочной прогулки. Сколькими спосо-
бами можно разбить их так, чтобы в каждой лодке оказались двое
мужчин и две женщины?
112. Имеем п предметов, расположенных в ряд. Сколькими спо-
собами можно выбрать из них три предмета так, чтобы не брать
никаких двух соседних элементов?
113. Даны 2п различных предметов а1; als a2, в},--, оп, ап. Сколько
существует перестановок из этих In предметов, в которых не сто-
ят рядом одинаковые элементы?
114. В шахматной олимпиаде участвуют представители п стран по
4 представителя от каждой страны. Сколькими способами они
могут встать в ряд так, чтобы рядом с каждым был представитель
той же страны?
115. Имеется п одинаковых вещей и еще п различных вещей. Ско-
лькими способами можно выбрать из них п вещей? Сколькими
способами можно упорядочить все In вещей?
116. Найти число способов распределения In одинаковых шаров
по двум неразличимым корзинам.
117. В каждой клетке шахматной доски размером п х п поставили
число, указывающее количество прямоугольников, в которые
входит эта клетка. Чему равна сумма всех поставленных чисел?
118. Найти число расстановок владей так, чтобы они не били друг
друга, на доске п х л (см. случаи а, 6, в) с выколотыми или добав-
ленными клетками. В случае в) использовать п ладей.
250 _ Задачи и упражнения
Производящие функции и рекуррентные
соотношения
119. Найти производящую функцию последовательности
{2(п - 5) + 7"
+2
}.
120. Применить технику производящих функций для нахождения
суммы чисел 1 + 2
3
+ ... + л .
121. Решить рекуррентные соотношения:
!) "я+2 - 4ия+1 +
Зм
« = °. "о =
8
. «1 =
10
;
2) ил+3 - Змл+2 + мл+1 - Зил = 0, м0 = 1, M! = 3, и2 = 8;
3) «п+2±9м„ = 0, м0 = 1, H! = O;
4) ил+4 ±4«л =0, м0 = 1, «! = 1, и2 = 1, и3 = 1;
5
) «л+з + «„+2 - "„+1 - «„ = 0, м0 = 1, M! = 2, и2 = 3;
6) ы„+2 - 4м„+1 + 4м„ = 0, м0 = 1, M! = 2.
122. Решить неоднородные рекуррентные соотношения:
!) "т-1 =м
« +л
>
M
O
= I
;
2) «п+2 = -2«n+i + 8м„ + 27 • 5л, н0 = 0, м, = - 9;
3) ип+2 - Змл+1 + 2м„ = п, и0 = 1, M! = 1;
4) м„+2 - 4мл+1 + 4и„ = 2", н0 = 1, M! = 2;
5) и„+2 = мл+1 - -м„ + 2~", «0 = 1^! = 3/2;
6) ыл+2
- Змл+1
+ 2м„ = (-!)", м0
= 1, Mj = 2.
123. Последовательность Фибоначчи {м„} задается рекуррентным
соотношением мл+2
= мл+1
+ м„, «0
= 1, MJ = 1. Найти мл
; показать,
что мл
и мл+
1 — взаимно простые числа и мл
делится на ит
, где
л = т • k.
124. Найти общее решение рекуррентных соотношений:
!) «п+
2 = "«+
1 - 4
М
« >
2) мл+2
- 4ил+
1 + Знл
= 0;
3) ип+
2 ~ »п+1 - "м
= 0.
125. Найти решение системы рекуррентных соотношений:
_ _ -1Л h - (
° ' °
126. Найти число решений уравнениях + 2у = п, где х, у, п s Z
+
—
положительные целые числа; х, у — неизвестные.
127. Найти число решений уравнения х + 2у + 4z = п, х, у, п е Z+
,
х, у, z — неизвестные.
Задачи и упражнения 251
128. Найти определитель матрицы
fa + p a(3
1 а + р ар
1 а + р ар
а + Р ар
где а, р — произвольные числа; вне обозначенных диагоналей
матрицы располагаются нули.
129.Вычислитьсумму^(1/2*),гдесуммированиепроизводится
по всем натуральным k, не кратным 2, 3 и 5.
130. Найти ладейный многочлен запрещенных позиций для до-
сок а) и Ь) идля каждого из этих случаев составить многочлен по-
паданий. Для доски с) составить многочлен запрещенных пози-
ций. Для досок а), Ь) и с) найти число расстановок трех ладей на
запрещенных позициях.
131. Найти число способов расставить 5 ладей на доске 5 x 5 так,
чтобы ни одну из них не бил слон. Позиция слона указана на до-
ске d) символом «с».
132. Найти число способов расставить 5 ладей на доске 5 x 5 так,
чтобы ни одну из них не бил конь. Позиция коня указана на доске
d) символом «к».
133. Найти число замкнутых маршрутов длины 2л по ребрам гра-
фа для случаев а), Ь) и с). Длина ребра равна 1. Начало и конец
пути есть вершина А.
в
с
А
а)
В
С В
A D
с)
л~-^с
ь) *"--д
Е
254 Задачи и упражнения
163. Найти хроматическое число л-вершинного дерева, п > 1.
164. Доказать, что в компании из 6 человек всегда найдутся либо
трое знакомых друг с другом, либо трое друг с другом не знако-
мых.
165. Доказать, что при любой раскраске ребер полного 6—графа в
два цвета найдется монохроматический 3—граф.
166. Рассмотрим граф М„ Муна-Мозера с Зл вершинами {1,2,...,
Зл}, в котором вершины разбиты на триады {1, 2, 3}, {4, 5, 6},
...,{3л - 2, Зл - 1, Зл}; Мп не имеет ребер внутри любой триады, но
вне их каждая вершина связана с каждой из остальных. Докажите
(по индукции), что М„ имеет 3" клик.
167. Показать, что в графе с л вершинами и с А; компонентами
связности число ребер не более ((л - k)(n - k+ l))/2.
168. Докажите, что если в графе все вершины имеют четные сте-
пени, то в этом графе нет мостов. Указание: допустить, что суще-
ствует мост; удалить это ребро—мост и показать, что полученный
граф будет противоречить условию задачи.
169. Разобьем плоскость на конечное число частей прямыми ли-
ниями. Докажите, что полученная карта имеет хроматическое
число равное двум. Указание: для доказательства воспользуйтесь
индукцией по числу прямых.
170. Для каждого графа а) и б) найти остовное дерево, используя
программную реализацию жадного алгоритма (алгоритм 6.7) п
алгоритма ближайшего соседа (алгоритм 6.9). На каждом шаге ал-
горитмов отобразить состояние используемых структур данных.
xl 20 х2 х] 7
171. Найти кратчайшие пути от вершины х$ до всех остальных
вершин ориентированного графа (см. рис. на следующей страни-
це).
Задачи и упражнения 255
41
172. Пусть Л* =[й!Л)
1 i,j= l,n обозначает k-ю степень матрицы
смежности орграфа. Доказать, что элемент а^ данной матрицы
равен количеству маршрутов длины k из вершины х, в ху
. Указание:
при доказательстве воспользоваться индукцией по числу k.
173. Выполнить хроматическое разложение графа. Найти все
клики, фундаментальное множество циклов, листы, блоки и мос-
ты. Определить центры, радиус и диаметр графа.
174. Сколь много ребер может иметь n-вершинный граф, у кото-
рого степень всякой вершины не превосходит d?
175. Показать, что в дереве с нечетнымдиаметром любые две про-
стые цепи наибольшей длины имеют хотя бы одно общее ребро.
176. Пусть корневое дерево с п (п > 2) висячими вершинами не
имеет вершин степени 2, отличных от корня. Показать, что общее
число вершин дерева не превосходит 2л - 1.
177. Доказать, что дерево обладает единственным центром в слу-
чае, когда его диаметр есть число четное, и обладает двумя цент-
рами, когда диаметр есть нечетное число.
178. Доказать, что в любом дереве с п > 2 вершинами имеется не
менее двух висячих вершин.
179. Вершины графа Гпронумерованы в порядке возрастания их
степеней. Доказать, что если k — наибольшее число, такое, что
k < d(xk) + 1, то х(Л =s k, где d(xk) — степень вершины xk.
180. Доказать, что если для любых двух вершин х и у связного
л-вершинного графа выполняется d(x) + d(y) > п, то граф имеет
гамильтонов цикл.
256 Задачи и упражнения
181. Используя алгоритм чередующихся цепей (см. п.6.14.3), рас-
ширить заданное начальное паросочетание в двудольном графе
Г- (F! u V2, U, Ф) до максимального паросочетания, где V{ = {slt
s2, s3, ,y4, s5, s6} и V2 = {I, 2, 3, 4, 5, 6}, смежные вершины в графе:
Sl
- {I, 2, 3}, s2
- {1, 2}, s3
- {I, 2}, s, - {I, 2, 3, 4}, s5
- {I, 2, 4, 5},
s6 — {I, 2, 3, 5, 6} и начальное паросочетание л = {(sb 1), (s2, 2),
(s4
, 3), (s5
, 4), (s6
, 5)}.
182. Используя алгоритм чередующихся цепей (см. п.6.14.3), рас-
ширить заданное начальное паросочетание в двудольном графе
Г= (F! u V2, U, Ф) до максимального паросочетания, где V{ = {sb
s2, ,УЗ, ^4>
S
5>
S
6> -s
1
?}
и
^2 = (1) 2, 3,4, 5, 6, 7}; смежные вершины в гра-
фе:Sl
- {1, 2}, *2
- {2, 5, 6}, J3
- {5}, *4
- {!» 2, 5}, *5
- {3, 4, 5, 6},
s6 — {4, 5, 7}, s7 — {5, 6}, и начальное паросочетание я = {(jb 1),
(s2
, 2), (53
, 5), (s5
, 3), (J6
, 7), (^7
, 6)}.
183. Перераспределить заданный начальный поток по транспорт-
ной сети и), б) и в) так, чтобы он стал максимальным, а сеть — на-
сыщенной(см. п.6.10). Найти все разрезы транспортной сети и их
мощности, сравнить мощность минимального разреза с найден-
ным максимальным потоком.
Задачи и упражнения 257
184. Решить задачи о назначениях максимального выбора
а) 2
8
1
8
9
12
6
7
5
7
11
9
4
2
3
1
1
9
7
4
4
2
3
4
1
3
3
0
3
5
2
5
3
1
6
7
б) 10
7
17
2
9
15
1
18
11
14
11
14
16
8
6
2
8
16
3
1
9
6
15
5
10
185. Решить задачи о назначениях минимального выбора
а) 4
13
9
12
6
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
9—2697
258 Задачи и упражнения
186. Фирма по перевозке грузов должна забрать пять контейнеров
в пунктах района края А, В, С, D, Еи доставить их в пункты а, Ь, с,
d, e. Расстояния в километрах между пунктами загрузки и пункта-
ми назначения контейнеров приведены ниже:
А-а
60
В-Ь
30
С-с
100
D-d
50
Е-е
40
Фирма располагает пятью грузовиками двух типов Хи Гна сто-
янках S, Т, U, V, W. Три грузовика типа ^находятся на автостоян-
ках S, U, Vw.два грузовика типа Гнаходятся на автостоянках Т, 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 . 0 0
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. Показать, что Gl = {nn & Z} — группа с операцией сложения
чисел, где Z— множество целых чисел; G2 = {2л | « е Z} — группа
с операцией сложения чисел; G3 = {2"  п е Z} — группа с опера-
цией умножения чисел; G$ — множество квадратных матриц по-
рядка л, определитель которых не равен нулю, является группой с
операцией умножения матриц; G5 — множество ортогональных
матриц порядка п является группой с операцией умножения мат-
риц; G6 = {1, —1} — группа с операцией умножения чисел; G1 —
множество рациональных чисел является группой относительно
операций сложения и умножения (без нуля); (78 — множество ве-
щественных чисел является группой относительно операций сло-
жения и умножения (без нуля). Установить, какие из групп явля-
ются подгруппами других групп.
260 _ Задачи и упражнения
190. Пусть М— подмножество группы Он Va, b еМвыполняется
ab~{
е М . Показать, что М— подгруппа.
191. Пусть (?!, G2
— группы и отображение/: G{
-» G2
— гомомор-
физм. Показать, что ядро и образ гомоморфизма являются под-
группами.
192. Пусть GI = {х е R+
} и G2
= {х е R}, где R+
— положительные
вещественные числа, R — вещественные числа. Показать, что
Gl
— группа с операцией умножения, G2
— группа с операцией
сложения. Рассмотрим отображение ф : G{
-> G2
такое, что
Vx e Gi ф(х) = 1п(х) е G2
. Показать, что ф — изоморфизм групп.
193. Пусть G — группа и г е G — фиксированный элемент. Опре-
делим отображение ф : G -» G формулой Vg e G(p(g) = r~l
gr. Дока-
жите, что ф — изоморфизм группы на себя.
194. Докажите, что если порядок группы G равен In и Н — под-
группа порядка « группы G, то Н — ее нормальный делитель.
195. Доказать, что если в квадратной матрице порядка п содер-
жится нулевая подматрица размера rx.snr+s>n, то определи-
тель матрицы равен нулю.
196. Найти порядок группы, порожденной подстановкой
12345}
2 3 4 5 lj'
197. Разложить подстановки (3 2 4 7 5 6 i s)
и
(? 6 2 ? 4 з 5J
в
про-
изведение независимых циклов и в произведение транспозиций,
определить их четность.
198. Пусть Н е S^, где 54 — симметрическая группа. Будет ли Н
подгруппой в следующих случаях:
ян ffl 2 3 4W1 2 3 4W1 2 3 4Wl 2 3 4a
>
a
-(l 2 3 4Д2 1 4 ЗДЗ 4 1 2J'U 3 2 l
fi^y ff -If1
2 3 4Wl 2 3 4Wl 2 3 4Wl 2 3 4
°>
H
-(l 2 3 4>U 3 1 4>U 1 2 4>U 4 1
199. Пусть G — циклическая группа, G  = т. Показать, что число
образующих группы равно ф(/и) — функция Эйлера.
200. Пусть G — циклическая группа. Показать, что элементы
группы одинакового порядка являются образующими одной и
той же подгруппы Не G.
201. Пусть G — группа порядка G=p,p — простое число. Пока-
зать, что G — циклическая группа.
202. Показать, что циклическая группа — коммутативна.
(
(
Задачи и упражнения 261
203. Пусть G — группа. Показать, что для всякого g е G найдется
такое целое k, что g = e.
204. Показать, что число образующих циклической группы G = {g,
g*,...,/' = е} равно значению функции Эйлера ср(л) — количество
чисел из множества {1,2,...,л-1} взаимно простых с и.
205. Пусть G — конечная абелева группа порядка G = р^р^2
...
/>"*, r№p,,p2,...,pk — простые различные числа; множество А(р) =К
= (х е G   x | =ра
}, где <х принимает произвольные целые значе-
ния. Показать, что А(р) — подгруппа.
206. Пусть Gb G2, — коммутативные группы порядков G{  = 56,
|G2  = 64. Найти количество возможных прямых разложений каж-
дой из групп на циклические подгруппы.
207. Определить множество левых и правых смежных классов
симметрической группы S3 по подгруппе Н, где Н— циклическая
подгруппа с образующим элементом ^ | Доказать что Н —
нормальный делитель.
208. Найти цикловой индекс группы самосовмещений (автомор-
физмов), действующей на множестве а), б), в), г). Отдельно рас-
смотреть случаидействия группы на плоскости и в пространстве.
V
209. Применить теорему Пойа для определения количества воз-
можных раскрасокдвумя и тремя красками вершин графов а), б),
в), г) предыдущей задачи.
210. Используя теорему Пойа, найти количество различных оже-
релий, которые можно составить из четырех бусинок пяти цветов.
Рассмотреть отдельно варианты, когда группа самосовмещений
(автоморфизмов) действует на плоскости и в пространстве.
Алгоритмы и графы
211. Задача о стоянке. На некоторой улице с одностороннимдви-
жением имеется п мест для стоянки автомобилей, расположен-
ных в ряд и перенумерованных от 1 до т. Муж везет в автомобиле
262 Задачи и упражнения
жену. Внезапно жена просыпается и требует остановиться. Он
послушно останавливается на первом свободном месте. Если нет
свободных мест, к которым можно подъехать, не поворачивая об-
ратно (т.е. если жена проснулась, когда машина достигла k-то ме-
ста для стоянки, но все «позиции» k, k+ 1,..., т заняты), то муж
приносит свои извинения и едет дальше.
Предположим, что это происходит с я различными машинами,
причему'-я жена просыпается в момент, когда машина находится
перед местом а/. Сколько имеется таких последовательностей а1;
а2,...,а„, при которых все машины удачно припаркуются, предпо-
лагается, что первоначально улица пуста и никто со стоянки не
уезжает? Составить алгоритм—программу вычисления всех воз-
можных перестановок alt a2,..., ап и соответствующие им располо-
жения автомобилей. Исходные данные — т, п. Например, если
т = п = 9 и (а{, а2,..., а„) = (3, 1, 4, 1, 5, 9, 2, 6, 5), то автомобили
расположатся следующим образом: 2, 4, 1, 3, 5, 7, 8, 9, 6.
212. Фальшиваямонета. Банк «Золотой Ящик» получил информа-
цию, что в последней партии из п монет ровно одна монета фаль-
шивая и отличается от других монет по весу. Для определения фа-
льшивой монеты кассиру выдали только аптечные весы без гирь.
Первым шагом кассир перенумеровал все монеты от 1 до п. Таким
образом, каждая монета получила уникальный номер — целое
число. После этого он начал взвешивать различные группы монет
по составу, отмечая, какие из них больше, меньше или равны.
Ваша задача — написать алгоритм—программу, которая по ре-
зультатам взвешиваний, выполненных кассиром, определит фа-
льшивую монету или определит, что этого нельзя сделать.
Текстовый файл входных данных содержит следующую ин-
формацию.
Первая строка файла содержит два целых числа п и k, разде-
ленных пробелами, где я — число монет в партии (п > 2) и k— чис-
ло взвешиваний, выполненных кассиром. Следующие Ik строк
файла описывают результаты взвешивания. Каждое взвешивание
представляется двумя строками файла.
Первая из них начинается числомpt
(!</?,< я/2), которое обо-
значает число монет, участвовавших при взвешивании на каждой
чашке весов. Следующие PJ чисел на этой же строке файла явля-
ются номерами монет, которые располагались на левой чашке ве-
сов, и последниеpi
чисел на этой же строке файла являются номе-
рами монет, которые располагались на правой чашке весов.
Задачи и упражнения 263
Вторая строка содержит один из знаков: <, > или =.
• Знак < означает, что вес левой чашки меньше веса правой чаш-
ки весов.
• Знак > означает, что вес левой чашки больше веса правой чаш-
ки весов.
• Знак = означает, что вес левой чашки равен весу правой чашки
весов.
Ниже приведен пример файла входных данных.
Результаты определения номера фальшивой монеты сохра-
нить в текстовом файле. Если по выполненным взвешиваниям
нельзя выявить фальшивую монету, то в качестве результата со-
хранить 0. Ниже приведен пример файла результатов.
ФАЙЛ ИСХОДНЫХ ДАННЫХ
5 3
2 1 2 3 4
<
1 1 4
1 2 5
ФАЙЛ РЕЗУЛЬТАТОВ
ФАЙЛ ИСХОДНЫХ ДАННЫХ
б 4
3 1 2 3 4 5 6
<
1 1 2
2 1 3 4 5
<
2 4 5 2 6
>
ФАЙЛ РЕЗУЛЬТАТОВ
О
213. Грядки. Садовый участок, имеющий прямоугольную формуй
разбитый на квадратные клетки со стороной 1 метр, имеет шири-
ну п и длину т метров. На этом участке вскопаны грядки. Грядкой
называется совокупность клеток, удовлетворяющих условиям:
• из любой клетки этой грядки можно попасть в любую другую
клетку этой же грядки, последовательно переходя по грядке из
клетки в клетку через их общую сторону;
• никакие две грядки не пересекаются и не касаются друг друга
ни по вертикальной, ни по горизонтальной сторонам клеток
(касание грядок по углам клеток допускается).
Составьте алгоритм—программу расчета количества грядок на
садовом участке.
Исходные данные задаются в текстовом файле. В первой стро-
ке располагаютсядва числа: п и т, разделенные одним или неско-
лькими пробелами. Далее следуют п строк по т символов. Символ
264 Задачи и упражнения
«#» обозначает территорию грядки. Символ «.» соответствует не-
занятой территории. Других символов в исходном файле нет. В
выходной текстовый файл вывести количество грядок на садовом
участке.
Пример файла исходных данных:
5 10
## ##
. # . . # . . . # .
.### ##
. .## ##
#.
Выходной файл для данного примера имеет вид:
з.
214. Спуск с горы.
1
3 8
8 1 0
2 7 4 4
4 5 2 6 5
На рисунке показан числовой треугольник. Написать алго-
ритм—программу, которая находит максимальную сумму чисел в
вершинах треугольника при движении сверху вниз по ребрам тре-
угольника, т.е. из каждой вершины можно двигаться вниз налево
или вниз направо. Например, для данного треугольника маршрут
движения по узлам 7,8,1,7,2 дает сумму 25. Результаты расчетов
сохранить в текстовом файле.
Исходные данные представлены в текстовом файле, имеющем
следующую структуру. Первая строка: п — число уровней в треу-
гольнике. Вторая и следующие строки содержат описание треуго-
льника.
Пример файла исходных данных:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Пример файла выходных данных:
30
7 3 8 7 5
Задачи и упражнения 265
215. Перестановка корзин. Даны 2л корзин с шарамиЛ и В, распо-
ложенные в ряд, как на рисунке (п < 5).
ABBA  ABAB
Два места под корзины пустые. Другие п - 1 корзина содержат
шары А и п - 1 корзина — шары В.
Составьте алгоритм—программу, которая бы переставляла
корзины с шарами А с одной стороны, а корзины с шарами В с
другой стороны. Правила перемещения корзин: разрешается пе-
реставлять на пустые места любые две смежные (пара) непустые
корзины, сохраняя их первоначальный порядок.
Исходные данные представлены в текстовом файле со следую-
щей структурой. Первая строка: 2л — число корзин с пустыми ме-
стами. Вторая строка: | Л | 2? | .Я | Л | | | Л | 5 | Л | .51— исходное
расположение корзин. Расчетные данные сохранить в текстовом
файле со следующей структурой. Каждая строка — состояние
корзин после каждой перестановки.
216. Комнаты музея. Составьте алгоритм—программу определе-
ния числа комнат в музее и площади каждой комнаты в клетках.
План музея показан ниже на рисунке.
11 6 11 б
7 9 6 13
1 10 12 7
13 11 10 8
3
5
13
10
10
7
13
14 13
Цифровая карта Карта перекрытий
Площадь музея состоит из клеток: л рядов и т столбцов. В каждой
клетке такой матрицы (цифровая карта) проставляется число, в
котором кодируется наличие стен уданной клетки. Значение чис-
ла в каждой клетке является суммой чисел: 1 (клетка имеет стену
на западе), 2 (клетка имеет стену на севере), 4 (клетка имеет стену
на востоке), 8 (клетка имеет стену на юге). Например, если в клет-
ке стоит число 11 (11 = 8 + 2+1), то клетка имеет стену с южной
стороны, с северной и с западной.
Исходные данные представляются в текстовом файле со сле-
дующей структурой. Первая строка: п, т — размерность сетки.
Вторая строка, третья и следующие строки содержат описание
матрицы цифровой карты по строкам. Расчетные данные сохра-
нить в текстовом файле со следующей структурой. Число в пер-
вой строке — количество комнат в музее. Вторая строка — пло-
щадь каждой комнаты.
266 Задачи и упражнения
Пример файла исходных данных:
4 7
11 6 11 6 3 10 6
7 9 6 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. Первоначально все бокалы
стоят дном вниз. Над бокалами можно выполнять операцию «пе-
реворот». За один переворот ровно М(1 < М< N) любых бокалов
переворачиваются так, что те бокалы, которые стояли дном вниз,
оказываются перевернутыми вверх дном, а остальные из М бока-
лов ставятся вниз дном.
Составить алгоритм-программу, которая за минимальное ко-
личество шагов позволяет перевернуть все бокалы вверх дном или
определяет, что это сделать невозможно.
Исходные данные N, Mзадаются в текстовом файле. Результа-
ты последовательных переворотов сохранить в текстовом файле.
218. Течение воды. Все улицы в некотором городе имеют направ-
ление с севера на юг (п улиц) или с запада на восток (т улиц), как
на рисунке. Для каждого перекрестка улиц задается высота его
над уровнем моря: H[i, j ] , i = l,M, j = ,N — матрица высот над
уровнем моря. Требуется написать алгоритм—программу, кото-
рый находит путь от перекрестка А до перекрестка В или в обрат-
ном направлении. Путь должен проходить по таким улицам, ко-
торые не ведут к возвышенностям (уровень при движении не дол-
жен возрастать).
м
N
Исходные данные представлены в текстовом файле со следую-
щей структурой. Первая строка: М, N — размерность матрицы и
Задачи и упражнения 267
улиц. Вторая строка: А = (iaja), B= (ib,jb) — координаты двух пе-
рекрестков. Третья и следующие строки определяют значения
элементов матрицы высот H[i,j}, i- ,M,j= ,N. Результаты рас-
четов сохранить в выходном текстовом файле со следующей
структурой. Каждая строка — координаты и высоты перекрест-
ков, через которые пролегает маршрут.
219. Бомба. Требуется составить алгоритм—программу для опре-
деления наименьшей окружности (центр и минимальный ради-
ус), охватывающей не менее k из п заданных точек на плоскости.
Исходные точки на плоскости (хь j>j), (jc2, у2),•••, (х„, уп) задаются в
текстовом файле. Результаты расчетов (координаты центра
окружности, радиус ее и точки (;с„ >>,), попадающие в окружность)
сохранить в текстовом файле. Решите эту же задачу, но искомая
окружность должна включать все заданные точки (х„ yt).
220. Ханойская башня. Задача о ханойской башне проиллюстриро-
вана на следующем рисунке:
А В С
п-
и
Имеются три колышка А, В, С. На колышекА нанизано п дисков
радиуса 1, 2,..., п (каждый с отверстием в середине) таким обра-
зом, что диск радиуса /является /-м сверху. Задача состоит в том,
чтобы переместить все диски на колышек Стаким образом, чтобы
диск радиуса / был опять /-м сверху. За один раз разрешается пе-
ремещать только один диск с любого колышка на любой другой
(можно пользоваться колышком В). При этом должно выполня-
ться следующее условие: на каждом колышке ни в какой момент
никакой диск не может находиться выше диска с меньшим номе-
ром. Составить рекурсивную алгоритм—программу требуемых
перемещений дисков. Результаты расчетов: состояние каждого
колышка на каждом шаге перекладывания дисков сохранять в
текстовом файле.
221. Числа. Дана последовательность п различных между собой
целых чисел аг
, а2
,..., а„. Трансформацией называется следующая
последовательность действий: некоторые из чисел увеличивают-
268 Задачи и упражнения
ся на 1, если в последовательности оказываются два одинаковых
числа, то одно из них исключается из последовательности. Вы-
полним данную трансформацию k раз, с целью достигнуть мини-
мального количествачисел в последовательности а{, о2,..., а„. Со-
ставить алгоритм—программу, которая вычисляет;? — количество
чисел, оставшихся в последовательности. Исходные данные n,kw.
последовательность а, а2,..., а„ задаются в текстовом файле. Най-
денное число р сохранить в текстовом файле.
Пример файла исходных данных:
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, 32, 33, 36, 37, 38, 41, 42, 43, 44, 45,
48,49,50,51,52,53,54,59,60
0 — признак отсутствия такой скорости.
226. Парламент. Парламент состоит из N делегатов. Делегаты
должны разделиться на группы (фракции), количество депутатов
в каждой группе отличается от количества депутатов в любой дру-
гой группе. Каждый день каждая фракция посылает одного пред-
ставителя в президиум. Парламент начинает работу в том случае,
когда состав президиума отличен от составов президиумов пре-
дыдущих дней.
Составьте алгоритм—программу, которая бы определяла опти-
мальное число фракций и количество делегатов в каждой из них
так, чтобы парламент мог работать как можно дольше. Число де-
легатов задается в исходном текстовом файле. Рассчитанные зна-
чения количества делегатов в каждой фракции, сортированные
по возрастанию, сохранить в выходном текстовом файле. Приве-
дем примеры оптимальных расчетов для N=7 и N=31.
Файл исходных данных
7
31
Файл выходных данных
3 4
2 3 5 6 7 8
227. Кот и Лиса. Дан ориентированный граф Г= (X, U, Ф), верши-
ны которого являются позициями в следующей игре. Участвуют
два игрока — Кот и Лиса. Они двигают фишку из позиции в пози-
цию по дугам графа. Множество позиций .^разделено на два под-
множестваХ= К<и Л. В позициях Л'ход делаетЛиса, а в позициях
К— Кот. Если игра находится в позиции х е X, владелец этой по-
зиции выбирает произвольную выходящую дугу (х, у) е С/и двига-
ет фишку из х в у. Игра начинается в некоторой позиции. Лиса
выигрывает, если фишка оказалась в фиксированной вершине
Z 6 X. Если за любое количество ходов фишка не попадает в эту
позицию z 6 X, то выигрывает Кот.
272 Задачи и упражнения
Составить алгоритм—программу, которая определяет все вы-
игрышные стартовые позиции для Лисы при оптимальной стра-
тегии обеих сторон. Считаем, что Х={1, 2,..., п), <п< 1000.
Исходные данные представлены в текстовом файле, имеющем
следующую структуру.
Первая строка: п, т, z, где п — число вершин, т — число дуг,
Z — заключительная позиция.
Со второй строки записаны: Ь1} Ь2,..., Ъп и ху± х^ ... х„ут, где
bj=l, если вершина i принадлежит Лисе; bt = 0, если вершина i
принадлежит Коту; xyt — список дуг графа, х, — начальная вер-
шина, У! — конечная вершина соответствующей дуги.
Все параметры — целые числа, разделенные пробелами.
Пример входного файла:
7 12 7
0 1 0 0 0 1 0
1 2 1 4 1 3
2 4 2 5
3 1 3 6 3 7
4 3 4 6
5 6
6 7
Результат представить в текстовом файле, в котором записать п
целых чисел с1г
с2
,..., с„, где с, = 1, если позиция /выигрышнаядля
Лисы; иначе с, = 0.
Для примера результаты расчетов представляются строкой:
0 1 0 0 1 1 1
228. Ящик с молоком. Ящик имеет п х п ячеек для бутылок с моло-
ком. Мистер Смитдля каждого столбца и каждой строки заготовил
отдельный листок бумаги, где записал наличие или отсутствие в
ячейке бутылки молока: 1 — ячейка занята молоком, 0 — ячейка
не занята молоком, но забыл проставить на каждом листе чему он
соответствует: строке или столбцу и все это вложил в коробку. В
пути ящик попал под дождь, и часть записей на листах пропала.
Испорченные цифры 1 и 0 были заменены цифрой 2. Составить
алгоритм—программу, которая по таким записям восстанавливает
исходное расположение бутылокс молоком, т.е. определить, какие
записи относятся к строкам, а какие — к столбцам. Исходные ис-
порченные записи по строкам и столбцам задаются в текстовом
файле. Результаты сохранить в текстовом файле.
Задачи и упражнения 273
Пример.
Исходные данные
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
01210
21120
21001
12110
12101
12101
00011
22222
11001
10010
Восстановленные
6
Q
3
2
8
4
1
1
1
1
0
данные
1 10
0
1
1
1
0
1
0
0
1
0
7
0
0
0
1
1
5
1
1
1
0
1
229. Длина объединения. Текстовый файл содержит целые числа:
«!, 6j, о2
! Ь2
,..., а„, Ьп
. Эта последовательность определяет на оси
ОХп отрезков. Составить алгоритм—программу, которая опреде-
ляет длину объединения всех отрезков. Результаты расчетов со-
хранить в текстовом файле. Исходные данные представлены в
текстовом файле со следующей структурой. Первая строка: п —
количество отрезков. Вторая строка, третья строка и т.д: a,, bt
—
параметры соответствующего отрезка. Результаты расчетов со-
хранить в текстовом файле.
Пример файла исходных данных:
з
О 2
-1 1
О 1.
Пример файла выходных данных:
з.
230. Площадь объединения. Условие данной задачи — это условие
предыдущей задачи, где вместо отрезков на прямой рассматрива-
ются прямоугольники на плоскости, стороны которых паралле-
льны осям координат. Составить алгоритм—программу определе-
ния площади объединения таких прямоугольников.
231. Прямоугольные области. Условие данной задачи — это усло-
вие предыдущей задачи. Однако требуется составить алго-
ритм—программу определения количества областей, на которые
границы прямоугольников разбивают плоскость.
274 Задачи и упражнения
232. Несвязные области. На плоскость ХОYпроизвольным обра-
зом размещают 7Vпроизвольных прямоугольников со сторонами,
параллельными осям координат. Взаимное расположение прямо-
угольников допускает их пересечение. Требуется составить алго-
ритм—программу определения количества несвязных областей,
на которые прямоугольники разбивают плоскость XOY. Входные и
выходные данные. В первой строке входного файла содержится
число N. В каждой из следующих Nстрок располагаются коорди-
наты одного прямоугольника: (я,, Ь,) — координаты левого верх-
него угла; (с/, d,) — координаты правого нижнего угла. Выходной
файл должен содержать единственное число, равное количеству
несвязных областей.
Пример файла исходных данных:
б
1 3 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
3 3 4 3 4 3 5 3
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
2
1
0
0
1
2
3
1
2
2
3
2
0
0
2
2
3
2
2
3
2
0
0
2
3
2
3
4
3
0
0
2
3
3
Задачи и упражнения 275
4 0 4 1 4 1 4 2
5 0 5 1 5 1 5 2 5 2 5 3
Пример файла результатов:
11 — площадь участка
234. Совмещение ломаных. Две ломаные построены по ребрам се-
точной области с целочисленными координатами. Требуется со-
ставить алгоритм—программу проверки совпадения двух лома-
ных, составленных из отрезков, с точностью до параллельного
переноса и поворота на 90°, 180°, 270°. Исходные данные — число
отрезков ломаных и значения координат их концов — определя-
ются в текстовом файле. Выходной файл результатов должен со-
держать признак 1, если ломаные совпадают, и 0 — в противном
случае.
Пример файла исходных данных:
4 — количество отрезков первой ломаной
0 0 1 0 3 0 2 0 1 0 2 0 3 0 3 1
2 — количество отрезков второй ломаной
1 1 1 4 0 4 1 4
Пример файла результатов:
1 — ломаные совпадают.
235. Деление на равные половины. Текстовый файл содержит по-
следовательность целых чисел — веса элементов: а^, а2
,..., а„. Со-
ставить алгоритм—программу деления этих предметов на две
группы так, чтобы общие веса двух групп были максимально
близкими друг к другу. Результаты расчетов сохранить в тексто-
вом файле. Исходные данные представлены в текстовом файле со
следующей структурой. Первая строка: п — количество чисел.
Следующие строки содержат веса элементов а/.
Пример файла исходных данных:
5
6 3 1 4 5 .
Пример файла выходных данных:
б 3 1 — первая группа
4 5 — вторая группа.
236. Простой круг. Натуральные числа 1, 2,..., я (я — чётное чис-
ло) располагают по кругу как на диаграмме. Первое число по кру-
276 Задачи и упражнения
гу всегда должно быть 1. Все остальные числа
располагаются таким образом, чтобы сумма
двух соседних чисел по кругу была простым
числом, начиная с 1. Составить алго-
ритм—программу определения всех указанных
расстановок. Исходное число п задается в тек-
стовом файле. Результаты расчетов сохранить
в текстовом файле.
Пример файла исходных данных Пример файла результатов
1 4 3 2 5 6 1
1 2 3 8 5 6 7 4 1
1 2 5 8 3 4 7 6 1
237. Почтальон. Дана последовательность из /Уулиц (по названи-
ям). Каждая улица соединяет два перекрестка. Первая и послед-
няя буквы названия улицы определяют два перекрестка для этой
улицы. Длина названия улицы определяет стоимость проезда по
ней. Все названия улиц состоят из строчных символов алфавита.
Например, название улицы «computer» показывает, что улица на-
ходится между перекрестками «с» и «г», адлина ее 8. Нет улиц, ко-
торые имеют одинаковые первые и последние символы. Есть не
более одной улицы, напрямую соединяющей два любых перекре-
стка. Всегда есть путь между любыми двумя перекрестками. Чис-
ло улиц с данным перекрестком называется степенью этого пере-
крестка. Есть не более двух перекрестков нечетной степени. Все
остальные перекрестки — четной степени. Составить алго-
ритм—программу определения минимальной стоимости проезда
по всем улицам, по крайней мере, один раз. Путешествие должно
начаться и закончиться на одном и том же перекрестке. Стои-
мость проезда по улице равна ее длине.
Пример входного файла
3
one
two
three
Пример выходного файла
11
238. Пересечение с отрезками. Имеются Nотрезков, концы кото-
рых задаются двумя парами точек на плоскости: (*![/], yl[i) и
(x2[i], y2[i]). Требуется составить алгоритм—программу определе-
Задачи и упражнения 277
ния такой прямой линии, которая пересекает как можно большее
количество заданных отрезков. Исходные данные определяются
в текстовом файле, имеющем следующую структуру. Первая
строка: N — количество отрезков. Вторая и следующие строки:
xl[i], yl[i] и x2[i], y2[i] — пары точек на плоскости (концы отрез-
ков). Результаты расчетов сохранить в выходном текстовом фай-
ле^ имеющем следующую структуру данных. Строки файла — но-
мера отрезков в возрастающем порядке, которые пересекает най-
денная прямая. Если найденная прямая линия проходит через
концы отрезков, то это учитывать как пересечение.
239. Простые суммы. Даны числа от 1 до л, 1 < п < 5000. Требуется
составить алгоритм—программу разбиения данных чисел на ми-
нимальное количество групп, в каждой из которых сумма являет-
ся простым числом. Например, при п = 8 такими группами могут
быть: {1,4, 5,6, 7}, {2, 3, 8}. Примечание: число 1 не считается про-
стым. Файл исходных данных содержит число я. Выходной файл
должен содержать п чисел (номера групп), которые показывают в
какую группу входит соответствующее по порядку число. Для ну-
мерации групп должны использоваться идущие подряд натураль-
ные числа, начиная с единицы.
Пример файла исходных данных:
Пример файла выходных данных:
1 2 2 1 1 1 1 2 .
240. Движение плота. Квадратное озеро, покрытое многочислен-
ными островами, задается матрицей размером NX N. Каждый эле-
мент матрицы — либо символ «#» — решетка, обозначающий ост-
ров, либо символ «—» — минус, обозначающий участок воды. В
верхнем левом углу озера находится квадратный плот размером
М х Мклеток. За один шаг плот может перемещаться на одну клет-
ку по горизонтали или вертикали. Составить алгоритм—программу
для определения минимального числа шагов, за которое плот мо-
жет достигнуть правого нижнего угла озера. Входной файл исход-
ных данных содержит числа Ми N. В следующих Nстроках распо-
лагается матрица, представляющая озеро. Выходной файл должен
содержать единственное число — количество необходимых шагов.
Если правого нижнего угла достичь невозможно, то выходной
файл должен содержать число —1 (минус один).
278 Задачи и упражнения
Пример файла исходных данных:
—#-
#-##-
—1#
Выходной файл для данного примера:
18.
241. Пират в подземелье. В поисках драгоценных камней пират
проваливается в подземелье. План подземелья — матрица NX M
комнат с драгоценными камнями. Камни из одной комнаты име-
ют одинаковую стоимость. Пирату в каждой комнате разрешается
взять с собой лишь один камень и следовать в любую другую со-
седнюю с ним комнату. Каждую из комнат пират может посещать
неоднократно. Требуется составить алгоритм—программу опре-
деления маршрута посещения пиратом К комнат лабиринта та-
ким образом, чтобы он набрал камней на максимально возмож-
ную сумму. Входные и выходные данные. В первой строке входного
файла содержатся числа N, Ми К. В следующих ./Vстроках распо-
лагается матрица N •*. М лабиринта. Каждый элемент матрицы
представляется стоимостью камня соответствующей комнаты.
Маршрут начинается с левой верхней угловой комнаты лабирин-
та. Выходной файл должен содержать единственное число, рав-
ное общей стоимости взятых с собой камней.
Пример файла исходных данных:
3 4 7
1 1 1 1
1 1 2 1
1 1 2 3
Выходной файл для данного примера:
12.
242. Оставить условие задачи №241 и предписать пирату, чтобы
он за К шагов еще и вернулся в начальную комнату лабиринта.
Задачи и упражнения 279
243. Задана Д.Андре. Составить алгоритм—программу поиска
всех способов заполнения числами 1, 2,..., п массива из п ячеек
так, чтобы во всех строках и столб-
цах они располагались в возраста-
ющем порядке (слева-направо и
сверху—вниз). Исходное число п
задается в текстовом файле. Резу-
льтаты заполнения сохранить в
файле результатов.
244. Сумма чисел. Дано натуральное число т. Вставить между не-
которыми цифрами: 1, 2, 3, 4, 5, 6, 7, 8, 9, записанными именно в
таком порядке, знаки +, - так, чтобы значением получившегося
выражения было число т. Например, если т = 122, то подойдет
следующая расстановка знаков: 12 + 34-5-6 + 78 + 9. Требуется
составить алгоритм—программу определения всех расстановок
знаков +, -, отвечающих условию задачи. Исходное число т зада-
ется во входном текстовом файле. Выходной текстовый файл дол-
жен содержать найденные расстановки знаков. Если требуемая
расстановка знаков невозможна, то выходной файл должен со-
держать число —1.
245. Обслуживание авиалиний. Имеется некоторый город М, кото-
рый связан маршрутами с городами А^,А^,...,Ап
. Пусть, согласно
расписанию, маршрут MAjMобслуживается в интервале времени
[cijjb,]. Другими словами, я, — это тот момент, начиная с которого
самолет связан с маршрутом MAt
M, a bt
— тот момент, когда эта
связь прекращается. Таким образом, задано п временных интер-
валов [а,,6,], / = 1, 2,..., п. Требуется составить алгоритм—програм-
му определения минимального числа самолетов, достаточного
для обслуживания всех рейсов.
Файл исходных данных Файл результатов
3 — количество городов
1 2 — интервалы времени
2 3
3 5
1 самолет на все рейсы
280 Задачи и упражнения
2 самолета на все рейсы5 — количество городов
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. Таблица инверсий. Составить алгоритм—программу определе-
ния таблицы инверсий d^d2
...dn
перестановки (оь
д2
,..., а„), где
dj — число элементов, больших j и расположенных левее j
(см.п. 1.13). Исходные данные — число п и произвольная переста-
новка чисел 1, 2,..., п — определяются в текстовом файле. Выход-
ной файл результатов должен содержать найденную таблицу ин-
версий.
Пример файла исходных данных:
5 — число п
5 3 4 2 1 — перестановка
Пример файла результатов:
4 3 1 1 0 — таблица инверсий.
Ответы
1. Множество D всех сочетаний С% разобьем на два непересекаю-
щихся подмножества D = Dl
и D2
, где Д n D2
= 0. Множество Z)t
включает все сочетания с произвольным фиксированным эле-
ментом, |Dj | = C^Jj
1
. Множество Z>2
включает все сочетания без вы-
деленного фиксированного элемента, D2
 = C*_l
. Следовательно,
2. Используйте бином Ньютона (l+jc)" =
3. Применить индукцию по п. 7. 2".
л
8. Воспользуйтесь тождеством (а + b)" = ^С„а Ь"~ .
k=0
9. Воспользуйтесь тождеством (1 + х)
т
( + х)" = (1 + х)
10. Воспользуйтесь тождеством (! + (! + 1))" = 3".
11—13. Воспользуйтесь тождеством (1+х)" =
14. Указание. Воспользуйтесь полиномиальным разложением
формулы (1 + 1 + ... + 1)" = k".
15.21. 16. С„2
+2
. 17. 2п2
х2п2
. 18. 2л2
х (2л2
- 2л). 19. 2пт
.
20.Л5
3
,С431 21. З6
. 22.63. 23. С„2
—двусторонних словарей, Л„2
-
односторонних словарей, п — словарей при переводе по циклу.
24. Д£. 25.P(5,7,3)=3f5[=C1
5
5C1
7
0C3
3
. 26.С%+т
. 27. С^.
28. Л^ +А^ +АП — учитывается порядок имен. 29. Р(2,2,2,1,1).
ЗО.С„*С*И 31. 2л!л!и2л!л!/2л = я!(л-1)!. 32. q4
^ 4!.
33. «!/2л, где деление на число п обозначает совпадение соседей
при циклическом перемещении исходной перестановки; в цифре
2 учитываются одни и те же соседи при отраженном (зеркальном)
расположении исходной перестановки.
34. Cf0
(Cf0
-l)(Cf0
-2) =А^ . 35. C^C^qj .
36. С„
6
((С6
2
С4
2
С2
2
)/3!) =15cJ. 37. С„
6
((С6
2
С4
2
С2
2
)/3!) =15С„
6
.
38. ((2и)!/(2!)")/«! — неупорядоченное разбиение множества.
282 ____ Ответы
39. См. решение задач 7 и 8. 40. 9!-С^7!3!+С3
2
5!3!3!3!-С3
3
3!3!3!3!.
АЛ г
1
г
1
) r
w
г
110
г-ю г
110
r
l
ri r
2
r
s
41. ^4*"48'
U
52 -*-48>
|
-52 ~*-48 ^
1
-4
1
-48'
и
4
(
-48 •
42.(С4
С
3
з)(С'з)
3
+(С
2
(С
2
з)
2
ХС1
1
3
)
2
. 43. 3
ffl
44. З
17
. 45. т".
±( С
т
~1 47 Г""-1 _/"""-! гчп-2 fm-k-lчи<
Si+wi-Г
ч /
' ^(п-/л)+ш-1 ~Si-l ' *"(я-*)+т-2'
|
"(л-£а, )+«-*-! '
"""1
"""1
"""1 2 2 6
"""1
51. 5
4
, А% . 52. С|6. 53. С^ , С|6 -С^ -СС^ -С2
^ .
55. Р(3, 2,3,1). 56. C^Cj
3
. 57. (1 + a i
)(l + a2
)...(l +а„),
l-n°l 1-^2 j _ а„
- * -- — ... - - — . 59. п - [п/р] — столько чисел среди 1, 2,...,
1-Л 1-Л !-Л
и не кратных^. Всего произведений С*, тогда число произведе-
ний, кратных.р, равно С„ -С%_[п/р]
. 60. л! - т(п -т+) (объеди-
нить т элементов в один элемент).
61. 2(С
2
)
2
=5J±!L _ способов поставить две ладьи так, чтобы
они не угрожали друг другу. (С},)
2
(п-)=п
2
(п-) — способов по-
ставить две ладьи так, чтобы они угрожали друг другу. Для ответа
на вопрос задачи осталось сравнить указанные числа.
63. С
2
0
+С
2
0
=90. 66. 18. 68. 31. 71. С*;^, С*;/.
72. 205223000, см. п. 1.13. 73. 27354186, см. п. 1.13.
75. Указание: воспользуйтесь тем, что перестановка двух соседних
меток N и М не оказывает влияния на произведение 2"~
т
.
76.3CJ,2". 77. (foi)!/(OH)"ii!). 78.
79. (С№/2)-(С$сЦ). 80. (C
2
0
C8
2
C6
2
C4
2
C2
2
)/5! =
81. 9!/((1!)
1
(2!)
4
1!4!). 82. 9!/((3!)
3
3!). 83. Р(2,2,2,2,2,2,1, 1,1,1).
84. Cf5
Cf0
. 85. 4
8
-С^З
8
+С|2
8
-С4
3
1
8
— воспользоваться форму-
лой включений и исключений для свойств: Р, — пустой /'-и этаж,
...
89. Cj;j_г
90. С^^^ -1, где -1 обозначает число 0.
91. С^+1
. 92. C*+k
. 93. Схема посева сортов пшеницы должна соот-
ветствовать латинскому квадрату т х т.
94. С^. 95. Г. 96. ХНУ С*(Л-/Г.
/=о
Ответы 283
k-r k-r
07 W IV'Г"1
Cr+l
(b r /V -r""W 1V Г" CJ- г Лш
"'• 2—i*~ ' r+i^k 1^~Г—1) ~*-'k2-i^~ ' k-r ~ ~ > '
i=0 i=0
m m t
*=o *=o
m
*
/1=0 /UO
m-r m-r t
/UO ' A=0
102. Введем обозначения. Д — свойство, что k-я пара враждую-
щих рыцарей сидит рядом, k = 1,2,..., л. ДО) — размещение рыца-
рей, которые не обладают ни одним из указанных свойств, т.е.
требуемые размещения по условию задачи. ДО) = Ж(0) - W(l) +
+ W(2) - ... + (-l)"W(n), где W(k) — количество размещений ры-
царей, когда k и более враждующих пар сидят вместе. Объединим
каждую из k указанных пар в один объект. Тогда имеем 2л - k объ-
ектов, которые можно расположить (2л - £)! способами. В каждой
из k заданных пар врагов можно поменять местами 2
k
способами.
Выбор k враждующих пар можно сделать C
k
способами. Следова-
п
тельно, искомое число равно ДО) = V^(-l) C
k
2 (2n-k)l
k=0
103. 542. 104. 734. 106. 20%, 60%, 70%. 107. 2, 6, 3.
109—110. Решение подобного уравнения рассмотрено в п.1.7.
111. |°5
!
I'^yV- 112. С„
3
_2
. Действительно, выбирая из л-2 три
различных предмета С„
3
_2
способами, можно однозначно отобра-
зить их в разбиения, требуемые по условию. Если выбраны пред-
меты с номерами ^ < k2
< k3
, то в исходном ряду их номера будут
Ш.
2 + 1 < &з + 2.
115. 2", ^—. 116. п + 1. 117. Количество прямоугольников размера
i xj равно (л - / + 1) х (n -j + 1). Каждый прямоугольник учиты-
вается в сумме столько раз, какова его площадь. Тогда сумма рав-
на
284 Ответы
118. а) Л!С*С* +2(Л;-1)!С*-
1
С*-
1
+(k-2)C
k
n~
2
C
k
m
2
; в) п + 1.
119. _4л__-Ш-+ _?!_. по. (П(п + 1)/2Г. 121. 1) 7 + 3";
2)и2п =[9•З
2
"+МЛ/10,«2п+1 =[9•3
2n+1
+3•(-1Л/10,п>0;
3) (+9)"; 4) (+4)"; 5) (-!)"(« - 1) + 2; 6) 2".
122. 1) С
2
+2 -2С
2
+1 +2С
2
; 2) -2(-4)" + 3 • 2" + 5";
Ш 1 ,1 Л ПЯ-1. 0 ^ . D . Ч". -54 X l J.T-V-' | . П
| I"'VJ
. II Л :
125. an =2
n+l
(2n +7), bn =2"
+1
(-2я~3).
126. 4
129. Использовать формулу включений и исключений.
130. a) R(x, С] = х(1 + х)3
+ (1 + Зх + ла
)(1 + х).
133. а) 2", с) 2 • З""
1
. Составить рекуррентное соотношение
(см.п.3.3). 134. а)
2
"
+(
з
1)Л2
, б) |(3"-
J
-(-l)"'
1
). Составить рекур-
рентное соотношение (см.п.3.3). 135. 4".
л
136. С2„2.](С„ ) =(С2„) . Воспользуйтесь производящей функ-
2" 2«
цией x + — +>> + — = х + ~ у + — всех ломаных
маршрутов длины 2л по рассматриваемой сетке. Свободный член
в правой части является искомым числом для замкнутых маршру-
тов (см. п.3.4). 137. С^, (см. указание к предыдущей задаче).
183. а) 14; б) 18; в) 9. 184. а) 43; 6)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
петля 110
подграф 111
полный 112
простой 112
псевдограф 111
связный 113
сильно 113
слабо 113
транспортная сеть 156-159
фундаментальные циклы 172—176
хроматический 194
цепь ИЗ
простая 113
замкнутая 113
гамильтонова 113
эйлерова 130
цикл 113
простой 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

More Related Content

PPSX
The definition of CLT By Alireza Sadeghiyan - www.academia.edu
PPTX
L'art de questionner
PDF
435.элементы теории множеств и математической логики теория и задачи
PDF
математический анализ. интегральное исчисление учебное пособие
PDF
Phép tính vector và tensor trong vật lý lý thuyết
PDF
2014-2015_Алгор-структ_Раб-прогр_Мансуров
DOCX
Урок физики "График алгебраических функций при решении задач с физическим сод...
PDF
РЕАЛИЗАЦИЯ РАДИАЛЬНО-БАЗИСНОЙ НЕЙРОННОЙ СЕТИ НА МАССИВНО-ПАРАЛЛЕЛЬНОЙ АРХИТЕК...
The definition of CLT By Alireza Sadeghiyan - www.academia.edu
L'art de questionner
435.элементы теории множеств и математической логики теория и задачи
математический анализ. интегральное исчисление учебное пособие
Phép tính vector và tensor trong vật lý lý thuyết
2014-2015_Алгор-структ_Раб-прогр_Мансуров
Урок физики "График алгебраических функций при решении задач с физическим сод...
РЕАЛИЗАЦИЯ РАДИАЛЬНО-БАЗИСНОЙ НЕЙРОННОЙ СЕТИ НА МАССИВНО-ПАРАЛЛЕЛЬНОЙ АРХИТЕК...

Similar to Иванов Б.Н. Дискретная математика. Алгоритмы и программы. Москва. 2003 (20)

PDF
Основы MATLAB. Лекция 1.
DOCX
конспект урока график алгебраических функций при решении задач с физическим с...
PDF
Тензорная алгебра и тензорный анализ Горлач.pdf
PPT
Формирование технологической и информационной компетентности школьников при и...
PDF
дискретная математика учебное пособие для студентов заочного факультета
PPT
презентации лекций10 13
PDF
1 курс ТПУ знание VBA для MS Excel
PPTX
о лаб мод и упр 2014
PPT
Лекция 14 Матрицы
PPT
практика 12
PPT
01 вводная
DOCX
минимум олимпиадника
PDF
651.локальные методы анализа динамических систем учебное пособие
PDF
651.локальные методы анализа динамических систем учебное пособие
DOCX
Урок математики "Решение систем линейных уравнений"
DOCX
Word
DOCX
Интегрированный урок "информатика + математика" в 10 классе "Преобразования г...
Основы MATLAB. Лекция 1.
конспект урока график алгебраических функций при решении задач с физическим с...
Тензорная алгебра и тензорный анализ Горлач.pdf
Формирование технологической и информационной компетентности школьников при и...
дискретная математика учебное пособие для студентов заочного факультета
презентации лекций10 13
1 курс ТПУ знание VBA для MS Excel
о лаб мод и упр 2014
Лекция 14 Матрицы
практика 12
01 вводная
минимум олимпиадника
651.локальные методы анализа динамических систем учебное пособие
651.локальные методы анализа динамических систем учебное пособие
Урок математики "Решение систем линейных уравнений"
Word
Интегрированный урок "информатика + математика" в 10 классе "Преобразования г...
Ad

More from Yura Maturin (20)

PPT
спортзал презентація (ремонт)
PDF
Д.В. Щедровицкий. Сияющий Коран.
PDF
Д.В. Щедровицкий. Книга Даниила.
PDF
Д.В. Щедровицкий. Книга Иисуса Навина.
PDF
Д.В. Щедровицкий. Введение в Ветхий Завет. Бытие.
PDF
Д.В. Щедровицкий. Введение в Ветхий Завет. Пятикнижие Моисеево.
PDF
Березанский Ю, Функциональный анализ.
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 9. Квантовая ...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 8. Квантовая...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 7. Физика спл...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике.6. Электодинам...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 5. Электричес...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 3. Излучение....
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 4. Кинетика. ...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 2. Пространст...
PDF
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 1. Современна...
PDF
Холл М. Теория групп.
PDF
Дороговцев А.Я. Математический анализ.
PDF
Дороговцев А.Я. Элементы общей теории меры и интеграла.
PDF
Атья М., Макдональд И. Введение в коммутативную алгебру.
спортзал презентація (ремонт)
Д.В. Щедровицкий. Сияющий Коран.
Д.В. Щедровицкий. Книга Даниила.
Д.В. Щедровицкий. Книга Иисуса Навина.
Д.В. Щедровицкий. Введение в Ветхий Завет. Бытие.
Д.В. Щедровицкий. Введение в Ветхий Завет. Пятикнижие Моисеево.
Березанский Ю, Функциональный анализ.
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 9. Квантовая ...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 8. Квантовая...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 7. Физика спл...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике.6. Электодинам...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 5. Электричес...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 3. Излучение....
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 4. Кинетика. ...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 2. Пространст...
Фейнман Р., Лейтон Р., Сэндс М. Фейнмановские лекции по физике. 1. Современна...
Холл М. Теория групп.
Дороговцев А.Я. Математический анализ.
Дороговцев А.Я. Элементы общей теории меры и интеграла.
Атья М., Макдональд И. Введение в коммутативную алгебру.
Ad

Иванов Б.Н. Дискретная математика. Алгоритмы и программы. Москва. 2003

  • 1. ТЕХНИЧЕСКИЙ & УНИВЕРСИТЕТ Б. Н. ИВАНОВ дискретнаяматематика АЛГОРИТМЫ И ПРОГРАММЫ Москва Лаборатория Базовых Знаний 2 0 0 3
  • 2. ББК 32.973.3 УДК 519(075.8)+681.142.2 И 20 Рецензенты: кафедра математического моделирования и информатики ДВГТУ (зав. кафед- рой доктор физико-математических наук, профессор А. А. Буренин); доктор физико-математических наук, профессор В. В. Катрахов Иванов Б. Н. Дискретная математика. Алгоритмы и программы: Учеб. по- И20 собие/Б. Н. Иванов. — М.: Лаборатория Базовых Знаний, 2003. — 288 с.: ил. ISBN 5-93208-093-0 Книга посвящена современному курсу дискретной математики. Теоретиче- ские основы курса сопровождаются практически значимыми алгоритмами, реа- лизованными в конкретныхкомпьютерныхпрограммах. Книгу можно рассматри- вать в качестве хорошего справочника методов и алгоритмов дискретной матема- тики, широко применяемых в практическом программировании. Пособие рассчитано на студентов специальностей, учебные планы которых предполагают изучение каких-либо разделов курса дискретной математики, в первую очередь на математиков-прикладников, а также программистов, занятых разработкой прикладного программного обеспечения. ББК 32.973.3 УДК 519(075.8)+681.142.2 Серия «Технический университет» Учебное издание Иванов Борис Николаевич ДИСКРЕТНАЯ МАТЕМАТИКА. АЛГОРИТМЫ И ПРОГРАММЫ Художник Н. Лозинская Компьютерная верстка В.Носенко Подписано в печать 22.04.01. Формат 60х90'/1в . Гарнитура Ньютон. Бумага офсетная. Печать офсетная. Усл. печ. л. 18,0. Тираж 3000 экз. Заказ 2697 Издательство «Лаборатория Базовых Знаний» Телефон (095)955-0398. E-mail: lbz@aha.ru Лицензия на издательскую деятельность № 066140 от 12 октября 1998 г. Отпечатано с готовых диапозитивов в полиграфической фирме «Полиграфист«.160001, г. Вологда, ул. Челюскинцев, 3. © Б. Н. Иванов, 2002 ISBN 5-93208-093-0 © Лаборатория Базовых Знаний, 2003
  • 3. Содержание Предисловие 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. Многочлены попаданий . 6 3
  • 4. Содержание Глава 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 Глава б. Введение в теорию графов. Алгоритмы на графах 110 6.1. Основные понятия и определения ПО 6.2. Представления графов 114 6.2.1. Матрица смежности графа 114 6.2.2. Матрица инцидентности графа . 1 1 5 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
  • 5. Содержание 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
  • 6. Предисловие радиционно кдискретной математике относят такие облас- ти математического знания, как комбинаторика, теория чисел, математическая логика, теория алгебраических систем, теория графов и сетей и т.д. Дискретная математика всегда оставалась наиболее динамичной областью знаний. Сегодня наиболее зна- чимой областью применения методов дискретной математики является область компьютерных технологий. Это объясняется не- обходимостью создания и эксплуатации электронных вычисли- тельных машин, средств передачи и обработки информации, автоматизированных систем управления и проектирования. На грани дискретной математики и программирования появляются новые дисциплины, такие как разработка и анализ вычислитель- ных алгоритмов, нечисленное программирование, комбинатор- ные алгоритмы, алгоритмизация процессов. Дискретная математика и примыкающие к ней дисциплины изучаются во всех университетах и институтах, где осуществляется подготовка специалистов в области программирования, математики, а также по экономическим, техническим и гуманитарным направлениям. Цель написания учебного пособия — научить студентов не то- лько основам дискретной математики, но и показать ее роль в со- временных компьютерных технологиях, вооружить читателя ме- тодами, применяемыми для решения широкого круга задач. По- собие написано в доступной форме, достаточно полно и строго. Особое внимание в книге уделяется вопросу практической компьютерной реализации. В каждом конкретном случае содер- жится достаточно информации для применения рассматривае- мых методов на практике. В этом отношении много полезного найдет читатель, более склонный к программистской работе и интересующийся предлагаемыми алгоритмами в силу их практи- ческого использования. Для любого заинтересованного читателя рассматриваемый в пособии набор приемов и правил алгоритми- ческого характера может составить хорошую основу формирова- ния культуры разработки, анализа и программной реализации ал- горитмов.
  • 7. Комбинаторные схемы D этой главе будет сделан обзор комбинаторных формул, наиболее важных для вычислительных задач. Мы не ставим себе целью сделать этот обзор всеобъемлющим, а хотим сосредоточить внимание читателя на таких формулах, которые он мог бы недо- оценить или даже совсем не заметить. Заинтересованному чита- телю рекомендуется обратиться к специальной литературе. Введем некоторые важные обозначения. Множества будем обозначать заглавными буквами. Множества состоят из элемен- тов, которые будем обозначать малыми буквами. Так, запись а еА обозначает, что элемент а принадлежит множествуА. Такие мно- жества будем изображать перечислением элементов, заключая их в фигурные скобки. Например, {а, Ь, х, у}. Количество элементов в множестве называется мощностью и записывается как | А . Пусть имеются два множества А и В. Рассмотрим все пары эле- ментов при условии, что первый элемент берется из множестваЛ, а второй — из множества В. Полученное таким образом множест- во называется прямым произведением АхВ множеств Аи В. На- помним некоторые операции над множествами, которыми время от времени будем пользоваться. АхВ = {(а,Ь) а <=А, Ъ еВ} — прямое произведение множеств. А и5 = {х | х еА v х &В} — объединение множеств. А глВ - {х | х &А л х &В} — пересечение множеств. А В - {х | х еА л х &В} — разность множеств. 0 — пустое множество. U — универсальное множество. A =U А = {х | х еА}— дополнение множества. 1.1. Правило суммы Пусть Аи В— конечные множества такие, что А гВ =0,А = и В = п. Тогда I A u5 I = т + п.
  • 8. Предисловие Практическая компьютерная реализация большого количест- ва рассматриваемых задач потребовала включения в книгу специ- альных разделов дискретной математики, таких как представле- ние абстрактных объектов, сортировка и поиск, порождение ком- бинаторных объектов. Однако увеличение объема материала по- собия только лишь усилило многие вопросы, позволило уточнить их суть, а также придать общее звучание разделам курса, которые на первый взгляд никоим образом не связаны. Книгу можно рас- сматривать в качестве хорошего справочника методов и алгорит- мов дискретной математики, широко используемых в разработ- ках прикладного программного обеспечения. Уровень математической подготовки, требующийся для пони- мания материала книги, может меняться от главы к главе. Мини- мум необходимых познаний в программировании соответствует уровню первокурсника, уже научившегося писать довольно про- странные программы. Необходимый уровень математического образования соответствует типичной подготовке студента, про- слушавшего ряд основных математических курсов, таких как ма- тематический анализ, аналитическая геометрия, линейная алгеб- ра. Учебное пособие ориентировано на семестровый лекционный курс, читаемый автором на механико-математическом факульте- те Дальневосточного государственного технического университе- та. Без сомнения, книга может составить хорошую основу курсов, примыкающих к дискретной математике, таких как информати- ка, алгоритмизация процессов, анализ вычислительных алгорит- мов. Учебное пособие предназначено прежде всего для студентов специальности «Прикладная математика», а также студентов дру- гих специальностей, изучающих дискретную математику и про- граммирование. Книга будет полезна преподавателям, аспиран- там и научным работникам, применяющим методы дискретной математики в прикладных задачах.
  • 9. 1.3. Размещения с повторениями Интерпретация. Если элемент а еА можно выбрать т спосо- бами, а элемент b еВ — п способами, то выбор элемента х &А jB можно осуществить т + п способами. Пусть Xi,X2,...,Xk — попар- но непересекающиеся множества, Xt -,г Xj = 0, где / *j. Тогда, оче- видно, выполняется равенство k 1=1 j k 1=1 1.2. Правило прямого произведения Пусть А и В — конечные множества, | Л | = /и и В = п, тогда АхВ = т-п. Интерпретация. Если элемент а еЛ можно выбрать т способа- ми и если после каждого такого выбора элемент b &B можно вы- брать п способами, то выбор пары (а,Ь) <=А*Вв указанном поряд- кеможноосуществитьАхЦ =т•пспособами. Вэтомслучаегово- рят, что выбор элементов множества А не зависит от способа вы- бора элементов множества В. Пусть теперь Xl,X2,...,Xk — произвольные множества, Xt =nis / =!,£. Тогда Задача. Найти число маршрутов из пункта Мв пункт Л'' через пункт К. Из Л/в ЛГведут 5 дорог, из KB N— 3 дороги. Решение. Введем два множества: S= {^, s2 , s3 , s4 , s5 }— дороги из Мв К, T={t{ , t2 , t3 }— дороги из KB N. Теперь дорогу из Мв УУмож- но представить парой (s, tj), где /'= 1, 2, 3, 4, 5;у'= 1, 2, 3. Значит, S х Т — это множество всех дорог из Мв N, количество которых равно |5'хГ|=5-3=15. 1.3. Размещения с повторениями Задача формулируется следующим образом. Имеются пред- меты п различных видов яь а2 ,..., а„. Из них составляют всевоз- можные расстановки длины k. Например, a2 fl i fl 3 fl 3 fl 4 fl 3 a 2 fl i ~ Р ас " становка длины 8. Такие расстановки называются размещения- ми с повторениями из п по k (элементы одного вида могут повто- ряться). Найдем общее число расстановок, среди которых две расстановки считаются различными, если они отличаются друг
  • 10. 10 .Глава 1. Комбинаторные схемы от друга или видом входящих в них предметов, или порядком этих предметов. При составлении указанных расстановокдлины k на каждое место можно поставить предмет любого вида. Рас- смотрим множества XbX2,...,Xk такие, что Х1 = Х2 = ... - Xk = (аь а2,..., ап} . Тогда все размещения с повторениями составят мно- жество Х{ xX2x...xXk. По правилу прямого произведения по- лучаем, что общее число размещений с повторениями из л по А: равно Xl xX2*...xXk=n k . Задача. Найти количество всех пятизначных чисел. Решение. Введем пять множеств: А2 = А3=А4=А5 = {О, 1,..., 9}, А1 = {1, 2,..., 9}. Тогда все пятизначные числа составят прямое произведение указанных множеств А{ х А2 х А3 х Д, х А5. Соглас- но правилу прямого произведения, количество элементов в мно- жестве AI х А2 х А3 х А х Л5 равно 9-10-10-10-10 =90000. 1.4. Размещения без повторений Имеютсяпразличныхпредметовal,a2,...,an.Сколькоизних можно составить расстановок длины k? Две расстановки счита- ются различными, если они отличаются видом входящих в них элементов или порядком их в расстановке. Такие расстановки называются размещениями без повторений, а их число обо- значают А%. При составлении данных расстановок на первое место можно поставить любой из имеющихся п предметов. На второе место теперь можно поставить только любой из п — 1 оставшихся. И, наконец, на &-е место — любой из п — k + 1 оставшихся предметов. По правилу прямого произведения по- лучаем, что общее число размещений без повторений из л по А: равно А% =n(n-)...(n-k+l)=n/(n-k}. Напомним, что п = п(п -!)...! иО! = 1. Задана. В хоккейном турнире участвуют 17 команд. Разыгры- ваются золотые, серебряные и бронзовые медали. Сколькими способами могут быть распределены медали? Решение. 17 команд претендуют на 3 места. Тогда тройку при- зеров можно выбрать способами Л^ =17-16-15 = 4080.
  • 11. 1.6. Сочетания 11 1.5. Перестановки При составлении размещений без повторений из п по kмы по- лучали расстановки, отличающиеся друг от друга либо составом, либо порядком элементов. Но если брать расстановки, которые включают все п элементов, то они могут отличаться друг от друга лишь порядком входящих в них элементов. Такие расстановки называются перестановками из п элементов, а их число обознача- ется Рп. Следовательно, число перестановок равно Р„ =А" =«!. Перестановки я = (щ, я2,...,я„) элементов 1, 2,..., п записывают и в f Л 1 * матричной форме тс = п , где верхняя строка— это по- рядковые номера 1, 2,..., п позиций элементов в перестановке; нижняя строка — тот же набор чисел 1, 2,..., я, взятых в каком-ли- бо порядке; щ — номер элемента нау'-м месте перестановки. По- рядок столбцов в перестановках, записанных в матричной форме, не является существенным, так как в этом случае номер позиции каждого элемента в перестановке указывается явно в верхней строке. Например, перестановка (3,2,4,1) из четырех элементов может быть записана как (* 2 4 l J ' ( 4 3 l 2 ) ' ( 2 3 l 4 J H Т-Д ' Задача оладьях. Сколькими способами можно расположить на шахматной доске 8 ладей, чтобы они «не били» друг друга? Решение. Условие «не могли бить» означает, что на каждой го- ризонтали и вертикали может стоять лишь одна ладья. Ввиду это- го, каждому расположению ладей на доске соответствует переста- ( 1 2 8 ^ новка я = . Верхняя строка перестановки — это но- мера горизонталей, нижняя — вертикалей, пересечение которых определяет положение ладей на доске. Следовательно, число рас- становок равно числу перестановок /*8 = 8! из 8 элементов. 1.6. Сочетания В тех случаях, когда нас не интересует порядок элементов в расстановке, а интересует лишь ее состав, то говорят о сочетани- ях. Сочетаниями из п различных элементов по k называют все возможные расстановки длины k, образованные из этих элемен- тов и отличающиеся друг от друга составом, но не порядком эле-
  • 12. 12 Глава 1. Комбинаторные схемы ментов. Общее число сочетаний обозначают через С* или [ ? к Определим это число. Составим все сочетания из п по k. Затем пе- реставим в каждом сочетании элементы всеми возможными спо- собами. Теперь мы получили расстановки, отличающиеся либо составом, либо порядком, т.е. это все размещения без повторений из п по k. Их число равно А*. Учитывая, что каждое сочетание дает №. размещений, то по правилу произведения можно записать С*х*!=4*. Тогда С* = :, или С* = " ' , и k k(n-k} Qk = Qn-k Задача о прямоугольниках. Сколько различных прямоугольников можно вырезать из клеток доски, размер кото- рой т х л? Решение. Прямоугольник однознач- но определяется положением его сто- рон. Горизонтальные стороны могут за- нимать любое из т + 1 положения. Тогда число способов их выбо- ра равно С^+1. Вертикальные стороны можно выбрать Сп 2 +1 спосо- бами. По правилу прямого произведения заключаем, что 1 2 3 т 2 3 п количество прямоугольников равно -С +1 . 1.7. Сочетания с повторениями Имеются предметы п различных видов. Число элементов каж- дого вида неограниченно. Сколько существует расстановок дли- ны k, если не принимать во внимание порядок элементов? Такие расстановки называют сочетаниями с повторениями, количество и обозначение которых следующее Cn k = C^~ l k_l =C*+k_l. Выведем данную формулу. Пусть а, Ь,с,..., d—это исходные различные типы элементов, количество которых п. Рассмотрим произвольное сочетание с по- вторениями cbbcaccda...ddaccbbb из данных типов элементов. Так как порядок элементов в сочетаниях не учитывается, то расста- новку можно записать и так: аа...а bb...b ее...с ... dd...d, где элементы каждого из типов упорядочены и завершаются вертика-
  • 13. 1.7. Сочетания с повторениями 13 льной чертой, за исключением последней серии элементов. Дли- на такой расстановки с учетом вертикальных линий составляет k + (n— l) = n + k— 1, где k — количество элементов в расстанов- ке; п — 1 — число вертикальных линий. Очевидно, что любую та- кую расстановку можно задать выбором из п + k — 1 места п — 1 место для положений вертикальных линий. Это можно сделать СП+LI способами. Промежуточные места между линиями запол- няются соответствующими типами элементов. Задача. Трое ребят собрали в саду 63 яблока. Сколькими спо- собами они могут их разделить между собой? Решение. Поставим в соответствие каждому делению яблок между ребятами сочетание с повторениями следующим спосо- бом. Типами элементов в нашем случае будут ребята. Таким обра- зом, имеемтри типа элементов а, Ь,с(п = 3), из которых предстоит составить все различные расстановки длины k = 63. Наличие в расстановке какого-либо из элементов а, Ъ, с отвечает принад- лежности данного яблока соответствующему мальчику. Порядок элементов в такой расстановке не играет роли. При делении яб- лок между ребятами не важно, какое из них попадет тому или иному мальчику/Гогда число способов разделить яблоки между ребятами равно С3 63 = С3 "63Ч =C3 2 +63 _1 =-^1 =2080. Задача. Найти количество целочисленных решений системы *! +х2 + ... +хп = k, k>0, xt > 0, /'= 1, 2,..., п; п > I. Решение. Рассмотрим следующую интерпретацию решения уравнения. Каждое значение xt = 1,+ 1,-+ ... + 1, представим как сумму единиц, количество которых х{ . Индекс у 1, отмечает ее принадлежность к разложению числа х( . Таким образом, мы вве- ли п типов различных элементов {11з 12 ,..., !„}, значение каждого из них равно единице. Теперь любое решение исходного уравне- ния можно представить как сумму, составленную из k произволь- ных единиц множества (Ij, 12 ,..., !„}. Суммируя подобные едини- цы 1, с одинаковыми индексами, можно составить соответствую- щие слагаемые д;, решения исходного уравнения. Данное соответ- ствие является взаимно однозначным, откуда и следует, что число решений системы равно числу сочетаний с повторениями
  • 14. Глава 1. Комбинаторные схемы 1.8. Перестановки с повторениями, мультимножества Задача формулируется следующим образом. Имеются предме- ты k различных видов. Сколько существует перестановок из «j элементов первого типа, п2 элементов второго типа и т. д., nk эле- ментов &-го типа? Рассмотрим, например, мультимножество М= {а, а, а, Ь, Ь, с, d, d, d, d}, в котором содержатся 3 элемента а, 2 эле- мента Ь, 1 элемент с и 4 элемента d. Мультимножество — это то же самое, что и множество, но в нем могут содержаться одинаковые элементы. Повторения элементов можно указать и другим спосо- бом:М={3-а,2•Ь,1•с, 4•d}.Такимобразом,искомыеперестановки с повторениями — это перестановки элементов мультимножест- ва. Если бы мы рассматривали все элементы множества М как различные, обозначив их al; а2, а-$, blt Ь2, cl, dlt d2, d$, d$, то полу- чили бы 10! перестановок, но после отбрасывания индексов мно- гие из них оказались бы одинаковыми. Фактически каждая пере- становка множества М встретилась бы ровно 3!-2!-1!-4!раз, поско- льку в любой перестановке М индексы при буквах а можно рас- ставить 3! способами, при Ь — 2! способами, при с — одним способом, а при d — соответственно 4! способами. Поэтому число перестановок множества Мравно ^ . В применении к обще- му случаю те же рассуждения показывают, что число перестано- вок любого мультимножества (перестановки с повторениями) равно полиномиальному коэффициенту где п = «J + п2 + ... + nk — общее число элементов. Перестановки с повторениями имеют тесную связь с сочета- ниями. Определим количество этих перестановок следующим об- разом. Из всех п мест перестановки п{ место занимают элементы первого типа. Выбор мест для них можно сделать С" 1 способами. Из оставшихся п — п^ мест элементы второго типа занимают п2 места, которые можно выбрать С п п г _п способами. Те же рассужде- ния показывают, что элементы k-то типа можно расположить в перестановке C"n k _n _п _п способами. Согласно правилу прямо-
  • 15. 1 .9. Упорядоченные разбиения множества 15 го произведения, число перестановок с повторениями равно Задача. Сколько существует различных перестановок из букв слова «Уссури»? * Решение. 1.9. Упорядоченные разбиения множества ПодсчитаемчислоразбиенийконечногомножестваS, где | S=п, на k различных подмножеств 5" = Si u S^ и ... и Sk , попарно не пере- k секающихся, Sj = nh i= 1, 2,..., k и ^]и, =п . Последовательность различных Si, S2 ,..., Sk рассматривается как упорядоченная последо- вательность подмножеств. При формировании упорядоченной Si, S2 ,...,Sk последовательности на первое место подмножество Si мож- но выбрать С^ 1 способами, на второе место подмножество S2 можно выбрать из оставшихся п — щ элементов С"*п способами и т. д., на последнее место множество Sk можно выбрать из оставшихся п - п{ - п2 -...- nk _i элементов С"*_п _п _ _п способами. По правилу прямого произведения получаем, что общее число упорядоченных разбиений множества S на k подмножеств равно Г п Г п г Cn k — П -...v^ л л-rtj'•• n-n1-...-nt_1 и 1и f и (' что совпадает с числом Д/ij, п2 ,..., п/) перестановок с повторениями. Замечание 1. Установим взаимно однозначное соответствие между упорядоченными разбиениями множества и перестанов- ками с повторениями. Каждой перестановке с повторениями можно поставить в соответствие упорядоченное разбиение мно- жества номеров элементов S= {1, 2,..., п} в перестановке на под- множества Si, S2 ,..., Sk , где Sj — множество номеров элементов г'-го типа в перестановке. Очевидно, что данное соответствие между перестановками с повторениями и разбиениями является взаимно однозначным.
  • 16. Глава 1. Комбинаторные схемы Замечание 2. Упорядоченные разбиения множества S на по- парно непересекающиеся подмножества Sl u S2 и ... и Sk = £до- пускают интерпретацию в терминах «корзин» и «шаров». Обозна- чим элементы исходного множества | S = п «шарами». Под разби- ением исходного множества, теперь множества шаров, на различ- ные Sj упорядоченные подмножества будем понимать разложение шаров по & различным корзинам (упорядоченные S{, $2,..., Sk подмножества): /ij шаров положить в корзину Si, пг шаров положить в корзину ^ и т. д., nk шаров положить в корзину Sk, где п{ + п2 + ... + nk = п. Как установлено, число таких разложений равно СС^...^,...^^^-^. Задача. В студенческой группе, состоящей из 25 человек, при выборе старосты за выдвинутую кандидатуру проголосовали 19 человек, против — 3, воздержались — 3. Сколькими способами может быть проведено такое голосование? Решение. Имеем три различные корзины: «за», «против», «воз- держались», в которые необходимо разложить 25 шаров, соответ- ственно 19 — в первую, 3 — во вторую, 3 — в третью. Количество таких разложений определяется выражением Cj5 -С$ -С] -jg^-y • 1.10. Неупорядоченные разбиения множества Подсчитаем, сколькими способами можно разбить множество S, где | S | = п, на подмножества, среди которых для каждого / = 1, 2,..., п имеется mt > О подмножеств с / элементами. Тогда верно, п что ^/-/и, =п. Данное разбиение позволяет представить исход- ное множество следующим образом: т„ п т, 7=1 7=1 7=1 i=lj=l где ^попарнонепересекаютсяи$ц=Sa = ... =| Sim . = /длякаж- дого /' = 1, 2,..., п. Порядок подмножеств в разбиении не является существенным. Так, например, разбиения множества S- {1, 2, 3, 4, 5} вида
  • 17. 1.10. Неупорядоченные разбиения множества V7 {1, 3}, {4}, {25}; {1, 3}, {25}, {4}; {25}, {1, 3}, {4}; {4}, {1, 3}, {25}; считаются одинаковыми. Обозначим число неупорядоченных разбиений множества S через N(m^, m2,..., т„). Рассмотрим схему формирования упорядо- ченных разбиений для представления п =l-ml +2-т2 +...+п-т„: flf1 ! /-<2 /-i2 г<Ъ /">3 /^п _ 1 /712 '"З л! !Г2 ...(л!)'"" Воспользуемся интерпретацией формирования упорядочен- ных разбиений как разложения п различных шаров по различным ml + т2 +... +тп корзинам так, что в каждую из /я, корзину кладут / шаров. Теперь откажемся от упорядоченности подмножеств в разбиении. Пусть все корзины имеют различное число шаров, та- кие корзины можно рассматривать как различные (они отлича- ются числом шаров). В этом случае упорядоченные и неупорядо- ченные разложения шаров совпадают. Пусть теперь в разложении существуют /и, корзин с одинаковым количеством шаров. При упорядоченном разложении такие корзины рассматриваются как различные. Однако при неупорядоченном разложении обмен ша- рами таких корзин можно рассматривать как соответствующую перестановку указанных корзин, что не приводит к новым разло- жениям. Если количество корзин с одинаковым числом шаров равно mt , то неупорядоченных разложений будет в /п,! меньше, чем упорядоченных. Тогда общее число неупорядоченных разби- ений будет в ml m2 ...ml ^. раз меньше, чем упорядоченных. Следо- вательно, п N(m,,m'>....,mn )= ' Заметим еще раз, что если выполнено упорядоченное разбиение числа п на подмножестваразличной длины (мощности), то они сов- падают с неупорядоченными разбиениями. В этом случае все т, б{0,1}.
  • 18. IjB _ Глава 1. Комбинаторные схемы Задача. Сколькими способами из группы в 17 человек можно сформировать 6 коалиций по 2 человека и 1 коалицию из 5 чело- век? Решение. Требуется разбить множество из 17 человек на непере- секающиеся и неупорядоченные группы людей. Откуда искомое число равно 7V(Q 6 03,04Д5,06,07,...,0 )= 17! . (2!) 6 (5!) 1 6!1! Задача. Сколькими способами можно разделить колоду из 36 карт пополам так, чтобы в каждой пачке было по два туза? Решение. 4 туза можно разбить на — 11— = 3 различные коалиции (2!)22! по две карты в каждой (неупорядоченные разбиения), т.е. только 3 способами можно разделить тузы пополам. Далее, каждая полови- на любого из этих трех разбиений тузов выполняет роль различных двух «корзин», куда необходимо разложить пополам оставшиеся 32 карты. Разложение 32 оставшихся карт уже будет упорядоченным, так как «корзины» различные, число разложений равно ^^. Со- 16! 16! гласно правилу прямого произведения, общее число вариантов 41 32' 3-32 1 разделить колоду пополам равно . = _ . . 1.11. Полиномиальная формула Формула л! • ... .. nl +n2 +...+nk =n"l -»2 ••••"* • называется полиномиальной, где суммирование выполняется по всем решениям уравнения лj + л2 + ... + nk = и в целых неотрицате- льных числах, я, > 0, / = 1, 2,..., k. Для доказательства выполним умножение +xk )...(xl + x2 +...+xk )=(xl Чтобы привести подобные в полученном выражении, необхо- димо подсчитать количество одночленов вида jc" 1 x n j . . .x", k каждо-1 ^ К го разбиения щ + п2 + ... + nk = n. Для получения же одночлена x"l x^2 ...x"k k необходимо выбрать jct в качестве множителя в п±
  • 19. 1.12. Бином Ньютона _ _ 19 скобках при раскрытии выражения (xl + х2 + ... + xk )n . Это можно сделать С1 ^ способами. Из оставшихся п — п{ не раскрытых ско- бок необходимо выбрать х2 в качестве множителя в п2 скобках. Это можно сделать С"1п способами и т. д. Тогда количество од- ночленов х"1 х"2 2 . . .x"k k при раскрытии выражения (xl +x2 +...+xk )(xl + x2 +...+xk )...(xl +x2 +...+xk ) ~"~ п будет равно числу С'С^ ...С"п ^_ _^^ =^ '^ , упорядо- ченных разбиений. 1.12. Бином Ньютона Частный вид полиномиальной формулы (1.11.1): =YJ Ck ak bn 'k (1.12.1) называется биномом Ньютона. Рассмотрим несколько задач, в основе решения которых ле- жит бином Ньютона. п Задача 1. Доказать тождество ^С* =2". Решение. Воспользуемся формулой (1.12.1) бинома Ньютона, в которой положим а = 1 и Ъ = 1, тогда (1+1)" =^С% -lk -l"~k . п Задача 2. Доказать тождество ^С„(т -l)"'k =m". *=о Решение. Воспользуемся формулой (1.12.1), где положим а = 1 и Ь = т — 1. m m Задача 3. Доказать тождество Xе /? = ZС п =2 • /ЫО *=1 Решение. Воспользуемся формулой (1.12.1), в которой положим а = 1 и £= -1, тогда (1-1)" =£(-!)*С* =0. Группируя положите- *=о льные и отрицательные члены равенства, установим
  • 20. 20 Глава 1. Комбинаторные схемы f '. Так как С„ 2 * 1 = с* =2», то каж- /t=0 /t=l )t=0 *=1 /t=0 дая из сумм составляет половину числа 2". Задача 4. Доказать тождество]^k -С* =«2"~ 1 . Решение. Воспользуемся формулой (1.12.1), из которой, пола- гая а = 1 и Ъ = х, получим (1+jc)" = "^C k x k . Дифференцирование последнего равенства дает «(l+x)"" 1 = ^k-C k x k ~ l . Пусть х= 1 , тогда n(l+l)"~ l = ^k-C k l k ~ l , что доказывает искомое тождество. 1.13. Инверсии Перестановки особенно важны при изучении алгоритмов сор- тировки, так как они служат для представления неупорядоченных исходных данных. Чтобы исследовать эффективность различных методов сортировки, нужно уметь подсчитывать число переста- новок, которые вынуждают повторять некоторый шаг алгоритма определенное число раз. Пусть (а1 ,а2 ,...,ал ) — перестановка элементов множества {1, 2,..., п}. Если / <j, а а, > я,-, то пара (a,-, aj) называется инверсией перестановки. Например, перестановка 3142 имеет три инверсии (3, 1), (3, 2), (4, 2). Каждая инверсия — это пара элементов, «нару- шающих порядок»; следовательно, единственная перестановка, не содержащая инверсий, — это отсортированная перестановка (1, 2,..., л). Таблицей инверсии перестановки (а{ , а2 ,.. ., ап ) называется по- следовательность d{ d2 ...dn , где dj — число элементов, больших/ и расположенных левее/ Другими словами, dj — число инверсий, у которых второй элемент равен/ Например, таблица инверсий пе- рестановки 5 9 1 8 2 6 4 7 3 будет 2 3 6 4 0 2 2 1 0 , поскольку 5 и 9 расположены левее 1; 5, 9, 8 — левее 2 и т. д. Всего 20 инверсий. По определению О < dv < п - 1, 0<d2 <n-2, ..., О < </„_! < 1, dn = 0.
  • 21. 1.14. Обратные перестановки 21 М. Холл установил, что таблица инверсий единственным обра- зом определяет соответствующую перестановку. Из любой табли- цы инверсий d"id2...dn можно однозначно восстановить переста- новку, которая порождает данную таблицу, путем последователь- ного определения относительного расположения элементов п, п — !,...,! (в этом порядке). Например, перестановку, соответст- вующую таблице инверсий (2,3,6,4,0,2,2,1,0) = d^d^d^d-jd^, можно построить следующим образом: выпишем число 9; так как ds = 1, то 8 стоит правее 9. Поскольку d1 = 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, придем к перестановке (5,9,1,8,2,6,4,7,3). Такое соответствие между перестановками и таблицами ин- версий важно, потому что часто можно заменить задачу, сформу- лированную в терминах перестановок, эквивалентной ей задачей, сформулированной в терминах таблиц инверсий. Рассмотрим, например, еще раз вопрос: сколько существует перестановок множества {1,2,...,л}? Ответ должен быть равен числу всевозмож- ных таблиц инверсий, а их легко пересчитать, так как d{ можно выбрать п различными способами, d2 можно независимо от d{ вы- брать п - I способами и т.д., dn — одним способом. Тогда различ- ных таблиц инверсий п(п — !)...! = п. Таблицы инверсий пере- считать легко, потому что все dj независимые, в то время как эле- менты uj перестановки должны все быть различными. 1.14. Обратные перестановки Не следует путать «инверсии» перестановок с обратными пе- рестановками. Пусть аь а2 ,..., ап — различные шары, индексы которых свяжем с номерами шаров. Тогда исходное расположе- ние шаров однозначно определяется тождественной переста- новкой е = (1, 2,..., и). Пусть п = (я^я^.....^) — произвольная пе- рестановка номеров 1, 2,..., л, где nk — номер шара наfc-мместе. Такая перестановка отвечает расположению шаров й„. ,ап ,...,ял . Вспомним (см. п.1.5), что перестановка | 2 ••• п |может быть записана в матричном виде. Данная 1*1 "2 ••• ъп )
  • 22. 22 Глава 1. Комбинаторные схемы форма записи позволяет рассматривать перестановку в качест- ве оператора, который заменяет старые номера шаров — верх- няя строка матрицы — на новые номера — нижняя строка мат- рицы. Тогда результат двух последовательных изменений л = (л1; л2,..., л„) и ст = (CTI, ст2,..., ст„) исходной последовательно- сти 1, 2,..., п номеров шаров можно рассматривать как операцию умножения перестановок р = яа = п '' ... п Упорядочим столбцы перестановки а в соответствии с переста- 2 ••• пновкойл = Оч, л2,..., я„), т.е. ст=! ( 1 9 п Тогдаможнозаписать, чтор =лог = ". , , ст 1 2 л у v jtj Л2 '" п '-' •••"]. Этой перестановке отвечает ••Pnj расположение шаров api,api,...,apnгде значение pk =стп^ — это номер шара на k-м месте. ( 1 2 пОбратной к перестановке я = называется пере- V 71 ! Л 2 ' ' Л л7 становкал~' = ' „ 2 " s -i -i -i I которая получает- ^ 1 2 ... п) [ji^ я2 ... п„ j ся, если в исходной перестановке поменять местами строки, а за- тем упорядочить столбцы в возрастающем порядке по верхним элементам,т.е.л" 1 =(itl l ,n2 1 ,...,л~').Ясно,чтопоследовательное изменение порядка шаров согласно перестановкам л = (л^ л2 ,..., л„) иобратной л' 1 =(я^ 1 ,л2 ! ,...,л' 1 )приводиткисходномуихрас- положению, т.е. к тождественной перестановке 2 '.'.'. перестановке (5,9,1,8,2,6,4,7,3) будет перестановка (3,5,9,7, 16849^ таккя^Г 5 9 1 8 2 6 4 7 3 W 1 2 3 4 5 6 78 9') 1,о,б/Ь4>, т, К |ч 1 2 3 4 5 6 7 8 9j~v 3 5 9 7 1 6 8 4 2J- Сортированную последовательность элементов перестановки л = (я1, я2 ,..., я„) можно получить, заполнив в цикле вектор elt <?2 ,..., en- far k =l to n do en =nk или f{nk] = nk.
  • 23. 1.14. Обратные перестановки 23 Ясно, что результирующие значения q, e2,..., е„ будут соответ- ственно 1,2,...,л. В цикле каждый элемент uk встает на свое упоря- доченное место еп (см. п.5.7). Подобным образом выполним за- полнение элементов перестановки л' 1 =(я^', я2 : ,..., я" 1 ), однако в упорядоченное место я" 1 элемента nk будем размещать его номер в исходной перестановке я = (яь я2,..., я„): for k=to n do я" 1 =k или n' l [nk]=k. Результирующий вектор я' 1 =(я^, я^ 1 ,..., я" 1 ) будет обратной перестановкой к я = (KI, я2,..., я„). X. А. Роте впервые установил связь между обратными переста- новками и инверсиями: обратная перестановка содержит ровно столько же инверсий, сколько исходная.
  • 24. Глава 2 — Представление абстрактных объектов ассматривая решение задачи с абстрактной точки зрения, как правило, избегают каких бы то ни было предположений отно- сительно того, как мы намерены автоматизировать ее решение. В идеале структура вычислительной машины должна соответ- ствовать естественной структуре задачи, однако это требование часто не выполняется, хотя приспособляемость современной вы- числительной техники такова, что она позволяет обойти эти огра- ничения без труда. Языки высокого уровня при условии, что они должным образом сконструированы, предоставляют в распоря- жение программиста, реализующего алгоритм, более удобную «машину», смягчая несоответствие основной машины требова- ниям алгоритма. Будем считать, что читатель знаком с элементар- ными понятиями математики и основными типами данных: це- лыми и вещественными числами, массивами, строками и т. д. 2.1. Представление последовательностей Любой заданный класс абстрактных объектов может иметь не- сколько возможных представлений, и выбор наилучшего из них решающим образом зависит от того, каким образом объект будет использован, а также от типа производимых над ним операций. 2.1.1. Смежное представление В алгоритмах на дискретных структурах часто приходится встре- чаться с представлением конечных последовательностей и операци- ями с ними. С вычислительной точки зрения простейшим пред- ставлением конечной последовательности 5Ъ s2, ..., sn является точ- ный список ее членов, расположенных по порядку в смежных ячей- ках памяти. В языках высокого уровня — это одномерные, двухмерные и т. д. массивы данных. Наряду с очевидными преиму- ществами последовательное представление имеет и некоторые зна- чительные недостатки. Смежное представление становится неуд об-
  • 25. 2.1. Представление последовательностей 25 ным, если требуется изменить последовательность путем включе- ния новых и исключения имеющихся там элементов. Включение между Sj и si+i нового элемента требует сдвига s^, S/+2,..., snвправо на одну позицию; аналогично исключение ^требует сдвига тех же эле- ментов на одну позицию влево, как показано в алгоритме 2.1. Алгоритм 2.1. Включение и исключение элементов при последовательном размещении (Включить элемент z на i-e место } п = п + 1; forj - п — 1 to i by — 1 do Sj+i = Sj, st = z. {Исключить элемент с i-го места } forj = i to n — I do Sj = Sj+l'} n = n — 1. В обоих случаях включение или удаление элементов при смеж- ном представлении требует перемещения многих элементов. С точки зрения времени обработки такое перемещение элементов может оказаться дорогостоящим из-за сложности операций включения и удаления 0(п). 2.1.2. Характеристические векторы Важной разновидностью смежного размещения является слу- чай, когда такому представлению подвергается подпоследовате- льность sk ,sk ,...,sk некоторой основной последовательности 5j, s2 ,..., sn . В этом случае подпоследовательность можно предста- вить более удобно, используя характеристический вектор — по- следовательность из нулей и единиц, где /'-и разряд равен едини- це, если Sj принадлежит рассматриваемой подпоследовательно- сти. Например, для последовательности (1,2,3,4,5,6,7,8,9) характе- ристический вектор подпоследовательности чисел, кратных 3, имеет вид (0,0,1,0,0,1,0,0,1). Характеристические векторы полезны в том случае, когда формирование нужной подпоследовательности выполняется пу- тем последовательного удаления из основной последовательно- сти элементов, которые не входят в подпоследовательность. Глав- ное неудобство характеристических векторов состоит в том, что они не экономичны.
  • 26. 26 Глава 2. Представление абстрактных объектов 2.1.3. Связанное размещение Неудобство включения и исключения элементов при смежном представлении происходит из—за того, что порядок следования элементов задается неявно требованием, чтобы смежные элемен- ты последовательности находились в смежных ячейках памяти. В результате многие элементы последовательности во время вклю- чения или исключения должны передвигаться. Если требование последовательного размещения элементов опущено, то операции включения и исключения можно выпол- нить без того, чтобы передвигать элементы. При любом размеще- нии элементов необходимо сохранять информацию о способе их упо- рядочения. При связанном размещении последовательности sb s2 ,..., sn каждому Sj ставится в соответствие указатель /,, который указывает на следующую подобную пару элементов si+l , li+l no списку. Вводится начальный указатель /0 , который указывает на первый элемент s^ последовательности. Последний указатель /„ в списке является пустым или нулевым, это признак конца списка. Графическое представление связанного списка можно изобра- зить следующим образом: Здесь каждый элемент связанного списка состоит из двух по- лей. В поле DATA размещен сам элемент последовательности, а в поле NEXT — указатель на следующий за ним элемент. Связан- ное представление последовательностей облегчает операции включения и удаления элементов из списка. Например, для иск- лючения второго элемента достаточно переустановить указатели NEXT(/i) = NEXT(/2 ). Графически это изображается следующим образом: до исключения после исключения — Чтобы в последовательность включить новый элемент sr после sl} необходимо установить указатели: NEXT(/r ) = NEXT(/j) и NEXT(/j) = lr , начальное значение указателя установлено на но- вый включаемый элемент. Графически включение нового эле- мента изображается так:
  • 27. 2.1. Представление последовательностей 27 do включения — /0 —H «осле включения — С помощью связанных распределений мы добились большей гибкости, но потеряли возможность работать с элементами по- следовательности как с массивами, когда по номеру / можно не- посредственно обратиться к элементу st . В связанном размеще- нии такой возможности не существует, и доступ к элементам по- следовательности не является прямым и эффективным. Напри- мер, при поиске среднего элемента последовательности, даже при известной ее длине, требуется просмотреть по связанному списку половину последовательности. В алгоритмах 2.2 и 2.3 при- водятся программы, реализованные на языках Pascal и С, связан- ного формирования списка элементов последовательности. В программы включены операции работы со списком: печать эле- ментов списка, включение новых элементов в список и удаление элементов из списка. Существуют различные модификации представления после- довательностей в виде связанных списков. Следующие два при- мера позволят, при желании, читателю самостоятельно продол- жить получение и других модификаций связанных распределе- ний, отличных от приводимых ниже. Циклическая форма представления позволяет эффективно возвращаться с последнего элемента списка к первому. Рис. 2.1. Циклический список Еще большая гибкость достигается, если использовать дважды связанный список, когда каждый элемент последовательности вместо одного имеет два связанных с ним указателя. В таком спи- ске для любого элемента имеется мгновенный прямой доступ к предыдущему и последующему элементам. Следует помнить, что
  • 28. 28 Глава 2. Представление абстрактных объектов выбор того или иного представления последовательности в зна- чительной степени зависит от типа операций, выполняемых с элементами последовательности. Рис. 2.2 Дважды связанный список /о"* 0 5, 1*2 •4 л 0 Алгоритм 2.2. Программа на Pascal 'е включения и исключения элементов из списка Program Number_List; {Связанный список данных} uses CRT; type NodePointer=A Node; Node= RECORD {Элемент связанного списка} s :Integer; (Элемент последовательности} next :NodePointer; {Указатель на следующий элемент} END; const first :NodePointer=NIL; {Указатель начала списка} {Генерация нового элемента списка} function InitNode: NodePointer; var newNode :NodePointer; begin New(newNode); {Выделить память новому элементу} newNode A .s:=Random(99)+1; {Значение нового элемента} newNode A .next:=NIL; InitNode:=newNode; end; {Включить новый элемент в начало списка} procedure IncludeNode( newNode: NodePointer ); begin newNode A .next:=first; first:=newNode; end; {Удалить из списка k-й элемент}
  • 29. 2.1. Представление последовательностей _ 29 procedure DeleteNode ( k : Integer ) ; var previos, current :NodePointer; i : Integer; begin i:=0; current:=first; while currentoNIL do begin if i=k then begin { k-й элемент найден} if first=current then first :=current A .next else previos' 4 .next : =current A .next; {Удаление из списка} dispose(current); break; end; previos:=current; current:=current A .next; end; end; procedure PrintNodeList; {Печать элементов списка} var p :NodePointer; begin WriteLn; p:=first; while ponil do begin Write(p A .s:3,' '); р:=р л .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; {Удалить из списка m-й элемент} DeleteNode(m); PrintNodeList; ReadKey; end. (Main)
  • 30. 30 _ Глава 2. Представление абстрактных объектов Алгоритм 2.3. Программа на Си включения и исключения элементов из списка #include <stdio.h> tinclude <stdlib.h> ttinclude <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-й элемент найден i f ( first==current ) first=current->next; else previos->next=current->next; //Удалить //из списка delete current; break;
  • 31. 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("n"); m=17; //Удалить m-й элемент DeleteNode(m) ; PrintNodeList(); getch(); Связанное представление предпочтительнее лишь в том слу- чае, если в значительной степени используются операции вклю- чения и исключения элементов. 2.2. Представление деревьев Конечное корневое дерево ^формально определяется как непу- стое конечное множество упорядоченных узлов, таких, что суще- ствует один выделенный узел, называемый корнем дерева, а оставшиеся узлы разбиты на т > 0 поддеревьев 7, Т2,..., Тт. Корневое дерево на рис. 2.3 содержит 9 узлов, помеченных буквами от а до л Узлы с метками e,f, с, g, h, r являются листьями, остальные узлы — внутренние. Узел с меткой а — корень. Поня- тие дерева используется в различных аспектах. Деревья — наибо- лее важные нелинейные объекты, используемые для представле- ния данных в алгоритмах на дискретных структурах.
  • 32. 32 Глава2.Представлениеабстрактныхобъектов Рис. 2.3. Корневое дерево с тремя поддеревьями Важной разновидность корневых деревьев являются бинарные деревья. Бинарное дерево Глибо пустое, либо состоит из выделен- ного узла, называемого корнем, идвухбинарныхподдеревьев: ле- вого 7i и правого Т2. Лесом называют упорядоченное множество деревьев. Тогдаде- рево можно определить как непустое множество узлов, такое, что существует один выделенный узел, называемый корнем дерева, а оставшиеся узлы образуют лес с поддеревьями корня. 2.2.Л. Представление деревьев на связанной памяти Почти все машинные представления деревьев основаны на связанных распределениях. Каждый узел состоит из поля данных и некоторых полей для указателей. В следующем примере пред- ставления дерева каждый узел имеет по три поля указателей. first Рис. 2.4. Регулярная связанная структура представления дерева Произвольное дерево с переменным числом поддеревьев все- гда можно представить с помощью односторонних списков с ис- пользованием двухкомпонентных звеньев, в которых в первом поле находится либо указатель, либо данные, а во втором — все- гда указатель.
  • 33. 2.2. Представление деревьев 33 first Рис. 2.5. Универсальная связанная структура представления дерева Применение указателей и связанных списков придает памяти гибкость, необходимую для представления различных структур. Но при этом легко и перестараться; поэтому следует избегать слишком большого количества указателей; сложность програм- мной поддержки таких структур возрастает «экспоненциально», теряется четкость основной структуры, которую пытаются пред- ставить в памяти (последний пример представления дерева это наглядно подтверждает). 2.2.2. Представление деревьев на смежной памяти Представление деревьев на смежной памяти (одномерный массив) предполагает неявное присутствие ребер, переход по ко- торым выполняется посредством арифметических операций над индексами элементов массива — смежной памяти. Формирова- ние таких деревьев с помощью адресной арифметики можно осу- ществлять двумя способами. Идея первого способа применима при любом постоянном количестве ребер, выходящих из вершин (регулярное дерево). Рассмотрим данный способ формирования на примере двоичного (бинарного) дерева. Пусть имеется одномерный массив смежных элементов аъ а2,..., а„. Неявная структурадвоичного дерева определяется как на рис. 2.6. По дереву на рис. 2.6 легко перемещаться в обоих направлениях. Переход вниз на один уровень из вершины a[k] можно выполнить, удвоив индекс k (индекс левого поддерева) или удвоив и прибавив 1 (индекс правого поддерева). Переход вверх на один уровень из вер- шины а[т] можно выполнить, разделив m пополам и отбросив дробную часть. Рассмотренная структура применима к любому де- реву с постоянным количеством ребер, выходящих из вершин. 2—2697
  • 34. 34 Глава 2. Представление абстрактных объектов a[2k] a[2k+l] a[m] . . . a[n] Рис. 2.6. Двоичное дерево на смежной памяти с последовательной нумерацией вершин Другой способ, основанный на индексной арифметике, при- меним только для двоичных деревьев. Пусть для представления де- рева используется одномерный массив а,, ам,..., а,. Корнем дере- ва полагают элемент ат, где индекс элемента корня рассчитыва- ется по формуле т = [_(/ +/)/2_|, т.е. середина массива. Левое под- дерево располагается в массиве а,, а/+1,..., ат_, а правое поддерево — в массиве ат+1, ат+2,..., о,. Корни поддеревьев рас- считываются подобным же образом, как и корень основного де- рева. Второй способ формирования двоичных деревьев на смеж- ной памяти имеет довольно ограниченное применение. Основ- ное его использование — поиск данных,в сортированных масси- вах, таблицах и т.д. В качестве примера использования представления регулярных деревьев на смежной памяти рассмотрим решение следующей за- дачи. Задача. Написать программу поиска всех а замкнутых маршрутов длины /К15 по ребрам треугольника abc. Длину ребра принять рав- ной 1. Начальная и конечная точка искомых маршрутов — вершина а. Длина маршрута п задается в текстовом файле исходныхданных. Результаты расчетов всех маршрутов сохранить в выходном тек- стовом файле. Каждый маршрут представить как последователь- ную комбинацию меток а,Ь,с посещаемых вершин треугольника при движении по нему. Каждый маршрут должен включать л+1 метку, где первой и последней меткой должна быть вершина а. Пример файла исходных данных: 4
  • 35. 2.2. Представление деревьев 35 Выходной файл для данного примера: abcba 1 ababa 2 acaba 3 abaca 4 асаса 5 acbca 6 В алгоритме 2.4 представлена программа расчета всех искомых маршрутов длины я. Алгоритм делится на две части. В первой час- ти (процедура CreateTreeA.bc) выполняется формирование двоич- ного регулярного дерева на смежной памяти рис. 2.7. Алгоритм 2.4. Программа на Pascal's поиска замкнутых маршрутов по треугольнику Program Тгее_АЪс; {Движение по треугольнику АЬс) 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,m,ml,m2 :LongInt; begin z[l]:='a'; {Вершина а} level:=1; {Номер уровня} ml:=l; {Индекс первой вешины уровня} m2:=l; {Индекс последней вешины уровня} while level<=n do begin for k:=ml to m2 do begin {Заполнить следующий уровень дерева} m:=2*k; case z[k] of 'a': begin z[m]:='b'; z[m+l]:='c'; end; 'b': begin z[m]:='c'; z[m+l]:='a'; end; 'c': begin z[m]:='a'; z[m+1]:='b'; end; end; end; level:=level+l;
  • 36. 36 Глава 2. Представление абстрактных объектов ml:=2*ml; m2:=2*m2+l; end; end; Procedure RouteTreeAbc( n:Integer ); {Формирование маршрутов} var i,k,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}
  • 37. 2.3. Представление множеств 37 При проходе вниз вершины дерева заполняются метками а, Ь, с, соответствующими вершинам треугольника при перемещении по нему. Два ребра, выходящих из каждой вершины, показывают возможные варианты выбора дальнейшего маршрута продвиже- ния по треугольнику. В каждом случае из вершин а, Ь, с можно попасть в любые две другие вершины. Индексы метокдерева про- хода на рис. 2.7 показывают соответствующее их место в массиве данных (смежной памяти). с[4] а[5] а[6] Ь[7] а[8] b[9] b[10] c[ll] b[121 с[13] с[14] а[15] Л Л Л / / Л / /Ь[1б| с[17] с[18]а[19] с[20] а[21] а[22] Ь[23] с[24] а[25] а[26] b[27] a[28] b[29] b[30] с[31] Рис. 2.7. Двоичное дерево маршрутов по треугольнику на смежной памяти Во второй части алгоритма выполняется формирование иско- мых маршрутов (процедура RouteTreeAbc), основой для построе- ния которых служит дерево прохода на рис. 2.7. Для формирова- ния всех маршрутов теперь достаточно подняться по нему от ли- стьев с метками а вершины треугольника к корню, запоминая пройденные метки. Ясно, что число маршрутов будет равно числу вершин на последнем уровне (количество листьев) с меткой а. 2.3. Представление множеств Существуют два основных подхода к представлению множеств в памяти. 1. При первом подходе хранят описание каждого элемента, действительно присутствующего в множестве, как это дела- ется, когда выписываются все элементы множества и заклю- чаются в фигурные скобки. 2. При втором подходе изначально определяются все потенци- ально возможные элементы множества, а затем для любого подмножества этого универсального множества для каждо- го возможного члена указывается, принадлежит ли он на са- мом деле данному подмножеству или нет.
  • 38. 38 Глава 2. Представление абстрактных объектов При первом подходе представления множеств используют как смежное, так и связанное размещение его элементов в памяти (рис. 2.8). Данные методы размещения подробно рассмотрены в п. 2.1 представления последовательностей. с а Ъ X у г X у - # Рис. 2.8. Смежное и связанное представление множества в памяти Как и для последовательностей, наилучший метод представления множеств существенно зависит от операций, которые мы собира- емся выполнять над ними. Типичные операции над множествами: выяснить, имеется ли конкретный элемент в данном множестве; добавить в множество новые элементы; удалить элементы из мно- жества; выполнить обычные теоретико—множественные операции, такие как объединение или пересечениедвух множеств. Как прави- ло, для представления множеств применяют связанную память. При втором методе множество представляется в виде вектора на смежной памяти. Пусть U — универсальное множество (т. е. все рассматриваемые множества являются его подмножествами), состоящее из п элементов. Любое подмножество 5с{/представ- ляется в виде характеристического вектора из п элементов. Эле- мент / в этом векторе равен 1 тогда и только тогда, когда /-и эле- мент множества U принадлежит S, в противном случае он уста- навливается равным 0 (рис. 2.9). Представление в виде характеристического вектора удобнее тем, что можно определять принадлежность /-го элемента множеству за время, не зависящее от его размера. Основные операции над мно- жествами, такие как объединение и пересечение, можно осуществ- лять как операции v и л наддвоичными векторами. Недостаток это- го представления заключается в том, что операции объединение и пересечение занимают время, пропорциональное мощности уни- версального множества U, а не рассматриваемого множества S.Дан- ное представление требует дополнительной памяти для хранения характеристического вектора, что для больших я (размер универса- льного множества U) бывает практически невыполнимо. 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 0 Рис. 2.9. Представление множества характеристическим вектором
  • 39. Методы подсчета и оценивания ассмотренные в предыдущих разделах комбинаторные формулы подсчета означают вычисление или определение свойств некоторой последовательности чисел, соответствующие той или иной задаче. В этомразделе предлагается полезный инст- румент для работы с последовательностями. Идея состоит в том, чтобы каждой числовой последовательности сопоставить функ- циюдействительного или комплексного переменного, с тем, что- бы обычные операции над последовательностями соответствовали простым операциям над соответствующими функциями. Аналитические методы работы с функциями оказы- ваются проще и эффективнее, чем непосредственные комбина- торные методы работы с последовательностями. 3.1. Производящие функции Пусть а0, «j, а2,... — произвольная последовательность. Сопо- ставим последовательности функцию действительного или ком- плексного переменного: 4*)= !>***• (3.1.1) *»о Функция А(х) называется производящей функцией последовате- льности а0, ai,a2,.... Какправило, поискфункцииА(х) по форму- ле (3.1.1) прямыми методами является сложной задачей. Однако заметим, что последовательность {ak} может быть восстановлена по А(х). Выражение (3.1.1) является разложением А(х) в ряд Тей- лора в окрестности точки х = 0. Воспользуемся этим замечанием и приведем некоторые наиболее распространенные производя- щие функции и соответствующие им последовательности.
  • 40. 40 Производящие 1 v 1-х & 1 ^, (1-х) 2 ~ 1 -У 1-* Я 1П Л , v V (i+ *)' -I е" = Z е " = Й 1 ^v-xY ~h функции А(х) 1 - Х * i t l f , v-A(К + 1)Х 1 х* /t x ,(;>'i *V ' ..* r —-xk (r+ k -iV* ,1 * J* Глава 3. Методы подсчета и оценивания Последовательности {а^} at k+l, k>0 (3.1.3) о и . a t ^ ' (3.1.4) " ' ' * /с ' ' ' at = l^},k>l,r — любое (3.1.6) |в4 = р,Л2:0 (3.1.7) Г* i at = — , Л>0, /- — любое (3.1.8) Г г + Л - Л at ^ ,к>0,г любое (3.1.9) Задача. Найти число ^-мерных граней в л-мерном кубе. Решение. Обозначим через ak число Л-мерных граней в «-мер- ном кубе, где 0 < k < п. Тогда производящую функцию последова- п тельности {ak } можно записать как А„(х) = ^ak x . Индекс п для /ыо А„(х) показывает размерность куба. Например, А0 (х) = 1, AI(X) = 2 + х, А2 (х) = 4 + 4х + х2 . Рассмотрим производящую функ- цию Ап+1 (х) последовательности {ak } для (п +1)-мерного куба. За- метим, что (и +1)-мерный куб можно получить из я-мерного куба сдвигом последнего по (я +1)-му измерению. На рисунке показан пример получения трехмерного куба сдвигом по тре- тьему измерению квадрата (двухмерного куба). От- сюда видно, что (я +1)-мерный куб включает два ста- рых л-мерных куба и каждая ^-мерная грань при сдвиге переходит в (k +1)-мерную грань. Из приведенных рассуж- дений следует, что Ап+1 (х) = 2А„(х) + х • Ап (х), где А^х) = 1. Отсюда
  • 41. 3.1. Производящие функции 41 Воспользуемся разложением бинома Ньютона: 4=0 k=0 Сравнивая коэффициенты при степеняхx k , получим, что число А:-мерных граней в л-мерном кубе равно ak = 2"~ k C k t . Например, ЛзОс)=2 3 - 0 Сз 0 х 0 +2 3 - 1 С3-;с 1 +2 3 - 2 C3 2 JC 2 +2 3 - 3 C3V = 8 + Ux+ 6x 2 + + x Простейшие производящие функции (3.1.2)—(3.1.9) будем ис- пользовать как «строительные кирпичики» для получения произ- водящих функций более сложных последовательностей. С этой целью рассмотрим наиболее важные из операций над производя- щими функциями, т.е. способы получения новых производящих функций и соответствующих им последовательностей. Обозна- чим через {ak}, {bk}, {ck} последовательности, а соответствующие им производящие функции — как Л(;с), В(х), С(х). 3.1.1. Линейные операции Если а и р константы, то последовательность ck = a • ak + p • bk имеет производящую функцию С(х) = а. • А(х) + (3 • В(х). Например, последовательность {1} соответствует производя- щей функции-, а последовательность — L соответствует про- 1-х [^!j изводящей функции е*, тогда последовательность 100+ — I соот- ( k 100 .х ветствует производящей функции -+5е . 1-х 3.1.2. Сдвиг начала вправо Пусть последовательность {bk } определяется через последова- тельность {ak } следующим образом: bk = Q для k = 0, 1,..., / - 1 и bk = ak _j дня k = i, i + 1,..., тогда В(х) = х'А(х). Действительно k=i
  • 42. 42 3. Методы подсчета и оценивания 3.1.3. Сдвиг начала влево Пусть последовательность {bk} определяется через последова- тельность {ak} следующим образом: bk = ak+i, k = 0, I,..., тогда *=0 Действительно А=0 со /-I /-I .*=0 k=0 A=0 3.1.4. Частичные суммы Пусть последовательность {bk} определяется через последова- тельность {ak} следующим образом: bk =Z u i> k= °. !>•••> тогда В(х)=-^-. /=о 1-* Действительно 1 2 3 4 /t=o /=o *=0 U»0 Множество пар точек (k, /), по которым ведется суммирование, представлено на рисунке. Изме- ним порядок суммирования (сначала по /, затем по k). Выражение для Б(х) примет вид /=o /=o 3.1.5. Дополнительные частичные суммы Пусть последовательность {bk } определяется через последова- тельность {ak } следующим образом: ** =|>/. * = 0. 1..... тогда В(Х) = А(1) ~ i=k 1-Х
  • 43. 3.1. Производящие функции 43 Действительно ;uo *=oV/=* ) 5 4 Множество пар точек (k, f), по которым ведется з суммирование, представлено на рисунке. Из- 2 меним порядок суммирования (сначала по /, затем по К). Выражение для В(х) примет вид О пг 1 2 3 4 k 1=0 u=o ^ /=о ,/+1 Л А()-х-А(х) ' v О (=0 3.1.6. Изменение масштаба 1. Пусть последовательность {bk } определяется через последо- вательность {ak } следующим образом: bk = k- ak , тогда В(х) = х • А'(х). Действительно и Д-1 *=о или =B(x). 2. Пусть последовательность {bk} определяется через последо- вательность {ak} следующим образом: =p-, тогда B(x)=--A(x)dx. Jk+1 Поскольку , то А=0 о k=0 K+i k=0
  • 44. 44 Глава 3. Методы подсчета и оценивания 3.1.7. Свертка Последовательность c k =Е Й Л-,' k = °- 1>-> тог Д а ОД =Д* /=о 00 00 Действительно, Дх) = ^я*** и 5(х) = ^^х*, тогда /1=0 *=OU=0 ) /=OA=i СО _ 00 / 00 I 00 1=0 A=i Vi»0 ) U=0 J Далее обсудим наиболее общие приемы использования произ- водящих функций на примере решения следующих задач. Задача. Рассмотрим обобщенное биномиальное правило рас- крытия выражений. а-*)г * где обобщенный биномиальный коэффициент k = (_ к ' V ту---У т"- ~1) _/'_1Ч* Тогда 1 Рассмотрим полученное выражение при г = — .
  • 45. 3.1. Производящие функции 45 2*-iM-3-5.7...(2*-3) л ^ 1.З.5...(2*-3) 2*£! £, 2**! , у( D 2 * - i - - . . . . - л . . . . . - t = 2*£! £, * il-2-3-4-S-6...(2£-3)(2fc-2) = fci 2**!-2-4-6...(2Л-2) ^l-2-3-4-5-6...(2fc-3)(2fc-2) k _— J^ > —• л ~~ 1 * 1 Z. Lil, 2* I. t . 4L Ч « * Vx Т I. Т fc ~2_, —x =1-2^—^-=-x . Таким образом, ,2 СA-l Рассмотримвыражение =(!-*) г при /•= 1. где Следовательно, —=(l-jc)-1 =£(-!)* (-х)* =Jjc 1 -д: = = Задача. Сколькими способами можно разбить выпуклый (п + 3)-угольник (п > 0) на треугольники диагоналями, не пересе- кающимися внутри многоугольника? Решение. Пусть мл+3 — искомое число способов разбить (п + 3)-угольник на треугольники. Перенумеруем вершины ис- ходного многоугольника числами от 1 до л + 3. Заметим, что при любом разбиении найдется треугольник, содержащий ребро мно- гоугольника с вершинами п + 2 и я + 3. Третья вершина этого тре- угольника может быть любой из остальных 1,2,...,я+1. Пусть это будет вершина k. Если удалить треугольник с вершинами п + 2, п + 3, k, то получим два многоугольника с числом вершин k + 1 и
  • 46. 46 _ Глава 3. Методы подсчета и оценивания п + 3 — k, которые можно разбить на треугольники иА+1 и un+3_k способами. Суммируя по k = 1, 2,..., п + 1, получим (согласно пра- вилам прямого произведения и суммы) искомое число разбиений исходного (я + 3)-угольника на треугольники: И«+3 = «2 ' "п+2 + "3 ' «л+1 + «4 ' "«-О + - "Л+1 ' «3 + ««+2 ' "2. где п > 0 и положили и2 = 1. Получили нелинейное рекуррентное соотношение для после- довательности {ип+2}, п > О, для поиска которой удобно ввести но- вую последовательность {vn}, п > 0, такую, что vn = ип+2, п>0. Тогда рекуррентное соотношение перепишется в виде Vn+l = «О ' V/I+0 + VI • У„_! + V2 ' Vn_2 + ... Vn_! ' Vt + Vn_0 ' V0, ИЛИ k=0 Заметим, что правая часть является сверткой двух одинаковых последовательностей {vn} и {vn} (см. п.3.1.7 операцийс производя- щими функциями). Ввиду этого, составим производящую функ- цию правой части Aя=0 n=OU=0 Пусть У(х) — производящая функция последовательности {vn }, п > 0, тогда последнее соотношение запишем как или х • Vx) - V(x) +1 = 0. Ранее рассмотренное разложение обобщенного бинома ^l у 2 '^-2 kЛ -1 Л запишем для случая
  • 47. 3.1. Производящие функции _ 47 Поскольку результат V(x) должен быть рядом по неотрицатель- ным степеням х*, то решение V(x) =(1/ 2x)(l + Vl-4x)является по- сторонним. Окончательно С" Отсюда «я+2 =vn =-^- , я > 0. Ответ: число способов разбить выпуклый (л + 2)-угольник на С" треугольникинепересекающимисядиагоналямиравно—^-,п>0. я+1 /f Задача. Найти сумму! 2 +2 2 +...+ k 2 = ^' 2 . i=i Определим четыре последовательности и их производящие функции: ak = l,bk = kak , ck = kbk , dk = £/2 и А(х), B(x), C(x), D(x). /=o Для решения задачи необходимо найти dk. С этой целью опреде- лим D(x), что позволит нам установить значения dk, 00 Дх) = ^dkx . Последовательности bk и ak связаны «изменением *=о масштаба», значит В(х) = х • А'(х). Последовательности ck и bk так- же связаны «изменением масштаба», следовательно, С(х) =х-В'(х)=х(х-А'(х)У =х-А'(х)+х 2 А"(х). Последовательности dk и ck связаны «частичной суммой», тогда D(x) = C(x)= x-A'(x)+x 2 A"(x) 1-х 1-х ОкончательноD(x)=—-—/. (1-^с) 4 Для получения коэффициентов dk воспользуемся разложением (3.1.9): 1
  • 48. 48 Глава 3. Методы подсчета и оценивания Теперь можно записать, что k=0 k=2 k=0 Сравнивая коэффициенты при одинаковых степеняхл:, получим d0=0, dl=Cl, dk=C 3 k+l+Cl+2, Л =2,3,.... Таким образом, I 2 +2 2 +...+k 2 = ]Г/ 2 =Cl+ +С%+2 ~ — /=o k . Задача. Показать, что 2^C'r+i =C*+k^ или 1 СО Заметим, что - - = Х^г+А ;с * является производящей функцией последовательности ak =C k rJfk. Следовательно, иско- k . k мая сумма равна ^C'r+i =^я, . ;=0 1=0 k Рассмотрим поеледовательностьйд. =]ГаА ..ТаккакйА иоА свя- /^о D/ ч А(х) 1 „ заны частичной суммой, то В(х ) = — - L - J -= - z- . Разложение 1-Jc (1-jc)" 2 (3.1.9) позволяет записать последнее выражение в следующем виде: -Х) k= o 1=0 1=0 Задача. Пусть .АТи 7— целочисленные случайные величины и определены их ряды распределений. Характеристической функ- цией распределения случайной величины (с.в.) X называется функция k=0 A=0
  • 49. 3.2. Линейные рекуррентные соотношения 49 Таким образом, gj^s) — это производящая функция последовате- льности чисел Р(Х= k), где k= О, 1,... . Будем полагать Хи Унеза- висимыми случайными величинами (с.в.). Рассмотрим с.в. Z=X+ Y. Очевидно, что P(Z =k) = P(X + Y=k) = Y,P(X = i)P(Y =k -/). i=0 Ввиду свойства свертки для производящих функций характери- стическая функция с.в. Z может быть записана таким образом: k)s =gx(s)gY(s). k=0 3.2. Линейные рекуррентные соотношения Рассмотрим последовательность {ип}, п = О, 1, 2,... . Будем го- ворить, что задано однородное линейное рекуррентное соотно- шение с постоянными коэффициентами порядка г, если для чле- нов последовательности {«„} выполняется равенство и п+ г = с 1«„+ л-1 + с 2«П+ г-2 +•••+£,-«„> (3-2.1) где cl, с2,..., сг — постоянные величины. Выражение (3.2.1) позво- ляет вычислить очередной член последовательности по предыду- щим /-членам. Ясно, что, задав начальные значения MO , HI,..., иг _ь можно последовательно определить все члены последовательно- сти. Мы рассмотрим общий метод решения (т.е. поиска ип как функции от п) рекуррентного соотношения (3.2.1). Для решения задачи достаточно найти производящую функ- цию ВД = 1>*** (3-2.2) *=о последовательности {«„}. Введем обозначение для полинома К(х) = 1 — срс — с2 х* — ... — c^f и рассмотрим произведение ЩхЩх) = С(х). Непосредственным умножением можно убедиться, что С(х) — это полином, степень которого не превышает г — 1, так как коэф- фициенты при х" +г (п = О, 1,...) в U(x)K(x), согласно уравнению (3.2.1), равны un+r- (qH^-i + c2un+r_2 +... + с^п) = 0 .
  • 50. 50 _ Глава 3. Методы подсчета и оценивания Характеристическим полиномом соотношения (3.2.1) назы- вается F(x)=xr -Cl xr '1 -c2 xr -2 -...-cr _lX -cr . (3.2.3) Выполним разложение Дх) на линейные множители ВД=(* -а, )<>(*-«2Г2 -(*-«,-)'', гдев!+е2 +...+ег =г. Сравнивая К(х) и F(x), запишем К(х) =xr F - I Отсюда U/ = г.= (l-alx) ei (l-a2x) e2 ...(l-arxY r , el + e2 Данное разложение на множители используем для представле- ния в виде суммы простых дробей: £/<*)= - т = — — - • (3-2.4) К(х) kk(-aiXy Таким образом, Щх) является суммой функций вида (1-ох)" Тогда выражение (3.2.4) примет вид Щ Л С(х) _ у^д Y ' / ' / j + - j i t ..9 -, х >=-гГч=2-2-Р*|-2-1 ' ' ( J /=1л=1 A=0 Данное разложение является производящей функцией 00 U(x ) = ^,и пх " последовательности {и„}. Для определения и„ необ- л=0 ходимо найти коэффициент при х„ в разложении (3.2.5). Задача. Найти члены последовательности {и„}, удовлетворяю- щие рекуррентному соотношению ип+2 = 5мл+1 — 6м„, щ = и^ = 1. Решение. К(х) = 1 - 5х + бх2 , K(x)U(x) = С(х).
  • 51. 3.3. Неоднородные линейные рекуррентные соотношения _ 51^ Выполним данноеумножение: (1 — 5х + 6х 2 )(и0 + щх+ z^x 2 + ...) = = ы0 + («! — 5и0)х+ (и2 — 5«! + 6и2)х 2 +... = HO + (MJ -5и0)х= 1 — 4х. Таким образом, С(х) = 1 — 4х. ХарактеристическийполиномДх) =х 2 — 5х+6 = (х— 2)(х— 3). Отсюда г/(х)= = = + _ _ . Значения вели- (1-2х)(1-Зх) 1-2х 1-Зх чин А л В находим методом неопределенных коэффициентов: А = 2, В = —1. Наконец, принимая во внимание (3.1.2), С другой стороны, U(x) = ^ukx . Поэтому, сравнивая коэффи- А=0 циенты при одинаковыхстепеняхх", заключаем, что ип = 2" +1 —3". 3.3. Неоднородные линейные рекуррентные соотношения Неоднородное линейное рекуррентное соотношение имеет вид ««+/• = c l u n+ r-l + с 2ИЛ+ /-2+"-+ с г"п +Ь„, (3.3.1) где величина Ъ„ в общем случае является функцией от п. Общее решение соотношения (3.3.1) представляет собой сумму частного решения неоднородного уравнения (3.3.1) (т.е. любого решения, которое ему удовлетворяет) и общего решения соответствующего ему однородного соотношения (3.2.1), которое находится рас- смотренным способом. Общих способов определения частного решения нет, однако для специальных значений Ъ существуют стандартные приемы определения и„. Рассмотрим на примере в некотором роде универсальную процедуру, которая позволяет сразу находить общее решение неоднородного уравнения (3.3.1). Задача. Найти {и„}, если известно, что м„+1 = и„ + (п + 1) и м0 =1. Умножив левую и правую части рекуррентного соотношения на х", получим
  • 52. 52 Глава 3. Методы подсчета и оценивания Суммирование последнего уравнения для всех п дает п=0 п=0 п=0 Свойства операций с производящими функциями позволяют данное выражение привести к виду дс (1-х) 2 Учитывая, что и0 = 1, запишем -х „=о л=о Сравнивая коэффициенты при V, заключаем, что п Задача. Найти число замкнутых маршру- тов длины п по ребрам треугольника ABC. Длину ребра принять равной единице. Нача- льная и конечная точка маршрутов — верши- •С на А. Решение. Введем обозначения: ап — число замкнутых маршру- тов длины п из вершины А в вершину А; Ьп — число маршрутов длины л из вершиныА в вершину В сп — число маршрутов длины п из вершины А в вершину С. Очевидно, что из условия симметрии задачи Ъп = с„. Величины же а„, Ь„, сп связаны системой рекуррентных соотношений: bn+ i=an +bn , C n+ l=a n+C n, Ъп =с„. С учетом последнего равенства Ь„ = сп (п = О, 1, 2,...) система при- водится к виду ,+1 =°л +V
  • 53. 3.4. Обобщенное правило произведения 53 Выражая Ъп из первого уравнения и подставляя во второе, полу- чим однородное рекуррентное соотношение относительно по- следовательности {а„}. Запишем его в принятых обозначениях, полагая и„ = а„: «л+2 = "«+1 + 2«„, м0 =!,«! = О, где п = О, 1, 2,... . Решение данного соотношения получим согласно изложенной выше теории. К(х) = -х-2х 2 , U(x)K(x) = С(х) = 1 -х. Характеристическийполином F(x) = х2 - х - 2 = (х - 2)(х + 1). Отсюда Щх)= *"* = -JjL+ -Ji-. (l-2jc)(l+jc) -2х l+jc Перепишем U(x) в развернутом виде по степеням У: П 00 00 Л П , / 1 Ч П 9 ОЭ вд=+£2"*"+±]г;(-1)''*"=2г V V=x»X-Jn=0 ^/1=0 n=0 n=0 Сравнивая коэффициенты при х", заключаем, что число замкну- 2" +(-!)"2 тых маршрутов длины п равно ип = —-—. 3.4. Обобщенное правило произведения Пусть 5 1 !, ^2,..., Sn — произвольные множества. Q = {(»!, ю2 , й>з>---} ~~ множество весов, где под са, будем понимать любой из символов 1, х, у, z, x~ l , y~ l , z~ l и их произведения. В от- личие от элементов, вес — это число либо переменная, которая может принимать любые числовые значения. Назначим каждому элементу j &Sj(i= 1,2,..., л) вес ®(s) e Q. Во многих задачах требу- ется определить количество элементов с определенными свойст- вами, а не их вес. В этом случае полагают m(s) = 1. Пусть С,ю — количество элементов множества 5, с весом со, тог- да A(Sj) = ^Cfoco — сумма весов элементов множества 5 1 ,. соеП Рассмотрим прямое произведение множеств S = SixS2x...*Sn ={E=(sls2...sn)si eSj,i=l,n}.
  • 54. 54 Глава 3. Методы подсчета и оценивания Положим вес элемента множества равным СО(Е) =( 5, )eQ. (=1 Пусть ЕП — количество элементов Е е S с весом ш, тогда A(S) = ^.ЕщШ — сумма весов элементов множества . теП Теорема. A(S) = A(Si)A(S2 )...A(Sn ). Доказательство. А Л ~ А <^ Л1- ._А1 Д Задача. Найти количество замкну- тых маршрутов длины 2л по ребрам трехмерного куба. Начальное и конеч- ное положение — вершина AQ куба. Решение. Исходное положение — вершина А0. Каждый шаг движения по кубу — это выбор одного из трех ребер. Пусть 1 обозначает выбор ребра вдоль оси ОХ, 2 — вдоль оси 07, 3 — вдоль оси OZ. В соответствии с этим введем множества S^ S2,..., S2n такие, что Si = S2 = ... = S2n = {I, 2, 3}. Тогда все маршруты длины 2п соста- вят множество S- S^ x S2 x ... х S2n. Например, маршрут 2113 означает, что изAQ пошли в А5, затем в А$, вернулись в А5 и подня- лись в А2. Назначим веса элементам множества: и(1)=х, ш(2)=у, и(3) = z. По правилуобобщенного произведения суммавесов всех маршрутов длины 2п равна A(S) = A(Sl)A(S2)..^A(Sn) = (x + у + z)2n , т.к. A(S,) = x + у + z • После возведения в степень получим, что k.X i yJZ k , (3.4.1)
  • 55. 3.4. Обобщенное правило произведения 55 где У/г — вес маршрута, включающего / шагов вдоль оси OX, j — вдоль О¥н k — вдоль OZ(i +j + k = 2л), aijk — количество маршру- тов с весом хУ^*- Заметим, что только маршрут, заканчивающийся в AQ, имеет вес x'y'z с четными степенями i,j, k, т. к. в замкнутом маршруте, сде- лав шаг вдоль оси, необходимо вернуться по этой оси. Для выде- ления таких маршрутов положимх = у1 = г2 = 1 (х, у, г.— произво- льные). Тогда выражение (3.4.1) примет вид (х + у + г)2л = С0 + Cjyz + C^xz + Cgxy, (3.4.2) где С0 — число маршрутов, заканчивающихся вА^; С2 — ъА2 , С4 — в Aj, С6 — в А6. Учитывая симметрию точекА2 , А$, А$ относительно AQ, можно за- ключить, что С2 = С4 = С6 = С. Тогда из системы (3.4.2) следует, что (3.4.3) Уравнение (3.4.3) содержит два неизвестных С0 и С при х2 = у1 = z2 = 1. Для их определения составим систему уравнений из выражения (3.4.3), полагая x = y = z= тлх = у-, z=l. Это возможно, т.к. выполняется условие х2 = у2 = z2 = 1. Получим сис- тему з 2п =с0+ зс UCo-C З 2 " +3 Отсюда С0 = -- число искомых маршрутов. Задача. Найти число решений р, q уравнения 2р + 3q = п, где п, р, q e{0, 1, 2,...}. Решение. Введем множества: Sl = {2р р = 0, 1, 2,...}, S2 = {3<7 1 q = = О, 1, 2,...} и S= Sl x S2 = {(2p,3q) p,q = Q,l, 2,...}. Назначим веса элементам данных множеств следующим образом: а)(2^)=х2 ^,ш(3^)=Л и Ш(Е) = ш((2р, 3q)) = х2 ^3 ^" = х2р • х3 " = т(2р)ш(3д). Веса элементов определены таким образом, что выполняется правило обобщенного произведения A(S) =A(S{)-A(S2). Легко за- метить, что степень веса х2 **3 ^" любого элемента Е = (2р, 3q) s5 дает одно из решений исходного уравнения 2р + 3q = п.
  • 56. 56 Глава 3. Методы подсчета и оценивания Раскроем выражение A(S) = A(S)-A(S2 ): HO + «i*+ «г* 2 + ••• + "«*"+ ••• = = (х 2 ' 0 + х 2 ' 1 + х 2 ' 2 + ... + х 2 '" + ...)(х 3 ' 0 + х 3 ' 1 + х 3 ' 2 + ... + х 3 '" + ...) = =(1+х 2 +х 4 +...)(1+х 3 +х б +...)=—Ц-—Ц-, 1-х 2 1-х 3 где м„ — число решений уравнения 2р + Зд = п. Фактически, сум- ма весов A(S) элементов множества S является производящей функцией числа решений уравнения 2р + Зд = п. Таким образом, A(S) = - ^ -- у Разложим данное выражение на множители: (1-х) 2 1-х 2 7 1-х3 *=0 k=0 k=0 где и„ — число решений уравнения 2р + Ъq = «. Сравнивая коэффициенты при одинаковых степенях , полу- чим: _3-(-1)3 "+2-(Зл ~ ~ _3-(-1)3п+2 +2-(Зл+3)+3_2л+3+(-1)3 " "12~ "4~ где я е{0, 1, 2...}. 3.5. Принцип включения и исключения Пусть S = {$!, ^2 , ^З"-"} ~ произвольное множество элементов. Q = {ю1 ,о)2 . «з,...} — множество весов, Q(JA ) — вес элемента sk eS. PI, Р2, РЗ,..., Р„ — свойства элементов или индикаторы свойств элементов.
  • 57. 3.5. Принцип включения и исключения 57 Р ( ч _ J1> еслиэлемент s k обладает свойством />• , ' k [О, если элемент sk не обладает свойством PJ . W(Pj )= ]£] /5 (.УА ) • га(.уfc ) — сумма весов элементов со свойством Р-г sk eS , W(Pt Pi2 ...Pim ) — сумма весов элементов множества S, которые обладают каждым из свойств Pt ,Pt ,..., Pim . W(m) = ^W(Pj Pi2...Pim), суммирование выполняется по всем (Ifa-im) сочетаниям (/1/2—0 длины т из п свойств, количество сочетаний равноС™. Таким образом, в W(m) суммируются веса только тех элемен- тов, которые имеют как минимум т свойств. Пусть элемент s обла- дает k свойствами nk>m, тогда его вес ш(,у) в Щт) войдет С™ раз. Так, W() = 'YJW(Pi ) = W(Pi) + W(P2)+...+W(Pn) содержит С = = п членов и Щ2)= ^W^P^W^PJ+W^P^ + ...+ ЩРп _1 Рп ) Cl'2) содержит С„ 2 =л(« + 1)/2 членов. Распространим определение W(m) на т = 0, положив ^K»(J) — сумма весов элементов исходного множества S. Данное 6 определение W(Q) выполнено корректно, так как сумма ЩО) должна включать элементы, обладающие нуль свойствами и более. Действительно, любой из элементов множества £удовлет- воряет этим условиям. Положим: Е(т) — сумма весов элементов, обладающих ровно т свойствами; ДО) — сумма весов элементов, которые не имеют ни одного из указанных свойств. Теорема. Сумма весов элементов, обладающихточно т свойст- вами из п свойств PI, Р2 ,.~, Рп > равна или Е(т) ="f(-l)' (%цЩт +/). (3.5.1) /=о Доказательство. Для доказательства достаточно показать, что вклад веса e>(s) произвольного элемента s e S в правую и левую
  • 58. 58 _ _ Глава 3. Методы подсчета и оценивания части (3.5.1) одинаковый. Пусть,? 6.5*обладаетточно /свойствами. Возможны следующие соотношения между / и т: 1) / < т, тогда co(s) не входит в Е(т) и не входит в Щт + /) для / = О, 1,..., п — т. Равенство (3.5.1) примет вид 0 = 0. 2) / = т, тогда e>(s) входит один раз в Е(т) и один раз в W(m). 3) / > т, тогда ю(s) не входит в Е(т) илевая часть равна 0. Пока- жем, что в этом случае и правая часть выражения (3.5.1) равна нулю. Вес со(s) в Щт + i) входит С,т+ ' раз, т + i < /. Правая часть для веса со(s) одного элемента s примет вид t-m =сф)£(-1)'С+1.сг. /=0 Заметим, что т m+i (w+Q! * /! (t-m) да!/! (то +/)!(/-(«+'))! Следовательно, С™+| С™+( =С,т С,'_от , а исходная сумма составит t-m t-m 1=0 j=0 И в третьем случае выражение (3.5.1) справедливо. Теорема дока- зана. Следствие. Е(0) = ЩО) - W(l) + Щ2) - ЩЗ) + ... +(-)"W(n). Задача. В группе 23 студента. Из них 18 знают английский язык, 9 — немецкий и 6 — оба языка. Сколько студентов в группе не знают ни одного языка? Сколько студентов знают один язык? Решение. Пусть S— множество всех студентов, S = 23. Назна- чим вес co(j) = 1 всем элементам s s S. Теперь под суммой весов будем понимать количество студентов. Назначим свойства элементам s e S: PI — знание английского языка, Р2 — знание немецкого языка. ДО) — студенты, не знающие языков (не обладают свойствами).
  • 59. 3.6. Ладейные многочлены и многочлены попаданий __ 59 ДО) = W(0) - W() + W(2). seS Щ1) = ЩР{) + W(P2 ) = 18 + 9 = 27. Щ2) = W(P,P2 ) = 6. Тогда ДО) = 23 - 27 + 6 = 2. Е(1) — студенты со знанием одного языка (обладают ровно одним свойством). Задача. Найти число перестановок т шаров, в которых ровно г шаров остаются на месте. Решение. Введем обозначения. Р, — свойство, состоящее в том, что при перестановке шаров /-и шар остается на месте, / = 1, 2..., т. Е(г) — количество перестановок, обладающих ровно г свойст- вами, т.е. при перестановке шаров ровно гиз них остаются на сво- их местах. Тогда по формуле включений и исключений запишем: Е(г) = (-!)' С;+/ Щг + i). Рассмотрим W(r) = ^ЩР^ Ph ...Pir ), 1=0 (l1 '2---'V) где суммирование выполняется по всем сочетаниям (/j/j.-./V) длины г из т свойств, количество сочетаний равно Сг т. W(Pt Pi:i...Pir)=(m -r)! — количество перестановок из т — г ша- ров, так как г шаров должны оставаться на месте. Тогда значение W(r)=Cr m (m-r)l Следовательно, и £(/•)= ^(-l)1 СГ Ы С? (т-г -/)! (=0 г!,to '! г 3.6. Ладейные многочлены и многочлены попаданий Основная цель данного подраздела — показать возможности применения методов подсчета и оценивания при решении конк- ретных задач. В то же время обсуждаемые здесь задачи сами по себе не лишены интереса, и в большей степени для тех, кто впер- вые знакомится ними.
  • 60. 60 Глава 3. Методы подсчета и оценивания Рис. 3.1 3.6.1. Ладейные многочлены • Определение. Доской запрещенных позиций назы- вается произвольный набор выделенных клеток шахматной доски, сохраняющих свое расположе- ние относительно других клетокдоски. Пример до- ски запрещенных позиций показан на рис. 3.1. • Определение. Пусть С — доска запрещенных пози- ций. Введем обозначения: rk — количество способов расста- вить владей на доске запрещенных позиций так, чтобы они не били друг друга; г0 = 1 — количество способов расстановки О ладей на доске запрещенных позиций, т.е. способов не ставить ладьи на доску. Ладьи считаются неразличимыми. Производя- щую функцию последовательности {rk} будем называть ладей- ным многочленом доски С и обозначать 00 IV v /"Л X"1 *• vk (i (. ЛХ,{,) = 2_, r k ' (j.O.JJ С, • Задача. Найти ладейный многочлен для доски Q на рис. 3.2. Рис. 3.2 Решение. Непосредственным подсчетом можно установить, что г0 = 1, ^ = 1 и /-, = 0, /' > 2. Тогда R(x, Cj) = 1 + х. Задача. Найти ладейный многочлен доски С2 на рис. 3.3. Решение. Непосредственным подсчетом можно установить, что г0 = 1, г{ = 2, г2 = 1 и rt •, = 0, / > 3. Тогда Задача. Найти ладейный многочлен доски С3 на рис. 3.4. Рис. 3.4 Решение. Непосредственным подсчетом можно установить, что г0 = 1, г, = 3, г2 = 1 и г,- = 0, /' > 3. Тогда R(x, С3 ) = 1 + 3jc + х2 . Определение. Доски Q и С2 называются неза- висимыми, если их клетки располагаются на различных горизонталях и вертикалях. При- мер независимых досок показан на рис. 3.5. С,-
  • 61. 3.6. Ладейные многочлены и многочлены попаданий 61 Свойства ладейных многочленов • Свойство 1. Правило произведения. Пусть R(x, Q) и R(x, C2 ) — ладейные многочлены независимых досок Cj и С2 . Если доска С= Ci u С2 , то R(x, С) = R(x, CJRix, C2 ). Доказательство. Пусть щ — расстановка ладей на доске С, тг2 — расстановка ладей на доске С2 . Тогда тс = (щ, л2 ) — переста- новка ладей на доске С = С и С2 . Верно и обратное. Пусть Sn и 5Л2 — множество расстановокладей надоске, соответственно Q и С2 . Тогда прямое произведение 5„ =Sn хЗ„2 — множество рас- становок ладей на доске С. Обозначим веса расстановок: w^ ) =xkl , где &, — число ладей в перестановке щ; ш(тг2 ) =xk2 , где k2 — число ладей в перестановке п2 . Тогда вес перестановки п равен s(n)=xkl+k2 =xki -х*2 = Цтс, )со(я2 ). В соответствии с тем, как введены веса перестановок, ладей- ные многочлены можно записать как сумму весов элементов мно- жеств: R(x,Cl ) = ^(^lR(x,C2 )= £ш(*2 ) и Д(х,С)=£ш(я). Многочлены Л(х, Q), 7?(х, С2 ) и /?(х, С) удовлетворяют всем усло- виям правила обобщенного произведения (см. п.3.4), в соответст- вии с которым R(x, С) = R(x, C])R(x, C2). Задача. Найти ладейный многочлен доски С на рис. 3.6. Пусть Cj — доска из одной клетки, R(x, С) = 1 + х. Ясно, что доска С состоит из п независимых досок Q. Отсюда следует, что • Свойство 2. Правило суммы. Пусть С — доска РИС. 3.6 запрещенных позиций. Введем обозначения: С, — доска с ладьей в клетке а (/ — index); Ce^ — доска с уда- ленной клеткой а (е — erase). Тогда В(х,С)=хВ(х>С1л)+В(х,Сел ) или R(xia +еа ) =хД(/а )+R(ea ). Длядоказательства данного свойства вновь рассмотрим ладей- ный многочлен как сумму весов перестановок. Все расстановки множества разобьем на два подмножества Sn . и S,e , Sn . — пе- рестановки с ладьей на клетке а; 5Я — перестановки, которые нееа занимаютклеткуос.
  • 62. 62 Глава 3. Методы подсчета и оценивания Тогда Множитель х перед скобкой — это вес ладьи в перестановке щ^, которая поставлена на выделенную клетку а. Задача. Найти R(x, С) для доски на рис. 3.7. Решение. Воспользуемся правилом суммы, по ко- торому b3& Л 3 . ' Рис " 3 ' 7 Отметим, что по виду полученного ладейного многочлена (производящей функции) можно сказать, что число способов расставить две ладьи на доску С равно 4. • Свойство 3 для прямоугольных досок. Пусть С — прямоугольная доска запрещенных по- зиций размером т х п, т — число горизонта- лей; л — число вертикалей (рис. 3.8). На квадратнойдоске размером k х А:можно &! способами расставить £ладей. Различных досок k х k на доске т х п можно выбрать способами Рис - 3.8 C^C k . Отсюда rk =С%С% -k —число способов расставить k ла- дей на исходной прямоугольной доске. Тогда R(x, С) = min(/7i/i) = £ Ck mCk kxk . k=0 Задача. Найти R(x, С) для прямоугольной доски С размером 2 x 3 . Решение. f^lf~>l-II...I ./^2f^2^iv 2 _ ^2^3 •* +1'2^3 ^'•* Коэффициент при х 2 показывает, что число способов поставить две ладьи на такую доску равно 6.
  • 63. 3.6. Ладейные многочлены и многочлены попаданий 63 3.6.2. Многочлены попаданий Определение. Пусть дана квадратная доска размером л х л с запрещенными позициями (рис. 3.9). Обозначим через En (k) количество перестановок на квадратной доске л ладей, k из которых занимают запрещенные позиции. Многочленом попадания называется произ- п водящая функция E(t) = ^En (k)t последо- Рис. 3.9 вательности (Еп (К)}. Установим связь между многочленом попаданий и ладейным многочленом. Введем обозначения: Sn = {я1; я2 ,..., ял! } — множество всех перестановок л ладей на до- ске л х и; П = {ю!, 0)2,.-} — множество весов; ю: Sn -> П — весовая функция,га(я) е fi — вес перестановки я е Sn i {1, 2,..., т) — номера запрещенных клеток на доске л х л; PI, Р2 ,..., Рт — свойства перестановок; я е Sn обладает свойством PJ, если ее ладья занимает запрещенную позицию/ Р ( -Ъесли л обладает свойством PJ, J О, в противном случае. W(Pj) = ^ PJ (л)ю(я) — сумма весов перестановок со свойством PJ, W(PJiP**.".Ph ) = ZP A W2М-Л(я)со(я) сумма весов перестановок со свойствами Р,- Pj2...PJt; W(k)= УЩР/Р/ ...Р: ), суммирование выполняется по всем / ^_, v 7| Ji Jk " J сочетаниям (/i/2—Л) Длины k из т свойств, число сочетаний С*. Принцип включения и исключения позволяет определить Так как нас интересует лишь количество перестановок, то будем полагать со(л) = 1. Нетрудно установить, что ЩК) = rk(n - K), где rk — количество способов расставить владей на запрещенных по- зициях доски я х и. Тогда Е„ (k) =Ck k rk (п -k)l -Ck k+l rk+l (п -k +1)!+.. .+(-1)"-* Ck m rm (n-m).
  • 64. 64 Глава 3. Методы подсчета и оценивания Заметим, что rk = 0 для всех k > п. С другой стороны, если т < п, то rk = О для всех k > т. Поэтому последнее выражение примет вид Ett (k) = C k k rk (n -k) -C k k+l rk+l (л -k +1)!+.. .+(-!)"-* С>„ (л -л)! или я-А .£„(£) = J](-1) C'k+irk+i(n-(k + i))l. Найденное выражение позво- (=0 ляет записать многочлен попаданий в виде *=0 А=0/=0 Суммирование выполняется по координатам уз- лов сетки на рис. 3.10. Замена переменных сумми- рования k'= k + i и /"= / в последнем выражении по- зволяет упростить многочлен попаданий и приво- п k дит его к виду E(t) = ^^(-l)'C'k rk (n-k)t , где k=0i=0 суммирование уже выполняется по узлам сетки на рис. 3.11. Таким образом, = ^/-J У(-!)'С£-?*~' (л-£)! или *=о U=o J Рис.3.11 *=0 Для более компактной записи последнего выражения введем оператор Е~ , действие которого распространим на функции це- лочисленного аргумента: Е~! (Дл)) =f(n - 1) и Б~*(Дл)) =Дл - k). Например, е"1 (л!) = (л - 1)! и Е~*(Л!) = (л - k) . Заметим, что [(t- l)^l fnl = (t- l)V*7z! = (t- )k (n-k). Тог- да многочлен попаданий перепишем в виде k=0 =o k=0 п ~, где x = (t-l)E . Таким образом, E(f) = R((t - и .
  • 65. 3.6. Ладейные многочлены и многочлены попаданий 65 Задача. Найти многочлен попаданий для доски 3 х 3 с запрещенными позициями на рис. 3.12. За- прещенные позиции отмечены темным цветом. Решение. Найдем ладейный многочлен доски за- прещенных позиций, которая состоит из двух неза- висимых досок. Тогда R(x) = R(S> • Я(ЕП) = (1 + *)(! + Зх + х 2 ) = 1 Значит =R((t- 1)E-V = (1 +4(Г- De'1 +4[(r- De'1 ]2 = 1 • 3! + Aft - l)s~l 3! + 4[(/- l^"1 ]2 3! + [(t- l)s Рис. 3.12 4л2 ~ 1 ] 3 3! = = 3! + 4(t - 1)2! + 4(f - I) 2 1! + (t - I) 3 0! . Итак, E(t) = l + 3t+t2 + t3 . Анализ коэффициентов E(t) при / показывает, что число пе- рестановок, в которых ладьи не занимают запрещенных клеток, равно 1 (коэффициент при f°); перестановок с одной ладьей на запрещенных позициях — 3 (коэффициент при t1 )', перестановок с двумя ладьями на запрещенных позициях — 1 (коэффициент при t2 ); перестановок с тремя ладьями на запрещенных позициях —1 (коэффициент при / ). 3—2697
  • 66. = Глава 4 _ Генерация комбинаторных объектов О комбинаторных алгоритмах часто необходимо порождать и исследовать все элементы некоторого класса комбинаторных объектов. Наиболее общие методы решения таких задач основы- ваются на поиске с возвращением, однако во многих случаях объ- екты настолько просты, что целесообразнее применять специализированные методы. Задачи, требующие генерации комбинаторных объектов; возникают при вычислении комбина- торных формул. Например, часто приходится вычислять суммы, имеющие вид где суммирование выполняется по всем последовательностям jq, х2 ,..., х„, удовлетворяющим некоторым ограничениям. В алгоритмах порождения комбинаторных объектов нас преж- де всего будет интересовать сложность алгоритмов, т.е. общее ко- личество времени, требующегося для порождения всего множе- ства объектов. 4.1. Поиск с возвращением Использование компьютера для ответа на такие вопросы, как «сколько существует способов...», «перечислите все возмож- ные...», или «есть ли способ...», обычно требует исчерпывающего поиска множества решений. Метод поиска с возвращением по- стоянно пытается расширить частичное решение. Если расшире- ние текущего частичного решения невозможно, то возвращаются к более короткому частичному решению и пытаются снова его продолжить. Идею поиска с возвращением легче всего понять в связи с за- дачей прохода через лабиринт: цель — попасть из некоторого за- данного квадрата Нъ другой заданный квадрат Кпутем последо-
  • 67. 4.1. Поиск с возвращением 67 вательного перемещения по квадратам. Трудность состоит в том, что существу- ющие преграды запрещают некоторые перемещения. Один из способов прохо- да через лабиринт — это двигаться из начального квадрата в соответствии с двумя правилами: и к • в каждом квадрате выбирать еще не исследованный путь; • если из исследуемого в данный момент квадрата не ведут не- исследованные пути, то нужно вернуться на один квадрат назад по последнему пройденному пути, по которому при- шли в данный квадрат. Первое правило говорит о том, как расширить исследуемый путь, если это возможно, а второе правило — о том, как выходить из тупика. В этом и состоит сущность поиска с возвращением: продолжать расширение исследуемого решения до тех пор, пока это возможно, и когда решение нельзя расширить, возвращаться по нему и пытаться сделатьдругой выбор на самом близком шаге, где имеется такая возможность. Общий алгоритм В самом общем случае полагаем, что решение задачи состоит из вектора (аь а2 , а$,...) конечной, но неопределенной длины, удовлетворяющего некоторым ограничениям. Каждое ai е At , где AJ — конечное линейно упорядоченное множество. Таким обра- зом, при исчерпывающем поиске должны рассматриваться эле- менты множества (аь а2 , а3 ,..., а,) е Л, х А2 х...х Af , для / = О, 1, 2,... в качестве возможных решений. В качестве исходного частичного решения примем пустой вектор () и на основании имеющихся ограничений выясним, какие элементы из AI являются кандида- тами в oj. Обозначим это подмножество кандидатов через S^ с А{ . В результате имеем частичное решение (а{). В общем случае для расширения частичного решения от (аь a2 ,..., aA _i) до (вь а2 ,..., ak _i, ak ) кандидаты на роль ak выбираются из Sk с Ak . Если частич- ное решение (аь а2 ,..., ak _{) не представляет возможности для вы- бора элемента ak , то Sk = 0; возвращаемся и выбираем новый эле- мент «£_!. Если новый элемент а^ выбрать нельзя, возвращаем- ся еще дальше и выбираем новый элемент ak_2 и т.д. Этот процесс удобно представлять в терминах прохождения дерева поиска в
  • 68. 68 Глава 4. Генерация комбинаторных объектов глубину. Процедура поиска с возвращением для нахождения всех решений формально представлена в алгоритме 4.1. Алгоритм 4.1. Общий алгоритм поиска с возвращениями 6*! =Ai', {Выделить кандидатов} k= 1; {Длина частичного решения} while k > 0 do begin while Sk Ф 0 do begin ak e Sk; {Расширить частичное решение } Sk = Sk — {ak}; {Удалить выбранного кандидата} if(ai, a2,..., ak) —решение then Сохранить решение; k = k+ 1; (Расширить частичное решение} Sk с Ak; {Выделить кандидатов] end; k = k— 1; {Вернуться, уменьшить частичное решение] end. Поиск с возвращением приводит к алгоритмам экспоненциа- льной сложности, так как из предположения, что все решения имеют длину не более «, исследованию подлежат приблизительно п Y[ Ak элементов. В предположении, что все Ak = С— констан- k= п ты, получаем экспоненциальную сложность ]^[|^|=С Л . Нужно *=i помнить, что поиск с возвращением представляет собой только общий метод. Непосредственное его применение обычно ведет к алгоритмам, время работы которых недопустимо велико. Поэто- му, чтобы метод был полезен, к нему нужно относиться как к схе- ме, с которой следует подходить к задаче. Схема должна быть хо- рошо приспособлена (часто это требует большой изобретательно- сти) к конкретной задаче, так чтобы в результате алгоритм годил- ся для практического использования. 4.2. Перестановки различных элементов Перестановки множества {а1; a2 ,..., а„} различных элементов относятся к часто порождаемым комбинаторным объектам. Без ограничения общности можно полагать, что элементами множе- ства являются целые числа от 1 до п, т.е. рассматриваются пере- становки целых чисел 1, 2,..., п.
  • 69. 4.2. Перестановки различных элементов 69 Порождение перестановок на основе метода поиска с возвра- щениями выполняется в алгоритме 4.2. Заметим, что в процессе приспосабливания общего алгоритма 4.1 поиска с возвращения- ми к задаче порождения перестановок мы не вычисляли и не хра- нили явно множества Sk . В этом случае легче и достаточно хра- нить только наименьшее значение из Sk , т.е. sk , и следующее зна- чение вычислять по мере необходимости. Проверка условия Sk Ф 0 соответствует условию sk < n, поскольку алгоритм устроен так, что перебор значений элемента sk выполняется в порядке их возрастания. Поэтому неравенство sk > п соответствует пустому множеству кандидатов Sk = 0. Алгоритм 4.2. Порождение перестановок методом поиска с возвращением SY = 1; {Первый кандидат} k = 1; {Длина частичного решения} while k > 0 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; {Расширить частичное решение} s k = i; while sk <n and notflag(sk ) do sk = sk + 1; end; end; k = k - 1; {Вернуться, уменьшить частичное решение} end; Function flag(sk ) {Поиск элемента sk e перестановке (й1 ,а2 ,---, ^_i)} flag= TRUE; /=i; while i < k andflag do begin if a, = sk then flag = FALSE; i= i+ 1; end.
  • 70. 70 Глава 4. Генерация комбинаторных объектов Программа на языке Pascal реализации рассмотренного мето- да генерации перестановок приводится в алгоритме 4.3. Следует отметить, что в программе размерность (длина) и перестановок читается из файла и порождаемые перестановки также сохраня- ются в файле. Попутно программа вычисляет время порождения всех перестановок с точностью до сотых долей секунды, которое сохраняется в конце файла сгенерированных перестановок. Алгоритм 4.3. Программа на Pascal'е порождения перестановок методом поиска с возвращением Program Start_BackTrack; {Порождение перестановок} uses CRT,DOS; Const max_n=20; Type Vector=array[I..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; i:=i+l; 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[!]:=!; k:=l; while k>0 do begin while s[k]<=n do begin a[k]:=s[k]; repeat {Поиск следующего кандидата на место a[k]} s[k]:=s[k]+l; until (s[k]>n) or Flag(a,s[k],k); if k=n then begin {Перестановка найдена} m:=m+l;
  • 71. 4.3.Эффективноепорождениеперестановок 71 Write(f,m,') '); for i:=l to n do Write(f,a[i],' '); WriteLn(f); end else Ьед1п{Поиск первого кандидата на место 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(f,'BkTrack.in'); Reset(f);{Файл открыт для чтения} ReadLn(f,n);{Ввод длины перестановки} Close(f); Assignff,'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(f,'Время счета=',delta div 100,'.', delta mod 100,' сек'); Close(f); end{Main}. 4.3. Эффективное порождение перестановок Последовательность я! перестановок на множестве {1, 2,..., «}, в которой соседние перестановки различаются так мало, как только возможно, — лучшее, на что можно надеяться с точки зрения мини-
  • 72. 72 Глава 4. Генерация комбинаторных объектов мизации объема работы, необходимого для порождения перестано- вок. Для того чтобы такое различие было минимально возможным, любая перестановка в нашей последовательности должна отличать- ся от предшествующей ей транспозицией двух соседних элементов. Такую последовательность перестановок легко построить рекур- сивно. Для п = 1 единственная перестановка {1} удовлетворяет на- шим требованиям. Предположим, мы имеем последовательность перестановок л1; л2 > я з>--- на множестве {1, 2,..., п}, в которой после- довательные перестановки различаются только транспозицией смежных элементов. Расширим каждую из этих (и — 1)! перестано- вок, вставляя элемент п на каждое из я возможных мест. Порядок порождаемых таким образом перестановок будет следующим: 17iH 21- Г1234 ,23 1243123 1423 [4123 Г4132 i тл 143213/ 11342 [1324 Г3124 312 3142312 3412 [4312 Г4321 „,1342132 M 3241 [3214 Г2314 9,11234123 Ч2431 [4231 Г4213 21 т]2413213 12143 [2134 Данную последовательность перестановок можно порождать итеративно, получая каждую перестановку из предшествующей ей и небольшого количества добавочной информации. Это дела- ется с помощью трех векторов: текущей перестановки я = (nl , я2 ,..., тг„), обратной к ней перестановкир = (р±, р2 ,---, р„) и записи направления dt , в котором сдвигается каждый элемент / (—1, если он сдвигается влево; +1, если вправо; и 0, если не сдвигается).
  • 73. 4.3. Эффективное порождение перестановок 73 Элемент сдвигается до тех пор, пока не достигнет элемента, боль- шего, чем он сам; в этом случае сдвиг прекращается. В этот мо- мент направление сдвига данного элемента изменяется на проти- воположное и передвигается следующий меньший его элемент, который можно сдвинуть. Поскольку хранится перестановка, об- ратная к я, то в л легко найти место следующего меньшего эле- мента. Алгоритм 4.4 представляет собой реализацию рассмотрен- ного метода. Корректность алгоритма доказывается индукцией по п. Алго- ритм порождения всех п перестановок линеен, сложность его определяется как п + о(п). Алгоритм 4.4 — один из наиболее эф- фективных алгоритмов для порождения перестановок. Рабочая программа на языке Pascal реализации эффективного метода генерации перестановок приводится в алгоритме 4.5. В качестве примера в алгоритме 4.6 приводится программа ре- ализации эффективного метода генерации перестановок, напи- санная на языке Си. Алгоритм 4.4. Метод эффективного порождения перестановок fori= ton я0 = nn+i = т = n + 1; {Метки границы} Print к = (п1,п2,...,п„); while тФ do • т =п; whileп„ .А >т do т ~ "! [т =т-1 :рт +dm ; (Изменить я} р. <*рт (Изменитьр = п ,np,dm =m] Алгоритм 4.5. Программа на Pascal'е порождения перестановок эффективным методом Program Start_Effeet; {Эффективная генерация перестановок} uses CRT,DOS; Const max_n=20; { n<=max_n } Type Vector=array [0. .max^_n+l] of Integer; Var f :Text; { Генерация перестановок z[l], z[2], .../ z[n] }
  • 74. 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+1]:=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[m]+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.
  • 75. 4.3. Эффективное порождение перестановок 75 Алгоритм 4.6. Программа на Си порождения перестановок эффективным методом ^include <stdio.h> ttinclude <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,"Id",&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; i++ ){ z [i]=p [i]=i d[l]=0; z[0]=z[n+l]=m=n+l; k=0; while ( m!=l ) { //Печать перестановки k++; fprintf (f, "n%ld) ",k); for( 1=1; 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(Stnew); delta=tnew.hour; delta-=t .hour; delta*=60;
  • 76. 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 сек", ( l o n g ) ( d e l t a / 1 0 0 ) , ( l o n g ) ( d e l t a % 1 0 0 ) ) ; f c l o s e ( f ) ; 4.4. Порождение подмножеств множества Порождение подмножеств множества {аь а2,..., а„} эквивалентно порождению «-разрядных двоичных наборов а,, принадлежащих подмножеству, если и только если /-и разряд равен единице. Таким образом, задача порождения всех подмножеств множества сводится к задаче порождения всех возможных двоичных последовательно- стей длины п. Очевидно, что наиболее прямым способом порожде- ния всехдвоичных наборов длины п является счет в системе счисле- ния с основанием 2, как показано в алгоритме 4.7. Перевод этого алгоритма на язык подмножеств множества {alt а2,..., ап] осуществляется согласно алгоритму 4.8, где добавлен фиктивный элемент а„+1. Алгоритм 4.7. Счет в системе счисления с основанием 2 для порождения всех п—разрядных наборов for i = 0 to п do bj = 0; while bn Ф 1 do /=0; while bi = ldo{ bi l'- b, =1 Алгоритм 4.8. Порождение подмножеств счетом в двоичной системе счисления while an+l eS do Print(S), /=0; while a.r e S do . ~ , [/=/+!;
  • 77. 4.4. Порождение подмножеств множества 77 Задача «Счастливый билет». Дано п (п>2) произвольных цифр: Oj, а2,..., а„, где и, е {1,2,..., 9}, и произвольное целое число w. Написать программу, которая расставляла бы между каждой парой цифр аь а2,..., ап, записанных именно в таком порядке, знаки +,- так, чтобы значением получившегося выражения было число т. Например, если д15 а2,..., ап соответственно равны 1, 2,..., 9 и т = 5, то подойдет следующая расстановка знаков: 1—2+3—4+5—6+7—8+9. Если требуемая расстановка невозмож- на, то сообщить об этом. Исходные данные вводятся из текстового файла, имеющего сле- дующую структуру: Первая строка — целое число п. Вторая строка — целое число т. Третья строка — цифры at, a2,..., ап через пробелы. Результаты расчетов сохранить в текстовом файле. Пример файла исходных данных: 14 71 6 5 8 8 4 7 5 2 3 4 5 7 8 9 Пример файла выходных данных: 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 с. Ясно, что для решения данной задачи достаточно выполнить полный перебор всех возможных вариантов расстановки знаков «±» между каждой парой цифр аъ а2 ,...,ап и выбрать те расстанов- ки знаков «±», которые удовлетворяют условию равенства суммы величине т. Всего позиций для расстановки «±» равно п — 1, а значит для полного перебора необходимо проверить 2"~ 1 двоич- ных наборов, если «+» будет соответствовать 1, а «—» — 0. Программа решения задачи «счастливый билет» представлена алгоритмом 4.9. Процедура SubSet (подмножество) этой програм- мы реализует рассмотренный выше алгоритм 4.7 счета в системе счисления с основанием 2 для порождения всех (п — 1)-разрядных наборов. Порожденные двоичные наборы используются в проце- дуре Summa (сумма) для формирования суммы, соответствующей данному набору знаков «±», где «+» соответствует 1, а «—» — 0.
  • 78. 78 _ Глава 4. Генерация комбинаторных объектов Алгоритм 4.9. Программа на Pascal 'е решения задачи «Счастливый билет» 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+ (2*b [i] -1) *a[i+l] ; if S=m then begin Write(f,a[l]); for i:=l to n-1 do begin if b[i]=l then Write {£,'+') else Write (f,'-'); Write(f,a[i+l]); end; WriteLnff,' = ',3: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,b,n,m); i:=l; while b[i]=l do begin end; end; end;
  • 79. 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. Генерация размещений с повторениями Порождение множества всех размещений с повторениями длины k из элементов {а0, аь..., ап_{ эквивалентно генерации множества ^-разрядных чисел в системе счисления с основани- ем и: на г-м месте в размещении будет располагаться элемент я,, если цифра в r-м. разряде соответствующего числа равна /. Всего размещений с повторениями п . Например, для k = 2 и п = 3 все наборы длины два в системе счисления с основанием три можно записать: 00,01,02,10,11,12, 20,21,22. Тогда эквивалентные раз- мещения примут вид (а0я0), (а0а{), (айа2), (а^), (а^), (а^), (а2«о). (a 2fl i)> (o2«2)- Алгоритм 4.10 использует фиктивный элемент bk при порож- дении наборов длины k в системе счисления с основанием и, где
  • 80. 80 Глава 4. Генерация комбинаторных объектов bj е {О, 1,..., п — 1}, /'=О, 1,..., k,т.е. 6,—этоцифрыгенерируемого числа в системе счисления с основанием п. Алгоритм 4.10. Счет в системе счисления с основанием п для порождения всех k-разрядных наборов while bk * 1 do Awr(6*_i>**-2>-A)); /=0; whilebj =n-ldo .'_~ ' bt =6, +1. 4.6. Порождение сочетаний Обычно требуются не все подмножества множества {alt a2,..., а„}, а только те, которые удовлетворяют некоторым ограничени- ям. Особый интерес представляют подмножества фиксирован- ной длины k, С* сочетаний из п предметов по А:штук. Как обычно, предполагаем, что основным множеством является множество натуральных чисел {1, 2,..., п}; таким образом, будем порождать все сочетания длины k из целых чисел {1,2,..., п}. Так, например, Cl =20 сочетаний из шести предметов по три (т.е. трехэлементные подмножества множества {1,2,3,4,5,6}) записываются в лексиког- рафическом порядке следующим образом: 123 135 234 256 124 136 235 345 125 145 236 346 126 146 245 356 134 156 246 456 Сочетания в лексикографическом порядке можно порождать последовательно простым способом. Начиная с сочетания (1, 2,...,k} следующее сочетание находится просмотром текущего со- четания справа налево с тем, чтобы определить место самого пра- вого элемента, который еще не достиг своего максимального зна- чения. Этот элемент увеличивается на единицу, и всем элементам справа от него присваиваются новые возможные наименьшие значения, как показано в алгоритме 4.11. Алгоритм порождения всех С* сочетаний линеен, его сложность С* +о(С%).
  • 81. 4.6. Порождение сочетаний 81 Алгоритм 4.11. Порождение сочетаний for i = 0 to k do с/ = i; Print(ci,c2,...,ck); while Cj = n -k+j do j = j -1; Cj = Cj +1; oc, =c, , +1. whilej Ф 0 do Задача. Выпуклый многоугольник. Дано множество пар целых чисел (*j, у{), (х2, у2),---, (хп, у„) — координаты точек на плоскости. Написать программу выделения тех точек из заданного множест- ва, которые являются вершинами выпуклого многоугольника, содержащего все остальные точки. Исходные данные представле- ны в текстовом файле, имеющем следующую структуру. Первым числом в файле является целое п — количество точек. Последую- щие числа определяют п пар целых (х, у,) — координаты точек. Ре- зультаты расчетов, признаки принадлежности исходных точек выпуклому многоугольнику: 0 — точка не принадлежит, 1 — точ- ка принадлежит, сохранить в текстовом файле. Пример файла исходных данных: 15 0 0 9 9 5 1 2 3 2 7 1 1 5 4 6 7 1 5 6 7 3 4 5 7 7 8 8 7 6 4 Выходной файл для данного примера: 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 Решение. Если не применять специальных методов, то в каче- стве решения можно использовать следующий алгоритм. Ясно, что точка (Xj у,) является вершиной выпуклого многоугольника, если она не лежит ни в одном треугольнике, вершинами которых являются исходные точки (xb yj, (x2 , у?),..., (хп , уп ), без рассмат- риваемой точки (xt у,-). Всего треугольников из п точек можно со- ставить С„ 3 + 0(п 3 ). Тогда сложность задачи полного перебора тре- угольников для каждой точки (xir у,) составит 0(п ). Реализация данного подхода представлена программой на языке Pascal в ал- горитме 4.12.
  • 82. 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 VI • —*~ M 1 • V9 • —<~ Г ? 1 • V • —1~ Г 7 1 •j.x > —O L J . J , ?*£.. —о i &. j , jvj. —L - i ~ j j f 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;
  • 83. 4.7. Порождение композиций и разбиений 83 Procedure Combination( n:Integer ); {Генерация сочетаний из п по 3} Const k :Integer=3; {Длина сочетания} Var с :Combine; {Сочетание} i,j :Integer; begin for i:=l to k do c[i]:=i; j:=l; while j<>0 do begin {Print(c,k);} Envelope(c,n); j:=k; while c[j]=n-k+j do j:=j-l; c[j]:=c[j]+l; for i:=j+l to k 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],' *); Close(f); end. {Main} 4.7. Порождение композиций и разбиений Рассмотрим задачу порождения разбиений положительного числа п в последовательность неотрицательных целых чисел (z, z2,..., zk], такчто Zi + z2 + ... +zk = n. Разбиение {^i, Zi,--, zk } называется композицией числа п, если учитывается порядок чисел г,. Как правило, представляют инте- рес композиции, в которых либо все г, > 0, либо все г, > 0.
  • 84. 84 Глава 4. Генерация комбинаторных объектов Разбиение {^i, Zi,—, Z^} называетсяразбиением числа п, если все Zj> 0 и порядок чисел г, не важен. По сути разбиение {z, Z},—, Z/J числа я является мультимножеством (см. п. 1.8). Рассмотрим примеры разбиения числа п = 3. (1, 2), (2, 1) — все композиции числа три из двух частей, г/ > 0. (1, 1, 1) — все композиции числа три из трех частей, z > 0. (О, 3), (1, 2), (2, 1), (3, 0) — все композиции числа три из двух час- тей, z,> 0. (3), (1, 2), (1, 1, 1) — все разбиения числа три. Композиции z, > О Композицию [z, Zi,-, zd, гдеZj > 0, числаz + Zi +-+ z^ = n можно интерпретировать следующим образом. Каждое значение Zj= 1,+ 1/ + ... + 1/ представим как сумму единиц, количество кото- рых zt . Индекс у элемента 1,- показывает его принадлежность разло- жению числа Zj. Таким образом, мы ввели k типов различных эле- ментов {1Ь 12 ,..., 1*}, значение каждого из них равно единице. Те- перь любую композицию можно представить как сумму, составлен- ную из п произвольных единиц множества {Ij, 12 ,..., 1*}. Суммируя подобные единицы 1, с одинаковыми индексами, получим соответ- ствующие значения £, композиции. Данное соответствие является взаимно однозначным, откуда и следует, что число композиций равно числу сочетаний с повторениями C"k = C^_j = C^+A_j. Каждое из сочетаний C"+k_{ можно интерпретировать как расстановку 1 и О длины п + k - 1, в которой п единиц и k - 1 нуль, т.е. каждому соче- танию ставим в соответствие (п + k- 1)-разрядное число из единиц и нулей; верно и обратное. Суммируя в таком числе слева направо единицы между нулями (их k - 1), будем получать соответствующие значения членов z (их k) композиции. Например, одному из c «+*-i =c i7? +7-i сочетаний 11011100111101111111010 соответствует композиция (2,3,0,4,7,1,0) числа 17. Ясно, что методы предыдущего раздела генерации подмно- жеств множества легко применить к последовательному порож- дению рассмотренных композиций г, S 0. Композиции zt > О Удобное представление композиций получается из рассмотре- ния целого числа п как отрезка прямой, состоящего из отрезков единичной длины. Линия разделена п - 1 точками, и композиция
  • 85. 4.7. Порождение композиций и разбиений 85 получается пометкой некоторых из них. Элементами компози- ции являются просто расстояния между смежными точками. На рисунке показано графическое представление композиции (2,1,2,2,1) для числа п = 8. Очевидно, что каждая композиция чис- ла п соответствует способу выбора подмножества из п - 1 точек. Каждой точке можно сопоставить двоичную цифру, и, таким об- разом, композиции п будет соответствовать (п - 1)-разрядное число. В этой интерпретации композиция из Участей соответст- вует (п - 1)-разрядному числу ровно с k - 1 единицами, и поэтому существует C*J/ таких композиций. Воспользуемся методами предыдущего раздела для генерации композиций Zj > 0. Учитывая, что в композиции z + Z2 +...+ zk = п каждый из Zj > 0, тогдадля новых переменных г, = z, - 1, (г,- > 0) со- ответствующая композиция (/*!, г2 ,..., rk ) будет для числа n-k = = r i + Г 2 + "- + r k> r i - О- Генерация слагаемых г, > 0 композиции (г1; r2 ,..., rk ) подробно разобрана в предыдущем разделе, добавляя к каждому из г, по единице, получим слагаемые zf > 0 композиции {Zi, Z2 , — , Zk}- Разбиения Разбиения п отличаются от композиций п тем, что порядок компонент не важен, так что, например, не делается различия между, скажем, 1+1+2,1+2+1, 2+1+1. Таким образом, разбиение п можно рассматривать как мультимножество, которое записы- вается следующим способом: {ml »zl ,m2 »z2 ,..-,mk »zk }, где имеется т вхождений z, т2 вхождений z2 , щ вхождений г3 k и т. д. и и =^/и,г,. Каждое разбиение удовлетворяет условию /=1 Zi > z2 > ... > z^ Рассмотрим пример генерации разбиений для п = 7. Последовательность генерации разбиенийданного примера далее будет положена в основу алгоритма порождения полного списка разбиений. Идея приведенного списка разбиений состоит в том, чтобы пе- реходить от одного разбиения к следующему, рассматривая са- мый правый элемент тk »zk разбиения. Если mk zk достаточно ве-
  • 86. 86 Глава 4. Генерация комбинаторных объектов лико (mk > 1), можно исключить два zk для того, чтобы добавить еще одно zk + 1 (иливключить одно ^ + 1, если втекущиймомент его нет). Если mk = 1, то m^Zk-i + mkzk достаточно велико для того, чтобы добавить Zk- + 1. Все, что остается, превращается в соответствующее число единиц и формируется новое разбиение. {VI) {1«2,5Ч} {2'2,3'1} {3-2, 1-1} {1-3, 4-1} {1'3,1«2,2Ч} {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'U =(1,1,1,1,1,1,1) ={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} ,1}={3,3, ={4,1,1,1} ={4,2,1} ={4,3} ={5,1,1} ={5,2} ={6,1} {1'7> ={7) Алгоритм 4. 13 использует рассмотренный процесс для порож- дения всех разбиений числа п. Алгоритм 4.13. Генерация разбиений числа п k=; т = п; while k Ф 0 do • Print{ml •zl ,m2 Summa = тk zk {k-k-V ifmk =lthen~' l> c [Summa =Summa+mk zk ', ifZk-i = z k +lthen elsel k . k ' mk =1; if Summa >zk then mk+l = Summa-zk ',
  • 87. 4.7. Порождение композиций и разбиений 87 Алгоритм 4.13 линеен, так как число операций, необходимых для перехода от одного разбиения к другому, ограничено кон- стантой, не зависящей от п и k. Программа на языке Pascal реализации рассмотренного мето- да генерации разбиений чисел приводится в алгоритме 4.14. От- метим, что в программе число для разбиения п читается из файла, а порождаемые разбиения сохраняются в файле. Попутно про- грамма вычисляет полное время генерации всех разбиений с точ- ностью до сотых долей секунды, которое сохраняется в конце файла сгенерированных разбиений. Алгоритм 4.14. Программа на Pascal'е генерации разбиений числа п 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,'{ Л ); for i:=l to k do begin Write(f,m[i],'*',z[i]); if iok then Write (f,','); end; WriteLnff,'}'); end;{Print} Procedure Divide( n:Integer ); {Разбиение числа n) Var k,Sum :Integer; begin; k:=l; z[-l]:=0; m[-l]:=0;
  • 88. 88 _ Глава 4. Генерация комбинаторных объектов z [0] :=п+1; т[0] :=0; :=п; while k<>0 do begin Print (т, 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, Seel00 :Word; rHour, rMinute, rSecond, rSeclOO :Word; delta rLonglnt; begin Assign(f,'Divide.in'); Reset (f); {Файл открыт для чтения} ReadLn(f,n); {Чтение числа 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*100+rSeclOO-Secl00; WriteLn(f,'Время счета=',delta div 100,'.', delta mod 100,' сек' ) ; Close (f ) ; end.
  • 89. 4.8. Генерация случайных перестановок 89 4.8. Генерация случайных перестановок Пусть тс = (nlt я2 ,..., п„) — произвольно выбранная перестанов- ка целых чисел 1, 2,..., п, например, я = (1, 2,..., и) — тождествен- ная. Случайную перестановку можно получить за линейное время О(п) из выбранной перестановки я = (я1; я2 ,..., п л)> выполнив в ней п транспозиций (см. п.7.4). Для промежуточных перестановок введем верхний индекс, значение которого будет соответствовать количеству выполнен- ных транспозиций. Один из элементов в каждой транспозиции выбирается случайным образом. Индекс такого элемента уста- навливается функцией rand(k,t), которая порождает независимые случайные целые числа на отрезке [k, l с равномерным распреде- лением. Положим я (0) = (Tc ( j 0) ,тс ( 2 0) ,...,TcJ, 0) )равной исходной перестановке я = (яь тс2 ,..., тс„). Каждая следующая перестановкаTC W =(я ( 1 А) ,тс ( 2 /г) ,..., я^')получаетсяизпредыдущейперестановкия**' 1 ' =(п^' 1) ,n ( 2 k ~ l) , ...,я^*~ 1) ) транспозицией элементов я^ -1) ия ( г *~]* гдеА;= 1,2,..., п. Между элементами перестановок я , я ,..., я вьшолняются ра- венства я ( ;> =я ( А "- 1) =..-=n[ k) , где k=l, 2,..., п. Покажем, что после выполнения всех указанных п транспози- ций равновероятно получение любой из п! возможных перестано- вок и = (als о-2 ,...,ст„) исходных чисел я1 ,п2 ,...,кп . Для этого доста- точно проверить, что Рг(л ( '^ = а) = /п. С этой целью введем со- бытия AI, А2 ,..., Ап . k _V =0-^}, k = 2,..., п. Вероятности данных событий, согласно схеме формирования я (0) , я (1) ,..., я (п) , равны Pi(Ak ) = !/(«- k +1), гдеЛ=1, 2..., п. перестановок я (0) , я (1) ,..., я (п) , равны
  • 90. 90 _ Глава 4. Генерация комбинаторных объектов Условие я**' 1 * =ст1 &л ( 2 /: " 1) =ст2 &...&л^ 1) =ok _l в событии Ль k = 2,..., п, обеспечивает выбор элемента n (k ~ 1 ),, , из множестваrand(kjt) {я^* 1) ,п ( А *~ 1) ,...,я^ ^J, которое совпадает с множеством {стл , сгЛ+ 1,..., а„}. Индекс же rand(k, n) элемента n^J* является неза- висимой случайной величиной с равномерным распределением на отрезке [k, n] целых чисел. Теперь заметим, что Рг(л(я) = ст)=Рг(л( 1") = ст1&я2") = а2&...&я<л) =а„) = = Рг(л( 1 1) =сг1&л( 2 2) =а2&...&л<,я) =ст„) = Рассмотренный метод генерации случайной перестановки представлен в алгоритме 4.15. Алгоритм 4.15, Генерация случайной перестановки for k= to n do nk = k; {Начальная перестановка} for k = 1 to n - 1 do uk «-» nrand (krf> ; { Случайная перестановка} или, если генерацию перестановки вести с конца, for k = 1 to n do nk - k {Начальная перестановка] for k = n to 2 do nk <-» Kran d({^) { Случайная перестановка}.
  • 91. Сортировка и поиск ассматриваемые здесь вопросы можно отнести к наиболее часто встречающимся в задачах машинной обработки данных. Почти во всех компьютерных приложениях множество объектов должно быть переразмещено в соответствии с некоторым заранее определенным порядком. Очевидно, что с сортированными дан- ными легче работать, чем с произвольно расположенными. Сор- тировка больших объемов данных составляет значительную часть коммерческой обработки данных, эффективные алгоритмы для сортировки важны и с экономической точки зрения. Эффектив- ность оценивается с точки зрения требуемых памяти и времени, а также простоты программирования. Простота программирова- ния предполагает и простоту понимания используемого метода, поскольку для того, чтобы написать хорошую программу, важно хорошо понять соответствующий метод. В наших же оценках мы будем учитывать только число сравнений. Самые простые алго- ритмы сортировки, основанные на сравнении элементов, имеют сложность порядка 0(п г ), а лучшие из них обходятся количеством сравнений 0(«log2 «). Задачу сортировки можно сформулировать так: дана последо- вательность из п элементов alt а2 ,..., а„, выбранных из множества, на котором задан линейный порядок, т.е. для любых а,, а7 - выпол- няетсялибо а, < Oj, либо а, < я,, либо ау = Oj, либо а, > йу , либо а, > Oj. Требуется найти перестановку n = (nl ,n2 ,...,nn ) этих п элементов, которая отобразит данную последовательность в неубывающую последовательность ап <а„2 <...<аТГл . Как правило, далее будем получать саму упорядоченную последовательность, а не упорядо- чивающую перестановку п. Методы сортировки классифицируются на внутренние (когда данные размещаются в оперативной памяти) и внешние (когда данные размещаются на внешней памяти). Внешняя сортировка составляет часть таких приложений, в которых в работу вовлека- ется гораздо больше элементов, чем можно сразу запомнить в оперативной памяти. Поэтому методы внешней сортировки при-
  • 92. 92 Глава 5. Сортировка и поиск менимы к данным, находящимся на внешних устройствах памя- ти, и имеют огромное коммерческое значение. Внутренняя сортировка важна как для разработки алгоритмов, так и для коммерческих приложений. Сортируемые данные раз- мещаются в оперативной памяти. Здесь рассматриваются именно методы внутренней сортировки данных. Известно много алго- ритмов сортировки данных. Почему же так много методов сорти- ровки? Ответ состоит в том, что каждый метод имеет свои преи- мущества и недостатки, поэтому он оказывается эффективнее других при некоторых структурах данных и аппаратной части. Здесь же мы не пытаемся охватить даже те из них, которые счи- таются важными; скорее, мы ограничимся методами, оказавши- мися полезными в разработке алгоритмов и в практической их ре- ализации. Рассматриваемые здесь методы сортировки активно используются при разработке алгоритмов во многих разделах данного пособия. Полезно изучить характеристики каждого ме- тода сортировки, чтобы можно было производить разумный вы- бор для конкретных приложений. К счастью, задача изучения этих алгоритмов не столь уж громоздка. 5.1. Сортировка вставками Сортировка вставками элементов аь а2 ,..., а„ относится к наи- более очевидным методам (алгоритм 5.1). Для компактности ал- горитма вводится фиктивный элемент а0 , значение которого устанавливается равным -оо. Сортировка проходит цикл дляу = 2, 3,..., п; для каждого j элемент в,- вставляется в свое правильное место среди я1; а2 ,..., o/_i. При вставке элемент ^временно разме- щается в >и просматриваются имена Ду_1( Oj_2 ,..., a^, они сравни- ваются с w и сдвигаются вправо, если обнаруживается, что они больше w. Имеется фиктивный элемент а0 , значение которого -оо служит для остановки просмотра слева. Алгоритм 5.1. Сортировка вставками о0 = '=7-1; w=a j> forj = 2 ton do{ I a,., =a,-; while w <o. do { '+1 [/=/+1; ai+1=w.
  • 93. 5.2. Пузырьковая сортировка 93 Сложность алгоритма определяется числом проверок условия w < djB цикле. Сравнение w < д, для конкретного w = а, (/' > 2) вы- полняется 1 + с^раз, где dj — число элементов, больших Oj и стоя- щих слева от него, т.е. dj — это число инверсий, у которых второй элемент о,-. Числа dj составляют таблицу инверсий dld2...dn, а так как 0 <fl"i< л - 1, 0 < d2 < л - 2,..., О < dn_v < 1, dn = 0, то в худшем п случае сортировка элементов ab a2,..., an потребует ~^(l + d j ) < j'2 А „ .. n(n-l) n . 2ч <2_l(l+n-j) = — - - - = 0(n ) сравнении. Сложность сортировки >2 2 вставками является квадратичной. 5.2. Пузырьковая сортировка Рассматриваемый метод пузырьковой сортировки последова- тельности аь а2,..., ап представляет собой наиболее очевидный метод систематического обмена местами слева направо смежных элементов, не отвечающих выбранному порядку, до тех пор пока каждый элемент не оказывается на правильном месте. Эта техни- ка получила название пузырьковой сортировки, так как большие элементы «пузырьками всплывают» вверх в конец списка. Реали- зация метода представлена алгоритмом 5.2. В алгоритме исполь- зуется переменная Ь, значение которой при каждом проходе цик- ла устанавливается равным наибольшему индексу t, такому, что все элементы аг+1, а1+2,..., ап уже находятся на своих окончатель- ных позициях. Ясно, что не имеет смысла продолжать просмотр для указанных элементов. Алгоритм 5.2. Пузырьковая сортировка while b*Qdoforj=tob-do if a} > aj+l then I uj _ [' -J' (b=t. Сложность алгоритма определяется числом проверок условия uj > aj+i в цикле и числом обменов я,- <-> а,+1, которое равно числу инверсий в исходной перестановке элементов alt a2,..., ап. Опре- делим число сравнений. В худшем случае верхняя граница b - 1
  • 94. 94 ___ Глава 5. Сортировка и поиск вложенного циклаfor на каждом шаге внешнего цикла while будет 1 уменьшаться на 1, тогда число сравнений равно ^(Ь -1) = (я - 1) + +(п-2)+...+1=—--=0(л 2 ).Сложностьпузырьковойсорти- ровки является квадратичной. В алгоритме 5.3 представлена «полная» пузырьковая сортиров- ка. Это наиболее популярный и упрощенный вариант алгоритма 5.2. Ясно, что основным достоинством алгоритма полной пузы- рьковой сортировки является легкость программирования. Сложность же алгоритма 5.3 остается постоянной, равной 2 п-/)=(п-1)+(п-2)+...+1=—--=0(п 2 ),инезависитотрас- 2 положения исходных данных. Алгоритм 5.3. Полная пузырьковая сортировка for i = 1 to n do begin forj = 1 to n - i do begin end; end. > aj+i then а} <-> 5.3. Сортировка перечислением Идея сортировки поеледовательности д1; а2 ,..., «„данных пере- числением состоит в том, чтобы сравнить попарно все элементы аь а2 ,..., ап и подсчитать, сколько из них меньше каждого отдель- ного элемента (алгоритм 5.4). Для подсчета числа элементов, ме- ньших данного, в алгоритме используется вспомогательный век- тор cl ,c2 ,--,cn . После завершения алгоритма значения Cj+l,j= 1, 2,..., п определяют окончательное положение элементов о. в сор- тированной последовательности rl; г2 ,..., гп . Алгоритм 5.4. Сортировка перечислением for i = 1 to n do ct : = 0 { Сбросить счетчики} for i = п to 1 by -1 do begin forj = i - 1 to 1 by -1 do begin ifa/ > Oj then ct = c, + 1 end; else C = Cj+ I
  • 95. 5.4. Сортировка всплытием Флойда 95 end; for i = 1 to n do begin; r c-+i =a i ( r i— сортированные элементы} end.' Сложность алгоритма сортировки перечислением определяет- ся парой вложенных циклов и составляет 0(п 2 ). Величина слож- ности не зависит от расположения данных в исходной последова- тельности аь а2 ,..., а„. Пусть перестановка л = (п17 я2 ,..., пп ), гдетс,— с,- + 1, /= 1, 2,..., п. Алгоритм 5.4 сортировки перечислением определяет перестанов- ку л~ , которая соответствует расположению а ч <а ., <...<а i 7Г] 7I2 71„ исходных данных (см.п.1.14). 5.4. Сортировка всплытием Флойда Все ранее упомянутые методы сортировки последовательно- сти alt a2 ,..., ап требовали сравнений порядка О(п ), и «это никуда не годится». Рассмотрим один из наиболее элегантных и эффек- тивных методов сортировки сложности 0(nlogn), предложенный Флойдом. До сих пор он остается самым оптимальным из сущест- вующих методов. В алгоритме активно используется упорядочен- ное двоичное дерево, пример которого представлен на рис. 5.1. 96- 22 17 2 28 Рис. 5.1. Пример упорядоченного двоичного дерева Значение в каждой его вершине не меньше, чем значение в его дочерних вершинах. Двоичное дерево называется частичноупоря- доченным, если свойство упорядоченности выполняется для каж- дой из его вершин, однако для корня это свойство нарушается. Пример частично упорядоченного дерева приведен на рис. 5.2. 22 17 2 28 Рис. 5.2. Пример частично упорядоченного двоичного дерева
  • 96. 96 Глава 5. Сортировка и поиск Интересно отметить, что в ранее рассмотренных методах сор- тировки сложности 0(п 2 ) при выборе наибольшего (наименьше- го) элемента, «забывали» информацию о других, забракованных элементах на эту роль, хотя эта проверка и выполнялась. Структу- ра же дерева позволяет сохранить состояние процесса сортировки последовательности alt a2,..., а„ на каждом его шаге, с целью ис- пользования этого состояния в дальнейших расчетах и уменьше- ния числа операций сравнений при поиске наибольшего (наи- меньшего) из оставшихся элементов. Метод сортировки Флойда представлен в алгоритме 5.5, где исходная последовательность а1; й2,..., ап данных представляется в виде дерева на смежной памяти (одномерный массив а[1..п]). В таком дереве ребра присутствуют неявно и вычисляются с помо- щью арифметических операций над индексами элементов масси- ва — смежной памяти. Пример двоичного дерева показан на рис. 5.3. Корень дерева — а[1], за каждой вершиной a[k] следуют вершины a[2k] и a[2k+l]. Использование смежной памяти для представления дерева имеет и другие преимущества, которые ста- новятся очевидными после анализа алгоритма 5.5. а[2] а[5] а[б а[7] Рис. 5.3. Пример двоичного дерева на смежной памяти Основу алгоритма 5.5 составляет процедура SURFACE (a[i..k]) всплытия Флойда, которая за O(log2 «) сравнений преобразует почти упорядоченное поддерево в упорядоченное. Поддерево представляется на одномерном массиве a[i..k], рис.5.4, где a[i] — корень поддерева, a[k] — максимальный элемент массива, кото- рый еще может принадлежать поддереву. a[k] Рис. 5.4. Двоичное поддерево на смежной памяти a[i..k]
  • 97. 5.4. Сортировка всплытием Флойда 97 Определим сложность процедуры SURFACE всплытия Флой- да. Процедура заключается в том, что значение из корня (здесь может нарушаться условие упорядоченности) всплывает по на- правлению клистьям (последний уровень вершин вдереве) до тех пор, пока дерево не преобразуется в упорядоченное. Во время всплытия на каждом уровне выполняется конечное число С опе- раций сравнения элементов. Если положить, что высота дерева (число уровней в дереве) равна Л, то сложность одного всплытия составит С • h = 0(h). Высота h регулярного двоичного дерева из п вершин легко находится из соотношения п < 2° + 2 1 +...+ 2 Л ~ 1 , где 2'" 1 — количество вершин на /-м уровне дерева, /= 1, 2,..., п. От- сюда высота дерева Л = flog2(w + 1)1. Таким образом, сложность процедуры SURFACE всплытия Флойда составляет O(log2«). Рассмотренная процедура SURFACE всплытия Флойда позво- ляет в почти упорядоченном дереве найти наибольший (наимень- ший) элемент за число сравнений 0(log2«), преобразуя дерево к упорядоченному виду. В результате найденный элемент будет располагаться в вершине дерева. Для сортировки же множества элементов аьа2,...,ап из них по алгоритму 5.5 сначала организует- ся почти упорядоченное двоичное дерево при помощи повторно- го применения алгоритма SURFACE всплытия Флойда сначала к самым мелким его поддеревьям от листьев и затем ко все более крупным. Листья тривиально упорядочены, поэтому можно на- чать с минимальных поддеревьев, содержащих несколько вер- шин, и укрупнять их, каждый раз полностью, применяя алгоритм всплытия до тех пор, пока таким образом не будет достигнут ко- рень дерева. Заметим, что каждое из поддеревьев, к которым при- меняется алгоритм всплытия, удовлетворяет условию почти упо- рядоченности, поскольку упорядочивание проходит от листьев к корню. Именно таким способом в алгоритме 5.5 осуществляется формирование исходного почти упорядоченного дерева. После того как дерево упорядочено, наибольший (наимень- ший) элемент оказывается в его корне. По алгоритму 5.5 найден- ный элемент меняют местами с самым последним листом в дере- ве (последний элемент рассматриваемого массива), дерево уме- ньшается на одну вершину и все готово для определения нового наибольшего (наименьшего) элемента множества при помощи следующего применения процедуры SURFACEвсплытия Флойда. На рис. 5.5 показана полная последовательность перестановок и всплытий, которые происходят после формирования из исходно- 4—2697
  • 98. 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 всплытие -»-37 ->• перестановка-*• 18 -+• всплытие —> 18 4 18 56 63 65 66 перестановка -*• 4 18 37 56 63 65 66 Рис. 5.5. Пример сортировки чисел 18,4,56,65,37,63,66 методом Флойда Алгоритм 5.5. Сортировка всплытием Флойда сложности 0(и1о§2 «) Program Floid; { Сортировка по возрастанию всплытием Флойда } uses CRT; const n = 1000; {Размер массива данных для сортировки} type Vector = array[l..n] of Integer; Var f :Text; {Текстовый файл для результатов сортировки}
  • 99. 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]:=Random(100); 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,1,k); {Поместить найденный максимальный элемент в конец списка} w:=a[k]; a[k]:=a[l]; a[l]:=w; end end;
  • 100. 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:I,']=',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(1о§2 «), общая сложность алгоритма сортировки данных аь а2 ,..., ап равна 0(«log2 «). Это лучшая оценка, на что вообще можно надеяться при сор- тировках, в основу которых положены сравнения данных. Дейст- вительно, число возможных перестановок из элементов а{ , а2 ,..., ап равно п и только одна из них удовлетворяет условию нашей сортировки. Двоичный же поиск перестановки среди множества л! перестановок требует Iog2 «! числа сравнений. Для упрощения воспользуемся формулой Стирлинга п~ J2nnnn e~". Тогда Iog2 «! ~j2nnnn e~n =0(«log2 «). Задача. Длина объединения отрезков. Текстовый файл содержит целые числа: аь Ь1г а2 , Ь2 ,..., а„, Ь„. Данная последовательность чи- сел определяет на прямой п отрезков [а,-, Ь,], / = 1, 2,..., п. Найти длину объединения указанных отрезков. Исходные данные пред- ставлены в текстовом файле со следующей структурой. Первая строка файла: п — количество отрезков. Вторая, третья и т.д. стро- ки файла содержат целые числа а-„ bi — границы соответствующих отрезков. Результаты расчетов длины объединения отрезков со- хранить в текстовом файле.
  • 101. 5.4. Сортировка всплытием Флойда 101 Пример файла исходных данных: з О 2 -1 1 О 1 Пример файла выходных данных: з Решение. Алгоритм 5.6 решения задачи основывается на пред- варительной сортировке абсцисс al , Ьь а2 , Ь2 ,..., а„, Ъп в массиве ab[l..2n]. Создается вспомогательный массив g[1..2n], который поддерживает после сортировки массива ab[..2n] отношение границ отрезков: g[i] = 1 — левая граница, g[i] = 0 — правая грани- ца. Вычисление завершается простым просмотром массива ab[1..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, с : Integer/- begin ab[0]:=ab[1]; m:=0; {Длина объединения} c:=0; {Число перекрывающихся интервалов} for i:=l to n do begin if coO then m:=m+ab[i] -ab[i-l] ; if g[i]=l {-левая граница} then c:=c+l else c:=c-l; end; end;
  • 102. 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+1]; ab[j+l]:=w; w:=g[j]; g[j]:=g[j+1]; 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(f,ab[k-l],ab[k]); g[k-l]:=l; {Левая граница} g[k]:=0; {Правая граница} end; Close(f); Assign(f,'Measure.out'); Rewrite(f); {Файл открыт для записи} SortBubble(2*n); Measure(m,2*n); WriteLn(f,m); {Длина объединения} Close (f); end. {Main} 5.5. Последовательный поиск Задача поиска является фундаментальной в алгоритмах на ди- скретных структурах. Удивительно то, что, накладывая незначи- тельные ограничения на структуру исходных данных, можно по- лучить множество разнообразных стратегий поиска различной степени эффективности.
  • 103. 5.5. Последовательный поиск 103 При последовательном поиске подразумевается исследование элементов множества а{ , а2 ,..., а„ в том порядке, в котором они встречаются. «Начни сначала и продвигайся, пока не найдешь нужный элемент; тогда остановись». Такая последовательная процедура является очевидным способом поиска. Алгоритм 5.7 выполняет последовательный поиск элемента z в множестве alt а2 ,..., ап . Несмотря на свою простоту, последовательный поиск содержит ряд очень интересных идей. Алгоритм 5. 7, Последовательный поиск с = 0; (Признак поиска записи г } {с =]• ' break; ifc=l then Запись найдена else Запись не найдена. Оценим среднюю сложность поиска элементов множества als а2 ,..., а„. Для нахождения /-го элемента а, требуется / сравнений. Для вычисления же среднего времени поиска необходимо задать информацию о частоте обращения к каждому элементу множест- ва. Будем предполагать, что частота обращения распределена рав- номерно, т.е. что ко всем элементам обращаются одинаково час- то. Тогда средняя сложность поиска элемента множества являет- - , . „, . ся-> /=-=0(п)линейной. »м 2 Рассмотрим распределение частот обращения к элементам в общем случае. Пусть р, обозначает частоту (распределение веро- п ятностей) обращения к элементу а/, где р/>0 и ^р,- =1. В этом /=1 случае средняя сложность (математическое ожидание) поиска п элемента будет равна ]Г /р, . Хорошим приближением распределе- (=1 £ ния частот к действительности является закон Зипфа: р, =т> для / = 1, 2,..., п. (Дж. К. Зипф заметил, что я-е наиболее употребите- льное в тексте на естественном языке слово встречается с часто- той, приблизительно обратно пропорциональной л.) Нормирую- п щая константа выбираетсятак, что ^]р, =1. Пусть элементы мно- /=i жества аь аг ,..., ап упорядочены согласно указанным частотам.
  • 104. 104 __ Глава 5. Сортировка и поиск - 1 1 1 Тогдас=-=-я—исреднеевремяуспешногопоискасо- Я Ы, . .с 1 п п + ставит>го•=>i-=n-c-п-»-,чтомногоменьше-. £ ft / Нп 1гш' 2 Последний пример показывает, что даже простой последовате- льный поиск требует выбора разумной структуры данных множе- ства, который бы повышал эффективность работы алгоритма. Бо- лее того, это общепринятая стратегия, время от времени переупо- рядочивать данные, для большинства последовательных файлов во внешней памяти, когда последовательная природа файла диктует- ся техническими характеристиками носителя информации. Алгоритм последовательного поиска данных одинаково эф- фективно выполняется при размещении множества аь а2,..., а„ на смежной или связанной памяти. 5.6. Логарифмический поиск Логарифмический (бинарный или метод деления пополам) по- иск данных применим к сортированному множеству элементов GJ < д2 < ••• <а п> размещение которого выполнено на смежной па- мяти. Для большей эффективности поиска элементов надо, чтобы пути доступа к ним стали более короткими, чем просто последова- тельный перебор. Наиболее очевидный метод: начать поиск со среднего элемента, т.е. выполнить сравнение с элементом а, 1+„ , . _ L 2 J Результат сравнения позволит определить, в какой половине по- следовательности tfj, U2,..., а, 1+„ ,,..., ап продолжить поиск, применяя к ней ту же процедуру, и т.д. Основная идея бинарного поиска довольно проста, однако «для многих хороших програм- мистов не одна попытка написать правильную программу закон- чилась неудачей». Чтобы досконально разобраться в алгоритме, лучше всего представить данные а^ < а2 < ... < а„ в виде двоичного дерева сравнений, которое отвечает бинарному поиску. Двоичное дерево называется деревом сравнений , если для лю- бой его вершины (корня дерева или корня поддерева) выполняет- ся условие: {Вершины левого поддерева} <Вершина корня <{Вершины правого поддерева }.
  • 105. 5.6. Логарифмический поиск 105 Пусть на очередном шаге деления пополам оказалось, что необ- ходимо выполнить поиск среди элементов а,- < a,+i <...< а,-. В каче- стве корня принимается элемент a, i + j , , где '-^- ] — наибольшее целое, меньшее или равное (/ +f)/2. Левое поддерево располагает- ся в векторе а„ ai+i,..., a, U J , , а правое поддерево — в векторе [~та ,ч; i )•••. Oj_i, uj. На рис. 5.6 показан пример двоичного дерева сравнений, ребра которого неявно выражаются рассмотренными выше отношениями между индексами элементов а{, а2,..., ап. ^9 5- " Рис. 5.6. Пример дерева сравнений, отвечающего бинарному поиску среди сортированных эламенюв: 3,5,7,9,12,19,27,44 Поиск элемента z среди а < a2 <...< ап методом деления попо- лам представлен в алгоритме 5.8. Алгоритм 5.8. Логарифмический поиск z в al < a2 <...< а„ /ind=Q; {Признак поиска записи} / = 1; {Левая граница поддерева} j = n; {Правая граница поддерева} while i <j do begin т = '-±L ; {Корень текущего поддерева} ifz= am then ** п ~ {Элемент найден] I &FCUK else ifz > ат then i = т + 1 {Новая левая граница} elsej = т — 1 {Новая правая граница} end', iffind = 1 then Запись найдена; else Запись отсутствует.
  • 106. 106 Глава 5. Сортировка и поиск Средняя сложность бинарного поиска среди элементов et < < я2 <•••< а п сравнима с высотой двоичного дерева (рис 5.6). В худ- шем случае искомый элемент может оказаться либо на последнем уровне, либо вообще не будет найден. На каждом уровне необхо- димо выполнить определенное число сравнений. В п.5.4 установ- лено, что уровней в дереве flog2 (n + 1)1. Значит, сложность поис- ка является логарифмической 0(1о§2 и), что оправдывает и назва- ние самого метода поиска. Необходимо отметить, что рассмотренный метод бинарного поиска предназначен главным образом для сортированных эле- ментов ai < а2 <...< а„ на смежной памяти фиксированного п раз- мера. Если же размерность вектора динамически меняется, то экономия от использования бинарного поиска не покроет затрат на поддержание упорядоченного расположения «j < a2 <...< а„. 5.7. Сортировка с вычисляемыми адресами Пусть а{ , а2 ,..., а„ — исходная последовательность сортируе- мых целых чисел и л = (кь п2 ,..., п„) — упорядочивающая переста- новка этих элементов ап <ani <... <а„п . Принятое ограничение, что о, — целые числа, не ведет к потере общности рассматривае- мых ниже алгоритмов. Сортированная последовательность at подсказывает очевидный способ использования значений этих элементов в качестве индексов (адресов) их расположения в мас- сиве bn br+l ,..., bs , где ba . =d j . Получим упорядоченную последо- вательность ЪГ < Ьм <...< bs , а значит, и упорядоченную последо- вательность исходных данных аь а2 ,..., ап . В качестве примера рассмотрим частный случай сортировки элементов последовательности ait a2 ,..., aj, равных соответствен- но 6,3,5,7,2, 4, 1 — различные целые числа от 1 до 7. Значение каждого элемента а, показывает его место в сортированном спис- ке bl < Ь2 <...< Ь7 , где bj определяются в цикле for /'= 1 to I doba . = d j . Сложность данного метода сортировки является линейной 0(п), где п = 1. Фактически, значения а, определяют перестановку л = (кь л2 ,..., л„) =(7,5,2,6,3,1,4), которая упорядочивает элементы ял <аП2 <...<оПл . Значения л, устанавливаются в цикле for i= I to 7 dona =/'.
  • 107. 5.7. Сортировка с вычисляемыми адресами 107 Сортировка стала возможной благодаря тому, что значения исходных данных 6, 3, 5, 7, 2, 4, 1 заполняют сплошной интервал последовательности натуральных чисел. Рассмотрим обобщение идеи сортировки с вычисляемыми адресами на случай произволь- ных целых аъ а2 ,..., а„. Алгоритм сортировки существенно упро- щается, если все значения а, а2 ,..., ап различные. Значения в„ а2 ,..., а„ — различные Реализация метода сортировки представлена в алгоритме 5.9. Временный массив br , br+l ,.,., bs , где r=mm(al , а2 ,..., а„) и s = max(ai, а2 ,..., а„), используется для сортированной упаковки элементов я15 а2 ,..., а„. Свободные места в массиве br , b^,..., bs инициализируются значением s + 1, отличным от значений эле- ментов flj, а2 ,..., а„. Алгоритм 5.9. Сортировка с вычисляемыми адресами для различных а^, а2 ,..., ап {Поиск min и max значений среди alt a2 ,..., ап } r = s = al; for i = 2 to n do begin ifr>a, then r= a, else ifs < ai then s = a, end; {Инициализация bt значением s+l, отличным от at } for i = rtosdobj = s+ 1; {Сортированная упаковка элементов а^, а2 ,..,, ап } for i = 1 to n do ba. =a,; {Выделение сортированных а, а2 ,..., ап из bn b^.b .,., bs } k = 0; for i-r to s do begin ifbj#S+ 1 then begin k = k+l; a k = */; end; end. Сортированный вектор ax < a2 <...< an является результатом последовательногопросмотрамассиваbn b^i,..., ^приудалении из него оставшихся незанятыми элементов, равных значению
  • 108. 108 Глава 5. Сортировка и поиск s + 1. Алгоритм не содержит вложенных циклов, а значит, слож- ность его линейная О(п). Допускаются одинаковые значения среди я,, а2,..., я„ Реализация метода представлена в алгоритме 5.10. Наличие одинаковых элементов среди alt a2 ,..., ап , например, я, = о/, при упаковке ba = at w.ba =д7 ведет к потере данных в исходном мно- жестве flj, а2 ,..., ап . Ситуация, когда одновременно несколько эле- ментов претендуют на одно место, называется коллизией. Такие элементы необходимо переразмещать на свободные места, сохра- няя свойства сортировки с вычисляемыми адресами. С этой це- лью на основании величин а1; а2 ,..., ап рассчитывается вектор ин- дексов dr , drf-i,..., ds сортированной упаковки данных а{ , а2 ,..., а„ в массиве Ь1г Ь2 ,..., Ь„. В алгоритме 5.9 роль индексов упаковки могли выполнять непосредственно сами значения элементов а{ , а2 ,..., а„, так как они были различные. В данном случае значения dn df+i,..., ds настраиваются таким образом, что одинаковые по ве- личине элементы из аь о2 ,..., ап оказываются смежными при их упаковке в массиве Ь1г Ь2 ,..., Ъп . Вектор cr , c^,..., cs используется для подсчета количества элементов каждого значения среди flj, а2 ,..., а„и формирования индексов упаковки dr , d^i,..., ds . Алгоритм 5.10. Сортировка с вычисляемыми адресами для произвольных а, а2 ,..., ап {Поиск min и max значений среди аь а2 ,..., а„ } r = s = al; for i - 2 to n do begin ifr> at then r= at else ifs < a, then s = a, end', {Расчет количества элементов каждого значения a,} for i = r to s do Cj = 0; for i = 1 to n do ca. =ca. +1; {Расчет индексов упаковки dr , d^^..., ds } dr =; for / = /•+! to s do dt, = flf,._! + Cj_i, {Сортированнаяупаковка элементов ui, a2 ,..., а„ в bi,b2 ,...,bn } for i = 1 to n do begin k = a,;
  • 109. 5.7. Сортировка с вычисляемыми адресами _ 109 end. Результирующий сортированный вектор исходных данных й1; а2,..., ап располагается в массиве Ь1<Ь2< ... < Ь„. Алгоритм не со- держит вложенных циклов, а значит сложность его линейная 0(п). Сортировка с вычисляемыми адресами является очень быст- рым методом, но она может быть крайне неэффективной при бо- льших значениях s - re точки зрения использования оперативной памяти, необходимой для хранения временных массивов данных с„ CH-IV, с, и dn dm,..., ds.
  • 110. Глава 6 =*—^ Введение в теорию графов. Алгоритмы на графах I ножество самых разнообразных задач естественно форму- лируется в терминах точек и связей между ними, т.е. в терминах графов. Так, например, могут быть сформулированы задачи со- ставления расписания, анализа сетей в электротехнике, анализа цепей Маркова в теории вероятностей, в программировании, в проектировании электронных схем, в экономике, в социологии и т.д. Поэтому эффективные алгоритмы решения задач теории гра- фов имеют большое практическое значение. 6.1. Основные понятия и определения • Определение. Конечным графом называется тройка Г=(Х, U, Ф),гдеАг —конечное множество вершин; U— конеч- ное множество ребер (дуг); Ф — отношение инцидентности; XrU=0. Отношение инцидентности Ф является трехмест- ным отношением Ф(х, и, у), где х, у е X, и е U, которое может либо выполняться (быть истинным), либо не выполняться (быть ложным) и удовлетворяет свойствам: 1) Vw е U Зх,у &Х Ф(х, и, у) — ребро всегда соединяет пару вершин. 2)(ФОс, и, у)*Ф(х', и,у'))^((х = х'лу = у')у(х = у'лу = х')) - ребро и соответствует не более чем одной паре вершин х, у. • Графическое представление графов. Элементы графов Геометрические элементы 1. х е X— вершина. 2. Ф(х, и,у)л-, Ф(у, и, х) — ориентированное ребро, дуга. 3. Ф(х, и, у) л Ф(у, и, х) - неориентированное ребро. 4. Ф(х, и, х) — петля. 1. • — точка в пространстве. 2. х— -у— направленный отрезок. 3. х- 4. у — отрезок. — замкнутый отрезок.
  • 111. 6.1. Основные понятия и определения 111 Рис. 6.1. Графы с тремя вершинами и двумя ребрами • Определение. / = (Х, Ul} Ф^ и Г2 = (Х2, U2, Ф2) называются изоморфными (7 = Г2), если существуют два взаимно одно- значных соответствия ср : Х -> Х2 и у : C/j -> U2, сохраняющие отношение инцидентности: Ф2(ф(х1),|/(и1),ср(>'1)) = Ф1(х1,и1,.у1). Из определения следует, что изоморфные графы можно оди- наково изображать графически и отличаться они будут только метками вершин (рис. 6.2). 2 А 7^.1 1 Рис. 6.2. Три изоморфных графа Определение. Граф называется ориентированным {орграф), если каждое его ребро ориентировано: Vjc^y eJfVw e U Ф(х, и, у) => -:Ф(у, и, х). Иногда удобно преобразовать неори- ентированный граф в ориентированный — заменой каждого неориентированного ребра парой ориентированных ребер с противоположной ориентацией. Определение. Подграфом графа Г= (X, U, Ф) называется такой граф Г= (Х U', Ф), что Х'^Х, U'cU. Обозначают Г с Г. Определение. Граф называется псевдографом, если в нем допус- каются петли и кратные ребра, т. е. две вершины могут быть соединены более чем одним ребром. Псевдограф без петель называется мультиграфом (рис. 6.3). Рис. 6.3. Псевдограф (слева) и мультиграф (справа)
  • 112. 112 Глава 6. Введение в теорию графов. Алгоритмы на графах Определение. Неориентированный граф называется простым, если он не имеет петель и любая пара вершин соединена не бо- лее чем одним ребром. Определение. Простой граф называется полным, если каждая пара вершин соединена ребром. Такой граф с п вершинами со- держит С^ ребер (рис. 6.4). Рис. 6.4. Полные неориентированные графы Определение. Дополнением простого графа /называется граф Г, имеющий те же вершины, а его ребра являются дополнени- ем Гдо полного графа (рис. 6.5). Рис. 6.5. Исходный граф Г и дополнительный Г Определение. Граф называется плоским (планарным), если он может быть изображен на плоскости так, что все пересечения ребер являются его вершинами. Рис. 6.6. Граф Г-| — плоский, а граф Гу, — неплоский Определение. Если вершины х и у соединены ребром и, то гово- рят, что вершины х, у смежные, а ребро и инцидентно верши- нам х и у. Два ребра называются смежными, если они имеют общую вершину. Определение. Степенью вершины графа называется количест- во ребер, инцидентных данной вершине. Вершина графа, име- ющая степень 0, называется изолированной, а если степень ее равна 1, то такая вершина называется висячей.
  • 113. 6.1. Основные понятия и определения 113 Определение. Граф называется помеченным (или перенумеро- ванным), если его вершины отличаются друг от друга каки- ми-либо пометками (рис. 6.7). х, Рис. 6.7. Граф /~| — помеченный, а граф Г-i — непомеченный Определение. Путь (маршрут) на графе Т- (X, U, Ф) определя- ется последовательностью вершин и ребер х1и1х2и2х^...хпипхп+1, где jc, е X, Uj е U. Ребро щ соединяет вершину х, с вершиной xi+l,т.е.выполняетсяотношениеинцидентностиФ(х„ы„х/+1). • Маршрут называется цепью, если все его ребра различные. • Маршрут называется замкнутым, если xi = xn+j. • Замкнутая цепь называется циклом. • Цепь называется простой, если не содержит одинаковых вершин. • Простая замкнутая цепь называется простым циклом. • Гамшътоновой цепью называется простая цепь, содержащая все вершины графа. • Гамилътоновым циклом называется простой цикл, содержа- щий все вершины графа. Определение. Граф Г=(Х, U, Ф) называется связным, если для всех х, у е X существует путь из вершины jc в вершину у (вер- шины х и у связаны маршрутом). Связный ориентированный граф называется сильно связным. Орграф называется слабо связ- ным, если соответствующий ему неориентированный граф (иг- норируется ориентация ребер) связный (рис. 6.8). Рис. 6.8. /~| — слабо связный, Г2 — сильно связный • Определение. Связный неориентированный ациклический граф называется деревом, множество деревьев называется лесом.
  • 114. 114 Глава 6. Введение в теорию графов. Алгоритмы на графах Рис. 6.9. /~! — дерево, Г% — не дерево Большинство задач на графах касается определения компо- нент связности, поиска маршрутов, расстояний и т.п. Далее будут рассмотрены решения подобных вопросов. Однако при решении реальных задач соответствующие им графы весьма велики, и ана- лиз возможен лишь с привлечением современной вычислитель- ной техники. Поэтому конечной целью рассмотрения каждой из задач будет являться описание и реализация практического алго- ритма решения данной задачи на ЭВМ. 6.2. Представления графов Наиболее известный и популярный способ представления гра- фов состоит в геометрическом изображении точек (вершин) или- ний (ребер) на бумаге. При численном решении задач на вычис- лительных машинах граф должен быть представлен дискретным способом. Существует довольно много способов такого рода представления графов. Однако простота использования пред- ставления графа, как и эффективность алгоритма, в основе кото- рого он лежит, в полной мере зависит от конкретного выбора это- го представления. Одно из направлений теории графов связано с их матричным представлением. Существуют различные виды матриц, ассоциированные с графами. Эти алгебраические формы используются для решения многих задач теории графов. Ниже рассматриваются две такие матричные формы и несколько не- стандартных представлений, которые наиболее широко исполь- зуются в алгоритмах на графах. 6.2.1. Матрица смежности графа • Определение. Матрицей смежности ориентированного поме- ченного графа с п вершинами называется матрица А= [а/} ], i,j= 1, 2,..., п, в которой _ Г1, если существует ребро (xt ,Xj), У 10, если вершины х/ ,Xj не связаны ребром (;с, ,Xj).
  • 115. 6.2. Представления графов 115 Матрица смежности однозначно определяет структуру графа. Примеры орграфа и его матрицы смежности приведены соответ- ственно на рис. 6.10 и рис. 6.11. Отметим, что петля в матрице смежности может быть представлена соответствующим единич- ным диагональным элементом. Кратные ребра можно предста- вить, позволив элементу матрицы быть больше 1, но это не при- нято, обычно же представляют каждый элемент матрицы одним двоичным разрядом. "0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0" 1 0 1 0 1 0 3 5 Рис. 6.10. Ориентированный граф А= Рис. 6.11. Матрица смежности ориентированного графа рис. 6.10 6.2.2. Матрица инцидентности графа • Определение. Матрицей инцидентности для неориентированно- го графа с п вершинами и т ребрами называется матрица В = [by], i = 1, 2,...,п, j = 1, 2,..., т, строки которой соответству- ют вершинам, а столбцы — ребрам. Элементы _ J1, если вершина х, инцидентна ребру и,-, '•* 10, если вершина jc, не инцидентна ребру и,. • Определение. Матрицей инцидентности для ориентированного графа с п вершинами и т ребрами называется матрица В[Ьд],
  • 116. 116 Глава 6. Введение в теорию графов. Алгоритмы на графах /= 1, 2,...,п, j= 1, 2,..., т, строки которой соответствуют вер- шинам, а столбцы — ребрам. Элементы {+1, если ребро му выходит из вершины д;,, -1, если ребро Uj входит в вершинух,, О, если вершина х, не инцидентна ребру Uj. Матрица инцидентности однозначно определяет структуру графа. На рис. 6.12 представлена такая матрица для орграфа на рис. 6.10. 1 1 2 2 1 1 2 1 1 1 1 . 6 6 6 1 7 2 3 1 3 4 5 7 5 1 5 7 4 5 7 4 5 ]Г+1 + 1 - 1 0 0 0 0 0 - 1 0 0 0 0 0 0 0 2-1 0 + 1 + 1 + 1 + 1 + 1 0 0 0 0 О О О О О 3 0 - 1 0 - 1 0 0 0 + 1 0 0 0 0 0 0 0 0 О О О 0-1 0 0 0 + 1 + 1 + 1 - 1 0 0-1 О О 0 0 0 0-1 0-1 0 - 1 0 0-1 0 0-1 0 0 0 0 0 0 0 0 0 0 0 + 1 + 1 + 1 0 0 О 0 0 0 0 0 - 1 0 0 0-1 0 0-1+1+1 Рис. 6.12. Матрица инцидентности ориентированного графа 6.2.3. Матрица весов графа • Определение. Граф называется взвешенным, если каждому его ребру сопоставлено число. Простой взвешенный граф может быть представлен своей матрицей весов W= [wy, где Wy — вес ребра, соединяющего вершины i,j= 1, 2,..., п. Веса несущест- вующих ребер полагают равными QO или 0 в зависимости от приложений. Заметим, что матрица весов является простым обобщением матрицы смежности. 6.2.4. Список ребер графа При описании графа списком его ребер каждое ребро пред- ставляется парой инцидентных ему вершин. Это представление можно реализовать двумя массивами r=(rl ,r2 ,...,rm )ut=(tl ,t2 ,..., tm ), где т — количество ребер в графе. Каждый элемент в массиве есть метка вершины, а /-е ребро графа выходит из вершины г, и входит в вершину tt . Например, соответствующие массивы пред- ставления графа на рис. 6.10 будут иметь вид: г= (1,1,2, 2, 2, 2,2, 3, 4, 4, 4, 6, 6, 6, 7, 7), Г =(2,3, 1,3,4,5,7,5, 1,5,7,4,5,7,4,5).
  • 117. 6.3. Метод поиска в глубину 117 • Интересно, что данное представление позволяет легко описать петли и кратные ребра. 6.2.5. Структура смежности графа Ориентированный или неориентированный граф может быть однозначно представлен структурой смежности своих вершин. Структура смежности состоит из списков Adj[x] вершин графа, смежных с вершиной х. Списки Adj[x] составляются для каждой вершины графа. В качестве примера опишем структуру смежно- сти графа, представленного на рис. 6.10. X, 1 2 3 4 5 6 7 Adj[x} 2, 3 1,3,4,5,7 5 1,5,7 — 4,5,7 4,5 Структуры смежности могут быть удобно реализованы масси- вом из п (число вершин в графе) линейно связанных списков. Каждый список содержит вершины, смежные с вершиной, для которой составляется список. Хранение же списков смежности на сцепленной памяти желательно в алгоритмах, в основе кото- рых лежат операции добавления и удаления вершин из списков. Следует отметить, что во многих задачах на графах выбор пред- ставления является решающим для эффективности алгоритмов. 6.3. Метод поиска в глубину Один из наиболее естественных способов систематического исследования всех вершин графа исходит из процедуры прохож- дения графа методом поиска с возвращением, который исследует граф в глубину (см. п.4.1). На неориентированном графе Г= (X, U, Ф) поиск в глубину осуществляется следующим обра- зом. Когда посещаем вершину л: е X, то далее идем по одному из ребер (х, у), инцидентному вершине у е X. Если вершина у уже пройдена (посещалась ранее), то возвращаемся в х и выбираем
  • 118. 118 Глава 6. Введение в теорию графов. Алгоритмы на графах другое ребро. Если вершина у не пройдена, то заходим в нее и применяем процесс прохождения рекурсивно уже с вершиной у. Если все ребра, инцидентные вершине х, просмотрены, то идем назад по ребру (s, x), по которому пришли в х, и продолжаем ис- следование ребер, инцидентных вершине s е X. Процесс закан- чивается, когда попытаемся вернуться из вершины, с которой на- чали просмотр графа. Поиск в глубину можно также осуществлять и на ориентиро- ванном графе. Если граф ориентированный, то, находясь в узле х, необходимо выбирать ребро (х, у), только выходящее изх Иссле- довав все ребра, выходящие из у, возвращаемся в jc даже тогда, когда в у входят другие ребра, еще не рассмотренные. Данная тех- ника просмотра в глубину полезна в практических приложениях при определении различных свойств как ориентированных, так и неориентированных графов. Метод поиска в глубину на простом неориентированном гра- фе представлен в алгоритме 6.1. Рекурсивная процедура Depth(x, w) осуществляет поиск в глубину на графе Г= (X, U, Ф), содержащем д; е X, и строит для графа дерево Т поиска, которое является ориентированным остовным деревом Г0 = (X, Т, Ф) (если исходный граф не связен, то Г0 будет лесом); w e А'является отцом х е Хъ строящемся дереве, где х — исследуемая вершина. Граф задан структурой смежности Adj[x], где Adj[x] означает мно- жество вершин, смежных с х е X. Элементы Т— это ребра строя- щегося дерева поиска, а элементы В — это обратные ребра, кото- рые не могут принадлежать Г0 , так как они ведут назад в пройден- ные ранее вершины. Заметим, что обратное ребродолжно идти от потомка к предку по дереву поиска. Чтобы отличить уже прой- денные вершины от непройденных, вводится вектор Mark[x] ме- ток вершин, которые постепенно нумеруются от 1 до (A'l по мере того, как попадаем в них. Сначала полагается Mark[x] = 0 для всех х е X в знак того, что ни одна вершина не пройдена, и когда попа- даем в вершину х первый раз, Mark[x] получает ненулевое значе- ние. Ребро (х, v) е Т, если метка вершины Mark[v] = 0. Если же Mark[v] Ф О, то условием того, что (х, v) & В будет обратным реб- ром, являются соотношения Mark[v] < Mark[x] и v * w. Условие Mark[v] < Mark[x] означает, что вершина v была пройдена раньше вершины х. Поэтому ребро (х, v) е В будет обратным, если оно не является ребром дерева Т, пройденным от отца w к х, т. е. v * w.
  • 119. 6.3. Метод поиска в глубину 119 • Сложность поиска в глубину. Поскольку для каждой вершины, которую проходим впервые, выполняется обращение к проце- дуре Depth ровно один раз, то всего обращений будет Х. При каждом обращении количество производимых действий про- порционально числу ребер, инцидентных рассматриваемой вершине. Поэтому сложность поиска составляет 0(Х + U). Алгоритм 6.1. Поиск в глубину на простом неориентированном графе for v е X do Mark[v] = 0; count= 0; Т=0; 5=0; for v e Xdo ifMark[v] = 0 then Depth(v, 0); procedure Depth(x, w); count= count+ 1; Mark[x] = count; for v e Adj[x] do begin ifMark[v] = 0 then T= T^J {(x, v)}; { Включить ребро дерева } Depth(v, x); else ifMark[v] < Mark[x] and v Ф w then B = .Su {(x, v)}; { Включить обратное ребро } end; end. Программная реализация алгоритма 6.1 представлена алгорит- мом 6.2. Реализация близко соответствует основному алгоритму 6.1. Программа представлена тремя процедурами Init, Depth, Way- Depth, где WayDepth — основная программа поиска в глубину; Depth — рекурсивная процедура поиска, один к одному соответст- вующая аналогичной процедуре в алгоритме 6.1; /m'f— процедура контроля исходных данных и изменения меток вершин. Измене- ние нумерации меток вершин является существенным для алго- ритма. Новые метки вершин — это натуральные числа от 1 до Х. Данная нумерация позволяет обращаться к элементам массивов, содержащих информацию о вершинах, по номерам соответству- ющих вершин. Такой прием позволяет очень близко подойти в программной реализацией структуры смежности Adj[x] к ее мно- жественному описанию. В этом случае множественное описание выражения for v e Adj[x] do ... в программной реализации пред-
  • 120. 120 Глава 6. Введение в теорию графов. Алгоритмы на графах ставляется какfor i=lto Nbr[x] dov = Adj[Fst[x] + /']..., где Nbr[x] — количество вершин в структуре смежности для вершины х е X; Adj[x] — вектор, содержащий все вершины структуры смежности по строкам; Fst[x] + 1 — номер первой вершины в структуре смеж- ности для соответствующей вершины х е X, тогда Fst[x] + i — но- мер /-и вершины в структуре смежности для х е X. Например, для следующей структуры смежности графа Adj[x]: X 1 2 3 4 5 6 7 AdJM 2, 3,5 1, 3,4 1, 2,4,5 2, 3 1, 3,6,7 5,7 5, 6 соответствующие массивы в программной реализации принима- ют вид №ix Fst[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. Пример обхода графа в глубину
  • 121. 6.3. Метод поиска в глубину 121 Исходные данные структуры смежности графа рис. 6.13 зада- ются в текстовом файле Depth,in: 7 1 3 2 3 5 2 3 1 3 4 3 4 1 2 4 4 2 2 3 5 4 1 3 6 6 2 5 7 7 2 5 6 Результаты расчетов сохраняются в выходном файле Depth.out со следующей структурой: 2 3 1 4 2 5 1 6 1 1 0 1 0 1 0 1 У! TvB Каждая колонка таблицы выходного файла соответствует реб- ру (х» у,) прохода графа, где последнее значение является призна- ком 1 или 0, что отвечает при проходе либо основному ребру, либо обратному. Алгоритм 6.2. Программа поиска в глубину на простом неориентированном графе Program PgmWayDepth; {Проход графа в глубину) uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[1..nVertex] of Integer; TypeAdjacent=array[1..nAdjacent] of Integer; Var f :Text; { Текстовый файл } n :Integer; { Количество вершин } nT :Integer; { Количество ребер прохода в глубину} Adj :TypeAdjacent; { Список смежности графа } Fst :TypeVertex; {Указатели вершин списка смежности } Nbr :TypeVertex; { Количество вершин в списке смежности} Vtx :TypeVertex; { Список вершин графа } Mark :TypeVertex; { Номера компонент для вершин графа} Т :TypeVertex; { Последовательность ребер прохода в глубину }
  • 122. 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[nT]:=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;
  • 123. 6.3. Метод поиска в глубину 123 Procedure WayDepth; (Проход в глубину) Var v,count :Integer; begin nT:=0; {Т - пустое дерево} 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} Assign(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); Assign(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*1]]:3); Writeln(f); for i:=l to nT div 2 do Write(f,В[i]:3); Writeln(f); Close(f); end. {Main}
  • 124. 124 Глава 6. Введение в теорию графов. Алгоритмы на графах 6.4. Отношение эквивалентности Бинарное отношение ~, определенное на множестве S, назы- вается отношением эквивалентности, если оно удовлетворяет свойствам рефлексивности, симметричности и транзитивности: 1. Vjj e. S sl~ Sj. 2. Vsj,S2 e S $i ~ $2 —> Si ~ s. 3. V^i, ^2, 53 е S $i ~ $2 л л ~ .УЗ —» $i ~ s^, Все элементы из множества S, эквивалентные данному эле- менту Sj, образуют множество St, которое называется классом эк- вивалентности. Два различных класса эквивалентности не могут иметь какого-либо общего элемента, в противном случае такие классы совпадают, что следует из свойств 1—3. Таким образом, определенное на множестве S отношение эквивалентности вы- полняет разложение его на непересекающиеся классы S/ эквива- лентности, т.е. S =(J S j , где St n Sj• = 0, i #j. / Пример. Пусть 5 1 — множество треугольников. Определим на S бинарное ~ отношение. Будем считать, что для треугольников Ля, Аи е S выполняется отношение Да ~ Ab, если они подобные. Ясно, данное отношение является отношением эквивалентности, так как свойства 1—3 выполняются для подобных треугольников. Введенное отношение разбивает множество треугольников на классы эквивалентности подобных треугольников. Пример. Пусть S— множество л-мерных векторов. Определим на S бинарное ~ отношение. Будем полагать, что для a,b e S вы- полняется отношение а ~ Ь, если они колинеарные. Данное отно- шение является отношением эквивалентности, так как свойства 1—3 выполняются для колинеарных векторов. Множество векто- ров под действием введенного отношения разбивается на классы эквивалентности колинеарных векторов. Пример. Пусть S= {1, 2,..., п]. Определим на б 1 бинарное ~ от- ношение. Будем полагать, что для р, q e S выполняется отноше- ние р ~ q, если они имеют одинаковые остатки от деления на це- лое положительное число т. Данное отношение является отно- шением эквивалентности. Множество Sпод действием введенно- го отношения разбивается на классы эквивалентности чисел с одинаковыми остатками от деления на т.
  • 125. 6.5. Связные компоненты 125 Пример. Пусть S— множество треугольников. Определим на S бинарное ~ отношение. Будем считать, что для треугольников Да, Д£ е ^выполняется отношение Да ~ Д&, если их площади рав- ны. Данное отношение является отношением эквивалентности. 6.5. Связные компоненты Пусть псевдограф Г= (X, U, Ф) является неориентированным. Две вершины xl} x2 e ^называются связанными, если существует маршрут из xl в х2. Определим на множестве вершин ЛГбинарное ~ отношение. Для хъ х2 е ЛГ отношение ~ будет выполняться, т.е. jq ~ х2, если эти вершины связанные. Введенное отношение яв- ляется отношением эквивалентности. Действительно, если вер- шина *! связана с х2, а вершина х2 связана с х3, то очевидно, что вершина х{ связана с х3. Следовательно, существует такое разло- жение множества вершин на попарно непересекающиеся подмножества, что все вершины в каждом Х( связаны, а вершины из различных Xt не связаны. Тогда можно записать разложение графа Г= (X, U, Ф) на непересекающиеся связные подграфы /= (Xj, Uj, Ф). Вследствие попарного непересечения подграфов, разложение называется прямым, а сами подграфы называются компонентами связности графа Г. Таким образом, справедливо следующее утверждение. • Утверждение 6.5.1. Каждый неориентированный граф распа- дается единственным образом в прямую сумму своих компо- нент связности. Количество компонент связности находится в определенном отношении с основными параметрами графа — числом его вер- шин и ребер. • Утверждение 6.5.2. Пусть Г= (X, U, Ф) является простым гра- фом с п вершинами и k компонентами связности. Число ребер в таком графе не может превосходить величины С„_А+1 = Доказательство. Рассмотрим прямое разложение k Г = r ( X j ,Uj ,Ф) исходного графа на компоненты связности.
  • 126. 126 Глава 6. Введение в теорию графов. Алгоритмы на графах Если положить, что число вершин в компоненте Xt связности рав- * но nh то число ребер в таком графе не превосходит ^С„.. Данная величина достигается в том случае, когда каждая из компонент связности является полным подграфом. Допустим, что среди компонент связности F(Xj, Ut, Ф) найдутся хотя бы две, которые имеют более одной вершины, например л2 - Л 1 > 1- Перенесем одну вершину из / в Г2. Легко видеть, что это увеличивает число ребер в модифицируемом полном графе с k компонентами связ- ности. Отсюда следует, что максимальное число ребер должен иметь граф, состоящий из k — 1 изолированной вершины и одно- го полного подграфа с п — k + 1 вершинами. • Следствие. Граф с п вершинами и числом ребер, большим чем ("-'И"- 2 ), связен. 6.6. Выделение компонент связности Рассмотрим алгоритм нахождения числа компонент связно- сти, а также выделения этих компонент на неориентированном графе. Подобным образом решается задача и для ориентирован- ного графа. В основу рассматриваемого алгоритма 6.3 выделения компонент связности положена описанная ранее техника поиска в глубину на графе Г(Х, U, Ф). Структура алгоритма 6.3 является модификацией в сторону упрощения основного алгоритма 6.1 поиска в глубину. Работа алгоритма 6.3 направлена на формиро- вание вектора Mark[x] меток вершин х е X графа. Элементу Mark[x] присваивается общий номер той компоненты, которой принадлежит вершина х е X. Сложность алгоритма 6.3, как и ал- горитма 6.1, составляет 0(Х + U). Алгоритм 6.3. Выделение связных компонент неориентированного графа for v e Xdo Mark[v] = 0; {Начальная установка} count = 0; {Счетчик числа компонент} for v e Xdo ifMark[v] = 0 then begin count^ count+ 1; Component(v, count); end;
  • 127. 6.6. Выделениекомпонентсвязности 127 Procedure Component(x, count)', Mark[x] = count', for v e Adj[x] do ifMark[v] = 0 then Component(v, count); end; Программная реализация выделения компонент связности представлена в алгоритме 6.4, который близко соотносится с со- ответствующим множественным описанием алгоритма 6.3. Рас- смотрим пример расчета по программе алгоритма 6.4 выделения компонент связности графа, представленного на рис. 6.14. •4 Т Рис. 6.14. Пример выделения компонент связности графа Для программы алгоритма 6.4 исходные данные структуры смежности Adj[x] графа на рис. 6.14 задаются в текстовом файле Connect.in. Структура (правило) заполнения файла одинакова с той, которая описана в рассмотренном примере поиска в глубину при расчете по программе алгоритма 6.2. Данные файла Connect.in для примера на рис. 6.14: 11 1 2 9 8 12 14 3 4 7 15 21 3 2 1 1 3 2 3 2 2 2 1 2 3 7 7 14 12 2 1 9 14 12 3 4 1 15 15 1 4 3 8 12 21 Результаты расчетов сохраняются в выходном файле Соп- nect.out со следующей структурой: 1 2 9 8 12 14 з 4 7 15 21 — номера вершин графа; 1 1 2 2 3 3 1 1 2 3 3 — номера компонент связности.
  • 128. 128 Глава 6. Введение в теорию графов. Алгоритмы на графах Алгоритм 6.4. Программа выделения связных компонент неориентированного графа Program ConnectComponent; {Выделение компонент связности графа} uses CRT,DOS; Const nVertex=100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[1..nVertex] of Integer; TypeAdjacent=array[1..nAdjacerit] of Integer; Var f :Text; { Текстовый файл } n :Integer; { Количество вершин } Adj :TypeAdjacent; { Список смежности графа } Fst :TypeVertex; { Указатели вершин списка смежности} Nbr :TypeVertex; { Количество вершин в списке смежности} Vtx :TypeVertex; { Список вершин графа } Mark :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 [ij-t-j] :=m; break; end; if not yes then exit; end; end; Procedure Component( x,count :Integer); Var i,v : Integer; begin Mark[x]:=count;
  • 129. 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: =1 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,'Плохая структура смежности графа!'); C l o s e ( f ) ; exit; end; 5—2697
  • 130. 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. Степени внутренних вершин четные (внутренние вершины не являются началом и концом цепи);
  • 131. 6.7. Эйлеровы графы 131 3. Если вершины а и Ъ являются началом и концом цепи и а # Ь, то степени их нечетные; 4. Если вершины а и b являются началом и концом цепи и a = b,io степени их четные. Доказательство. (=>) Дано, что существует эйлерова цепь aulx2u2...xnunb, где а, Ь, *, е X, и, е U, в которрй содержатся все ребра по одному разу. Такая цепь включает все вершины графа, если граф не содержит изолированных вершин. Докажем условия 1—4: 1) по данной цепи из любой вершины можно попасть в лю- бую другую, значит, граф связный; 2) каждая тройка цепи «/_Л«, привносит вершине х, степень два, а так как все ребра и, в цепи различные, то степени внутренних вершин четные; 3) и 4) доказа- тельства повторяют доказательство пункта 2. (<=) Даны условия 1—4. Построим эйлерову цепь. Предварите- льно приведем условие 3 к условию 4 включением в граф фиктив- ного ребра и*, которым свяжем вершины а и Ь. Теперь и в случае 3 все вершины будут иметь четную степень. Пусть А е X— произво- льная вершина (рис. 6.16). Из нее будем строить цепь, выбирая в качестве продолжения пути ребро, которое еще не пройдено. Эта цепь (цикл /) может закончиться только в вершине А, так как, при входе в любую другую вершину, всегда существует ребро, по кото- рому можно выйти из нее (степени вершин четные). Возможны два случая: 1) построенный цикл Tj содержит все ребра графа, тогда теорема доказана; 2) /i содержит не все ребра графа. Во втором случае рассмотрим граф ГГ1г полученный уда- лением из Гвсех ребер, входящих в /. Граф Г Г{ вновь содержит вершины только с четными степенями (у каждой вершины удали- ли по четному числу ребер). Так как Г— связный граф, то сущест- вует вершина в /, инцидентная ребру из Г Г^ Пусть это верши- на В е X. Построим из нее цикл Г2 так же, как строили цикл Г^ Построим общий -Г12 цикл из / и Г2 так, как это сделано на рис. 6.16. Для Гп вновь проверяем рассмотренные выше два слу- чая, как для Рис. 6.16. Объединение двух циклов в один цикл
  • 132. 132 Глава 6. Введение в теорию графов. Алгоритмы на графах Процесс расширения продолжаем до тех пор, пока не будут включены все ребра графа в один цикл: Aul x2 ...au*b...un A. Разры- ваяданный цикл по ребру и*, получим эйлерову цепь flw1/2.,./nwn£, где t; e X, Wj e U. Конструктивный характер доказательства теоремы позволяет на формальном уровне в алгоритме 6.5 записать рассмотренный по- иск эйлеровой цепи. Исходный граф представлен своей структурой смежностиAdj[x], где А#[х] — множество вершин, смежных с х е X. Результирующая эйлерова цепь формируется в множестве Z. Алгоритм 6.5. Алгоритм поиска эйлеровой цепи графа 3v e X', (Вершина начала эйлеровой цепи} Z- {v}; (Начало строящейся эйлеровой цепи} R = 0; {Частный расширяющийся цикл эйлеровой цепи} repeat Cycle(v, R); Z= Z^i R, {Объединение циклов в один цикл} until Not 3v e Z Adj[v] > 0 Procedure Cycle(v, R) R= {v}; (Построение отдельного цикла эйлеровой цепи} repeat w = Adj[v]; R=Rv(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 (а значит, и в Z), удаляются как пройденные из структуры смежности Adj[x] (из графа). Формирование расширяющих циклов R осуществляется до тех пор, пока структура смежности графа содержит хотя бы одно ребро. • Сложность алгоритма поиска эйлеровой цепи. Число обраще- ний к процедуре Cycle не более, чем число вершин Х. При каждом обращении количество производимых действий про- порционально числу ребер, входящих в выделенный цикл. Сложность суммарной работы процедуры Cycle пропорциона-
  • 133. 6.7. Эйлеровы графы 133 льна количеству ребер Us графе. Поэтому сложность выделе- ния эйлеровой цепи составляет О(Х + U). Программная реализация поиска эйлеровой цепи представле- на в алгоритме 6.6, который соответствует множественному опи- санию соответствующего алгоритма 6.5. Алгоритм 6.6. Программа поиска эйлеровой цепи графа Program EilerWay; {Эйлерова цепь в псевдографе} uses CRT,DOS; Const nVertex-100; {Максимальное количество вершин} nAdjacent=1000; {Максимальная длина списка смежности} Туре TypeVertex=array[1..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; A d j ( F s t [ i j + j ] : = m ;
  • 134. 134 Глава 6. Введение в теорию графов. Алгоритмы на графах break/- end; if not yes then exit; end; { Разместить петли в начале списка смежности } for i:=l to n do begin k:=l; for j:=l to N b r f 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 Degfi]:=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:=l; 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;
  • 135. 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]-1; break; end; v:=w; until Not( Nbr[v]>0 ); end; Procedure Eiler; { Построение эйлеровой цепи z[] } Var v,w :Integer; i,j,kt :Integer; count :Integer; yes :Boolean; begin v:=ks; kz:=l; kt:=kz; z[kz]:=v; Write (f,'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+l]; 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. 136 Глава 6. Введение в теорию графов. Алгоритмы на графах Var {Main} i,j :Integer; yes :Boolean; begin {Main} Assignff,'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 do Write(f,Vtx[z[i]]:3); WriteLn(f); Close(f); end. {Main} Рассмотрим пример расчета по программе алгоритма 6.6 поис- ка эйлеровой цепи в графе, изображенного на рис. 6.17. Рис. 6.17. Пример расчета эйлеровой цепи графа
  • 137. 6.8. Остовные деревья 137 Для программы алгоритма 6.6 исходные данные структуры смежности Adj[x] графа на рис. 6.17 задаются в текстовом файле Eiler.in. Структура (правило) заполнения файла совпадает с той, которая описана в рассмотренном примере поиска в глубину при расчете по программе алгоритма 6.2. Данные файла Eiler.in для примера на рис. 6.17: 9 1 2 3 4 5 6 7 8 9 4 4 4 4 4 2 2 2 2 2 1 1 1 1 2 2 3 4 3 3 2 5 4 5 3 4 5 Результаты расчетов сохраняются в выходном файле Eiler.out со следующей структурой: Z= 1 R = 1 2 3 1 4 5 1 Z = 1 2 3 1 4 5 1 R= 5 6 2 7 3 8 4 9 5 Z = 1 2 3 1 4 5 6 2 7 3 8 4 9 5 1 0 = 1 2 3 1 4 5 6 2 7 3 8 4 9 5 1 . На каждом шаге показана строящаяся эйлерова цепь Z, кото- рая расширяется выделенным R циклом. Результирующая эйле- рова цепь графа отмечена признаком О в начале строки. 6.8. Остовные деревья • Определение. Остовным деревом связного неориентированно- го графа Г= (X, U, Ф) называется дерево Г0 = (X, U0 , Ф), явля- ющееся подграфом графа Г и содержащее все его вершины (рис. 6.18). Рис. 6.18. Связный граф и два остовных дерева
  • 138. 138 Глава 6. Введение в теорию графов. Алгоритмы на графах • Утверждение 6.8.1. Дерево с и вершинами содержит п - 1 ребро. Доказательство. Доказательство проведем по индукции числа вершин. Заметим, что в дереве найдется вершина, степень которой равна единице (висячая вершина). Действительно, в противном случае, если степени вершин > 2, можно построить цикл, что про- тиворечило бы определению дерева. Цикл строится следующим образом. Выполним проход по ребрам графа, начиная с произво- льной вершины. Так как степени > 2, то, попав в вершину первый раз, можно всегда из нее выйти. Исходный граф — конечный и связный. Следовательно, наступит момент, когда вновь попадем в пройденную уже вершину, что доказывает существование цикла. Условие индукции для п = 2 выполняется, дерево с двумя вер- шинами содержит одно ребро. Предположим теперь, что утверж- дение выполняется для деревьев, число вершин у которых меньше п. Рассмотрим дерево с п вершинами. Удалим из этого дерева ви- сячую вершину и инцидентное ей ребро. Очевидно, что остав- шийся граф будет связным и без циклов, т.е. будетдеревом с п — 1 вершиной. Тогда по предположению индукции оставшаяся часть графа содержит п — 2 ребра, а значит, исходное дерево должно иметь их п — 1. Практическую значимость остовных деревьев дает популярная форма задачи Кэли. Необходимо соединить п городов железнодо- рожными линиями так, чтобы не строить лишних дорог. Известна стоимость строительствадля каждой пары городов. Каковадолжна быть сеть дорог, соединяющая все города и имеющая минималь- ную возможную стоимость?Аналогичные вопросы возникают при проектировании линий электропередач, сетей ЭВМ и др. В терминах теории графов задачу можно сформулировать сле- дующим образом. Рассмотрим граф Г= (X, U, Ф), где X— города, U— дороги. Каждому ребру и & Uназначим вес са(м) — стоимость строительства дороги и. Задача состоит в том, чтобы построить связный граф Г о = (X, U0 , Ф), содержащий все вершины, с мини- мальным весом W(r0 )= ^со(и). Очевидно , что Г0 — дерево, "*%° кв противном случае можно было бы удалить одно ребро, не нару- шая связности То и уменьшая сумму весов его ребер. • Определение. Минимальным остовным деревом (лесом) назы- вается остовное дерево (лес) с минимальным общим весом его ребер.
  • 139. 6.8. Остовные деревья __ 139 6.8.1. Жадный алгоритм построения минимального остовного дерева Минимум остовныхдеревьев графа Г= (X, U, Ф) можно найти, применяя процедуру исследования ребер в порядке возрастания их весов. Другими словами, на каждом шаге выбирается новое ребро с наименьшим весом, не образующее циклов с уже выбран- ными ребрами. Процесс продолжается до тех пор, пока не будет выбрано Х — 1 ребро. Рассмотренная процедура называется жадным алгоритмом. Реализация данной схемы может быть выполнена следующим образом. Для каждой вершины Х= {xl5 х2,..., х„} графа Г= (X, U, Ф) формируются начальные тривиальные компоненты связности 1*1 Т, = (Xif и„ Ф), где X, = {х,}, Ui = 0, 2,..., Х. Компоненты Заявляются деревьями, объединение Т =(JT( которых дает начальное приближение строящегося остовного де- рева Г0 = (Х, и0,Ф). Включение в строящееся остовное дерево Г0 выбранного ребра на очередном шаге жадного алгоритма выполняется слиянием 7} = 7} u TJ (Xt I = Xj vXj и Ц = U, i u ф двух компонент 7) и 7j, которым принадлежит по вершине новогоребра, и включением самого ребра в объединенное множество Ц=11^Ц ребер. Процесс роста объе- динения Т =[_)Tj компонент к остовному дереву Го = (X, U0 , Ф) i продолжаем до тех пор, пока не будет включено Х — 1ребро. Справедливость жадного алгоритма является следствием сле- дующих двух лемм. • Лемма 6.8.1. Пусть Г= (X, U, Ф) — связный неориентирован- ный граф и Г0 = (X, U0 , Ф) — произвольное остовное дерево для него. Тогда: 1) V xi, x2 е ^существует единственная между ними цепь в Г0 ; 2) если к Г0добавить ребро из U U0 , то возникнет ровно один цикл. Доказательство. Утверждение 1 верно, т.к. в противном случае в Г0 существовал бы цикл, что противоречит дереву Го . Утвержде- ние 2 верно, поскольку между вершинами добавляемого ребра уже есть одна цепь, а значит, возникнет один цикл.
  • 140. 140 Глава 6. Введение в теорию графов. Алгоритмы на графах • Лемма 6.8.2. Пусть Г= (X, U, Ф) — связный неориентирован- ный граф, для каждого ребра и е U определен вес со(и), и Tj = (Xj, Uj, Ф) — компоненты связности жадного алгоритма, объединение которых Т = у Tj, согласно алгоритму, растет к остовномудереву Г0 = (X, U0, Ф), где / = 1,2,..., k и k > 1. Пусть следующим найденным для включения ребром является ребро Е = (х, у) наименьшего веса из оставшихся U у £/, и пусть х е Х1 i ну £ Х. Тогда найдется остовное дерево Г0дляГ= (X, U, Ф), со- держащее ребра ус/, U{E}, вес которого не больше любого другого остовного дерева, содержащего ребра у С/,. Доказательство. Допустим противное. Пусть существует ос- товное дерево Г'0 = (Х,и'0,Ф)ддя Г, содержащее у С/, и не содер- i жащее ребра Е, вес которого меньше весалюбого остовногодерева для Г, содержащего у С/, и{Е}. По утверждению 1 леммы 6.8.1, при у- добавлении Е к Г'0 образуется цикл. Этот цикл должен содержать такое ребро Е'= (х', у), от- личное от Е, что х' Е Х1 и у' г Xi, т.к. цикл вхо- (у дит в С/1 по ребру (х, у) и у g A^, то он должен и выйти из С/! (рис. 6.19). Из условия следует, что Рис. 6.19 вессо(Е) < со (Е), так каку С/, с U0 иус/,- с U'0 и ребро Е выбиралось с минимальным весом из оставшихся ребер С/ЛУ Uj без образования циклов, в противном же случае выбор должен был бы пасть на Е ', т.к. оно тоже не образует циклов с уС/,. Рассмотрим граф Го = (X, U0 , Ф), образованный добавлением Е к Г'0 и удалением Е 'из Г'0 . В Г0 нет циклов, так как единственный цикл разорван удалением ребра Е '. Г0 остался связным* так как осталась цепь между х'иу'. Таким образом, Г0 — остовное дерево. Учитывая, что со(Б) < СО(Е ), то вес дерева Го не больше веса Г'0 . Ос- товное дерево Г0 содержит у С/, и Е, а это противоречит предпо- ложению минимальности Г0, что доказывает справедливость жадного алгоритма.
  • 141. 6.8. Остовные деревья 141 Реализация «жадной» схемы формирования остовного дерева представлена в алгоритме 6.7. Используемые при его описании обозначения соответствуют тому, что вводилось при обоснова- нии жадной схемы. Вектор Mark[x] меток вершин х е X графа поддерживает их принадлежность компонентам связности Uit из которых формируется реберный список остовного дерева. Нача- льные величины Mark[x,] устанавливаются равными порядковым номерам соответствующих вершин х, е X. Далее значения Mark[Xj] корректируются по мере слияния компонент Uit сохра- няя соответствие принадлежности им вершин. Исходный граф задается реберным списком U, выходное остовное дерево также формируется реберным списком Uo . Алгоритм 6.7. Жадный алгоритм минимального остовного дерева for Xj e Xdo Markfa] = i; Sort(U)', {Сортировка списка ребер по их весам) U0 = 0; while UJi<X- I do begin (х, у) е U {Ребро с win весом из оставшихся) ifMark[x] Ф Mark[y] then begin U0 = U0 u {(х, у)}', {Включитьребро в остовное дерево) Z = Mark[y]; {Слияние Ux uUy ) for v 6 Xdo ifMark[v] = z then Mark[v] = Mark[x] end; U= U{(x, у)}; {Удалить ребро с min весом из списка] end; • Сложность жадного алгоритма. Жадный алгоритм требует предварительной сортировки ребер по их весам. Стандартные методы сортировки имеют сложность O(U 2 ). Сложность ал- горитма 6.7 помимо сложности сортировки зависит от слож- ности реализации слияния подмножеств Ux и Uy . Сложность данной операции при полном переборе вершин данных под- множеств (как представлено в алгоритме 6.7) составляет 0(Х 2 ). Значит, сложность жадного алгоритма О(Х| 2 ) + | J7| 2 ). Программная реализация жадного алгоритма представлена в алгоритме 6.8, который близко соответствует множественному описанию соответствующего алгоритма 6.7.
  • 142. 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
  • 143. 6.8. Остовныедеревья 143 w:=We[j]; We[j] :=We[j+1] ; We[j+l]:=w; w:=U[2*j-l]; U[2*j-l] :=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 : =1 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] OMark [у] then begin nUo:=nUo+l; Uo [nUo] :=sU; {Добавить ребро в остовное дерево} z:=Mark[y]; {Слияние Ux и Uy} for i:=l to nX do if Mark[i]=z then Kark[i]:=Mark[x]; end; sU:=sU+l; {Удалить ребро (х, у) из списка 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-l] ) ; { Первые вершины ребер } 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(f,'nX=',nX:3);
  • 144. 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) ;WriteLri (f) ; Ostov; W r i t e ( f , ' u o l = ' ) ; 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=',Wt:3); Close(f); end. {Main} Рассмотрим пример построения минимального остовного дере- ва графа, изображенного на рис. 6.20, по программе алгоритма 6.8. х5 х4 Рис. 6. 20. Пример расчета остовного дерева Для программы этого алгоритма исходные данные графа на рис. 6.20 задаются реберным списком в текстовом файле Hung- ry.in со следующей структурой: • в первой строке файла содержится количество ребер в списке (12); • во второй и третьей строках указываются ребра своими верши- нами: одна вершина во второй строке, другая вершина ребра в третьей строке;
  • 145. 6.8. Остовные деревья 145 • в четвертой строке располагаются значения весов соответству- ющих ребер. 12 7 7 7 7 7 7 1 2 3 4 5 б 1 2 3 4 5 6 2 3 4 5 6 1 1 4 9 16 25 36 20 15 3 17 28 23 Результаты расчетов сохраняются в выходном файле Hung- ry.out со следующей структурой: nU = 12 пХ = 7 Х = 7 1 2 3 4 5 6 ul = 7 3 7 7 2 7 4 1 6 7 5 7 u 2 = 1 4 2 3 3 4 5 2 1 5 6 6 We = 1 3 4 9 15 16 17 20 23 25 28 36 uol= 7 3 7 7 4 6 uo2= 1 4 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. Построение остовного дерева Г0 начинается с произвольной вершины Xj. 2. Затем среди ребер, инцидентных х±, выбираем ребро (xj, x2 ) с наименьшим весом и включаем его в дерево Г0 . 3. Повторяя процесс, выполняем поиск наименьшего по весу реб- ра, соединяющего вершины xl и х2 с некоторой другой верши- ной графа х3 .
  • 146. 146 Глава 6. Введение в теорию графов. Алгоритмы на графах 4. Процесс включения ребер продолжаем до тех пор, пока все вер- шины исходного графа Г не будут включены в дерево Г0. По- строенное дерево будет минимальным остовным. Доказательство того, что последовательность шагов 1—4 при- водит к построению минимального остовного дерева, аналогично доказательству для жадного алгоритма. Реализация схемы бли- жайшего соседа формирования остовного дерева выполнена в ал- горитме 6.9, где исходный граф Г= (X, U, Ф) представляется мат- рицей весов We = [щ], веса несуществующих ребер полагаются равными +оо. Под весами ребер понимаются их длины. Остовное дерево Го = (Х0> U0, Ф) формируется посредством реберного спи- ска Uo и списка вершин Хо. В качестве меток вершин устанавли- ваются их порядковые номера Х= {1, 2,..., п}. Для каждой верши- ны х е Хграфа, еще не включенной в остовное дерево, поддержи- вается минимальное расстояние до множества ранее включенных вершин в Х0. Это осуществляется с помощью двух векторов dist[x] nprev[x], где dist[x] равно минимальному расстоянию от* е Хдо вершины prev[x] е Х0. Обновление значений векторов dist[x] и prev[x] выполняется на каждом шаге алгоритма при пополнении Х0 новой вершиной. • Сложность алгоритма ближайшего соседа. Сложность алгорит- ма определяется двумя вложенными циклами по числу вер- шин. В каждом из циклов выполняется константное число операций. Следовательно, сложность составляет Алгоритм 6.9. Алгоритм ближайшего соседа для остовного дерева Х= {1, 2,..., я}; {Метки вершин графа} пХ= Х; {Количество вершин в графе] v = rand(, Х); {Произвольная вершина v е X] XQ - Mi {Вершины остовного дерева} X=X{v}; {Удалить v изХ} U0 = 0; {Ребра остовного дерева} WT = 0; {Вес остовного дерева] for x e Xdo begin disfix] = We[x, v]; {Минимальное расстояние от х до v е Х0 } prev[x] = v; {Ребро (v, х), длина которого dist[x]} end; while X0 *nXdo begin dist[v] = min dist[x]; { v е Х— вершина для включения} xsX
  • 147. 6.8. Остовные деревья 147 Х0 = Х0 u {v}; {Добавить вершину] X=X{v] {Удалить вершину] U0= U0^j {prev[v, v}; {Добавитьребро] WT= WT+ dist[v; {Поправить вес дерева] {Поправить dist[x] — вектор расстояний] forx e Xdo ifdist[x] > We[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..nVertex] of Integer; Var f :Text; { Текстовый файл } nX :Integer; { Количество вершин в графе } nXo :Integer; { Количество вершин в остовном дереве} nUo :Integer; { Количество ребер в остовном дереве } X :TypeVertex; { Список вершин графа } Хо :TypeVertex; { Список вершин остовного дерева } Uo :TypeRib; { Ребра остовного дерева } Prev :TypeVertex; { Список ближайших вершин } Dist :TypeRib; { Расстояния до ближайших вершин } We :TypeWeight; { Матрица весов ребер графа } Wt :LongInt; { Вес минимального остовного дерева } Procedure minDist( Var v :Integer );{Поиск v - ближайшего соседа} Var i,d :Integer; begin v:=X[l];
  • 148. 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=Xv - удалить 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=Xv - удалить 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) - добавить ребро к остову}
  • 149. 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[i,j]:=$7fff; {+бесконечность} W e [ j , i ] : = W e [ i , j ] ; end; end; C l o s e ( 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[i,j]=$7fff then continue; nUo:=nUo+l; Uo[2*nUo-l]:=i; Uo[2*nUo]:=j; end; WriteLnff,'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*1-1]:3); WriteLn(f); Write(f,'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(f,We[Uo[2*1-1],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); Writeff,'u62='); for i:=l to nUo do Write(f,Uo[2*1]:3);WriteLn(f);
  • 150. 150 Глава 6. Введение в теорию графов. Алгоритмы на графах Write ( f , ' W o e = ' ) ; for i:=l to nUo do Write(f,We[Uo[2*i-l],Uo[2*i]]:3); W r i t e L n ( f ) ; Wt:=0; for i:=l to nUo do Wt:=Wt+We[Uo[2*1-1],Uo[2*i]]; W r i t e ( f , ' B e c = ' , W t : 3 ) ; C l o s e ( 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 Х = 1 2 3 4 5 6 7 ul = 1 1 1 2 2 3 3 4 4 5 5 6 u 2= 2 6 7 3 7 4 7 5 7 6 7 7 We = 20 23 1 15 4 3 9 17 16 28 25 36 uol= 1 7 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).
  • 151. 6.9. Кратчайшие пути на графе 151 6.9. Кратчайшие пути на графе Рассматриваемый алгоритм определяет расстояния между вер- шинами в простом орграфе с неотрицательными весами. К таким орграфам сводятся многие типы графов. Если граф не является простым, его можно сделать таковым, отбрасывая все петли и за- меняя каждое множество параллельных ребер кратчайшим реб- ром (ребром с наименьшим весом) из этого множества; каждое неориентированное ребро заменяется парой ориентированных ребер. Если граф не взвешен, то можно считать, что все ребра имеют один вес. Пусть /= (X, U, Ф) — простой орграф, для каждого ребра и е U определен вес ю(м) > 0. Найдем кратчайший путь между выделен- ными вершинами х$ и z (рис. 6.21). Несуществующие ребра будем считать ребрами с бесконечными весами. Сумму весов ребер в пути будем называть весом или длиной пути. Обозначим w,y = co(w) — вес ребра и = (х,-, xj). Алгоритм поиска кратчайшего пути, начиная из вершины XQ, просматривает граф в ширину, по- мечая вершины Xj значениями—метками их расстояний от XQ. Мет- ки могут быть временные и окончательные. Временная метка вер- шины Xj — это минимальное расстояние от XQ до Xj, когда в опреде- лении пути на графе учитываются не все маршруты изXQ вх,. Окон- чательная метка Xj — это минимальное расстояние на графе OTXQ до Xj. Таким образом, в каждый момент времени работы алгоритма некоторые вершины будут иметь окончательные метки, а осталь- ная их часть — временные. Алгоритм заканчивается, когда верши- на z получает окончательную метку, т.е. расстояние от XQ до z. Вначале вершине XQ присваивается окончательная метка 0 (ну- левое расстояние до самой себя), а каждой из остальных Х — 1 вершин присваивается временная метка да (бесконечность). На каждом шаге одной вершине с временной меткой присваивается окончательная и поиск продолжается дальше. На каждом шаге метки меняются следующим образом. 1. Каждой вершине х,, не имеющей окончательной метки, присва- ивается новая временная метка — наименьшая из ее временной и числа (wy + окончательная метках,), где х, — вершина, которой присвоена окончательная метка на предыдущем шаге. 2. Определяется наименьшая из всех временных меток, которая и становится окончательной меткой своей вершины. В случае равенства меток выбирается любая из них.
  • 152. 152 Глава 6. Введение в теорию графов. Алгоритмы на графах Циклический процесс п.1+п.2 продолжается до тех пор, пока вершина z не получит окончательной метки. Легко видеть, что окончательная метка каждой вершины — это кратчайшее рассто- яние от этой вершины до начала XQ. Рассмотрим пример поиска кратчайшего пути на графе, пред- ставленном на рис. 6.21. 2 х2 5 хЗ 7 Рис. 6.21. Простой взвешенный орграф х5 Процесс назначения меток вершинам графа на каждом шаге удобно представить в виде следующей таблицы. xl х2 хЗ х4 х5 10 15 13 15 Квадратами выделены окончательные метки, т.е. расстояния от них до х0 . По такой таблице легко восстановить путь перемеще- ния от z к XQ, который отмечен ломаной кривой. Реализация рассмотренной схемы поиска кратчайшего пути представлена в алгоритме 6.11, где граф Г= (X, U, Ф) представля- ется матрицей весов We = [w,-,], веса несуществующих ребер пола- гаются равными +оо. Вектор Mark[x] меток вершин устанавливает принадлежность вершины х Е ЛГпостоянной (TRUE) или времен- ной (FALSE) метке. Вектор Dist[x] в алгоритме фиксирует теку- щие значения меток вершин. Вектор Prev[x] позволяет восстано- вить в обратной последовательности вершины кратчайшего пути.
  • 153. 6.9. Кратчайшие пути на графе 153 Алгоритм 6.11. Алгоритм кратчайшего пути на орграфе for x e X do begin Mark[x] = FALSE; Dist[xJ = oo; end; У = ХО', Mark[xQ = TRUE; Dist[xQ] = 0; while not Mark[z do begin for x e X do if not Mark[x] and dist[x] > disty] + w[y, z] then begin dist[x] = disty] + w[y, x]; prev[x]=y; end; {Поиск новой вершины у е X с минимальной временной меткой} disty] = min distx xsXand Mark[x]=FALSE Marky] = TRUE; end. Prev[x] указывает на вершину с окончательной меткой, бли- жайшую к вершине х. Последовательность вершин кратчайшего пути будет имеет следующий вид: z, prev[z], prevprev[z]], prevprevprev[z]]], ... , х0, а значение Dist[z] составит длину пути из XQ в z- Очередная новая вершина, претендующая на постоянную метку, обозначается че- рез у. • Сложность алгоритма, Алгоритм обращается к телу цикла whi- le не более Х — 1 раз, и число операций, требующихся при каждом таком обращении, равно 0(Х |). Тогда сложность алго- ритма составит 0(1-^1 ). Интересно заметить, что если требуется найти длины кратчай- ших путей от х0 до всех вершин графа, то в алгоритме 6.11 условие цикла while not Mark[z] do begin надо заменить на условие while v not Mark[x] do begin. При этом сложность алгоритма останется хеХ прежней. Программная реализация алгоритма поиска кратчайшего пути представлена в алгоритме 6.12 на Pascal'e, который близко соот- ветствует множественному описанию алгоритма 6.11.
  • 154. 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 f :Text; { Текстовый файл } nX :Integer; { Количество вершин в графе } Mark :TypeMark; {Признаки временных и постоянных меток} Dist :TypeDist; { Значения текущих меток вершин (расстояния)} Prev :TypePrev; { Указатель на ближайшую вершину } We :TypeWeight; { Матрица весов ребер графа } хО :Integer; { Вершина начала пути } z :Integer; { Вершина конца пути } у :Integer; {Последняя вершина с постоянной меткой} Var i,j,х :Integer; weight :Longlnt; begin Assign(f,'Short.in'); Reset(f);{Файл открыт для чтения} {Ввод исходных данных} Read(f,xO); {Начальная вершина пути} Read(f,z); {Конечная вершина пути} Read(f,nX); {Количество вершин в графе} пХ:=пХ-1; (* Х={О,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 х:=0 to nX do begin Mark[x]:=FALSE; Distfx]:=$7fffffff; end;
  • 155. 6.9. Кратчайшие пути на графе 155 у:=хО; {Последняя вершина с постоянной меткой} Mark[у]:=TRUE; Dist[y]:=0; while not Mark[z] do begin {Обновить временные метки] for x:=0 to nX do if not Markfx] and ( Dist[x]>DistCy]+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 W r i t e ( f , x : 2 ) ; x:=Prev[x]; end; WriteLn(f,x:2); WriteLn(f, ' Длина пути= D i s t [ z ] ) ; Close(f); end. Рассмотрим пример расчета по программе алгоритма 6.12 по- иска кратчайшего пути на графе, показанном на рис. 6.21. Исход- ные данные графа представляются матрицей весов его ребер в текстовом файле Short.in со следующей структурой: • в первой строке определяется номер начальной вершины пути л^; • во второй строке определяется номер конечнойвершины путиz', • в третьей строке указывается количество пХвершин в графе; • в следующих дАГстроках определяются строки матрицы весов [щ] графа. о б 7
  • 156. 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 6 0 Результаты расчетов сохраняются в выходном файле Shortcut со следующей структурой: Вершины пути= 6 4 3 1 2 0 Длина пути= 11. 6.10. Потоки в сетях • Определение. Транспортной сетью называется связный ориен- тированный граф без петель Г= (X, U, Ф) с выделенной парой вершин д:0 и z (рис. 6.22). Вершина х0 — начало транспортной сети, из которой дуги только выходят. Вершина z — конец транспортной сети, в которую дуги только входят. На множе- стве дуг и е U задана целочисленная функция с(и) > О, где с(и) — пропускная способность дуги. Рис. 6.22. Транспортная сеть Определение. Потоком по транспортной сети называется цело- численная функция ф(м) > 0 , заданная на множестве дуг и elf и обладающая следующими свойствами: Уие£/"ф(ы)<С(ы) и £>(«)= £>(и), (6.10.1) где х — внутренняя вершина графа, т.е. х Ф х0 , х * z', UZ — множество дуг, заходящих в вершину х; U~ — множество дуг, выходящих из вершины х (рис. 6.22).
  • 157. 6.10. Потоки в сетях _ 157 На рис. 6.22 напротив каждой дуги стоит дробь, числитель ко- торой — пропускная способность дуги, знаменатель — поток по дуге. Свойство (6.10.1) утверждает, что поток, входящий в верши- ну, равен выходящему потоку (поток в вершинах не скапливает- ся). Обозначим „ где ф(г)— поток, входящий в вершину z; ф(*о) — поток, выходящий из вершины л^. • Утверждение 6.10.1. ср(г) = ф(х0 ). Действительно, сумма £[ ^ф(и)- ]>]ф(м)]=0, так как V« e U величина ф(м) суммируется дважды — со знаками + и -. Здесь где первая часть выражения равна нулю вследствие 6.10.1. • Определение разреза. Пусть А с X— множество вершин транс- портной сети: х0 g A, z^A. Обозначим через U^ множество дуг, входящих в А. Это множество дуг будем называть разрезом транспортной сети. с(и) / с(и Рис. 6.23. Разрез транспортной сети С(А) = ]Гс(и) — называется мощностью разреза. Это максимально ие(/^ возможный поток, входящий в А по дугам разреза. ф(4) = ^ ф(м) — поток, входящий в А по дугам разреза. Ясно, что и<=и + А ср(Л) < С(А), так как Vw e U ф(ы) < с(и). • Утверждение 6.10.2. ф(г) < С(А). Действительно, из рис. 6.23 видно, что не весь поток, входя- щий в А, скатывается в z. Часть потока может выходить из А. Зна- чит, ф(г) < у(А), но ф(Л) < С(А), тогда и ф(г) < С(А).
  • 158. 158 Глава 6. Введение в теорию графов. Алгоритмы на графах Теорема 6.10.1 Форда и Фалкерсона. Максимальный поток по транспортной сети равен мощности минимального разреза, т.е. max (р(г ) = тптС(А). Доказательство теоремы — это алгоритм определения макси- мального потока по сети. Алгоритм состоит из двух частей. 1. Насыщение потока. Поток называется насыщенным, если лю- бой путь из XQ в z содержит дугу и s U, для которой ср(и) = с(и). Задача первой части алгоритм состоит в насыщении потока. 1.1. Зададим произвольный начальный поток. Например, нуле- вой на всех дугах: Vu e Uq(u) = 0. 1.2. Поиск пути из XQ в г. Если путь найден, то переход к пункту 1.3. Если путь не найден, то переход к пункту 1.5. 1.3. Увеличиваем поток по найденному пути таким образом, что- бы одна из дут стала насыщенной. 1.4. Условно разрываем насыщенную дугу и переходим к пункту 1.2, на поиск пути из х$ в z. 1.5. Сеть насыщена и «разорвана». 2. Перераспределение потока. Итак, поток насыщен, как в приме- ре на рис. 6.24. Пометим рекурсивным образом все возмож- ные вершины х, сети. -2 Xl х2 +о х2 Рис. 6.24. Насыщенная транспортная сеть и пометка вершин 2.1. Вершину XQ пометим —0. 2.2. Пусть Xj — любая из уже помеченных вершин; у — произволь- ная непомеченная вершина, смежная л:,. Вершину у помечаем +/, если данные вершины соединены ненасыщенным ребром Xj-*y(+i), и помечаем —/', если соединены непустым ребром х / <- Х~0- После пометки вершин возможны два случая: вер- шина z оказалась либо помеченной, либо непомеченной.
  • 159. 6:10. Потоки в сетях 159 2.3. Вершина z оказалась помеченной. Значит, существует после- довательность помеченных вершин от х0 к z. В этой последо- вательности каждая последующая вершина помечена номе- ром предыдущей, как на рис. 6.25. Определим на дугах новый поток, увеличивая на единицу поток на дугах, ориентирован- ных по направлению движения от х$ к z, и уменьшая поток на единицу на дугах, направленных против этого движения, как на рис. 6.25. 1 1 3 1 1 3 -О 1 +0 1 -2 1 +1 2 0 2 хО +0 -*-••« х2 хО х2 xl Рис. 6.25. Перераспределение потока на основе пометки вершин Заметим, что поток можно увеличивать (уменьшать) на пря- мых (обратных) дугах настолько, пока одна из дуг не станет насыщенной (пустой). Далее вновь переходим к пометке вер- шин (пункт 2.1). Выполненное перераспределение потока со- храняет все его свойства и увеличивает на единицу поток в вершину z. Таким образом, пометка вершины z позволяет увеличить поток как минимум на единицу, а значит, алго- ритм конечен, т.е. наступит момент, когда вершина z оста- нется непомеченной. 2.4. Вершина z осталась непомеченной. В рассматриваемом при- мере это показано на рис. 6.26. ПустьА* — множество всех не- помеченных вершин. Тогда дуги, входящие в эти вершины, насыщенные, а выходящие — пустые. В примере А* = {xlt z}- Множество А* определяет разрез, так как XQ <£ A*, z e А*. Та- ким образом, мы нашли поток ф* и разрез А*, для которых вы- полняется ф*(Л*) = С(А*). Учитывая, что выходящие дуги изЛ* пустые, то весь поток у*(А*) скатывается в z, т.е. ф*(г) = С(А*). xl Рис. 6.26. Максимальный поток
  • 160. 162 Глава 6. Введение в теорию графов. Алгоритмы на графах • Определение независимого множества вершин. Пусть граф Г= (X, U, Ф) — неориентированный и без петель. Множество / с f/вершин называется независимым, если между любыми его вершинами нет соединяющих ребер. В зависимом множе- стве хотя бы две вершины соединены ребром. Множество Q полностью зависимое, если каждая пара его вершин соединена. Вершины графа, составляющие Q, образуют полный подграф. • Определение. Максимальное независимое множество есть неза- висимое множество, которое становится зависимым после до- бавления к нему любой вершины. Заметим, что каждое неза- висимое множество содержится в некотором максимальном независимом множестве. Максимальное число р(7) вершин, составляющих независимое множество, называется числом (вершинной) независимости графа. • Определение независимого множества ребер. Подобно незави- симым множествам вершин рассматриваются независимые множестваребер, состоящие из ребер, не имеющих общих вер- шин. Каждое независимое множество ребер содержится в не- котором максимальном независимом множестве. Число ребер в максимальном независимом множестве называется числом реберной независимости (Зи(7). При представлении игр графами независимые множества вер- шин являются такими множествами позиций, что никакая из них не может бытьдостигнута издругой за один ход. Примеромявля- ется задача о расположении максимального числа ферзей на шах- матной доске так, чтобы ни один них не мог побить другого. Это максимальное число равно (3(/) = 8. • Утверждение 6.11.1. Независимое множество максимально тогда и только тогда, когда оно доминирующее, а значит, р(7) > 5(/)— число (вершинной) независимости не может быть меньше числа доминирования. Доказательство. (=>) Если 7с U— максимальное независимое множество, то не может быть вершин k е 7, не соединенных с ребром, так как в противном случае множество k u /также было бы независимым, но 7— максимальное по условию. Отсюда 7 — доминирующее. (<=) Пусть 7— независимое доминирующее мно- жество. Тогда никакое k нельзя перевести из 7 в /так, чтобы k <u I осталось независимым, а значит, 7 — максимальное.
  • 161. 6.11. Клики, независимые множества 163 Определение. К/гика есть полностью зависимое множество, ко- торое теряет это свойство после добавления любой вершины. Клики графа представляют «естественные» группировки вер- шин в максимальные полные подграфы. Определение клик графа полезно в кластерном анализе в таких областях, как ин- формационный поиск, в социологии и др. В качестве примера на рис. 6.31 показан граф и его клики. 6 7 1 4 4 Рис. 6.31. Граф и его клики 7 7 • Замечание. Если предположить, что граф Г= (X, U, Ф) про- стой, то полностью зависимые множества (клики) в Г стано- вятся максимально независимыми множествами в дополните- льном графе Г, верно и обратное. При алгоритмическом подходе к выделению клик в графе при- меняют метод поиска с возвращением по специальному дереву по- иска, устроенному следующим образом. Каждый узел в дереве по- иска соответствует полному подграфу исходного графа, и каждое ребро дерева поиска соответствует вершине исходного дерева. Вершины (множества) дерева поиска определим рекурсивно. Ко- рень дерева поиска — пустое начальное множество S = 0. Пусть теперь S — произвольная вершина дерева поиска какого-либо уровня. Тогда вершиной следующего уровня дерева поиска будет вершина S u {х}, если х eS и х смежна с каждой вершиной из S. В дереве поиска такие вершины S и S и {х} соединяются ребром, которое соответствует вершине х. На рис. 6.32 показаны некото- рый граф Гидерево поиска Т, которое исследуется в процессе по- иска с возвращениями клик графа полным перебором. Заметим, что каждая клика порождается много раз: клика {1,2,3} порождается 3! раз, клики {3,4} {4,5} порождаются 2! раз. В общем случае клика размера &порождается k раз. Все тонкие реб- ра на рис. 6.32 исследования дерева поиска можно оборвать, они не приводят к новым кликам. Следующие два утверждения по- зволяют обрывать такие «тонкие» ребра (не исследовать их), обес- печивая целенаправленный проход по дереву поиска клик графа.
  • 162. 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(Sc X— подмножество вершин графа). Вершина Sдерева поиска уже обработана и первой вершиной, которую надо исследовать, является множество .У и {х}, как на рис. 6.33, вершина х смежна с каждой вершиной из S. Пусть все поддеревья узла Sv {х} в дереве Гуже исследованы и по- рождены все клики, включающие S^j {х}. Тогда необходимо исследовать только те из вершин Su {v,-}, для которых v g Adj[x] (рис. 6.33). Рис. 6.33 Поддеревья с корнями Su {v/} (эти вершины смежны с 5) • Утверждение 6.11.3. Пусть S — узел в дереве поиска Т, и пусть S с S — предок SB Т. Если все поддеревья узла Su{x}уже ис- следованы, так что порождены все клики, включающие S и{х}, то все неисследованные поддеревья с корнями Ju{x} можно игнорировать. Алгоритм 6.13 порождения клик графа представляет собой про- цедуру поиска с возвращением и является наиболее сложным из всех ранее рассмотренных алгоритмов. Рекурсивная процедура CLIQUEимеет два параметра: Nn D. Для рассматриваемого узла S
  • 163. 6'. 11. Клики, независимые множества 165 поиска объединение Nи/) представляет множество вершин, смежных с каждой вершиной из S, т.е. N<uD— множество вершин, которые могут выступать в качестве продолжения поиска клик из вершины S. Множество Nсостоит только из новых вершин, кото- рые могут быть добавлены к S в процессе поиска клик, т.е. N= (x е A]|(A:,J) e UVs е-УлУб 1 с S ни одно из поддеревьев S w {x} не исследовано}. Алгоритм 6.13. Порождение клик графа 5=0; {Начальная вершина дерева поиска Т} N=X; D = 0; Z=X; CLIQUE(N, D, Z); {Рекурсивный проход по дереву поиска Т} Procedure CL1QUE(N, D, Z) i/TV и D = 0 then вывести S, которое является кликой else ifN*0 then begin x e N; {Исследовать первое поддерево} View(x); {Исследовать поддеревья} {Исследовать оставшиеся поддеревья уровня] Z=Z(x};Z=ZAdj[x- while Z#0 do begin veZ; View(v); {Исследовать поддеревья} Z e Z{v}; end', end; end; Procedure View(v) {Исследовать поддеревья} N= N{v}; S=S{v}; D = Dv{v}; end; Процедура CLIQUE выбирает произвольную вершину x e N, удаляет ее из N и исследует поддерево S= Su{x}, обращаясь к процедуре View. Далее, согласноутверждениям 6.11.2и 6.11.3, при помощи процедуры исследуются только поддеревья S= Su {v}, где v е Л^ v g vl$[;c] что соответствует условию v e Z. Множество
  • 164. 166 Глава 6. Введение в теорию графов. Алгоритмы на графах Zсостоит из вершин одного уровня дерева, которые должны быть исследованы при рекурсивном проходе по дереву поиска, чтобы не потерять ни одной клики графа. Второй параметр D процедуры CLIQUE представляет собой множество вершин, смежных со всеми вершинами из S, но таких, которые не надо добавлять к S на предмет продолжения форми- рования клик. D = { x z X}(x,s) et/Vs eSu noddepeeoS u{x) исследовалось для некоторых S ^S]. По алгоритму множество S с X является полным подграфом гра- фа Г= (X, U, Ф) и TVu D — множество всех вершин, смежных с каждой вершиной в S. • Множество S будет кликой тогда и только тогда, когда • Условие N= 0 и Z) * 0 обозначает, что все клики, включающие S, уже ранее порождались. • При N* 0 могут оставаться клики, включающие S, которые еще не порождались. Исследование таких поддеревьев S u {х}, х е N необходимо продолжить. Основные усилия алгоритма 6.13, порождения клик графа, на- правлены на поддержание множеств N к D, текущее состояние которых, согласно перечисленным выше условиям, предопреде- ляет исследования по дереву поиска. Программная реализация алгоритма порождения клик графа представлена в алгоритме 6.14 на Pascal'e, который близко соот- ветствует множественному описанию алгоритма 6.13. Отметим, что в программной реализации передача множеств N, D, ZB каче- стве параметров процедур выполнена посредством указателей kN, 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;
  • 165. 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 - указатель начала и количества вершин в списке 2} Procedure PrintClique; FORWARD; Procedure Subtract; x:Integer; Var kZ,nZ:Integer ); FOR- WARD; Procedure Intersection( v,kM,nM:Integer; Var kMw,nMw:In- teger; Var M:TypeVertex ); FORWARD; Procedure View( v:Integer; Var kN,nN, kD,nD, kZ,nZ:Inte- ger ); 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:=1 to Nbr[i] do begin yes:=FALSE; for k:=l to m do if A d j [ F s t [ i ] + j ] = V t x [ k ] then begin yes:=TRUE; A d j [ F s t [ i ] + j ] : = k ; break; end;
  • 166. 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+l; M[kMw+nMw] :=M[kM+i]; break; end; end; Procedure Subtract( x:Integer; Var kZ,nZ:Integer ); (* Формирование разности множеств Z=Z{x} и Z=ZAdj[x] *) Var i,j,k :Integer; yes :Boolean; begin (* Формирование Z=Z{x} *) for i:=l to nZ do if Z[kZ+i]=x then begin nZ:=nZ-l; for k:=i to nZ do Z[kZ+k]:=Z[kZ+k+1]; break; end; (* Формирование Z=ZAdj[x] *)
  • 167. 6.11. Клики, независимые множества 169 for j:=l to Nbrfx] 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 :Integer; begin if (nN=0) and (nD=0) then {Клика найдена} PrintClique {Печать клики) else if nN<>0 then begin (Продолжить исследование поддеревьев} x:=N[kN+nN]; {Перебор с конца вершин множества N} View(x,kN,nN,kD,nD,kZ,nZ); {Исследовать первое поддерево уровня} Subtract(x,kZ,nZ); (* Z=Z{x} и Z=ZAdj[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;
  • 168. 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]:=0; {Указатель начала первой строки списка} for i:=l to m 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,'Clique.out'); Rewrite(f); {Файл открыт для записи} Init(yes); if not yes then begin WriteLn(f,'Плохая структура смежности графа!'); Close (f); exit; end;
  • 169. 6.11. Клики, независимые множества 171 {Формирование начальных множеств: S, D, N, Z} nS:=0; (S - пустое} kD:=0; nD:=0; {D - пустое множество} kN:=0; nN:=m; {N - все вершины графа) for i:=l to m do N[i]:=i; kZ:=0; nZ:=m; {Z - для исследования доступны все вершины} for i:=l to m do Z[i]:=i; Clique(kN,nN,kD,nD,kZ,nZ); {Рекурсивное выделение клик графа} Close (f); end. Воспользуемся данной программой в качестве примера для ре- шения следующей задачи. Задача. Симпатичный прием. Генерал желает устроить свой юбилей с максимальным числом гостей из своих знакомых. Стре- мясь сделать юбилейный вечер приятным, он должен организо- вать все так, чтобы на нем присутствовали люди, симпатизирую- щие друг другу. Для достижения цели ему придется находить мак- симальную клику графа своих знакомых. Этот граф устроен следу- ющим образом. Вершины его — знакомые юбиляра. Две вершины смежные, если соответствующие знакомые симпатизируют друг другу. Нетрудно понять, что клика этого графа с максимальным числом вершин и представляет тот самый максимальный контин- гент приглашенных, который может позволить себе юбиляр. «Симпатичный» граф знакомьрсгенерала представлен на рис. 6.34. Рис. 6.34 !*. „2 Пример порождения клик графа 7 Для программы алгоритма 6.14 исходные данные структуры смежности AdJ[x] этого графа задаются в текстовом файле CU- que.in. Структура (правило) заполнения файла совпадает с той, которая описана в примере поиска в глубину при расчете по про- грамме алгоритма 6.2. Данные файла Clique.in для примера на рис. 6.34: 7 3 3 1 4 7 1 4 3 4 5 2
  • 170. 172 Глава 6. Введение в теорию графов. Алгоритмы на графах 4 4 3 1 2 5 7 2 3 6 2 4 1 4 5 6 5 4 4 1 2 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, U0 , Ф) графа Г= (X, U, Ф). Лю- бое ребро, не принадлежащее U0 , т. е. любое ребро из UU0 , по- рождает в точности один цикл при добавлении его к U0 . Такой цикл является элементом фундаментального множества циклов графа /относительно дерева Г0 . Так как каждое остовное дерево графа /включает Х — 1 ребро, в фундаментальном множестве циклов относительно любого остовного дерева графа / имеется U — Х + 1 циклов. Полезность фундаментального множества циклов вытекает из того факта, что это множество полностью определяет цикличе- скую структуру графа: каждый цикл в графе может быть представ- лен комбинацией циклов из фундаментального множества. Пусть F= {Q, С2 ,..., С|^|_|д-|+1 } — фундаментальное множество циклов, где каждый цикл С,является подмножеством ребер С, с U. Тогдалюбой цикл графа / можно записать в виде ((...(С, Ф С,-,г )Ф...) Ф С, ), где символ Ф обозначает операцию симметрической разности, Ср Ф Cq = {и | и zCp uC? ли еСр пС„}.
  • 171. 6.12. Циклы, фундаментальные множества циклов 173 Например, на рис. 6.35 показан граф и фундаментальное мно- жество циклов, получающихся из выделенного жирной линией остовного дерева графа. Цикл графа (х{ , х2 , х5 , х3 ) есть С1 © С3 ® С4 или цикл (XL х2 , х4 , д/з) есть С1 Ф С2 . Отметим, что в общем случае не каждая сумма циклов будет являться циклом графа. 2 хЗ х2 Р х 4 Рис. 6.35. Граф, его остовное дерево и фундаментальное множество циклов При порождении фундаментального множества циклов удобно использовать метод поиска в глубину; он строит остовное дерево и каждое обратное ребро порождает цикл относительно этого дере- ва. Для того чтобы следить за ребрами дерева, используется поиск в глубину со стеком, в котором хранятся все текущие вершины пройденного пути в данный момент. Когда попадаем на обратное ребро, обнаруженный цикл будет состоять из этого ребра и ребер, соединяющих вершины из верха стека. Реализация рассмотренно- го подхода представлена в алгоритме 6.15, который строит фунда- ментальное множество циклов F= {Q, С2 ,..., С^ц^^} графа Г= (X, U, Ф). Программная реализация поиска фундаментального множест- ва циклов представлена в алгоритме 6.16. Алгоритм 6.15. Фундаментальные циклы графа for v <= X do Mark[v] = 0; {Начальные метки вершин} count - 0; jC= 0; {Счетчик числа циклов} пС- 0; {Вершина стека циклов} for v 6 X do if Mark[v] = 0 then begin
  • 172. 174 _ Глава 6. Введение в теорию графов. Алгоритмы на графах Cycle(v, 0); пС= пС- 1; end', Procedure Cycle(x, у) count= count + 1; Mark[x] = count; {Вершина исследована} for v s Adj[x] do begin nC=nC+ 1; C[n C] = v; {Вершину в стек} ifMark[v] = 0 then Cycle(v, x) else ifMark[v] < Mark[x] л v * у then begin jC=jC+ 1; {Обратное ребро (х, v), найден цикл} WriteCycle(v, С, nC); {Печать цикла] end; nC=nC - 1; {Удалить исследованную вершину из стека} end; end; Procedure WriteCycle(x, С, пС) printjC; {Печать номера цикла] 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 :Text; . { Текстовый файл ) n :Integer; { Количество вершин } nC :Integer; { Количество вершин в стеке циклов)
  • 173. 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:=1 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 (f,jC,'')'); 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
  • 174. 178 Глава 6. Введение в теорию графов. Алгоритмы на графах 6.13.1. Листы • Определение. Пусть Г= (X, U, Ф) — неориентированный граф. Ребро и-(а,Ь)& U называется циклическим ребром, если оно принадлежит некоторому циклу. Петля является циклическим ребром. Никакое концевое ребро (инцидентное висячей вер- шине) не может быть циклическим. Например, дерево не име- ет циклических ребер, и, обратно, связный граф без цикличе- ских ребер является деревом. • Определение. Ребро и = (х, у) s i/называется разделяющим реб- ром (или мостом, или разрезающим ребром) в Г, если в графе Т, получающемся после удаления ребра и, вершины х и у не свя- заны. Тогда граф Г можно представить как объединение гра- фов Г =/1 иГ2 > (6.13,1) где / п Г2 = 0, и / содержит х, Г2 содержит у. • Утверждение 6.13.1. Ребро и = (х, у) е Uявляется разделяющим тогда и только тогда, когда оно не является циклическим. Доказательство. (=>) Допустим, что разделяющее ребро «явля- ется циклическим. Тогда после его удаления вершины х и у оста- нутся связанными, а значит, разложение (6.13.1) невозможно, что противоречит условию: и — разделяющее ребро. (<=) Теперь и = (х, у) — не циклическое ребро, т.е. не существует цепей, соединяющих х и у и не содержащих и. Отсюда и — разделяющее ребро. • Определение. Будем говорить, что две вершины х0 и хп цикличе- ски-реберно связаны, если существует такая последователь- ность простых циклов С1; С2 ,.-., Ck , что х0 е Cj, *„ е Ck и каж- дая пара соседних циклов имеет хотя бы одну общую вершину. Условно взаимное расположение вершин и циклов можно представлять так, как показано на рис. 6.36. Рис. 6.36. Вершины циклически-реберно связаны Утверждение 6.13.2. Циклически-реберная связность опреде- ляет отношение эквивалентности (см. п.6.4) на множестве вер- шин графа Г= (X, U, Ф). На рис 6.37 показано разбиение Гна компоненты циклически—реберной связности.
  • 175. 6.13. Листы и блоки 179 Рис. 6.37. Компоненты Г(^) циклически-реберной связности графа. Компоненты /~(£А ) связности графа. Компоненты /""(£,/) s Г (Ц связаны мостами • Определение. Множество всех вершин, циклически—реберно связанных с данной вершиной х, называется листовым множе- ством L(x), которому принадлежит х. Отметим, что листовое множество может состоять только из одной вершины х, тогда листовое множество называется особым. Далее будет показано, что это возможно тогда и только тогда, когда все ребра, инци- дентные вершине х, являются петлями или разделяющими ребрами. • Определение. Подграф Г(L), определяемый листовым множе- ством L, называется листом. • Утверждение 6.13.3. Отметим следующие очевидные свойства листа Г(1). 1. Граф f(L) циклически замкнут, т.е. если какой-нибудь простой цикл С в /имеет общую вершину с L, то весь про- стой цикл С содержится в Г(Ь). 2. Не может быть более одного ребра, связывающего два раз- личных листовых множества L и L2 , так как иначе эти ребра оказались бы циклическими и множества L^ и Z,2 должны были бы совпадать. Связывающие одиночные ребра различ- ные листовые множества L{ и L2 являются мостами для гра- фа. Ниже показано, что они будут являться и блоками, со- стоящими из одного ребра. 3. Все ребра в P(L) являются циклическими. Пусть ребро (х, у) лежит вГЩ. Покажем, что оно циклическое. Действитель- но, если, например, вершины х и у в L соединены ребром, тогда (х, у) циклическое по построению L. Если же х и у в L не соединены ребром, то, добавив данное ребро (х, у) к L,
  • 176. 180 Глава 6. Введение в теорию графов. Алгоритмы на графах получим цикл, так как вершины х, у связаны в L по построе- нию. Отсюда следует, что ребро (х, у) циклическое. 4. По определению граф Г(Ь) связный. Из предыдущего пунк- та следует, что маршрут в Г(Ь), соединяющий произволь- ные две его вершины, будет состоять исключительно из циклических ребер. 6.13.2. Блоки • Определение. Пусть Г= (X, U, Ф) — неориентированный граф. Два ребра и, v e U называются сильно циклически связанными, если существует такая последовательность простых циклов С{, С2,..., Ck, что и e C1; v e Ck, и любая пара соседних циклов С,, Ci+i имеет, по крайней мере, одно общее ребро. Условно вза- имное расположение ребер и циклов можно представлять так, как показано на рис. 6.38. Рис. 6.38. Сильно циклически связанные ребра и, v • Определение. Множество всех ребер, сильно циклически свя- занных с ребром и e U, образует некоторую часть графа Г (£*), называемую блоком, определяемым ребром и. Множество вер- шин L этого графа называется блоковым множеством, опреде- ляемым ребром и. Блок является связным графом и может со- стоять из единственного ребра. • Лемма 6.13.1. Два ребра сильно циклически связаны тогда и только тогда, когда существует простой цикл, содержащий оба эти ребра. Справедливость данного утверждения следует непо- средственно из структуры сильно циклической связанности ребер (рис. 6.38). • Лемма 6.13.2. Если Р(х, у) — простая цепь, связывающая две различные вершины х, у e L b блокового множества, то все реб- ра цепи Р(х, у) принадлежат блоку Г(Ь Ь ). Доказательство. Если предположить, что утверждение леммы не выполняется, то существует участок цепи Р(х, у), ребра кото- рого не принадлежат данному блоку Г(Ь Ь ). Не уменьшая общнос-
  • 177. 6.13. Листы и блоки 181 ти, будем считать, что этим участком является исходная цепь Р(х, у). Так как х, у Е Lb , то в блоке / (Ьь ) существует простая цепь Q(x, у), связывающая х, у. Тогда объединение простых цепей Р(х, у) u Q(x, у) составит простой цикл. Согласно лемме 6.13.1, ребра этого цикла будут сильно циклически связаны, а значит, все ребра простой цепи Р(х, у) должны лежать в Г (Lb ), что проти- воречит предположению. • Утверждение 6.13.4. Из леммы 6.13.2 следует, что блок Г(ЬЬ ) является подграфом. Он циклически сильно замкнут, в том смысле, что если простой цикл Симеет хотя бы две вершины, общие с Lb , то все ребра цепи С принадлежат Г (Lb ). Поэтому два различных блока могут иметь не более одной общей вершины (рис. 6.39). В противном слу- чае блоки должны совпадать. • Утверждение 6.13.5. Из определения блокового множества Lb следует, что все его вершины являются циклически-реберно свя- занными при условии, что число ребер в блоке Г (L ) более од- ного. Отсюда заключаем, что Lb с L, где L — листовое множе- ство вершин Ьь , и каждый лист Г (L) имеет непересекающееся по ребрам разложение Д£)=дДФ (6.13.2) I на семейство блоков. • Определение. В графе Г= (X, U, Ф) вершину х <= Хназываютраз- деляющей вершиной (разрезающей или точкой сочленения), если имеет место прямое по ребрам разложение (рис. 6.40) Г=Г(УдиГ(У2), V=V^V2, V^V2 = x. (6.13.3) Рис. 6.40 Прямое по ребрам разложение графа • Утверждение 6.13.6. Блок Г(ЬЬ ) не имеет разделяющих вер- шин, так как все его вершины циклически-реберно связаны. На основании разложения (6.13.2) любого листа Г (L) на непе- ресекающееся по ребрам разложение на блоки Г(Ь Ь ) и последне- го утверждения, составление листа Г (L) из блоков Г(Ь) может быть представлено кактусообразной фигурой, как на рис. 6.41,
  • 178. 182 Глава 6. Введение в теорию графов. Алгоритмы на графах в которой различные блоки соприкасаются в своих соединяющих вершинах. Соединяющие вершины блоков являются разделяющими вершинами графа. Разложение (6.13.2) листов на блоки Г(Ьу)=[_)Г(1^) позволяет теперь А уточнить структуру графа (рис. 6.37): каждый лист ГL. можно представить в виде кактусооб- разной'"схемы (рис. 6.41) составляющих его блоковr(L b k). Рис. 6.41 6.13.3. Поиск блоков в глубину Разложение графа на блоки и выделение их имеет важное прак- тическое значение. Иногда недостаточно знать, что граф связен; может интересовать насколько «сильно связен» связный граф. k Ь) с) Рис. 6.42. Исходный граф (а); блоки графа (Ь); листы (с), (е) и один мост (d); точки сочленения: b, f, j, i Например, удаляя вершину сочленения двух блоков (рис. 6.40) и инцидентных ей ребер, нарушим связность графа. Связность графа не нарушится, если удалить внутреннюю вершину блока и инцидентные ей ребра. Про такие компоненты графа говорят, что они двусвязные. Отыскание точек сочленения и блоков графа важ- но при изучении надежности коммуникационных и транспорт-
  • 179. 6.13. Листы и блоки 183 ных сетей. Это важно также и при изучении других свойств графа, таких, например, как планарность, так как часто полезно разло- жить граф на его двусвязные компоненты (блоки) и изучать каж- дую из них в отдельности. На рис. 6.42 в качестве примера изображен связный граф и его блоки (двусвязные компоненты). Здесь же показано разложение графа на листы. Для нахождения блоков и точек сочленения применим извест- ный метод поиска в глубину на неориентированном графе Г= (X, U, Ф). Основу алгоритма выделения блоков и точек их со- членения легче понять, рассмотрев пример на рис. 6.43, где схе- матически изображен связный граф, состоящий из шести блоков rt, i = 1,6, и четырех точек сочленения Xj, j = 1,4. Рис. 6.43. Схематическое изображение графа с шестью блоками и четырьмя точками сочленения Если начать поиск в глубину, скажем, из вершины s e Г2 , то мо- жем перейти из Г2 в /i, проходя через вершину xt . Из свойства по- иска в глубину, все ребра в / должны быть пройдены до того, как вернемся в Xj. Поэтому / состоит в точности из ребер, которые проходятся между входом и выходом из вершины х^ Для других блоков дело обстоит несколько иначе. Так, например, если уйти из TI в Г5 , а оттуда — в Г^ через х4 , то окажемся в Г6 , пройдя ребра из Г2 , /5 и Г6 . Если хранить ребра в стеке, то во время прохождения назад из Г6 в Г5 через вершину Jc4 все ребра Г6 будут на верху стека. После их удаления на верху стека останутся ребра Г5 и снова про- должим проход блока Г5 . Таким образом, если можно распозна- вать точки сочленения во время обхода, то применяя поиск в глу- бину и храня ребра в стеке в той очередности, в которой они про- ходятся, можно также определить и блоки (двусвязные компо- ненты). Ребра, находящиеся на верху стека в момент обратного прохода через точку сочленения, составляют блок. Реализация рассмотренного подхода выделения блоков графа представлена в алгоритме 6.17. В векторе Mark[x] меток вершин х е Аграфа фиксируются порядковые номера обхода соответст-
  • 180. 184 Глава 6. Введение в теорию графов. Алгоритмы на графах вующих вершин. В этом случае метка вершины сочленения при входе в блок получит наименьший номер из всех остальных вер- шин блока. Таким образом, для определения точки сочленения выхода из блока достаточно найти вершину этого блока с мини- мальной меткой. Свойство циклической замкнутости блока по- зволяет это сделать лишь на основе вектора меток Mark[x], не привлекая дополнительной информации. На рис. 6.44 схематич- но представлен блок, где вершина w — точка входа в блок и точка сочленения. Вершина х — следующая обследованная вершина блока после w. Свойство циклической замкнутости блока позволяет утверждать, что существует по край- г, Рис. 6.44 ней мере еще одна вершина у, смежная w. Рекур- сивный характер алгоритма поиска в глубину на графе позволяет утверждать, что в этом случае ребро блока (у, w) будет пройдено как обратное, и, значит, метка Mark[w] точки со- членения блока будет доступна до выхода из блока по ребру входа (z, x). Поэтому, сохраняя минимальное значение меток обследо- ванных вершин (включая и по обратным ребрам поиска в глуби- ну), будем проверять при рекурсивном выходе из поиска в глуби- ну совпадает ли это минимальное значение с меткой вершины выхода. Если ответ положительный, то найдена точка сочлене- ния. В алгоритме значения минимальных меток фиксируются в векторе Virtual[x] для каждой вершины х е X, как наименьшее значение из Marky], где у — вершины графа, которые достижимы из jc при проходе графа в глубину. Алгоритм 6.17. Выделение блоков графа count= 0; Stack =0; for v е Xdo Mark[v] = 0; {Начальные метки вершин] for v&Xdo ifMark[v] = 0 then Block(v, 0); Procedure Block(x, w) count= count+ 1; Mark[x] = count; {Вершина исследована} Virtual[x] = count; {Напольная минимальная метка} for v e Adj[x]X do ifMark[v] = 0 then begin Stack = Stack u (x, v);
  • 181. 6.14. Двудольные графы 185 Block(v, x); Virtual[x]=rmn(Virtual[x], Virtual[v); if Virtual[v] > Virtual[x] then begin В этой точке х — либо корень дерева, либо точка сочленения. Образовать новый блок. состоящий из всех ребер стека, включая (х, v). end, end', else if Mark[v < Mark[x] and v*w then begin { (x, v) — обратное ребро} Stack = Stack и (х, v); Virtual[x] =rmn(Virtual[x], Virtual[v]); end; end. 6.14. Двудольные графы • Определение. Граф Г= (X, U, Ф) называется двудольным, если множество его вершин можно разбить на два независимых подмножества Vb V2 таких, что Х= FJ и V2 и Fj г V2 = 0. Такой граф будем обозначать как Г= (V и V2 , U, Ф). На рис. 6.45 изображен типичный двудольный граф. Двудольные графы играют заметную роль в различных приложениях. 6.14.1.Условиясуществованиядвудольных графов • Теорема 6.14.1. Граф Г= (X, U, Ф) являетсядвудольным тогда и только тогда, когда любой его простой цикл четной длины. Доказательство. (=>) Ясно, что данное условие для двудольно- го графа всегда выполняется. (<=) Разобьем граф Гна компоненты связности Гь Г2> ...,Гт . Пусть Fk = (Xk , Uk , Ф) одна из них и а е Xk — произвольная вершина. Разобьем множество вершин Xk на непе- ресекающиеся Vki и Vk2 , где Vkl — вершины, расстояние до кото- рых от а нечетно; Vk2 — вершины, расстояние до которых от а чет- но, а е Vk2 . Множества Vkl и Vk2 являются независимыми. Дейст- вительно, если предположить, что вершины b и с смежные и
  • 182. 186 Глава 6. Введение в теорию графов. Алгоритмы на графах Ь, с е Vkl или Ь, с е Vk2, то существовал бы УП '- цикл нечетной длины, соответственно «а нечетная длина Ь длина единица с нечетная — длина а» или «а четная длина Ь длина единица y2t =r^rrzn с четная длина а», что противоречит усло- вию. Рассмотренное разбиение вершин вы- полним для каждой компоненты /1; Г2,...,Г„, v; связности. На рис. 6.46 показано объедине- ние независимых компонент Vkl и Vk2 в не- Рис. 6.46 зависимые компоненты F, =МКЛ1 и k2 6.14.2. Паросочетания .• Определение. Паросочетанием в двудольном графе Г = ( У 1 < и V2, U, Ф) называется независимое подмножество ре- бер л с U, ребра л не имеют общих вершин. s . _ , Для графа, изображенного на рис. 6.47, в качест- h —- •^£ — -2 ве паросочетания можно взять множество ребер * з n = {(si, I), (s2, 2)}, n = {(s3, 1), (s2, 2)} и т.п. РИС. 6.47 • Определение максимального паросочетания. Па- росочетание называется максимальным, если любое другое паросочетание содержит меньшее число ребер. 6.14.3. Алгоритм определения максимального паросочетания Пусть /= ( F| u V2 , U, Ф) — двудольный граф и п — произволь- ное паросочетание. Множество вершин А^ с J^ и А2 с V2 (рис. 6.48). Чередующейся цепью относительно паросочетания я назы- вается цепь С, в которой ребра пооче- к редно принадлежат С/" и тс и которая на- чинается ребром, не принадлежащим п. Заметим, что ребра в цепи не повторя- ются. Пусть al e А — произвольная вершина и MJ = (a{ , v2n ) — ребро, инци- дентное вершинам из А^ и V2x . Постро- им чередующуюся цепь С= (щп^п^.. и„_1л:„_1«л) и допустим, что по такой цепи можно достичь вершины а2 е А2. рис_ е.48
  • 183. 6.14. Двудольные графы 187 Такую цепь Сможно использовать для получения нового паросо- четания я, которое содержит на одно ребро больше, чем исходное паросочетание я. Действительно, в я можно включить все ребра я, удалив rcj, тс2,..., лл_1 идобавив wb м2,..., ип_ь и„. Полученное таким образом п содержит несмежные ребра, а значит, я — паросочета- ние. Говорят, что я получено из я чередующимся расширением. Пример. Дан двудольный граф Г= (Fj u V2, U, Ф), где Vl = {sb s2,..., s6} и V2 = {1, 2,..., 6}. Соединение вершин V{ и К2 задано соот- ношениями: st -> {4}, s:2 ->• {1, 6}, .УЗ -> {4, 5, 6}, j4 -> {1, 3), ss -> {2}, ,у6 -> {1, 3}. Найти максимальное паросочетание. Выберем начальное паросочетание я таким образом, что вер- шину jj e F! соединяем с вершиной j & V2 первой незанятой ра- нее из списка соединений для jj. На рис. 6.49 изображено исход- ное паросочетание я = {(s{, 4), (s2, I), (s3, 5), (s4, 3), (ss, 2)}, |я| = 5. Вершины s6 и 6 не вошли в паросочетание. По- пытаемся увеличить я, используя алгоритм че- редующихся цепей. Обозначим >переход по ребрам графа из FJ в V2 и > переход по реб- рам паросочетания я из F2 в FJ. Так, s6 Ц1,3} означает, что из s6 можно перейти в вершины 1 и 3, и {1,3} >{s2,s4} означает, что из вершин 1 Рис 6 4д и 3 можно достичь по ребрам паросочетания вершин s2 и J4- По алгоритму исходной верши- ной цепи является s6. Тогда множество всех чередующихся цепей, начало которых в s6, можно представить: s6 »{1,3} >{s2,s^} »{1Д6}. Переходы следует закончить, если вершина 6 достиг- нута или подмножество вершин К2, доступных из s6, повторилось в чередующейся цепи. В последнем случае вершина 6 не доступна из s6 и, значит, исходное паросочетание л максимальное. В нашем случае вершина 6 оказалась доступной. Для выделения исходной чередующейся цепи из всего множества расширяющихся цепей выполним обратный ход: 6 >s2 >1 >s6. Теперь новое па- росочетание строим из старого, исключая из него ребро (s2, 1) и включая ребра (6, s2), (I, s6). Процесс включения также показан на рис. 6.49. Максимальное паросочетание содержит ребра (j1} 4), (s3 , 5), (j4 , 3), (s5 , 2), (s2 , 6), (дб> 1) и |я| = 6.
  • 184. 188 Глава 6. Введение в теорию графов. Алгоритмы на графах • Теорема 6.14.2 о максимальном паросочетании. Пусть Г= ( Fj u V2, U, Ф) — двудольный граф. Тогда количест- во ребер в максимальном паросочетании равно (*)Л Ь=" i где ДЛ = {у е V2 Вх & F, л (х, у) е V) с V2. Доказательство. Пусть л — максима- льное паросочетание в исходном двудо- льном графе (рис. 6.50). Паросочетание я позволяет рассматривать его как ото- бражение я: V2 > Vl вершин множест- ва V2 в вершины множества V{ по ребрам паросочетания я. Аналогично, под Д будем понимать ото- >У2 вершин МНОЖе- Рис. 6.50. максимальное паросочетание л бражение Д: V{ ства FJ в вершины множества V2 по рам Uграфа. Вершины множеств <о и Z (рис. 6.50) несмежные, так как паросочетание я является макси- мальным. Рассмотрим процесс насыщения множества ш. Под со ->дюл бу- дем понимать последовательное выполнение двух отображений 7i(A(ra)) с K! множества со. Далее применим отображения Д и я к полученному множеству: д юл ^•д (д со7Г )к с ^ и т.д. Ясно, что каждая пара отображений приводит к расширению исходного множества д сол сД (д со11 )7t . Учитывая конечные размеры исходного графа, наступит момент, когда отображаемое множество переста- нет расширяться. Таким образом, процесс насыщения отобража- емого множества можно представить следующим образом: Для множества А выполняется условие А = АА, в противном случае множество А можно было бы еще расширить. Следствием расширения множества Дсо в процессе его отображения является включение Дсо с ДА Обозначим множество со u A = В. Покажем, что найденное множество В удовлетворяет условию (*) теоремы, т.е. я(/ т ) = |Fj| — - (!•# | - |Д5 1). Имеем |д£ | = |Д(со и А) = |Дсо и Д<4)| = |ДЛ| , следова- тельно, | Fj| - (|5 1 - |Д5 1) = | KJ - (|со | + И| - М|) = | ?i| - |со | = я(Г).
  • 185. 6.14. Двудольные графы 189 Покажем теперь, что /А с FJ условие (*) теоремы записывается в следующем виде: п(Г) < У{ — (А — |ЛЛ|). Тогда ранее найденное множество В, для которогоданное неравенство обращается в равен- ство, будет доказательством условия (*) теоремы. Пусть AI =А(к>г>А), тогда А = (ю глА) Uv4j. Отметим, что VAlc КД(ю rAi) выполняется неравенство А^ < &Ai, так как вершины множества F!(CQ n FJ) составляют паросочетание. Тогда верно, что А = |со глА + А! < |<о | + А{ < |со | + |A/4j| < |со + |д/4| или А — АА < к>. Теперь количество ребер в максимальном паросочетании можно оценить: и(Г) = |Fj| — |со| < V^ — (А — |ДЛ|). Теорема доказана. 6.14.4. Системы различных представителей Рассмотрим пять множеств: Sl = {2, 3}, S2 = {I, 2, 4}, 53 = {1, 2, 5}, ,У4 = {3, 4, 5}, 1% = {3,4, 5}. Требуется выбрать такие различные чис- ла^, х2, х3, Хц, х5, чтоXj e Sf, i = 1,2,..., 5. Дляданного примерах! = 2, х2 = 1, х3 = 5, jc4 = 3, х5 = 4. Однако если взять множества 7} = {1, 2}, Т2 = {1, 2}, Гз = {1, 2}, Г4 = {3,4, 5}, Т5 = {3, 4, 5}, то такой выбор ока- зывается невозможным. Рассмотримданную задачу в общем случае. Пусть 5= {1, 2,..., и}. M(S) — система подмножеств S{, S2,..., Sn множества S. Будем го- ворить, что M(S) имеет систему различных представителей, если для всех /' = 1, 2,..., п существуют различные xt e St . 6.14.5. Связь системы различных представителей и двудольных графов Определим двудольный граф Г= (F! uF2 , С/, Ф), соответствующий системе подмножеств. Пусть M(S) = {S{ , S2 ,..., Sn } — сис- тема подмножеств S^ S2 ,..., Sn множества S. По- ложим Si, S2 ,..., Sn вершинами V графа, которые соединены ребрами со своими элементами — смежными им вершинами из V2 (рис. 6.51). Рис - 6 - 51 • Лемма 6.14.1. Двудольный граф F=(Vl jV2 , и,Ф), отвечаю- щий системе подмножеств M(S) = (S^, S2 ,..., Sn }, имеет макси- мальное паросочетание из п ребер тогда и только тогда, когда M(S) имеет систему различных представителей. (Доказатель- ство вытекает из определения построения двудольного графа, отвечающего системе различных представителей).
  • 186. 190 Глава 6. Введение в теорию графов. Алгоритмы на графах • Теорема 6.14.3 Ф. Холла о существовании системы различных представителей. Система M(S) = {Sb S2,..., Sn} имеет систему различных представителей тогда и только тогда, когда для лю- бой подсистемы {.У, ,Sj ,...,Sj } с M(S)выполняется неравен- k ство (J Sj >k, т.е. количество элементов в объединении лю- М бых k подмножеств должно быть не менее k. Доказательство. (=>) Необходимое условие теоремы следует из определения системы различных представителей. Каждое под- множество St е. M(S) содержит элемент х, е S{., отличный от К элементов других подмножеств, а значит (<=) Пусть Г= (Fj u^2, U, Ф) —двудольный граф, соответству- ющий системе подмножеств M(S) = {S, S2,..., Sn}. Покажем, что в данном графе существует максимальное паросочетание, количе- ство ребер в котором равно п. Тогда из леммы 6.14.1 будет следо- вать достаточное условие теоремы. Из теоремы 6.14.2 имеем, что число ребер в максимальном паросочетании равно л(/) = |Fj| — -тах(|Л| -|ДЛ|), где М. = {у е V2 Зх е FJ л (х, у) е V} с F2. В рам- ках принятой интерпретации A ={St ,Si2 ,...,St }, A = k и k АЛ = (J Si : .. По условию теоремы ЛА > k. Таким образом, VA с FJ 7=1 А - М ^ 0. а значит, n(r)=|K1 |-max(M-|A4)^|Ki|. Однако < |Fi|, следовательно, п(Г) = V^ = л (достаточное условие до- казано). 6.14.6. Задача о назначениях Существует множество задач, постановки которых укладыва- ются в рамки задачи о назначениях. Рассмотрим две такие поста- новки. Задача. Предположим, что вычислительная сеть объединяет п специализированных ЭВМ. На вход сети поступают задачи. Изве- стно, что наибольшая производительность конкретной ЭВМ сети достигается на определенном классе задач. Это выражается коэф- фициентом ay использования /-и ЭВМ при решенииу-го класса за-
  • 187. 6.14. Двудольные графы 191 дач. Найти оптимальное распределение задач по сети таким обра- зом, чтобы эффективность ее использования была наибольшей. Задача. Группа лиц может выполнить п видов работ. Эффек- тивность использования /-го лица нау'-й работе определяется ме- рой ценности Ду. Найти оптимальную расстановку людей по ви- дам работ. • Теорема 6.14.4 — алгоритм поиска оптимальной перестановки я. Пусть А = [ау, i,j= ,n — матрица целых чисел. Тогда макси- мум X( (6.14.1) * /=i по всем перестановкам я равен минимуму mmHj>,+£v,| (6.14.2) «i+'^ft ,tl ) по всем числам м, и v,- таким, что ut + Vj>av> V/,y=l7ii. (6.14.3) Минимум суммы (6.14.2) достигается на перестановке я такой, что Доказательство. Пусть я — произвольная перестановка. При изменении / от 1 до л величины л, принимают все значения множе- ства {1, 2,..., п}. По условию u, + v, > a,j, Vi,j= 1, п, а значит, и для j = щ верно и, +у„ =а,-п . . Установим связь сумм (6.14.1) и (6.14.2). i=l y=l 1=1 ;=1 »=1 /=1 Таким образом, сумма (6. 14.1) для любой перестановки я не боль- ше суммы (6.14.2). Отсюда следует, что теорема будет верна, если мы найдем такие м, и v, и перестановку я, что (6.14.1) и (6.14.2) совпадают. Шаг 0. Поиск начальных и; и v,, удовлетворяющих ограничени- ям щ r + v,> ay, V/, j = 1, п. Положим v,- = 0 и ui = max a^— максима- льный элемент в /-и строке; условие (6.14.3) м, +Vj =maxOj, >o,y выполняется. Для матрицы ценностей на рис. 6.52 справ4 и снизу указаны начальные значения, соответственно м, и v,-.
  • 188. 192 Глава 6. Введение в теорию графов. Алгоритмы на графах «I «2 «3 «4 V] 3 1 6 6 0 V2 4 4 5 4 0 УЗ 2 3 2 5 0 V4 1 3 5 5 0 4 4 6 6 Рис. 6.52. Начальная матрица ценностей Шаг 1. Фиксируем все v,-, j= l,n и уменьшаем значения м„ / = 1,л до тех пор, пока одно из неравенств и, + v, > а,-, не обратится в равенство », + v,- = и,-,. Эту процедуру выполняем для каждой строки /= 1,л. В рассматриваемом примере на рис. 6.53 звездоч- ками отмечены совпадения. 1/1 «2 «3 1/4 V] * * 0 V2 * * 0 V3 0 V4 0 4 4 6 6 Рис. 6.53. Матрица совпадений Шаг 2. Для каждого м„ /= 1,л определим множества совпаде- ний Если обратиться к примеру^го ^ = {2}, S2 = {2}, ^3 = Ш, ^4 = {!}• Система множеств Sh i= l,n может иметь систему различных представителей: у е Slt j2 e S2 ,...,jn e Sn , где^, /2 ,...,7Я — все раз-"/" * Л личные. Тогда на перестановке я = . ••• выполняется со- 72 ••• JnJ отношение ы, +v_,- =м, +ул =аь . , а значит, найденная переста- новка л является оптимальной. Шаг3. Предположим, что S, S2 ,..., Sn не имеют системыразлич- ных представителей, как в рассматриваемом примере. Тогда нару- шается условие теоремы Ф. Холла, т. е. существуют j u u полагая такие, что S^ uSi2 u...uSik <k. В нашем примере 64! = 2 < 4. Перейдем к новым значениям м; * и vj , и* =н,1 -1, м*2 =м/2 -1,..., M,*t =ii/t -1 и vj =vy +1, если индекс у E.S,-
  • 189. 6.14. Двудольные графы 193 Остальные и, и v, остаются без изменений. Обратимся кнашему при- меру. На рис. 6.54 показаны новые значения переменных и* и v). "1 _"2__^ И3 -J4 V] 3 1 6 6 0 1 V2 4 4 5 4 0 1 V3 2 3 2 5 0 0 V4 1 3 5 5 0 0 4 3 4 3 6 5 6 5 Рис. 6.54. Новые значения и' и и*- «1 «2 «3 «4 VI * * 0 1 V2 * * 0 1 V3 * * 0 0 V4 * * * 0 0 4 3 4 3 6 5 6 5 Рис. 6.55. Матрица совпадений для новых значений и* и v'j При такой saMeHejnepeMeHHbix не нарушается основное усло- вие ut + Vj > Ojj, V/,7 = 1, и. Действительно, возможныдва случая: l.jeS^ u Sj2 v...vSik , тогда и* +v* =(щ -l) + (Vj +1)=ы, +v} >av . 2. j % Sj <uSi2 u...u Sj , а значит, v* =Vj и м, + v,- > e& - или и- + V> a+ 1. Отсюда и* +v* =(м, -l) +v^- >fly +1-1=Яу.Vj> f ui1 ,, =t <k, тогда новая сумма (6.14.2)Обозначим Сумма уменьшилась на k — t. Если теперь перейти к шагу 2, то в случае существования различных представителей для новых значений и* иvj , задача будетрешена, в противном случае шаги 2 и 3 алгоритма продолжаем. Так как каждое повторение шагов ал- горитма приводит к уменьшению суммы (6.14.2) п п ^Uj '+ ^Vj на k — t единиц, следовательно, процесс закончится, что доказывает теорему. 7—2697
  • 190. 194 Глава 6. Введение в теорию графов. Алгоритмы на графах • Замечание. При решении практических задач изменение пере- менных Uj и v,- на 1 может затянуть получение ответа. Заметим, что алгоритм допускает изменение переменных м, и v, на лю- бую величину, не_ нарушая при этом основного условия: В рассматриваемом примере сумма уменьшилась на 2, так как l^i u S2 u S3 u 5*4! = / = 2 и k = 4. Необходимо вернуться на шаг 2. Матрица совпадений примет вид на рис. 6.54, 6.55. Составим для нее систему множеств совпадений S{ = {2}, S2 = {2, 3,4}, S3 = {I, 4}, •5*4 = {1, 3,4}. Проверим наличие системы различных представите- лей для данных множеств. Обращаясь к интерпретации системы различных представителей в терминах двудольного графа, надо проверить, что максимальное паросочетание равно 4 для графа Г= ( У! uF2, U, Ф), где F, = №, S2, S3, SJ, F2 = {1, 2, 3, 4}, и связь вершин S{ -> {2}, S2 -> {2, 3, 4}, S3 -> {1, 4}, S4 -> (1, 3, 4}. Решая, можно установить, что существуют три таких паросочетания: тг, = {(Si, 2), (S2, 3), (5з, 1), (£,, 4)}, я2 = {№, 2), (5-2, 3), (5з, 4), (£,, 1)}, я3 = {№, 2), (S2, 4), (£3, 1), №. 3)}. Таким образом, существуют три оптимальных назначения: '1 2 3 4^1 _(1 234} _(1 2 3 4Л 3 1 4/ ™2-[2 3 4 1/ "3 ~U 4 1 3j" Ценность назначения составляет aJ2 + а23 + «31 + а 44 = 1^- 6.15. Хроматические графы Пусть Г= (X, U, Ф) — простой граф. Граф /называется k-pac- крашиваемым, если существует такое разложение множества его вершин Хна k непересекающихся подмножеств (компонент) Сь С2 ,..., Ck таких, что X=JC,, С, пС7 =0 при/*./ (6.15.1) и вершины в каждой компоненте С, независимы, т.е. ребра в /со- единяют вершины только из разных компонент (рис. 6.56). Пред- ставление (6.15.1) называется k-раскраской графа Г. Вершины этого графа можно раскрасить k красками так, чтобы смежные вершины всегда были окрашены в разные цвета. Для этого доста- точно вершины каждой компоненты С, покрасить своей краской.
  • 191. 6.15. Хроматические графы 195 Наименьшее возможное число £ = х(-0 компонент в разложении (6.15.1) называется хроматическим чис- лом графа Г. Рассмотрим несколько примеров хроматического разложения графов. • Утверждение 15.1. Полный граф Г= (X, U, Ф) на 1^1 = п вершинах имеет хроматическое число хСО = n. Здесь каждая компонента С,, /= ,п Рис 6 56 разложения (6.15.1) состоит из одной вершины, |CJ = 1, /'= 1,л. • Утверждение 15.2. Граф Г= (X, U, Ф) содержит максимальный подграф (клику) из k вершин тогда и только когда, когда его хроматическое число %(Г) равно k. Доказательство. (=^>) Пусть {лс1; х2,..., xk} e А"вершины макси- мального подграфа. Для разложения (6.15.1) максимального под- графа требуется А: компонент Сь С2,..., Ckтаких, что х, е С,. Пока- жем, что этого числа компонент достаточно для разложения (6.15.1) всего графа Г. Пусть_у е X— произвольная вершина и у £ {xi,x2,...,xk. Среди Xj, /= 1,А: существует такая вершинах,- е С,, которая несмежна су, в противном случае существовал бы макси- мальный подграф из k + 1 вершины. Вершину у включаем в ком- поненту Cj. Следовательно, %(Г) = k. (<=) Имеем х(Г) = k. Предположим, что максимальный под- граф в /"содержит т вершин и т Ф k. Необходимое условие теоре- мывэтомслучаеутверждает: хСО = т, чтопротиворечитусловию. • Утверждение 15.3. Граф /= (X, U, Ф) является двудольным тогда и только тогда, когда х(Г) = 2. • Утверждение 15.4. Хроматическое число дерева равно 2, так как дерево является двудольным графом. • Теорема 6.15.1. Для числа р(Г) вершинной независимости и хроматического числа %(Г) графа Г=(Х, U, Ф), Х = п выпол- няется соотношение р(Г)х(Г)>л. (6.15.2) Доказательство. В разложении (6.15.1) все компоненты С,яв- ляются независимыми. Из определения числа р(Г) следует, что
  • 192. 196 Глава 6. Введение в теорию графов. Алгоритмы на графах |С,|< PC/ 1 ). Суммируя по всем компонентам, получим Задача. Для графа Гна рис. 6.57 найти разложение (6.15.1) и установить, что хроматиче- ,_. _ Рис. 6.57 ское число х(Г) = 3. Задача. Пусть / — длина самой длинной простой цепи в графе Г. Показать, что %(Г) < 1+ 1. Решение. Предположим, что -)(_(Г)>1 + 2. Тогда утверждение 15.2 позволяет сделать заключение, что граф Гсодержит максима- льный подграф (клику) из / + 2 вершин или более. Такой подграф содержит простой цикл из / + 2 ребер и простую цепьдлиной / + 1. Это противоречит условию задачи, так как любая простая цепь графа не может превосходить длины /. Отсюда следует, что 6.16. Диаметр, радиус и центры графа I. Пусть Г= (X, U, Ф) — конечный связный псевдограф. Обо- значим через d(x, у) длину минимального маршрута между вер- шинами х, у e X. Величина d(F) = maxd(x,y) называется диамет- ром графа. П. Пусть х е X — произвольная вершина графа. Величина r(x) =maxd(x,y) называется максимальным удалением в графе Г " от вершины х. III. Радиусом графа Г называется величина г(Г) =minr(x). хеХ ТУ. Любая вершина z е X, для которой r(z) = г(Г), называется центром графа. Задача. Для графа Гна рис. 6.58 най- ти диаметр, радиус и все центры. Решение. Диаметр d(f) =max.d(x,y) = = 3. !•(*!>= 3, Г ( Х 2 ) = 2, f ( * 3 ) = 3, г(*4 ) = 2, г(х5 ) = 3, ге(*6 ) = 2. Следовате- льно, радиус графа г(Г) =min/-(x) = 2. " Центры графа: х2 , х4) х6 .
  • 193. Введение в теорию групп. Приложения 7.1. Определение группы • Определение. Группой называется непустое множество G с би- нарной алгебраической операцией • (будем называть умноже- нием) такой, что выполняются следующие аксиомы: 1. Va,b &G3c &Gа-b =с — замкнутость относительно операции •. 2. fa,b,c eC a-(b-c)=(a-b)-c — ассоциативность операции •. 3. 3le<=G/aeG e-a=a-e=a — существование единичного эле- мента е. 4. VfleCrBla" 1 &G а-а~ 1 =а~ 1 -а=е — существование обратного элемента а . • Определение. Группа называется коммутативной, если выпол- няется аксиома коммутативности: 5. Va,b &G a-b =b-а— коммутативность операции •. Примеры групп 1. GI = {п | п е 2} — группа с операцией сложения чисел, где Z — множество целых чисел. Действительно, 0 — единица группы; я" 1 = (-«) — обратный элемент к л е Gv 2. GI = {In | п е Z} — группа с операцией сложения чисел. 3. G3 = {2 я | л е Z}— группа с операцией умножения чисел. 4. <74 — множество квадратных матриц порядка я, определитель которых не равен нулю, является группой с операцией умно- жения матриц. 5. С5 — множество ортогональных матриц порядка п является группой с операцией умножения матриц. 6. G6 = {1, —1} — группа с операцией умножения чисел. 7. G7 — множество рациональных чисел является группой отно- сительно операций сложения и умножения (без нуля). 8. G8 — множество вещественных чисел является группой отно- сительно операций сложения и умножения (без нуля).
  • 194. 198 Глава 7. Введение в теорию групп. Приложения 9. G<) = Sm — множество подстановок (перестановок) является группой с операцией умножения подстановок (симметриче- ская группа Sm , см. п.7.6). • Определение. Hc,G называется подгруппой группы G, если Н— группа относительно бинарной операции, определенной в G, т.е. для элементов //выполняются аксиомы 1—4. Так, на- пример, являются подгруппами: G2 с Glt G5 с G4 , G7 с G8 . • Утверждение 7.1.1. Пусть М — подмножество группы G и Va,b е М выполняется ab~l е М. Показать, что М — подгруп- па. Данное условие можно рассматривать как характеристиче- ское свойство группы. Доказательство. Проверим выполнение аксиом группы. 1. Существование единичного элемента. Пусть а е М, тогда аа~ 1 е М или е е М. 2. Существование обратного элемента. Пусть а е М и так как е е М, то е • а~1 е М или а~ е М. 3. Замкнутость. Пусть a, b е М, тогда и b~l е М. Значит, и а • (b~l )~l е М или ab е М. 7.2. Гомоморфизм групп • Определение. Гомоморфизмом группы Gl в G2 называется ото- бражение /:GI -» G2, сохраняющее операции: /a,b sG{ f(a °b) =/(«) •/(£), где о — операция в группе GI, • — операция в группе G2. Если/— взаимно однозначное отображение, то/ называется изоморфизмом. Свойства гомоморфизма Свойство 1. Единичный элемент переходит в единичный. Пусть е е С^ — единица G{, тогда/^) = е2 е G2 — единица G2. Действи- тельно, VoeG./a) =.AaM<?i) =MM<0, так какДа) = и АО) =Мо) =М)Ля). В группе Эе2 е (?2 Да) = Значит, А£[) = ^2- Свойство 2. Обратный элемент переходит в обратный. Пусть а е GI, тогда Да"1 ) = (Да))"1 . Действительно,Да)Да""1 ) =Дй"1 )Да) = = <?2, так как Д^Ло"1 ) =Доо"1 ) =Де,) = Да^а) =Да~1 )Ло), где М) = е2. В группе 3!(Да)ГГ б С2 Дя)^^)-1 = <№)'№) = е2. Сле- довательно, Да ') = (Да)) ! .
  • 195. 7.3. Смежные классы _ 199 • Определение. Образомгомоморфизма/называетсяподмножество Im/= {а2 e G2 За, е Gt а2 =/(а,)} с G2 . • Определение. Ядром гомоморфизма/называется подмножество Кег/= {GI е G! |/(0l ) = е2 6 G2 } с С?!. • Утверждение 7.2.1. Im/c G2 — подгруппа. Доказательство. Проверим все свойства (аксиомы) группы. 1. Замкнутость. Va2 ,b2 е Im/ 3flj,ii е Gj /(а^ = а2 A/(&J) = £2. Тогда а2 Ь2 =/(fli)/(*i) =/(«^1) е Im/ 2. Существование единичного элемента. Так как е2 =f(e{) е Im/ 3. Существование обратного элемента. V«2 е Im/ 3aj e Gj /(fll ) = «2 . Тогда и «21 =(/(«! ))-! ^/(flf1 ) elm/. • Утверждение 7.2.2. Кег/с Gt — подгруппа. Доказательство. Проверим все свойства (аксиомы) группы. 1. Замкнутость. Vflj,^ е Кег/ /(a^j) =f(a^)f(b^ = e2 e2 = е2 . Сле- довательно, fljij е Кег/ 2. Существование единичного элемента. Так как/Xej) = е2 , значит, el е Кег/ 3. Существование обратного элемента. Vfll£ Кег/ /(or1 ) =(/(ai))"1 ^e^1 =е2 7.3. Смежные классы • Определение. Пусть Н= {е, h, H2,..., /Jm_i} — подгруппа группы G. Множество gH= {ge, ghb gh2,..., gAm_i}, полученное умноже- нием элементов Н слева на элемент g e G, называется левым смежным классом группы G по подгруппе Н. • Лемма 7.3.1. Пусть Я — подгруппа группы G, тогда V/z е Н hH=H. Доказательство. Пусть Н- {е, Нъ Н2,..., hm_l]. Vhk е Н hhk е Н - замкнутость подгруппы, значит ЛЯ с Я. С другой стороны, УЛА е Н hk = ehk = (hh~l )hk = h(h~l hk) е ЛЯ, откуда Яс ЛЯ. Таким образом, УЛ е Я ЛЯ= Я. • Лемма 7.3.2. Пусть Я — подгруппа группы G. Если 0, то£i#=ft-ff,гдеgb g2 e G.
  • 196. 200 _ Глава 7. Введение в теорию групп. Приложения Доказательство. Пусть Ге gl Hr>g2 H, тогда ЭА1; И2 е Я такие, что t = gj/j) = g2 fi2. Рассмотрим левый смежный класс Ш= (gihl )H= = №)#= g^H) = й(А2 Я), откудаД Я=& Я. • Лемма 7.3.3. Пусть Я — подгруппа группы G, тогда V# e G Доказательство. Для доказательства достаточно показать, что все элементы в gff различные. Пусть 3Ai * А2 е Я такие, что ghi = gh2 . Тогда g l (gh{ ) =g I (gh2 ) или (g"V)^i = (gl g)h2 , откуда A! = A2 > что противоречит предположению. • Лемма 7.3.4. Группа G распадается на непересекающиеся ле- вые смежные классы по подгруппе Я, т.е. G = gHv g2 Hu... и &Я, где все&, #2 ,..., gs — различные; #,Яn gfl= 0, если ft # ft. Доказательство. Пусть <?={£* ,#Л ,.••>#£ }• Ясно, что G=gk H<ugk H^j...(jgk H. Воспользов'авшись лелшом 7. 3.,2и уда- лив совпадающие левые смежные классы из последнего разложе- ния, получим искомое разложение группы • Теорема 7.3.1 Лагранжа. Порядок конечной группы G кратен порядкулюбой из ее подгрупп Яи G = |Я| • G : Я|, где G : Н — целое число, называется индексом подгруппы Яв группе G. Доказательство. Лемма 7.3.4 позволяет записать разложение группы G = g1Hvg2Hv...ugsH, где gfHrg:H=0 при ft*ft. Из леммы /.З.Зимеем Vft gjH = Н, тогда G = glHvg2H<u...vgsH = = SH + g2H + ... + |&Я| = s • Н. Следовательно, G = |Я| • G : H, Определение. Пусть G — группа. Порядком элемента g e G (g -Ф e) называется наименьшее целое k такое, что gk = e. Утверждение 7.3. L Пусть G — группа и g e G — произвольный элемент порядка k. Тогда множество Я= {g, #,..., g = e} назы- вается циклической подгруппой, a g есть образующий ее эле- мент. Утверждение 7.3.2. Порядок группы | G кратен порядку любо- го элемента^ e G. (Следствие теоремы 7. 3.1Лагранжа и утвер- ждения 7.3.1). Утверждение 7.3.3. Всякая циклическая группа коммутативна (абелева). Теорема 7.3.2. Всякая подгруппа циклической группы сама яв- ляется циклической.
  • 197. 7.3. Смежные классы 201 Доказательство. Пусть G — циклическая группа с образую- щим элементом £ е G и Яс G — подгруппа. Предположим, что наименьшая положительная степень элемента g, содержащаяся в Н, есть g k . Покажем, что элемент g k — образующий элемент под- группы Н. Допустим, что в Ясодержится элемент^ 7 , где /* О и /не делится на k. Пусть d = (I, k)— наибольший общийделитель, тогда существуюттакие целые числа и и v, что k • и + I • v = d(см. п. 8.1). Следовательно, подгруппа Яв этом случае должна содержать эле- мент g d = (g*)"(gV = & h '. Так как d < k, то приходим к противоре- чию относительно выбора элемента g k . Таким образом, g k — обра- зующий элемент подгруппы Яс (Я • Утверждение 7.3.4. Число образующих циклической группы G={g,g 2 ,...,g" = e} равно значению функции Эйлера ф(«) — ко- личество чисел из множества {1,2.,..., п—1} взаимно простых с п. Доказательство. Пусть г е {1,2,..., п—1} и (г, п) = 1 — НОД (см. п.8.1), т.е. run — взаимно простые. Если предположить, что на- ступит (g r ) k = f k - едля некоторого k<n,ior-k = n- /для некото- рого t, таккакп — порядокэлементаg. Из г • k= п • tследует, чтоп делит k, так как (г, и) = 1. Это противоречит предположению k < п. Следовательно, порядок элемента £ = п. Пусть теперь (г, п) = s и s > 1, т.е. /•= s • р и п = s • q, где (р, q) = 1. Тогда (/)" = (/У = Я* 4 = tf 9 ? = G?Y = # = е, а значит порядок элемента | /1 = q < п. Действительно, порядок | /1 не ме- ньше q, в противном случае имеем (jf) 9 = (/)* = е, где k < q, и r-k = n-t, так как п — порядок элемента#. Как и в первом случае, из/••&=«• f, s-p-k = s-q-t,p-k=q-t следует, что q делит k, т.к. (р, q) - 1. Это противоречит предположению k < q. • Определение. Подгруппа Я группы G называется нормальным делителем, если правые смежные классы совпадают с левыми: Vg е G gH= Hg. • Утверждение 7.3.5. Множество смежных классов группы G по нормальному делителю Яявляется группой с операцией умно- жения смежных классов. Такая группа называется фактор- группой и обозначается G/H. Элементами этой группы являют- ся смежные классы разложения группы G = gl H<ug2 Hи... u gs ffna непересекающиеся левые смежные классы, т.е. G/H= = {g{ H, g2 H,..., gs H}.
  • 198. 202 _ Глава 7. Введение в теорию групп. Приложения Доказательство. Проверим выполнение аксиом группы. 1. Замкнутость. У^Д&Яе G/H Sl H- g2 H=gl (Hg2 )H=gi(g2 H)H= = £1й(ЯЯ) = (gig-^ff 6 G/H. Произведение двух классов — это умножение каждого с каждым элементов указанных классов. 2. Существование единичного элемента. Так как (eH)(gH) = = (gH)(eH) = (eg)H=gH, то еН= Н— единица факторгруппы G/H. 3. Существование обратного элемента. Так как (gH)(g~l H) = = (g"l H)(gH) = (&ОЯ= Н, то g~l H е G/Я— обратный элемент к элементу gH е G/H. • Теорема 7.3.3. Для любого нормального делителя Н группы G отображение /:<?-» G/H, где VgzG /(g) = gH, является гомоморфизмом, ядро которого Н, G/H— фактор- группа. Доказательство. Проверим свойство гомоморфизма сохране- ния операций: /(^ -g2 )=(gi -giW =(gl H)°(g-i H)=f(gl )° f(g2 ). Единицей факторгруппы G/Hявляется Н, тогда Кег/= {£е(?|/(£) = Я}. Имеем VA s Я/(Л) = АЯ= Я, откуда Яс Кег/ С другой стороны, Vg g Я /(g) = #Я* Я. В противном случае, если gH= H, то суще- ствует такое Л е Я, что gh = e или g=h~ e Я, что противоречит предположению g g Я. Таким образом, только Яс Кег/ а зна- чит, Кег/= Я. • Теорема 7.3.4. Ядро произвольного гомоморфизма есть норма- льный делитель. Доказательство. Пусть/: G -> AT, где G, AT— группы,/— гомо- морфизм. Кег/= {Л e G|/(/J) = е еф. Обозначим Я= Кег/— подгруппа. Покажем, что V£ e G gH= Eg, т.е. Я— нормальныйде- литель. Рассмотрим множество S= {g e G f(g) = k eЩ, где k — фиксиро- ванный элемент. Покажем, что S-gH, где geS — произвольный фиксированный элемент. Пусть gr еб1 , тогда f (gg~l ) = =f(Sii ) f ( g ~ = kk~ = e и /СГд) =/Gf Ы = = e. Отсюда еЯ ng ^еЯ или g^Hg и ^е^Я Таким образом, S^gHn egeS.C другой стороны, УЛ &Нf(gh) =f(g)f(ti) =f(g)e = fc. Отсюда gh <=Sили ^Яс S. Так же проверяется, что и Hg^S. Получили, что gH= S= Hg, т.е. Я— нормальный делитель.
  • 199. 7.4. Строение коммутативных (абелевых) групп __ 203 7.4. Строение коммутативных (абелевых) групп • Определение. Группа С 1 является прямым произведением своих подгрупп Gi и G2, т.е. G = G{ x G2, если выполнены следующие условия: 1. Пересечение подгрупп Gj n G2 = e. 2. Любой элемент g е G однозначно представим в виде произ- ведения элементов g = gig2... gk, где g, &С^ G2. 3. Если^ eGj Hgr2 &G2, то g^g^ =g^g^. Коммутативность указанных элементов позволяет записать представление в Bnaeg=gg , rae eG и gi2 е(72. Лемма 7.4.1 утверждает, что это представление од- нозначное. • Лемма 7.4.1. Пусть G — группа и Glt G2 — ее подгруппы, для которых пересечение Gi n G2 = е. Тогда, если g^g2 =g'lg'2, то gl =g Hg2 =g;>> где ^,^1 eGj и^2,^2 еС?2. Доказательство. Действительно, если g^g2 =g[g'2> то^" 1 ^^ = =£21 S> 2 =e < T -K - GlrG2 = e. Следовательно, gl =g и g2 =g'2 . • Теорема 7.4.1. Группа Gявляется прямым произведением сво- их подгрупп GI и G2 тогда и только тогда, когда выполняются условия: 1. Пересечение подгрупп GI г G2 = е. 2. Любой элементу е G однозначно представим в виде произ- ведения элементов g = gift— &. где g, e Gl u G2 . 3. Подгруппы G! и G2 являются нормальными делителями. Доказательство. (=>) Очевидно, что если группа G является прямым произведением своих подгрупп GI и G2 , то условия 1—3 выполняются. (<=) Достаточно показать, что если gj e G 1 ! и g2 e G2 , то gjg2 = = g2g!. Имеем g!g2 e g^G2 и g!G2 = G^, тогда gt g2 e G^, откуда gig2 =8281- Также gjg2 e G{ g2 и Gl g2 = g2 Gl , тогда gjg2 e g2 G ! 1 и, значит, gjg2 =g2gj. Итак, g{g2 =g'2gi =g2g[, а так как GI n G2 = e, то из леммы 7.4.1 следует, что g2 =g2 и gj =gl . Следовательно, SS2 = 8281-
  • 200. 204 _ Глава 7. Введение в теорию групп. Приложения • Утверждение 7.4. 1. Пусть G — конечная абелева группа поряд- ка С = р" 1 р% 2 •••P^ k > f R s Pi,P2>--->Pk ~~ простые различные чис- ла. Множество А(р) = {х е G |х| =ра }, где а принимает произ- вольные целые значения, является подгруппой и называется примарной подгруппой группы G, соответствующей простому числу р. • Теорема 7.4.2. Всякая конечная абелева группа G разлагается в прямое произведение своих примарных подгрупп A(p^, А(рг ),..., A(pk ), где G = р^р^ ...pa k k . Доказательство — индукция по числу простых в разложении порядка G = р*1 р2 2 •••/>£* • Очевидно, что для G =ра справедли- во, т.к. в этом случаеА(р) = G. Пусть теперь G=pa g^, где (p,q) = 1. Покажем, что G представимо в виде G = А(р) х A(q). Проверим свойства разложения. 1. А(р) rA(q) = е. Если предположить, что Зх е А(р) х A(q) и х * е, то | jc | =ра и | х = (р, тогда и ра = <р, что противоречит усло- вию (р, q) = 1. 2. Покажем, что любой элемент х е G можно представить в виде х = у • z, где у е А(р), z е A(q). Поскольку порядок | х делит | С^тоИ^'^.гдеА., <аД2 <р.Таккак(рХ 1 ,#Х 2 )=1— взаимно простые, то существует представление р*"1 -m+q^1 -n =1 (см. п.8.1 алгоритм Евклида), где т, п — целые. Тогда хр ' 'т+9 2 " =х х = у • z, где^ =xq 2 '" и z =хр ' 'т , для которых ур ' =[ хр lq г ] =е и z? "2 =1 хр 'g 2 J = е . Проверить, если у^ = е, то порядок | у де- лит N. Отсюда у е А(р) и г е A(q). Пусть разложение верно для l<k, т.е. для |Сг|= р^р^1 •••?"'• РассмотримгруппупорядкаG =р"'р%2 ...р^k ,тогдавозможнопря- мое разложение G=-A(pl, p2,..., Pk-i)*A(pk), теА(рь р2,..., р^) = = {х е G | х=р^ру 2 2 ---Р^ }, у, ^ «,, — это доказывается как и для случая |(7| =pa q^. Имеем: группа A(pk ) — примарная, группа А(р{ , Ръ~~> Pk-i) по предположению индукции разлагается в прямое про- изведение своих примарных подгрупп; теорема доказана.
  • 201. 7.4. Строение коммутативных (абелевых) групп 205 • Утверждение 7.4.2. Порядок конечной примарной группы (подгруппы) А(р) = {х х = р а } равен | А(р) =р", где п — неко- торое положительное целое; а принимает произвольные це- лые значения. Доказательство. Рассмотрим следующее разложение примар- ной группы. Пусть А1 ={а,а 2 ,...,а р =е}сА(р) — циклическая подгруппа максимального порядка A{=p ai . По теореме Лагран- жа (см. теорему 7.3.1) А(р) = А{ • А(р)/А^, где А(р)/Аг = {х^А, х2А,..., xkA} — факторгруппа по подгруппе А±. Ясно, что /XjA е A(p)/Ai (XjA) p * =е и, значит, В(р) = А(р)/А{ — примарная группа, которая вновь допускает разложение на смежные классы по циклической подгруппе А2 с В(р) максимального порядка, т.е. А(р) = А) • А2 • В(р)/А2, тлеА2=р а2 . Исходная примарная груп- па А(р) конечного порядка и, следовательно, за конечное число т шагов получим разложение А(р) = А • А2 •...• Ат, или | А(р) = • Лемма 7.4.2. Пусть А(р) — примарная группа (подгруппа), А с А(р) — циклическая подгруппа максимального порядка | А -р" с образующим элементом а, А(р)/А — факторгруппа, у е А(р)/А — класс смежности порядка | у =р а , т.е. у р " = ё =А, тогда существует элемент у е у того же порядка | у =р а . Доказательство. Так как у р " =А, то для любого у е у выполня- ется у р " е А, где А — единица факторгруппы А(р)/А. Следователь- но, у рЛ =а с -a Cl ' p , где (сь р) = 1 и р < п. Положим г =я с ' —обра- зующий элемент группы А, тогда у р " = z p и I У Р ] =( z p ) = z p " =e или у р ^ =е. Так как z — образующий элемент А, то ^а+л-р _ дордцок j Вследствие максимального порядка подгруп- пы | А =р", порядок | у <р". Отсюда р а+ "' ? <р" или а < р. Теперь И fl / 6-IX Ра равенство у р " = z p можно записать в виде у р -z p =Z P j ,a таккак^^^^ " еД то^ р " =г[°или (уг~ 1 ) р * =е. Таким образом, элемент у± =yz~l е у, порядок которого | yl =ра .
  • 202. 206 _ Глава 7. Введение в теорию групп. Приложения • Теорема 7.4.3. Всякая конечная примарная группа (подгруппа) разложима в прямое произведение своих циклических под- групп. ЕсянА(р) = {х е G х =/} яА(р) =/, тоДр) =С(/' )х )х. . .хС(рХт ), где С(рк ' ) — циклическая подгруппа поряд- ка < ) =Р , Xj < Х2 < ... < Хм и ^ + Хз + ... +*„=*. Доказательство — индукция по числу л. Для п = 1 теорема вер- на, т.к. (показать) группаЛ(р) порядка А =р, тер — простое, яв- ляется циклической и не содержит подгрупп. Предположим, что те- орема верна для всех групп меньшего порядка /Л Пусть ^4 с Л(р) — циклическая подгруппа максимального порядка А =ра . Рассмот- рим факторгруппу А(р)/А = (х^А, х^А,..., х/А}. Данная группа являет- ся примарной порядка | А(р)/А <р", т.к. | А(р) = А - А(р)/А . Предположение индукции позволяет записать для нее разложение A(p)/A = C(pai )xC(pa *)x...xC(pa "). Обозначим через г, zC(p"' : ) образующие циклических подгрупп. Лемма 7.4.2 утверждает, что существует у, е ^,- и | yt = £,• | и можно положить г, = уА. Из пря- мого разложения факторгруппы следует, что любой класс смеж- ности х е А(р)/А можно представить в виде х = z'l l zt 2 1 ---^ , или х =y'iy'£ ...у'^А, где 0 </,<а,. ТаккакА(р) =х{ А ^jx-^A u...ux^, то произвольный элемент х е А(р) представим как х =у[1 У22 •••У'^а ' • Таким образом, искомое прямое разложение на циклические подгруппы найдено. Покажем, что представление А(р) = С(р^1 )хС(рХ2 )х...хС(рХт ) единственно. Доказательство единственности — индукция по числу п. Для п = 1 имеем А(р) = С(р) — свойство выполняется. Пусть оно верно для всех k < п. Покажем, что верно и для групп порядка р". Предположим существование другого разложения группы А(р) =С(/' )х С(/2 )х...х C(pftl ), где р! < р2 < ... < р, . Ясно, ЧТО ПОрЯДОК A(p) = p Ki -р Кг :..-р Кт =/J Pl -p^ 2 -...-J p P ' =p n . Запишем разложение группы в уточненном виде )хС(р)хС(р)х...хС(р) и т-?] 2 )хС(р)хСр>)х.-хСО>).
  • 203. 7.5. Строение некоммутативных групп 207 Рассмотрим группу (подгруппу) [А(р)]р = {х? х е А(р)}. Для этой группы справедливы разложения: ~ l ) и (*) - 1 ), (**) x2 * ,...,x"a =e}. Порядок | [A(p)]p | < | A(p) | и, следовательно, по предположе- нию индукции разложения (*) и (**) совпадают, т.е. 11 = рь /2 = Р2,."Л, =Р(2, h = t2, а значит, nm-tl = l-t2 или т = /. Единст- венность разложения доказана. Пример. Пусть G — коммутативная группа порядка | G = 42. Так как 42 = 2 • 3 • 7, то группа разложима в произведение следу- ющих своих циклических подгрупп G= С(2) х С(3) х С(7). Пример. Пусть G— коммутативная группа порядка | G = 4. Так как 4 = 22 , то группа разложима в произведение следующих своих циклических подгрупп G = С(4) или G = С(2) х С(2) и в явном виде G = {х, х2 , х3 , х4 = е} — циклическая или G = {х, у, ху, в] = = {х,х 2 = е}х {у, у 2 = е}. 7.5. Строение некоммутативных групп • Определение. Пусть G — конечная группа. Подгруппа HcG называется ^-подгруппой, если порядок ее Н =р а . • Определение. /7-подгруппа называется силовской, если порядок ее р а имеет максимальную степень в разложении порядка групп G. • Теоремы 7,5.1 (Силова). Пусть G — конечная группа порядка G = P^Pi г •••p a k k , тер, — простые числа. 1. Для каждого pf существует силовская подгруппа группы G. 2. Всякая /ьподгруппа группы G содержится в некоторой си- ловской подгруппе. 3. Все силовские подгруппы сопряжены, т.е. если Н, Р—сп- ловские подгруппы, то существует такое t е G, что Н= tPt 1 . 4. Количество силовских/ьподгрупправнор • k+l, где А;—не- которое целое. Пример. Пусть G — группа порядка G = 28 = 2 2 • 7 1 , тогда су- ществуют силовские подгруппы Щ, Н^ = 4 и Н2, Н г = 1.
  • 204. имеем 208 Глава 7. Введение в теорию групп. Приложения 7.6. Симметрическая группа подстановок Пусть S — конечное множество из т элементов. Множество всех взаимно однозначных отображений множества S на себя на- зывается симметрической группой Sm степени т. Без ограничения общности можно считать, что множество S состоит из элементов {1, 2,..., /т?}. Каждое такое отображение л : 5 1 -» S называется под- f 1 1 Л становкой или перестановкой и записывается л = "' т где V я ! Л 2 •-•я т/ я, = я(/) — образ элемента / = 1,/я. Произведением подстановок яв- ляется композиция отображений (операция группы) (лст)(/) = ст(я(/)). Например, для подстановок л = ~ ; : 1 : ] и а = , 5 ' 7 : э -> *• *J ^ l э яа =( J ? ~ ] истл=( ~ ~ ?). Данный пример показывает, что сим- ч- 5 А ^/ v^ J v метрическая группа Sm не является абелевой (некоммутативная) при т > 3. Порядокданной группы Щ = т — количество всех пе- рестановок из т элементов. Единичная (тождественная) подста- ( 9 т новка обозначается е = | f " ' > которая удовлетворяет Уя е ^т ^ 1 9 ^яе = ея = я. Обратной к я= i ... т ЯВЛяется подстановка Hi "2 ••• KmJ I Я| Лт ... Я„. | -1 -1 л = / • "' I для которой верно, что ля = я я = е. U 2 ••• w / • Утверждение 7.6.1. Симметрическая группа ^ степени 2 — абелева. • Определение. Подстановка я, перемещающая элементы гь /2 ,---, /^так, что л(/!) = /2 , л(/2 ) = /з,...,я(/л ) = /i и оставляющая на месте остальные элементы, называется циклом длины А: и обознача- ется (/ь /2,..., /J. • Равносильное определение. Подстановка называется цикличе- ской, если каждый из ее действительно перемещаемых элемен- тов г'ь /2,..., 4 можно перевести в любой другой (из действительно перемещаемых элементов), если подстановку применить доста- точное число раз. Например, л(/1 ) = /2 , л 2 ^) = я(л(/!)) = я(/2 ) = /3 , rc^Oi) = '*>—, я *('1) = 'i- Теперь цикл можно записать: (/ь /2 ,...,
  • 205. 7.6. Симметрическая группа подстановок 209 Пример. I ~ j 4 5 6 7 3 )= ^' ^' ^4> ^' ^' ^ ~~цикл A™1 ™ семь. • Определение. Два цикла называются независимыми, если они не содержат общих действительно перемещаемых элементов. Например, (1, 2, 3, 5, 9) и (7, 8) — независимые циклы. • Теорема 7.6.1. Каждую нетождественную подстановку Sm мож- но разложить единственным образом в произведение незави- симых циклов. Доказательство. Пусть я е Sm и i,j e S. Элементы /иу назовем эквивалентными i~j, еслиу' = л*(/) для некоторого целого числа k. Введенное отношение есть отношение эквивалентности на мно- жестве S. Оно разбивает множество ^на непересекающиеся клас- сы эквивалентности по этому отношению S= Sl ^j S2 u...u Sr . Каждый элемент / e 51 принадлежит одному и только одному клас- су S,, причем множество S, состоит из образов элемента / при дей- ствии степеней подстановки л: S, = {/,л(/),л2 (/),....я*'"1 (/')}, где k,— количество элементов в St . Множества .У,еще называют л-орбита- ми. Выберем в каждом классе S, по одному представителю /, и по- ставим ему в соответствие цикл я, ={/,,тг(/,),тг2 (/,),...,nk '~l (i,)}. Так как любой элемент, не принадлежащий S,, остается на месте при действии степеней к,, то перестановка л есть произведение независимыхцикловл=л^.-.л,.. • Замечание 1. Если цикл л, = (/',) имеет длину 1, то он действует как тождественная подстановка. Такие циклы в записи л = Л1Л2...лл можно опускать. • Замечание 2. Независимые циклы в записи л = л1л2...ллможно произвольным образом переставлять между собой. Так, л =лА .1 Л^...л^,где{лА 1 ЛА 2 ...лА г }={л1 ,л2 ) ...,лг }. Пример.^ 2 3 4 5 £)= (1345)(2)(6)41345), 3 2 1 5 4 Определение. Декрементом (d) подстановки называется раз- ность между числом действительно перемещаемых элементов и числом независимых циклов, на которые она раскладывает- ся. Подстановка называется четной, если d — четное число и подстановка нечетная, если d — нечетное. Введем функцию
  • 206. 210 Глава 7. Введение в теорию групп. Приложения +1, если я - четная подстановка, sgn(rc) =< [-1, если л -нечетная подстановка, где я е Sm, тогда sgn(rc) = (~l) d . Например, для подстановкиI i ? т 5 4 6 ] = (132)(45)декремент равен d= 5 - 2 = 3, следовательно, подстановка нечетная. • Определение. Цикл длины 2 называется транспозицией т = (ар). Для транспозиции декремент d = 2- 1 = 1 — нечетное число. • Теорема 7. 6.2. При умножении подстановки л е 5^ на транспо- зицию т = (ар) она меняет свою четность. Доказательство. Пусть л = (/1/2.../г)(Д/2-"Л)---(^2---'Р — разло- жение подстановки в произведение независимых циклов. Умно- жим ее на транспозицию т = (ар). Рассмотрим все возможные случаи: 1. a ё л, р ё л. 2. а е л, Р g тг. 3. а g л, р е л. 4. а е л, р е л, а и р принадлежат одному и тому же циклу. 5. а Е л, р е л, а и р принадлежат разным циклам. Пусть k — число действительно перемещаемых элементов л; / — число независимых циклов в разложении л. Декремент подста- новки d(n) = k- I. 1. Пусть а 0 л, р $. тг, тогда лт = (/^../^(/^...^...(^^.../^(ар). Дек- ремент </(пт) = (£ + 2) - (/+ 1) = £- /+ 1. 2. Пусть а е л, р g я. Будем считать, что iv = а. В этом случае лт= (а/2 .../г )(/у2 ...л)...(/1 /2 ...д(ар) = (а/2 .../^)(/У2 -Л)-(^2-У- Декремент </(ят) = (&+!) - / = & - / + ! . 3. Случай a g л, р е л рассматривается подобно а е я, р г л. 4. Пусть а е л , Р е л , а и р принадлежат одному и тому же циклу. Тогда лт = (а/2 .../от р/ш+2 .../г )(/'1 /2 ..: /;)...(/1 /2 ...// ,)(ар) = Декремент й?(лт) =k-(l +!) = &-/-!. 5. Пусть а е я , р е я , а и р принадлежат разным циклам. Тогда лт = (a/2 .../r )(py2 ...^)...(/1 /2 .../; ,)(ap) = (а/г.../^...;;)...^.../,). Декремент й?(лт) = &-(/- !) = &-/+!.
  • 207. 7.6. Симметрическая группа подстановок 211 Таким образом, во всех случаях з§п(ят) = (-1)*~ /±! = = (-1) ±L (-!)*"'=-sgn(u) четность подстановки лт меняется. • Теорема 7.6.3. Каждая подстановка я е Sm разлагается в произ- ведение транспозиций не единственным образом, однако чет- ность числа транспозиций постоянна и совпадает с четностью самой подстановки. Доказательство. п = (/i/2—V)(/i/2—Л)—(/i(2—^) ~ разложение под- становкив произведение независимыхциклов. Каждыйцикл разла- гается в произведение транспозиций (/Y/2-••'/•) = ('i^X'i's)—('ifs)- Та- ким способом можно разложить в произведение транспозиций все циклы подстановки я = т1 т2 ...т„, где т., — транспозиции. Теорема 7.6.2 позволяет записать sgn(Ti) = 8§п(т1 т2 ...тл ) = =sgn(t1 T2 ...Vl )-(-l)=sgn(T1 T2 ...Tn _2 )-(-l)(-l)^ Таким образом, четность подстановки sgn(n) - (-1)" совпадает с четностью числа транспозиций п в разложении л = т^...-c,,. • Следствие 1. sgn(crr) = sgn(cr)-sgn(T), ст, т — произвольные под- становки. Доказательство. Пусть u = sl s2 ...sr и т = Цг ..Л} — разложения в произведение транспозицийsf , tj. Тогда от =j^-.Vilz—'/~~ Р аз ~ ложение в произведение транспозиций. Из теоремы sgn(crr) = = (-1/ +/ = (-1) Г Н)'= sgn(a)-sgn(T). • Следствие 2. sgn(a~ l ) = sgn(<r), ст" 1 — обратная подстановка. Доказательство. Пусть a= sl s2 ...sn тогда и" 1 = sr ..s2 Si, так как стст" 1 = ^...^Х^..^^) = (Si(s2 (...(sr sr )...)s2 )si ) = en(SiS,) = е —тож- дественная подстановка, где st — транспозиции. Первое следст- вие позволяет записать sgn(acf') = sgn(cj)-sgn(cr" 1 ). С другой сто- роны, ста' 1 = е — тождественная подстановка и sgn(e) = 1. Тогда sgn(a)-sgn(cj~ 1 ) = 1 и, следовательно, sgn(cf L ) = sgn(a). • Теорема 7.6.4. Число четных подстановок Ат с Sm равно числу нечетных. Доказательство. Достаточно показать, что Ат = т/2, так как Sm = ml. Для этого установим взаимно однозначное соответствие между четными и нечетными подстановками. Пусть т — произвольная фиксированная транспозиция. Рас- смотрим отображение ср : Sm -» Sm , где Уп&5т ф(я) =ят. Пусть а е Ат — произвольная четная подстановка, тогда cp(a) = at — не- четная подстановка.
  • 208. 212 _ Глава 7. Введение в теорию групп. Приложения Свойство 1. Для ф верно, что V^ * а2 & Ат cp(aj) Ф у(а2 ), в про- тивном случае ар = а2 -с. Отсюда, умножая справа последнее ра- венство на т, получим а^тт) = а2 (тт), а так как тт = е, то а± = а2 , что противоречит выбору а{ Ф аг . Свойство 2. Для любой нечетной подстановки b существует прообраз £т е Ат четной подстановки, так как ф(йт) = (6т)т = = *>(тт) = и. Свойства 1, 2 позволяют утверждать, что отображение ф явля- ется взаимно однозначным. • Утверждение 7,6,2, Ат — подгруппа симметрической группы Sm . • Теорема 7.6,5 Кэли. Всякая конечная группа G порядка т изо- морфна некоторой подгруппе симметрической группы Sm . Доказательство. Для любого элемента а е G рассмотрим ото- бражение La : G -> G, состоящее в умножении всех элементов G={gi, &>>•••= gm } сл ева на а: £0(&) = agf. Свойство группы aG= G позволяет утверждать, что La — взаимно однозначное отображе- ние (подстановка). Обратным к La будет отображение Z," 1 -L „, , единичным отображением является Le . Вследствие ассоциатив- ности умножения в группе G имеем замкнутость: (La Lb )(g) = = Lb (La (g)} = b(ag) = (ab)g = Lab (g), т.е. La Lb = Lab . Отсюда следует, что множество Н ={Lgi ,Lg2 ,...,Lgm }образует подгруппув множе- стве всех взаимно однозначных отображений GB себя, т.е. в сим- метрической группе ,5^. Тогда отображение ф : G -> Не Sm такое, что Va e Gy(a) = La есть изоморфизм, поскольку ф — взаимно од- нозначное и выполняется свойство ф(а£) = Lab = LaLb = ф(а)ф(й) сохранения операций. 7.7. Действие групп на множестве • Определение. Говорят, что задано действие группы Она множе- стве S= (1, 2,..., т}, если определен гомоморфизм Ггруппы G в симметрическую группу Sm подстановок: Т : G -» Sm . Свойст- во сохранения операций для гомоморфизма: V^, g2 е G u e 1 2 ... m" ( о Л Далее полагаем, что g, = '" m Ч а 1 a 2 ••• a m )
  • 209. 7.7. Действие групп на множестве 213 • Замечание. Чаще всего бывает так, что действие Сна *Увозни- кает естественным образом, как группа симметрии структуры, определенной на S. Пример. Пусть S = {1, 2, 3, 4, 5} — вершины графа на рис. 7.1. Найти G — группу самосовмещений дан- ного графа. Решение. Исходное множество элементов ^являет- ся связанным или структурой. Группа G, действую- щая на S, — группа самосовмещений: G = {e, a, b, ab), где е 11 9 4 S — тождественное преобразование; а ={ ? 11 = ( 45 > - поворот Таблица 7.1 Д 2 3 5 4 ab вокруг горизонтальной оси; ab '= (l 3 2 4 }"^~~ поворот юкруг вертикальной оси; <*Ь =(} Г) =(23)(45) - поворот ab ab ab 1 3 2 5 ~ М ~ вокруг горизонтальной оси и вертикальной. В табл. 7.1 содержат- ся все возможные произведения элементов рассматриваемой группы. Из табл. 7.1 видно, что G — коммутативная группа и G={e, а}*{е, Ъ]. • Определение. Элементы sl5 s2 e S называются g-эквивалентны- ми и записывают sl ~ s2 , если 3g e G, который, действуя на множестве S, переводит Si в s2 , т.е. g = S{ '" т или ^«1 а 2 ••• S 2 ••• a mj более короткая запись этого gsl = s2 . • Утверждение 7.7.1. Определенная g-эквивалентностъ на мно- жестве S является отношением эквивалентности. Доказательство. Проверим свойства отношения эквивалент- ности. 1. Vsj e S si ~ s2 . Действительно, es^ = s^, где e e G — единичный элемент. 2, V5j, S2 G О 5j ~ S2 —> ^2 ^1- Имеем Sj ~ ^2, тогда 3g s G gSi = s2 ns2 = g~l s{ , а значит, s2 ~ s^ j. VtSi j S^y S^ £ tJ iS1 ]^ ^т A iSS "^ -Уз —^ S *^з>
  • 210. 214 _ Глава 7. Введение в теорию групп. Приложения Имеем, что 3t, g e G ts^ = s2 л gs2 = s$, откуда (tg)sl = g(tsi) = = gs2 = s3 . Следовательно, s{ ~ s3 . • Утверждение 7. 7.2. Группа G={gi,g2 ,..., g^} , действуя на мно- жестве S, порождает его разбиение на непересекающиеся под- множества — классы эквивалентности (рис. 7.2): , где Vsl ,s2 eSa Э# e (? NG — количество классов эквивалентности. Рис. 7.2 Пусть л1 ! eSa , тогда класс эквивалентности Sa составят все различные элементы множества Sa = Определение. Множество Z(jj) = {g e G gs{ = sb s^ e S} называ- ется стабилизатором sl e S. Элементы стабилизатора оставля- ют jj на месте. Пример. Продолжим рассмотрение примера на рис. 7.1. '= {1, 2, 3, 4, 5} — вершины графа на рис. 7.3. На б1 действует группа самосовмещений G= {e, a, b, ab}, где ' 1 2 3 4 5 " 2 3 4 5/ ~l 2 3 5 4 ! 2 3 45"i д А = ( 1 2 3 4 5 3 2 4 5 aft " 3 2 5 4 Найдем все классы эквивалентности. Sl= Ml), в(1), 6(1), eft(l)} = {1, 1, 1, 1} = {!}, S2= (e(2), a(2), b(2), ab(2)} = {2, 2, 3, 3} = {2, 3}, S3= M4), a(4), 6(4), ab(4)} = {4, 5, 4, 5} = {4, 5}. S = Sl uS2 и^з— всего три класса эквивалентности. Определим стабилизаторы для вершин графа{1, 2, 3, 4, 5} . Z(l) = (е, а, Ъ, ab}, Д2) = ДЗ) = {е, а}, Д4) = Д5) = {е, 6}. • Утверждение 7. 7.3. Z(s^) с G — подгруппа группы G. Доказательство. Проверим свойства группы. 1. Замкнутость. V&, g2 e Z(^t) g^ = st, g^ = sl} тогда и fag^ = = gi(SiSi) = fe^i = •*!> следовательно, ^2 e Z^j). 2. Единичный элемент e & Z^j), так как ejj = jj. 3. Обратный элемент. Пусть g e Z(j1), тогда ^! = sl, откуда jj =g ^i, следовательно, g~l e Z^).
  • 211. 7.7. Действие групп на множестве _ • Утверждение 7.7.4. Vsj, s2 e Sa Z(si) = Z(s2 ) n3t&G Z(sl ) = = tZ(s2)f l — в этом случае говорят, что подгруппы Z(sl), Z(s2) сопряжены. Доказательство. Имеем sl, s2 e Sa, следовательно, 3teG tsl = s2. Vg e Z(s2) (tg)s{ = g(tsi) = gs2 = s2 = ts^ или (te)^ = ts{. Отсю- да (#ГVi = r l (tg)si = t~ l (tsi) = (ff'Vi = si, т.е. tgr 1 e ад. Полу- чили, что Vg e Z(s2) tgt e Z(jj). Заметим, что Vg, *£2 6 Д 5 2) (git' 1 * tg2t~ значит, |Z(52)| = tZ(s2)r l < Z(Sl) или Z(s2) < Z(si). Подобным образом доказывается в обратную сторону: Z(s2) ^ |Д^1)|, следовательно, Z(si) = Z(s2). Показали, что 3/ &G /g e Z(s2) tgt~ l e Z(si) и |Z(jt)l = 1Д^)1 = tZ(s2)t~ отсюда " • Утверждение 7.7.5. Sa= ' ' , где ^ e ^a- l^(*i)l Доказательство. Пусть G = {gv, g2,..., gk]. Из утверждения 7.7.2 следует, что Sa= {giSi, g^b--, g^}, однако среди выписанных эле- ментов множества Sa могут встречаться одинаковые. Назовем gj ,gi2 e G эквивалентными gj ~ gi2, если они действуют на эле- мент jj одинаковым образом, т.е. gt s{ =gl г jj . Данное отношение является отношением эквивалентности. Введенная эквивалент- ность разбивает группу G на классы, количество которых равно числу различных элементов среди выписанных Sa = {gis{ , g2 Si,..., &s,b т.е. равно |,У0 |. Пусть g^s^g^Si (ftj-ftj) или fe1 ^2 1 )*i=?r2 1 fe1 ^i) = =^, r 2 1 fe^i) = fe2 ^ : 2 1 )5i =•*!. следовательно, д^,/ eZ(5j) или ^(i eZ^j^j. Верно и обратное, если g^ eZCSj)^, то й^^ 1 eZ^^^nfe^,- 1 ^! =*!- Отсюда^,^! =g,2 sl wuig^-g^. Таким образом, gj ~ gt2 тогда и только тогда, когда gt , gj2 лежат в одном правом классе смежности по стабилизатору Z(jj) (gj e Z(sj )gt2 ), а значит, и число элементов в i 1 ,,; равно количест- ву правых смежных классов в (7по подгруппе Z^j). Согласно тео- реме 7.3.1 Лагранжа, Sa= -^— ЦG : Z(sl )| .
  • 212. 216 Глава 7. Введение в теорию групп. Приложения • Лемма 7.7.1 Бернсайда. Число классов Sa эквивалентности, на которые распадается множество S = Sl <uS2^j...uSNc под дей- 1 ствиемгруппы G, равноNG = г—- /JvC?)!, wej/(g) = {.ye.S'l.g^S'}. Доказательство. Подсчитаем двумя различными способами множество всех таких пар элементов, что V# е G Vs е S {(s> s ) S s = s}. Это можно выполнить следующим образом: Nq Первая сумма ]T|Z(.y)| = ]T ]£|Z(,y)|. Так как Vsl,s2eSa seS i^seSf , то ^Z(S)=Sa.Z(sa)^-^—Z(Sa)=G, где seSa ^( S a) S(l eSa. Таким образом, £|Z(j)|= ^Z(s) = G=NG-G. s^S i=lstS, Получили, что Л^с -|G|= ^1vfe)l. откуда '=1 Пример. Продолжим рассмотрение примера на рис. 7.3. S = {1, 2, 3, 4, 5} — вершины графа. На 5 1 действует группа самосовмеще- ний G={e, a, b, ab}, гдее=[| 2 М 2), fl =[i о ч < llV X л О т" JJ L ** Э J ./ 2 3 45") 3 2 5 4/ Полным перебором установили, что под действием Gмножест- во 5распадается на три класса эквивалентности: S = Sl uS2 uS3 , где Sj ={!}, ^2 ={2,3}, S3 ={4,5}. Установим данный факт, приме- j няялемму 7.7.1 Бернсайда: NG =—- У|у(^)| — число классов экви- валентности. Ч/(*)=фб,У |ег = *} = {!, 2, 3, 4, 5}, {je J|os = j} = {l, 2,3},
  • 213. 7.8. Цикловой индекс группы ___ 217 Отсюда следует, что число классов эквивалентности ArG=-l(|vl/(e)HM,(a)H4/(6)|+|vl/(flft)|) =1(5+3+3+1) =3. Замечание. Рассмотрению более содержательных задач, при решении которых возможно применение изложенной выше тех- ники подсчета классов эквивалентности, предварим изложение теории перечисления Пойа. Это позволит нам с более формаль- ных позиций подойти к пониманию самой техники подсчета и к применению ее для решения задач. 7.8. Цикловой индекс группы Пусть группа G действует на множестве S= {1, 2,..., т} и Т : G ->• Sm — гомоморфизм в симметрическую группу Sm. Рас- смотрим разложение g e G на независимые циклы где ki — количество циклов длины 1; k2 — количество циклов длины 2; km — количество циклов длины т. Набор (kb k2 ,..., km ) называется характеристикой элемента g & G, где 1- fcj + 2 • k2 + ... + т • km - т. • Определение. Цикловым индексом Z(G,Xl , x2 ,..., xm ) группы G, действующей на множестве S, называется полином от пере- менных Xi, х2 ,..., хт , определяемый формулой где (ki, k2 ,..., km ) — характеристика элемента g &G. Пример. Продолжим рассмотрение примера на рис. 7.3. S = {1, 2, 3, 4, 5} — вершины графа. На £действует группа самосовмеще- ний G=(c, а, Ъ, аЬ], где,=(} 2 3 4 5 ^ e= Q 2 3 4 5 ^ 2 3 5 4 12 3 4 5 l 3 2 4 5 ( 2 3 4 5" тт - , аЪ = | t ~ 5 4г" аидем Цикловой индекс группы G, для этого выполним разложение на независимые циклы под- становок элементов G и установим их характеристики:
  • 214. 218 Глава 7. Введение в теорию групп. Приложения е= (1)(2)(3)(4)(5), (k{k2...km) = (5, О, О, О, О); а = (1)(2)(3)(45), (k^.-.kj = (3, 1, О, О, О); Ъ = (1)(23)(4)(5), (k,k2...km) = (3, 1, О, О, О); аЬ= (1)(23)(45), (Аг^...**) = (1, 2, О, О, О). l f v 5 Y ° V 0 V ° Y 0 -1- v 3 Y 1 V 0 V 0 V ° - l - V 3 V 1 V 0 V 0 r 0 J. ~' + 2 7.9. Теория перечисления Пойа Введем следующие обозначения. D= {db d2,..., dm} — конечное множество. G= (Sb 821 ftj--} — конечная группа, действующая на D. R = {гь г2, г3,...} — конечное множество качественных признаков (цвета). S= (ff: D ->/?} — множество функций; каждая функция/опре- деляет качественные признаки элементов D. Q = {coj, a>2, й>з>"-} — множество весов. о : R —> Q — весовая функция, назначает веса о(г) е Q признакам reR. Дю) = 2]<о(г) — сумма весов элементов г <=R или , где Сш — число элементов г <=R с весом ш е Q, множество { Сю } — перечень J? относительно весовой функции ш(г). Рассмотрим введенные понятия на следующем примере, к ко- торому ниже не раз будем возвращаться. Пусть D= {c?i, d2 , с?3 } — вершины правиль- ного треугольника (рис. 7.4). Треугольник нанизан на вертикальную ось, вокруг кото- рой он свободно вращается. /? ={», °} — мно- жество из двух красок. Найти количество различных раскрасок вершин треугольни- Рис. 7.4 ка
  • 215. 7.9. Теория перечисления Пойа 219 На D действует группа самосовмещений G= {e, а, а 2 }, где тождественное совмещение, а = — поворот во- ^z з .) круг оси на 120°, а 1 =( | ? |) — поворот на 240°. Q = {х, у, х~ 1 , у" 1 и их произведения}— множество весов. S = ff'- D -> R} — множество раскрасок. В треугольнике три вер- шины и каждую допускается окрашивать в любой из двух цветов R- = {•> °К следовательно, всего функций 2 3 . Такое количество рас- красок будет, если треугольник сделать неподвижным (рис. 7.4). Если допустить вращение, то различные раскраски неподвижно- го треугольника становятся одинаковыми для вращающегося треугольника. Приведем пример трех раскрасок: f,fi,fi- Очевидно, что для решаемой задачи раскраски^ и/3 совпада- ют. Назначим краскам R ={•, о} веса: со(») -х и ю(°) =у. • Замечание. Отметим, что назначенные веса элементов со(») =х и са(о) =у позволяют сравнивать признаки количественно, за- бывая, в какой— то степени, о качественном их содержании. • Определение. Для каждой функции feS определим вес В нашем примере W(fl ) = со(»)со(»)ш(о) =хху =х у, Определение. Группа G, действуя на D, индуцирует (наводит, создает, определяет) свое действие на множество функций S. Положим У/еб 1 V g e G gf=f(g(d))— это рассматривается
  • 216. 220 _ Глава 7. Введение в теорию групп. Приложения В нашем примере рассмотрим действие элемента а е G на /2 е S. / ( « 2 ( ) ) = / ( ^ ) = ° и /) = °, Таким образом, элемент группы а переводит/ в/3 или, в при- нятых обозначениях, a 2 f2 =/. • Определение. Положим/ ~f2, если 3g &G/d eD f(gd) =f2(d). Такие /i и /2 определяют одинаковые раскраски элементов s Введенная эквивалентность функций есть от- ношение эквивалентности, которое порождает разбиение множества элементов/е .Уна непере- секающиеся классы эквивалентности (рис. 7.5): г ч_ Рис. 7.5 И V/ i е ^« V /2 e£p VgeGgft *f2,Sa ^5p, NG - количество классов эквивалентности. Каждый класс эквивалентности определяет отдельную рас- краску элементов d e D. Таким образом, количество различных раскрасок равно NG . Для определения NG воспользуемся леммой 7.7.1 Бернсайда: NG = -~^i(g), в данном случае {/e Sgf=fwmf(gd) =Л$ Vrf e D}. Вернемся к нашему примеру на рис. 7.4 и найдем для него чис- ло NG . у(е) = {/e S ef=f] удовлетворяют все/е S, откуда |vj/(e)| = = 2 3 = 8. у(а) = { f e S af=f} — это такие раскраски/вершин, ко- торые допускают совмещение с эквивалентной из раскрасок вра- щением треугольника на 120°. Это возможно, если все вершины либо белые, либо черные. Итак, |vj/(a)| = 2. Подобным образом устанавливается, что и |у(я 2 )| = 2. Следовательно, • Утверждение 7.9.1. Если/! ~f2 , то Wlf^ = W(fl), т.е. эквива- лентные функции имеют одинаковые веса. Доказательство. D = {аъ d2 , d3 ,...} и D - (gdb gd2 , gd^,...} — вер- но Vg e G, так как G действует на D и g = j , 2 , 3 '" — это
  • 217. 7.9. Теория перечисления Пойа __ 221 подстановка. Теперь W(f{} = J7o)(/1(uf)) = J^oX/j (#</)). Имеем deD dsD fi ~/2, тогда 3g e G VdeD a>(fi(grf)) = ю(/2(^). Отсюда Определение. Последнее утверждение позволяет определить вес каждого класса эквивалентности 5, в разложении S - Sl и <uS2 и. . .vSNc , как W(Sj ) = W(f), где / e St . Определение кор- ректно, так как каждый класс St состоит из эквивалентных функций/ веса которых совпадают. Теорема 7.9.1 Пойа. ]£Сш • ш = Z(G,R(<s> 1 ),R(& 2 ),...,R(a m )), где Сю— число классов эквивалентности S = Sl u S2 v. . -^>SN(! с ве- сом о e Q, Z(G,x ' ,х2 2 ,...,х^ т ) — цикловой индекс группы G, действующей на множестве D={d^, d2>..., dm}. Отметим, что гаеП Доказательство. Пусть «А»— разбиение множества D на непе- ресекающиеся подмножества: 2l +D22+ ...+ D2k2+ ...+ Dml +Dm2 +...+Dmkm , где |Dy| = /, D| = m, 1 • k{ + 2 • k2 + ... + т • km = m. • Определение. Говорят, что/е ^подчинена разбиению «Д» мно- жества D и записывают/е Д, если/постоянна на каждом под- множестве Dy из разбиения: yd e Dv f(d) = гф где Гу e R. Функция/, подчиненная разбиению «Д», взаимно однозначно определяется набором (ги г12 ...гщ r2l r22 ...г2 ^...rml rm2 ...rmkm ), где r 'J &R - ~^~ ~^Г ~£Г Все такие наборы составляют множество: _ где Sy - R, i = l,m, j = l,kt . Полагая веса элементов Sy e Sy равны- ми юЦ) = [4)(riJ )]'nBQCs = (sll sl2 ...slki S2l s22 ...s2k2 ...sml sm2 ...smkm ) 6 S
  • 218. 2 2 2 Г л а в а 7 . Введение в теорию групп. Приложения равным произведению весов <o(s) имеем o(s) = W(f), где/s А подчинена разбиению. Для множества .У выполнены все условия правила обобщенно- го произведения, тогда сумма весов элементов данного множест- ва, а значит, и сумма весов всех функций/е А составит ' т W(Sy) = Ц[Щ5у )]*', вследствие W(Stti ) = W(SiJ2). W(Sjj)= ^ d(s) = ^][ш(г)]' =R((a'). Следовательно, s eS;i rsR или АД Пусть g eC и g = (P1)(p2)...((3,i XP;I )((3,2)... ;..(РЛРЛ...Р7т) ^~ ~*7~ ~~%T разложение на независимые циклы, где (k^, k2,..., km) — характе- ристика^и 1 • ki +2 • k2 + ... +т • km =т.Запишемразложениена независимые циклы в виде g = (Dn)(Dl2)...(Dlki )(D2l)(D22)...(D2k2 )...(Dm,)(Dm2)...(Dmkm ^ *2 km где Dy — цикл длины /', |iy = /. Обозначим разбиение множества D на Dy через Ag. Элементы d e Dy одного цикла при умножении на g переходят последовате- льно по циклу в элементы того же цикла. Указанное свойство по- зволяет заключить, что Vdb d2 e Dy 3k ^d{ = d2 . Пример. Пусть g = (12345)(678), тогда g 2 = (13524)(687). • Определение. Функция f&S называется неподвижной относи- тельно g &G, если /d e D f(gd) =f(d). • Утверждение 7.9.2. Функция /eS неподвижна относительно g e G тогда и только тогда, когда/e Ag подчинена разбиению А?. Доказательство. (=>) Пусть db d2 e Dy — принадлежат одному циклу. Следовательно, 3kg k d1 = d2. Тогда f(d2) =f(g k dl) = ~Х)=/(/~Х)=•••=/(М)=f( d i) > где каждый переход
  • 219. 7.10. Цикловая структура групп подстановок _ 223 обусловлен неподвижностью/: /d sD f(gd) =f(d). Таким обра- зом, Vrflf d2 e Dtj /(4) =/(rf2), т.е. /e Ag. (<=) Пусть d eDy , тогда и gd eDy — свойство циклов. Имеем /e Д? или Vtfj, d2 e Dy f(d{) =f(d2), следовательно, nf(gd) =f(d), тогда /есть неподвижная относительно # e G. Запишем сумму весов/ подчиненных разбиению Ag, в следую- щем виде £ W(f) = £a^,ra 'm ' где й лг,о> ~ количество функций, /eAg fflsQ подчиненных разбиению Дд, с весом ш eQ. Составим множество всех функций, неподвижных относите- льно^ e G, с весом ш eQ : ^(g) = (f fd &Df(gd) =f(d) /W(J) = со}. Утверждение 7.9.2 позволяет записать а^ - 1^(^)1. Величина Сю — число классов эквивалентности с весом to eQ, на которые распадается множество функций S -Sl u ^2 u...UA?^ под дейст- вием группы G. По лемме Бернсайда, Сш = — ^|ч/га(^)| = I^UeG = - — Г^ЯА?Ш - Умножив последнее равенство на со и просуммиро- G g*G вав по всем весам из Q, получим, что ^Сш -к> = -— - шеП Сумма 2^йд?0) -со= ^^(/) — сумма весов функций, подчи- ненных разбиению &g. Так как W(f)=[R(^)] ki [R((a 2 )]^ ..{R(<* m )] km , то 7.10. Цикловая структура групп подстановок Рассмотрим несколько общих примеров, которые в какой-то степени дают представление о возможностях изложенной выше техники подсчета классов эквивалентности с использованием те- ории перечисления Пойа.
  • 220. 224 __ Глава 7. Введение в теорию групп. Приложения 7.10.1. Цикловой индекс группы, действующей на себе Пусть группа G действует на множестве S= G следующим об- разом: Vg е G /s е S g(s) = gs. Если порядок элемента | g | = d, то все элементы#5, j?s, g3 s,...,/s = sразличны. Группа Gраспадается под действием g на циклы одинаковой длины. Количество циклов равно n/d, где n = G — порядок группы. Цикловой индекс груп- пы примет вид f, (7.10.1) где y(d) — количество элементов g е G с порядком | g | = d. Сумми- рование выполняется по всем делителям d числа п. 7.10.2. Цикловой индекс циклической группы Пусть S= {О, 1,..., л-1} — множество вершин правильного л-угольника (рис. 7.6) на плоскости. Группа G — циклическая группа самосовмещений. Образующий элемент группы а е G — вращение (отображение) S вокруг центра на угол 2п/п. Следовательно, G = {а" = е, а, а2 ,..., а"~1 }, где е — тождественная подстановка. Если обозначить вершины многоугольника {0, 1,..., «-!} элементами группы {а" = е, а, а 2 ,..., а"~ 1 }, то вращение будет эквивалентно умножению верши- ны на соответствующий элемент группы. Напри- мер, совмещение при вращений на угол 2п/п рав- носильно умножению новых меток {а" = е, а, а 2 ,..., о"' 1 } вершин n-угольника на элемент а, действите- льно, а • е -> а, а • а -» а 2 ,..., а • а"' 1 -> а". Таким образом, можно считать, что циклическая группа G действует на себе. Согласно (7.10.1) цикловой индекс данной группы примет вид ' ( 7 - 10 - 2 ) d/n d/n где y(d) = ф (d) — функция Эйлера. Действительно, если порядок элемента равен d (элемент суммируется в j(d)), то он является об- разующим элементом подгруппы Яс G порядка Н = d. Пока- зать, что если порядки элементов циклической группы совпадают
  • 221. 7.10. Цикловая структура групп подстановок _ 225 ak | = ат = d, то они являются образующими одной и той же под- группы Не G. Число образующих в такой подгруппе y(d). Найдем количество возможных раскрасок NG двумя цветами вершин данного (рис. 7.6) «-угольника. Пусть цвета — ./? ={•,<>}. Воспользуемся теоремой 7.9. 1 Пойа. Для определения количества раскрасок положим веса цветов равными Ц») =1 и о>(°) =1 Тогда d/n Для треугольника (п = 3) число раскрасок равно Для шестиугольника число раскрасок равно NG =^^d)2n 'd = 1ф (1)23 +Ф (2)23 +Ф (3)22 + =i(l-26 +1.23 +2-22 +2.21 )=14. о 7.10.3. Цикловой индекс симметрической группы Пусть S= {1, 2,..., п} — произвольное множество, на котором действует группа всех подстановок Sn — симметрическая группа, Sn = п. Рассмотрим произвольную подстановку п s SH с характе- ристикой (&!, k2,..., kn), где Iki + 2k2 + ... + nkn = п. Подсчитаем ко- личество подстановок с данной характеристикой. Для этого запи- шем в цикловом представлении, помещая знаки «—» на местах, которые должны занять п элементов. Так, для характеристики (3,2) следует записать (—)(—)(—)( -- )(—). Далее пробелы можно заполнять п элементами множества S в любом порядке. Это дает и! подстановок с характеристикой (klt k2,..., kn), которые, однако, не все различные. Каждый из циклов kr может начинаться с любо- го своего элемента, не изменяя исходной подстановки и умень- шая общее число различных подстановок в г раз. Если имеется kr таких циклов, то их можно переставлять k). способами, что также не будет приводить к новым подстановкам. Все эти варианты суть 8—2697
  • 222. 226 _ Глава 7. Введение в теорию групп. Приложения различные обозначения одной и тойже подстановки с характери- стикой (ki, k2,..., &„). Поэтому различных подстановок с указан- fil ной характеристикой будет - '- - . Тогда цикло- £1!-l*1 £2!-2*2 .../t/I!-«*" вой индекс симметрической группы можно записать в следую- щем виде: Z(G, хъ х2,..., х„) = _ v Рассмотрим пример определения числа NG раскрасок двумя цветами/? ={•, о}трехусов S= (1,2, 3} антенны (рис. 7.7). Усы сво- бодно вращаются в пространстве. Е этом случае на множестве •У={1, 2, 3} действует симметрическая группа подстановок S3. Найдем все характеристики (klt k2, k3) разложения числа 3 = 1&! + 2k2 + З&з- Ими будут: (3,0,0), (1,1,0) и (0,0,1). Цикловой индекс примет вид 2, 3? Z(G, Xi, Х2, Х3 ) = V 1 Ы*'Г*2' Рис. 7.7 3!(,,U 1!1!ПД2; 1M Для определения количества раскрасок положим веса цветов рав- ными со(») =1и (о(°) =1, тогда Дш*) =ш*(•)+со*(°) =2. Следователь- но, з = '
  • 223. — Глава 8 ===== Элементы теории чисел I еория чисел занимается изучением свойств целых чисел. Целыми называются числа Z= {..., -3, -2, -1, О, 1, 2, 3,...}. Для любых a,b e Zсумма а + Ь, разность а - Ъ и произведение а • Ъ являются целыми числами. Но частное - от деления а на Ъ Ъ (если Ъ не равно нулю) может быть как целым, так и не целым. В случае, когда частное —является целым, то обозначают а = bq, где Ъ q — целое число, а Ъ тогда называют делителем числа а и записы- вают так: Ьа. В общем случае единственным является представ- ление a = bq + г, 0 <r<b где г — называют остатком от деления. 8.1. Наибольший общий делитель В дальнейшем будем рассматривать лишь положительные де- лители чисел. Всякое целое, делящее одновременно целые а,Ь,..., с, называется их общим делителем. Наибольший из общих делите- лей называется наибольшим общим делителем (НОД) и обозначает- ся (а, Ь,..., с). Если (а, Ь,..., с) = 1, то а, Ь,..., с называются взаимно простыми. Например, (10, 15) = 5, (8, 21) = 1. Свойства наибольшего общего делителя 1. Если а = bq, то (а, Ь) = Ь. 2. Если a = bq + r, тогда общие делители чисел а и Ь суть те же, что и общие делители чисел Ь и г, в частности, (а, Ь) = (Ь, г). 3. Для определения наибольшего общего делителя применяется алгоритм Евклида. Он состоит в нижеследующем. Пусть а и Ь — положительные целые числа и а > Ь. Составим ряд равенств: a = bql + r2 , 0 < /2 < Ь, b = r2q2 + r3, О < /з < /2,
  • 224. 228 Глава 8. Элементы теории чисел /2 =ОДЗ+ Г 4> 0<Г4 </-3 , (8.1.1) г*-г = Vi?«-i + Л., < Л, < г п-, гп- = г„д„, заканчивающийся, когда получается некоторое гп+1 = 0. По- следнее неизбежно случится, так как ряд Ъ, г2, г3,... убывающих целыхчисел не может содержать более чем b положительных. 4. Из формул (8.1.1) алгоритма Евклида следует, что (а, Ь) = (Ь, Л) = (г2, г,) =... = (/•„_!, г„) = /•„. Наибольший общий делитель равен последнему не равному нулю остатку алгоритма Евклида. 5. Из формул (8.1.1) алгоритма Евклида следует также, что суще- ствуют целые ti и t2, что ta + t2b = rn. В частности, если (а, Ь) = 1, то t{a + t2b = 1. Пример. Найдем (525, 231). 525 = 231-2 + 63, 231 = 63-3+42, 63 = 42-1 + 21, 42 = 21 • 2. Последний остаток есть 21, значит, НОД = (525, 231) = 21. 6. Пусть т — любое положительное целое, тогда (am, bm) = = (a, b)m. 7. Если (а, Ь) = 1, то (ас, Ь) = (с, Ь). 8. Если (а, Ь) = 1 и ас делится на Ь, то с делится на Ь. 8.2. Наименьшее общее кратное Всякое целое, кратное всех данных чисел, называется их об- щим кратным. Наименьшее положительное общее кратное назы- вается наименьшим общим кратным (НОК). Наименьшее общее кратное двух чисел а и Ь равно их произведению, деленному на их общий наибольший делитель, т.е. ^|у . 8.3. Простые числа 1. Число 1 имеет только один положительный делитель, имен- но 1. В этом отношении число 1 в ряде натуральныхчисел сто- ит совершенно особо.
  • 225. 8.3. Простые числа 229 Всякое целое, большее 1, имеет не менее двухделителей, имен- но 1 и самого себя; если другихделителей нет, то число называ- ется простым. Целое, большее 1, имеющее кроме 1 и самого себя другие положительные делители, называют составным. 2. Наименьший отличный от единицы делитель целого, больше- го единицы, есть число простое. В противном случае, можно было бы выбрать делитель еще меньше. 3. Наименьший отличный от единицы делитель (он будет про- стым) составного числа а не превосходит -Ja. Действительно, пусть q — именно этот делитель, тогда a = qbnb>q(q — наи- меньший делитель), откуда а > q или q <Ja. 4. Простых чисел бесконечно много. Это следует из того, что како- вы бы ни были различные простые числа plt Р2,---, Рь можно получить новое простое, среди них не находящееся. Таковым будет простой делитель суммы/?]^---/^ + 1, который, деля всю сумму, не может совпадать ни с одним из простыхpi,p2,••-,/>*• 5. Решето Эратосфена для составления таблицы простых чисел. Данный способ состоит в следующем. Выписываем числа 1, 2, 3,-4, 5,6, 7,8,9,-Ю, 11, . . . , N. Первое, большее 1, число этого ряда есть 2. Оно делится толь- ко на себя и на 1 и, следовательно, оно простое. Вычеркиваем из ряда (как составные) все числа, кратные 2, кроме самого себя. Первое, следующее за 2 не вычеркнутое число есть 3 — оно также будет простым. С ним, как и с числом 2, проделываем ту же про- цедуру и т.д. Если указанным способом уже вычеркнуты все числа кратные простых, меньших/? (4а <р), то все невычеркнутые, ме- ньшие р 2 , будут простые. Составление таблицы простых чисел, не превосходящих N, за- кончено, как только вычеркнуты все составные кратные простых, не превосходящих -/Ж В алгоритме 8.1 реализовано решето Эратосфена для нечетных чисел 2N+ 1 с предпросеиванием для двойки; другими словами, начинаем только с нечетных чисел, отсеивая кратные 3, 5, 7,11 и т.д. Вектор Xявляется двоичным набором индикаторов простых нечетных чисел. Так элемент вектораXk=, если соответствую- щее емучисло 2k + 1 — простое; в противном случае, когда Xk = О, число 2k + 1— непростое.
  • 226. 230 Глава 8. Элементы теории чисел Алгоритм 8.1. Решето Эратосфена А-=(1, 1,..., 1); for k= 3 to V27V + 1 by 2 do (X(k-)/2 — индикатор нечетного числа k) {Вычеркнуть числа кратные k] tfX(k-)/2 = ! thenfor i = k2 to 2N+ 1 by 2k do X^.^ = 0; { Печать простых чисел } for k=l 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[I..N] of Boolean; Var f :Text; {Текстовый файл простых чисел} X :Vector; {Вектор индикаторов простых чисел} Procedure Primary; {Генерация простых чисел) Var i,k,M,nm :Integer; begin nm:=2*N+l; for k:=l to N do X[k]:=TRUE; k:=3; M:=trunc(sqrt(nm)); while k<=M do begin if X[(k-l) div 2] then begin i:=k*k; {Исключить числа кратные k} while i<=nm do begin X[(i-l) div 2]:=FALSE; i:=i+2*k; end; end; k:=k+2; {Выбираем нечетные числа k} end;
  • 227. 8.3. Простые числа _ 231 {Печать простых чисел по индикаторам X[k]} i:=0; for k:=l to N do if X[k] then begin Write(f,2*k+l,''); end; WriteLn(f); WriteLn (f, ' Количество простых нечетных чисел '+ 'вдиапазоне[3,',2*N+1,']равно',i); end; begin Assign(f,'Primary.out' } ; {Файл для записи простых чисел} Rewrite(f); Primary; Close(f); end. Алгоритм 8.З. Программа на Си генерации простых чисел iinclude <stdio.h> #include <math.h> ttdefine N 45 char X[N+1]; // Индикаторы простых чисел // в диапазоне 3,5, . . .,2*N+1} int main (void) { FILE *f; int i,k,M,run; f =f open ("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++ ) iff X[k]){ i++; fprintf (f,"%d ",2*k+l); } fprintf (f, "ХпКоличество простых нечетных чисел в диапазоне [3,%d] равно %d", 2*N+1, i) ; fclose(f); return 0;
  • 228. 232 Глава 8. Элементы теории чисел Исходными данными для программ алгоритмов 8.2 и 8.3 явля- ется верхняя граница 2N+ 1 диапазона [3, 2/V+ 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, 27Y+ 1], границы которого распечаты- ваются во второй строке результирующего файла. Во второй же строке указывается и общее количество найденных простых чи- сел. 8.4. Сравнения, свойства сравнений Пусть т — целое положительное число, которое назовем моду- лем. Будем говорить, что целые числа а и Ъ сравнимы по модулю т, если а - Ъ = t • т для некоторого целого t, т.е. равны остатки от деления я и b на т. Сравнение чисел а и Ъ по модулю т будем за- писывать а = b (mod т). Например, 77 = 5(mod 8), 102 = 0(mod 3). Свойства сравнений 1. а = a (mod т) — свойство рефлексивности. 2. a s b (mod т) => b = a (mod m) — свойство симметричности. 3. а = b (mod т), b = c (mod т) => а = с (mod т)— свойство тран- зитивности. 4. а = b (mod /и) => (а, т) = (Ъ, т). 5. а = b (mod /и), с = d (mod m)=*a + csb + d (mod m). 6. a = b (mod m), c = d (mod m) => ac = bd (mod m). 7. a = ad, b = b^d, (d, m) = 1, a = b (mod m) => a{ = bi (mod m). 8. a = b (mod /и), /иД/п (т{ делит т) => a = b (mod m{). 9. a = b (mod m), da, db, dm => a± = b (mod m{).
  • 229. 8.6. Приведенная система вычетов 233 8.5. Полная система вычетов Свойства 1—3 сравнений показывают, что операция сравнения целых чисел по модулю является отношением эквивалентности. Множество всех целых чисел Zpa36nBaeTCH на классы эквивален- тности (рис. 8.1), которые называются вычетами по модулю т. Числа г, s eZлeжaт в одном классе {&,}, т.е. г, s e {&,} тогда и только тогда, когда г = s (mod т) имеют одинаковые остатки от деления на т. Числа одного и того же класса имеют с модулем т один и тот же наибольший общий делитель, т.к. из г, s е {&,} следует, что (г, т) = (s, т) (см. п.8.4). Особенно важны классы, для которых этот делитель равен единице, т.е. классы, содержащие числа, вза- имно простые с модулем. z (0) {1} {2} {3} {4} (5} Рис. 8.1. Полная система вычетов {т-2} {т-1} Определение. Множество классов вычетов {0}, {!},..., {т - 1} по модулю т называется полной системой вычетов (п.с.в.). Пол- ную систему вычетов можно получить следующим образом. Пусть Z— аддитивная (операция сложения) группа целых чи- сел, mZ— подгруппа всех чисел, кратных т. Тогда факторгруп- па Z/mZ— аддитивная группа вычетов по модулю т (полная сис- тема вычетов). 8.6. Приведенная система вычетов Определение. Пусть т — целое положительное число. Множе- ство классов из полной системы вычетов {0}, {!},..., [т - 1} вза- имно простых с т называется приведенной системой вычетов, которую будем обозначать как М„ или Мк (т). Приведенную систему вычетов, следовательно, можно составить из чисел п.с.в., взаимно простых с модулем. Обыкновенно М„ выделя- ют из системы наименьших неотрицательных вычетов: О, 1, 2,..., т-1.
  • 230. 234 Глава 8. Элементы теории чисел • Утверждение 8.6.1. Мп является группой с операцией умноже- ния. Доказательство. Проверим все свойства (аксиомы) группы. 1. Замкнутость. Пусть произвольные a, b е Мп . Покажем, что аЪ е Мк . По условию а = 1 (mod т) и b = 1 (mod т), тогда ab = 1 (mod т). 2. Ассоциативность операции умножения чисел выполняется. 3. Единичный элемент — 1. 4. Существование обратного элемента. Возьмем произвольный элемент а е Мп . Покажем совпаде- ние множеств аМп = М„. Ясно, что аМп с Мп , так какдля М„ вы- полняется свойство замкнутости. Для доказательства аМп = Мк теперь достаточно показать, что все элементы множества аМк различны. Предположим, что существуют ^ * Ь2 е М„, для которых abi - аЬ2 = 0 (mod т). Отсюда а(Ь± - Ь2 ) = 0 (mod т). Атак как (а, т) = 1 — взаимно простые, то Ь - Ь2 = 0 (mod т) или bl = Ь2 (mod т), что противоречит принадлежности их разным классам. Таким образом, все элементы множества аМ^ различны, зна- чит, ЗЬ е М„, что а • b = 1 (mod т). Элемент b является обратным к а, и по доказательству он единственный такой элемент (сущест- вование обратного элемента а доказано). Таким образом, получили, что Мп является группой по умно- жению. Порядок этой группы равен количеству чисел меньших т и взаимно простых с ним. 8.7. Функция Эйлера • Определение. Функция Эйлера <p(w) определяется для всех це- лых положительных т и равна количеству чисел ряда 1, 2,..., /я-1, взаимно простых с т, где число 1 полагается взаимно простым с любым из чисел и ср(1) = 1. Примеры.Ф(1) = 1,Ф(2) = 1,Ф(3) = 2,Ф(4) = 2, ср(5) = 4, ср(6) = 2. Замечание. Отметим, что порядок группы Мп (т) приведенной системы вычетов по модулю т равен |Afn (m)| = (р(/п).
  • 231. 8.7. Функция Эйлера _ 235 Свойства функции Эйлера Свойство 1. Если (mlt т2 ) = 1, то ф^ • т2 ) = y(ml )y(m2 ). Доказательство 1. Пусть С(/и1 /я2 ) — циклическая группа по- рядка |С(/П!/и2 )| = т{ т2 , число образующих ее равно (р(т{ т2 ) ( C M. утверждение 7.3.4). Так как (т^т-^ = 1, то допустимо разложение (см. п.7.4) группы С(7И!/Я2) в прямое произведение своих цикли- ческих подгрупп С(/И!/я2 ) = C(/Wj) x C(m2 ) и, следовательно, чис- ло образующих группы С^т^т^ равно (p(/Wi)(p(/H2 )- Доказательство 2. Достаточно показать, что 1. Заметим, что из (т^т^ — 1 следует существование целых а и Ъ, для которых выполняется ат2 + Ьт^ = 1 (алгоритм Евклида см. п.8.1). Приведем значения целых а и и к значениям а е {1, 2,..., т^иЬ е {1, 2,..., т2 ], для которых a/n2 + bm^ = I(modm1 /n2 ). Пусть с е {1, 2,..., /ni/«2 }, тогда верно сдт2 + cbm = c(mod т^т2 ) , где зна- чения са и cb приведены к значениям а е {1, 2,..., /Wj} и b е {1, 2,..., /и2 }. Таким образом, произвольное число с е {1, 2,..., mj/w2 } можно записать в виде о/и2 + Ът = с (mod /njm2 ), где а е {1, 2,..., /nj} и и е {1, 2,..., /и2 }. Данное представление является однозначным, так как число возможных пар (а, Ь) равно т^2 и та- кое же количество представляемыхчисел с е (1, 2,..., W!/w2 }- Далее рассмотрим все представления ат2 + Ът для всех а е {1,2,..., /wj и £ е {1, 2,..., т2 }. 2. Пусть а е Мп (тд и 6 е М^(т2 ) , т.е. (о, /Wj) = 1 и (6, /и2 ) = 1 и (/«!, т2 ) = 1. Покажем, что (ат2 +• bmlt /и1 /и2 ) = 1. Выражение (ат2 + bmi, т^) = 1 эквивалентно (ат2 + Ъть т{ ) = 1 и (ат2 + + bmlt т2 ) = 1. В первом случае — (ат2 + bm, Wj) = (ат2 , т^) = = (a, /HI) = 1 и во втором — (ат2 + Ьт{ , /и2 ) = (bmh т2 ) = (Ь, т2 ) = 1. Таких пар (а, Ь), а значит и чисел ат2 + Ьтг взаимно простых с т^2 , равно y(mi) • ф(/я2 ). Покажем, что других чисел взаимно простых с т{ т2 среди ат2 + bml нет. 3. Остались не рассмотренными числа ат2 + bml , где а е M^ni]) или Ь <ь М„(т2), для них (ат2 + Ът, т^т^ Ф 1, т.е. та- кие числа не являются взаимно простыми с т^т^ 4. Из пунктов 1), 2), 3) следует, что ф(/Я!/и2 ) =
  • 232. 236 Глава 8. Элементы теории чисел Свойство 2. ф(р") =р а -р а 1 =р а 1— , I Р) где р — простое число и а > 0. Доказательство. Числавидаk • р, гдеk={, 2,...,р а ~ 1 } — это все числа не взаимно простые ср а среди 1, 2,..., р а , а значит остальные являются взаимно простыми с р а . Отсюда ф(р а ) =р а -р а ~ . Свойство 3. Пусть разложение числа т на простые сомножите- ли имеет вид т=р^ 1 р^ 2 ...р°^ , гдеpi — простые числа, тогда _*_ * ~1л в 'И- Л Свойство 4. 2^Ф(*/) =л > г Д е ^ ~ различные делители числа п. dn Доказательство 1. Пустьл =р^ [ р^ 2 ...p^ k — разложение числа п на простые сомножители. Правило обобщенного произведения (см. п.3.4) позволяет записать: Сумма = l + (р - 1) + (р2 -р) + ... + (ра - р"- 1 ) =р°. Отсюда искомая сумма Еф(<о=П Z ф(^)=Ш а '=«-dn i=ldp°4 i'=l Доказательство 2. Пусть С(«) — циклическая группа порядка |С(я)| = я. Для всякого делителя d числа л существует единствен- ная подгруппа C(d) с С(я) порядка |С(сГ)| = d. Образующие груп- пы C(d) составляют множество Sd = (х. е С(я) | | х | = d }. Из утвер- ждения 7.3.4 следует, что число образующих группы C(d) равно ср(йО = Sd. Так как Sd r Sd- = 0 для rf 7t d', то [J^j =С(л) или dn (/Л
  • 233. 8.7. Функция Эйлера _ 237 • Теорема 8. 7.1 Эйлера. х ф(ш) = 1 (mod т), где т > 0 и (х, т) = 1. Доказательство. Приведенная система вычетов М„ по модулю т является группой, порядок которой Мп = <р(т). Пусть х — про- извольное такое, что (х, т) = 1 и х = г (mod т), где г е М^. Из свойств сравнений следует, что наибольший общий делитель (г, т) = 1. Теорема 7.3.1 Лагранжа утверждает, что порядок эле- мента группы кратен порядку этой группы. Пусть k — порядок элемента г, т.е. г = 1 (mod т). Отсюда ф(/п) = k • d, где d — поло- жительное целое. Тогда /* (т) = /^ = 1 (mod т). Из х = г (mod т) следует, что л» (|и) = /* (m) (mod т), а значит, и х ф<т) a I (mod /и). • Теорема $. 7.2 Ферма. х р = х (modр), где /) — простое число; х — произвольное целое положительное число. Доказательство. Пусть х = 0 (mod р), тогда и х р = 0 (mod p). Пусть теперь х = г (modр), где re {1, 2,...,р- 1} и, значит, (г,р) = 1. Из теоремы Эйлера следует, что х*^ = 1 (mod р), где q>(p) =p-l. Отсюда х^ 1 = 1 (mod ^) и х р = 1 (mod /7). • Теорема 8. 7.3 Вильсона. (р-1)! + 1=0 (modр), где р — простое число. Доказательство. Пусть М„ = {1, 2,...,р- 1} — приведеннаясис- тема вычетов по модулю р. Мп является группой. Для любого л:е{1, 2,..., р - 1} существует единственный обратный элемент у е {1, 2,..., р - 1} такой, что х • у= 1 (mod/?). Заметим, чтох • х = 1 (mod;?) выполняетсятолькодлядвухэле- ментов: л; = 1 и х =р - 1. Действительно х 2 - I = (х- 1)(х + I) = = 0 (modp) равносильное - 1 = 0 (mod/)) илих + 1 = 0 (mod/)). От- сюда х = 1 или х =р - 1. Таким образом, обратными элементами к себе являются только х= их=р-1. Для любого из оставшихся элементов группы л: е {2, 3, ...,/> - 2} существует единственный обратный у е {2, 3,..., р - 2} такой, что ху= 1 (mod/)) и х*у. Тогда верно 2 • 3 •...• (р - 1) = 1 (mod/)). Ум- ноживпоследнеесравнениена 1 • (р- 1), получим 1 • 2 •...• (р-) = = (р-) = - (mod/)) или (р- 1)! + 1 = 0 (mod/)). Задача, Пусть/) — простое и hb H2,..., hn — целые числа. Дока- зать, что (A! +H2+...+hn У =h*+h p 2 +...+h p n (mod/)).
  • 234. 238 _ Глава 8. Элементы теории чисел Решение. Согласно теореме Ферма (8.7.2), hf =A,(mod/>), / = ,п. Свойства операции сравнения (см. п.8.4) позволяют запи- сать данные п сравнений hf =hj(modp) в виде их суммы: h { +h2 +...+h% = hi + h2 +...+ hn (mod/0- С другой стороны, верно и (Aj + А2 + ... + Н„У = AJ + А2 + ... + hn (mod p), что непосредственно вытекает из теоремы Ферма. 8.8. Функция Мёбиуса. Формула обращения Мёбиуса • Определение. Функция Мёбиуса ц(л) определяется для всех це- лых положительных я и равна 1, если л = 1, О, если n=p^pl*...plk и За,- >1, 1)*, если п^ где п =р" ' р%г . - .р^k — разложение на простые сомножители, pt — простые числа, а, — кратность pt в разложении. Пример. ц(1) = 1, ц(2) = -1, ц(3) = -1, ц(4) = 0, ц(5) = -1, ц(6) = 1, -1, ц(8) = 0, ц(9) = 0, и(Ю) = 1, ц(И) = -1, ц(12)=0, ц(14) = 1, ц(15) = 1, ц(16)=0, ц(17) = -1, ц(18) = 0 ц(20) = 0, ц(21) = 1 , ц(22) = 1, ц(23) = -1. • Лемма 8.8.1. Уц(Ю = {?' если п>1 > ^ [1, если и = 1, где суммирование идет по всем делителям d числа п. Доказательство. Если п = 1, то ^ц(б/)=ц(1)=1. Пусть теперь di п=р^р^2 •••/>£* Ф — разложение на простые сомножители. Тог- да £>(</) = £ц(</) = jrcr k (-IY =(1-1)* =0. Все делители d, для r=0 которых ц(йО ^ 0, имеют вид р^р^.^р^к ]i(p,1pil...p,r)=(-l) r . Количество таких делителей pt pi2 ...pir , выбираемых изр1 ,р2 ,..., pk , равно числу сочетаний Cr k .
  • 235. 8.8. Функция Мёбиуса. Формула обращения Мёбиуса _ 239 • Теорема 8.8.1. Формула обращения Мёбиуса: если /(«) = ^g(d то g(n) = £>(</)/(£), где/(л), g(n)— функции, определенные для всех целых поло- жительных п. Доказательство. Выполним подстановку /(4) в сумме • Заметим, что здесь число п неявно <Л« Л" »ф рассматривается в виде произведенияп = d • 5 • г, гдеделители dvi 5 принимают все допустимые значения независимо друг от друга и порядок суммирования не влияет на значение суммы, т.е. 5>(Л I>(5) = 2Хб 2>0)1 где £ ц(</) = °' ССЛИ «л* »»ф s« . ф это вследствие леммы 8.8.1. Тогда ц(</) = ' ' - </(f) I1 ' если е -я 5« Задача. Установить связь функций Эйлера ср(л) и Мёбиуса ц(л)- Решение. ^n(d) =п — свойство 4 функции Эйлера (см. п.8.7). d/n К данной сумме применим формулу обращения Мёбиуса: и, наконец, > = dn dn dn Например, для п = 6 имеем q>(6) = 2, вседелители </ е {1, 2, 3, 6}, |д(1) = 1, ц(2) = -1, ц(3) = -1, ц(6) = 1 и, наконец, выражение ^Г^= Х^^ в этом случае примет вид -+= ^ +^ +- dn Пусть п =р^1 ?2 г ---Р^ ~ разложение на простые множители. k ( Так как ф(и)=л-]~]] 1 — — свойство 3 функции Эйлера (см. /=Л Pi J п.8.7),Т о « . ] 1 - = и . £ или i=14 Л / <//л 1=14 Л У d/n
  • 236. Задачи и упражнения Комбинаторные схемы 1. Доказать комбинаторными рассуждениями (т.е. используя только определение числа сочетаний) тождества: я Ck -Ck 4-Г*"1 -а > Ч - 4-1 + 4-1 • 2. Доказать тождества: а) ЕС* =2"; А=О б) ЕЛ-С* ^"-^ д) Х(-1) А С* =0. k=0 т LL, '& Ь ^2, i^ 3. Доказать тождество £ £ Z • • • Z Z Z1 = -2=1 '2=1 4=1 '0=1 4. Доказать, что У ""' =- , п > 1. ' . п (2л)! (Зл)! (л 2 )! (2л)! 5. Доказать, что следующие числа: 2" ' 2"3"' л" 'л!(л +1)! являются целыми. 6. Доказать формулу бинома Ньютона (a + b)" = k " k 7. Найти число подмножеств множества М = {alt a2,..., an}. 8. Доказать, что ^Q 2 * =£c «2 *+1 =2n ~l . k k
  • 237. Задачи и упражнения 241 А п 9. Доказать, что ^С тС п =С п+ти ZXC *г ) =С 2п (теорема сложе- /•=0 *=0 ния). и и—t 10. Доказать равенство 11.ДоказатьравенствоХтЧ^*=2 ^'"1 . я 12. Доказать равенство ]Г(-1) тЦ-С* =-L . А=0 -2 i , 1 ^ л-А 13. Найти сумму 2] * -1 + -С„ . 14. Доказать тождество ^ =k", где суммирование рас- пространяется на все упорядоченные разбиения л на kслагаемых: л = Л! + л2 +... + nk , п > 0 — целые числа. 15. Из города А в город 5 ведут семь дорог, а из города В в город С — три дороги. Сколько возможных маршрутов ведут изА в Сче- рез город В? 16. Сколькими способами число 11" можно представить в виде трех сомножителей (представления, отличающиеся порядком со- множителей, считаются различными; 11° — сомножитель)? 17. Сколькими способами можно указать на шахматной доске 2л х 2л два квадрата — белый и черный? 18. Сколькими способами можно указать на шахматной доске In х 2л белый и черный квадраты, не лежащие на одной горизон- тали и вертикали? 19. Какое количество матриц можно составить из л строк и т столбцов с элементами из множества {0,1}? 20. Сколькими способами можно составить трехцветный флаг, если имеется материал 5 различных цветов? Та же задача, если одна из полос должна быть красной. 21. Надо послать 6 срочных писем. Сколькими способами это можно сделать, если любое письмо можно передать с любым из 3 курьеров? 22. У одного студента 7 книг, у другого 9 различных книг. Сколь- кими способами они могут обменять одну книгу одного на одну книгу другого?
  • 238. 242 Задачи и упражнения 23. Сколько различных словарей надо издать, чтобы можно было переводить с любого из данных п языков на любой другой язык этого же множества? 24. В правление избрано т человек. Из них надо выбрать предсе- дателя, заместителя председателя, секретаря и казначея. Сколь- кими способами можно это сделать? 25. У мамы 5 яблок, 7 груш и 3 апельсина. Каждый день в течение 15 дней подряд она выдает сыну по одному фрукту. Сколькими способами это может быть сделано? 26. У мамы т яблок и п груш. Каждый день в течение п + т дней подряд она выдает сыну по одному фрукту. Сколькими способа- ми это может быть сделано? 27. Найти число векторов а = (а^ а2,..., а„), координаты которых п удовлетворяют условию а, = {0, 1}, /= 1, 2,..., п, ^о, =г. i=i 28. У англичан принято давать детям несколько имен. Сколькими способами можно назвать ребенка, если ему дают не более трех имен, а общее число имен равно т? 29. Сколькими способами можно расставить белые фигуры: 2 коня, 2 слона, 2 ладьи, ферзя и короля на первой линии шахмат- ной доски? 30. Сколькими способами можно расставить k ладей на шахмат- ной доске размером п х т так, чтобы они не угрожали друг другу, т. е. так, чтобы никакие две из них не стояли на одной вертикали или горизонтали? 31. Сколькими способами можно посадить п мужчин и л женщин за круглый стол так, чтобы никакие два лица одного пола не сиде- ли рядом? Та же задача, но стол может вращаться и способы, переходя- щие при вращении друг в друга, считаются одинаковыми. 32. На школьном вечере присутствуют 12 девушек и 15 юношей. Сколькими способами можно выбрать из них 4 пары? 33. Пусть п (л > 2) человек садятся за круглый вращающийся стол. Два размещения будем считать совпадающими, если каж- дый человек имеет одних и тех же соседей в обоих случаях. Сколь- ко существует способов сесть за стол? 34. Хор состоит из 10 участников. Сколькими способами можно в течение трех дней выбирать по 6 участников, так, чтобы каждый день были различные составы хора?
  • 239. Задачи и упражнения 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. Сколькими способами можно разместить л одинаковых ша- ров по т различным корзинам при следующих условиях: а) пустых корзин нет; б) во второй корзине k шаров; в) в первых & корзинах соответственно alf a2 ,.., ak шаров?
  • 240. 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.2)1 55. Сколькими способами можно раскрасить квадрат, разделен- ный на девять частей, четырьмя цветами таким образом, чтобы в первый цвет были окрашены 3 части, во второй — 2, в третий — 3, в четвертый — 1 часть? 56. Определить коэффициент с в одночлене сх^х^х] после разло- жения выражения (xl +х2 + х3 ) 10 и приведения подобных членов. 57. Сколько делителей имеет число q =р* 1 р^ г ...р%", где/?, —про- стые числа, не равные единице, а,- — некоторые натуральные чис- ла? Чему равна сумма этих делителей? 58. Доказать, что в разложении числа п на простые сомножители простое число р входит с показателем /" =Иг +Ну +гт +••• • 59. Из выбранных k различных чисел от 1 до л составляют произ- ведение, k фиксировано. Какое количество полученных таким образом произведений делится на простое число р < п? 60. Сколько можно составить перестановок из п элементов, в ко- торых данные т элементов не стоят рядом в любом порядке? 61. На шахматную доску п х п произвольным образом поставили две ладьи — черную и белую. Что вероятнее: ладьи бьютдругдруга или нет?
  • 241. Задачи и упражнения 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.2)1 69. Каких чисел больше среди первого миллиона: тех, в записи которых встречается 1, или тех, в записи которых ее нет? 70. Пусть числа 1, 2,..., л расположены подряд по кругу- Двигаясь по кругу, вычеркиваем каждое второе число. Показать, что по- следнее не вычеркнутое число равно 2л-2 [1 ° 82 " 1+1 +L 71. Сколькими способами можно число п представить в виде сум- мы k слагаемых (представления, отличающиеся лишь порядком слагаемых, считаются различными), если: а) каждое слагаемое является целым неотрицательным числом; б) каждое слагаемое — натуральное число? 72. Какова таблица инверсий для перестановки 271845936? 73. Какой перестановке соответствует таблица инверсий 50121200? 74. Пусть перестановке а^.-.а,, соответствует таблица инверсий dld2.-.dn. Какой перестановке тогда будет соответствовать следую- щая таблица инверсий (и - 1 - d^)(n - 2 - d2)...(О - dn)?
  • 242. 246 Задачи и упражнения 75. На окружности произвольным образом отмечают п точек бук- вой Nnm точек буквой М. На каждой из дуг, на которые окруж- ность делится выбранными точками, ставят числа 2 или 1/2 сле- дующим образом: если концы дуги отмечены буквой N, то ставят число 2; если концыдуги отмечены буквой М, то ставят число 1/2; если же концы дуги отмечены различными буквами, то ставят число 1. Доказать, что произведение всех поставленных чисел равно 2""". 16. Сколькими способами можно распределить 3« различных книг между тремя лицами так, чтобы числа книг образовывали арифметическую прогрессию? 77. Рассматриваются всевозможные разбиения nk элементов на п групп по k элементов в каждой, причем разбиения, отличающие- ся друг от друга только порядком элементов внутри групп и по- рядком расположения групп, считаются совпадающими. Сколь- ко существует различных таких разбиений? 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 человек. Сколькими способами они могут вый- ти на четырех этажах так, чтобы на каждом этаже вышел, по край- ней мере, один человек?
  • 243. Задачи и упражнения 247 86. Доказать, что число упорядоченных разбиений числа л на k натуральных слагаемых, т. е. число решений уравнения п = xl + + х2 + ... + xk, Xj > 0, / = 1,2,..., k, равно С*Г/, а общее число упоря- доченных разбиений для различных k равно 2"" 1 . 87. Сколькими способами можно разложить п различных шаров по k различным корзинам так, чтобы в первую корзину попало п^ шаров, во вторую корзину попало п2 шаров и т.д., в k-ю корзину попало nk шаров, где п = п^ + п2 +... + nk? 88. Сколько существует чисел от 0 до 10", которые не содержат две идущие друг за другом одинаковые цифры? 89. Сколько существует натуральных л-значных чисел, у которых цифры расположены в неубывающем порядке? 90. Сколько существует натуральных чисел, не превышающих 10", у которых цифры расположены в неубывающем порядке? 91. Сколькими способами можно расставить п нулей и k единиц так, чтобы никакие две единицы не стояли рядом? 92. Город имеет вид прямоугольника, разделенного улицами на квадраты. Число таких улиц в направлении с севера на юг равно п, а в направлении с востока на запад — k. Сколько имеется крат- чайших дорог от одной из вершин прямоугольника до противопо- ложной? 93. Как разбить квадратное поле на участки так, чтобы высеять на нем т сортов пшеницы для сравнения урожайности этих сортов, исключающего влияние изменения плодородия в пределах участ- ка? Считаем, что плодородие убывает при удалении от одной сто- роны поля (неизвестно, какой именно) к противоположной. 94. Бросают т игральных костей, помеченных числами 1, 2, 3, 4, 5, 6. Сколько может получиться различных результатов (результа- ты, отличающиеся порядком очков, считаются одинаковыми)? 95. Имеем т различных шаров и А:различных корзин. Сколькими способами можно разместить предметы по корзинам, допускают- ся пустые корзины? 96. Имеем т различных шаров и & различных корзин. Сколькими способами можно разместить предметы по корзинам, пустые корзины не допускаются? Указание: воспользоваться правилом включения и исключения. 97. Найти число способов разложения т шаров по k корзинам так, чтобы г корзин остались пустыми. Указание: воспользоваться правилом включения и исключения.
  • 244. 248 Задачи и упражнения 98. Имеем т различных шаров а±, а2,..., ат и столько же различных корзин #!, k2,..., km. Сколькими способами можно разместить предметы по корзинам так, чтобы никакой предмет а, не попал в корзину kj (допускаются пустые корзины)? Указание: воспользова- ться правилом включения и исключения. 99. Задача о беспорядках. Имеем т различных шаров alt a2,..., ат и столько же различных корзин kl; k2,..., km. Сколькими способами можно разместить предметы по корзинам так, чтобы никакой предмет о, не попал в корзину &,, пустые корзины не допускают- ся? Указание: воспользоваться правилом включения и исключения. 100. Найти число перестановок т шаров, в которых ровно г эле- ментов остаются на месте. Указание: воспользоваться правилом включения и исключения. 101. Доказать, что г различных вещей можно разделить между п +р людьми так, чтобы данные п людей получили, по крайней мере, по одному предмету, способами С®(п + р) г -С*(п + р-1) г + +С%(п + р-2) г -...+(-1)"С%(п+р-п) г . Указание: воспользоваться правилом включения и исключения. 102. Рыцарские переговоры. К обеду за круглым столом приглаше- ны п пар враждующих рыцарей, п > 2. Требуется рассадить их так, чтобы никакие два врага не сидели рядом. Показать, что это мож- но сделать ]Г(-1)*С^2*(2л-А:)!способами. Указание:воспользова- *=о ться правилом включения и исключения. 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. На одной из кафедр университета работают тринадцать чело- век, причем каждый из них знает хотя бы один иностранный язык. Десять человек знают английский, семеро — немецкий, ше-
  • 245. Задачи и упражнения 249 стеро — французский. Пятеро знают английский и немецкий, четверо — английский и французский, трое — немецкий и фран- цузский. Найти: а) сколько человек знают все три языка; б) сколь- ко знают ровно два языка; в) сколько знают только английский? 108. Имеются Зл + 1 предметов (п одинаковых, остальные различ- ны). Доказать, что из них можно извлечь п предметов 2 2 " способами. 109. Применяя формулу включения и исключения, определить количество целочисленных решений системы уравнений и нера- венств: AC, + х2 +... + хп = г, я,- < Xj <bhi=l,n, ah xh bj — целые числа. 110. Определить количество целочисленных решений системы х{ + х2 + *3 = 40, х: > 3, х2 > О, х3 > 2. 111. Компания, состоящая из 10 супружеских пар, разбивается на 5 групп по 4 человека для лодочной прогулки. Сколькими спосо- бами можно разбить их так, чтобы в каждой лодке оказались двое мужчин и две женщины? 112. Имеем п предметов, расположенных в ряд. Сколькими спо- собами можно выбрать из них три предмета так, чтобы не брать никаких двух соседних элементов? 113. Даны 2п различных предметов а1; als a2, в},--, оп, ап. Сколько существует перестановок из этих In предметов, в которых не сто- ят рядом одинаковые элементы? 114. В шахматной олимпиаде участвуют представители п стран по 4 представителя от каждой страны. Сколькими способами они могут встать в ряд так, чтобы рядом с каждым был представитель той же страны? 115. Имеется п одинаковых вещей и еще п различных вещей. Ско- лькими способами можно выбрать из них п вещей? Сколькими способами можно упорядочить все In вещей? 116. Найти число способов распределения In одинаковых шаров по двум неразличимым корзинам. 117. В каждой клетке шахматной доски размером п х п поставили число, указывающее количество прямоугольников, в которые входит эта клетка. Чему равна сумма всех поставленных чисел? 118. Найти число расстановок владей так, чтобы они не били друг друга, на доске п х л (см. случаи а, 6, в) с выколотыми или добав- ленными клетками. В случае в) использовать п ладей.
  • 246. 250 _ Задачи и упражнения Производящие функции и рекуррентные соотношения 119. Найти производящую функцию последовательности {2(п - 5) + 7" +2 }. 120. Применить технику производящих функций для нахождения суммы чисел 1 + 2 3 + ... + л . 121. Решить рекуррентные соотношения: !) "я+2 - 4ия+1 + Зм « = °. "о = 8 . «1 = 10 ; 2) ил+3 - Змл+2 + мл+1 - Зил = 0, м0 = 1, M! = 3, и2 = 8; 3) «п+2±9м„ = 0, м0 = 1, H! = O; 4) ил+4 ±4«л =0, м0 = 1, «! = 1, и2 = 1, и3 = 1; 5 ) «л+з + «„+2 - "„+1 - «„ = 0, м0 = 1, M! = 2, и2 = 3; 6) ы„+2 - 4м„+1 + 4м„ = 0, м0 = 1, M! = 2. 122. Решить неоднородные рекуррентные соотношения: !) "т-1 =м « +л > M O = I ; 2) «п+2 = -2«n+i + 8м„ + 27 • 5л, н0 = 0, м, = - 9; 3) ип+2 - Змл+1 + 2м„ = п, и0 = 1, M! = 1; 4) м„+2 - 4мл+1 + 4и„ = 2", н0 = 1, M! = 2; 5) и„+2 = мл+1 - -м„ + 2~", «0 = 1^! = 3/2; 6) ыл+2 - Змл+1 + 2м„ = (-!)", м0 = 1, Mj = 2. 123. Последовательность Фибоначчи {м„} задается рекуррентным соотношением мл+2 = мл+1 + м„, «0 = 1, MJ = 1. Найти мл ; показать, что мл и мл+ 1 — взаимно простые числа и мл делится на ит , где л = т • k. 124. Найти общее решение рекуррентных соотношений: !) «п+ 2 = "«+ 1 - 4 М « > 2) мл+2 - 4ил+ 1 + Знл = 0; 3) ип+ 2 ~ »п+1 - "м = 0. 125. Найти решение системы рекуррентных соотношений: _ _ -1Л h - ( ° ' ° 126. Найти число решений уравнениях + 2у = п, где х, у, п s Z + — положительные целые числа; х, у — неизвестные. 127. Найти число решений уравнения х + 2у + 4z = п, х, у, п е Z+ , х, у, z — неизвестные.
  • 247. Задачи и упражнения 251 128. Найти определитель матрицы fa + p a(3 1 а + р ар 1 а + р ар а + Р ар где а, р — произвольные числа; вне обозначенных диагоналей матрицы располагаются нули. 129.Вычислитьсумму^(1/2*),гдесуммированиепроизводится по всем натуральным k, не кратным 2, 3 и 5. 130. Найти ладейный многочлен запрещенных позиций для до- сок а) и Ь) идля каждого из этих случаев составить многочлен по- паданий. Для доски с) составить многочлен запрещенных пози- ций. Для досок а), Ь) и с) найти число расстановок трех ладей на запрещенных позициях. 131. Найти число способов расставить 5 ладей на доске 5 x 5 так, чтобы ни одну из них не бил слон. Позиция слона указана на до- ске d) символом «с». 132. Найти число способов расставить 5 ладей на доске 5 x 5 так, чтобы ни одну из них не бил конь. Позиция коня указана на доске d) символом «к». 133. Найти число замкнутых маршрутов длины 2л по ребрам гра- фа для случаев а), Ь) и с). Длина ребра равна 1. Начало и конец пути есть вершина А. в с А а) В С В A D с) л~-^с ь) *"--д Е
  • 248. 254 Задачи и упражнения 163. Найти хроматическое число л-вершинного дерева, п > 1. 164. Доказать, что в компании из 6 человек всегда найдутся либо трое знакомых друг с другом, либо трое друг с другом не знако- мых. 165. Доказать, что при любой раскраске ребер полного 6—графа в два цвета найдется монохроматический 3—граф. 166. Рассмотрим граф М„ Муна-Мозера с Зл вершинами {1,2,..., Зл}, в котором вершины разбиты на триады {1, 2, 3}, {4, 5, 6}, ...,{3л - 2, Зл - 1, Зл}; Мп не имеет ребер внутри любой триады, но вне их каждая вершина связана с каждой из остальных. Докажите (по индукции), что М„ имеет 3" клик. 167. Показать, что в графе с л вершинами и с А; компонентами связности число ребер не более ((л - k)(n - k+ l))/2. 168. Докажите, что если в графе все вершины имеют четные сте- пени, то в этом графе нет мостов. Указание: допустить, что суще- ствует мост; удалить это ребро—мост и показать, что полученный граф будет противоречить условию задачи. 169. Разобьем плоскость на конечное число частей прямыми ли- ниями. Докажите, что полученная карта имеет хроматическое число равное двум. Указание: для доказательства воспользуйтесь индукцией по числу прямых. 170. Для каждого графа а) и б) найти остовное дерево, используя программную реализацию жадного алгоритма (алгоритм 6.7) п алгоритма ближайшего соседа (алгоритм 6.9). На каждом шаге ал- горитмов отобразить состояние используемых структур данных. xl 20 х2 х] 7 171. Найти кратчайшие пути от вершины х$ до всех остальных вершин ориентированного графа (см. рис. на следующей страни- це).
  • 249. Задачи и упражнения 255 41 172. Пусть Л* =[й!Л) 1 i,j= l,n обозначает k-ю степень матрицы смежности орграфа. Доказать, что элемент а^ данной матрицы равен количеству маршрутов длины k из вершины х, в ху . Указание: при доказательстве воспользоваться индукцией по числу k. 173. Выполнить хроматическое разложение графа. Найти все клики, фундаментальное множество циклов, листы, блоки и мос- ты. Определить центры, радиус и диаметр графа. 174. Сколь много ребер может иметь n-вершинный граф, у кото- рого степень всякой вершины не превосходит d? 175. Показать, что в дереве с нечетнымдиаметром любые две про- стые цепи наибольшей длины имеют хотя бы одно общее ребро. 176. Пусть корневое дерево с п (п > 2) висячими вершинами не имеет вершин степени 2, отличных от корня. Показать, что общее число вершин дерева не превосходит 2л - 1. 177. Доказать, что дерево обладает единственным центром в слу- чае, когда его диаметр есть число четное, и обладает двумя цент- рами, когда диаметр есть нечетное число. 178. Доказать, что в любом дереве с п > 2 вершинами имеется не менее двух висячих вершин. 179. Вершины графа Гпронумерованы в порядке возрастания их степеней. Доказать, что если k — наибольшее число, такое, что k < d(xk) + 1, то х(Л =s k, где d(xk) — степень вершины xk. 180. Доказать, что если для любых двух вершин х и у связного л-вершинного графа выполняется d(x) + d(y) > п, то граф имеет гамильтонов цикл.
  • 250. 256 Задачи и упражнения 181. Используя алгоритм чередующихся цепей (см. п.6.14.3), рас- ширить заданное начальное паросочетание в двудольном графе Г- (F! u V2, U, Ф) до максимального паросочетания, где V{ = {slt s2, s3, ,y4, s5, s6} и V2 = {I, 2, 3, 4, 5, 6}, смежные вершины в графе: Sl - {I, 2, 3}, s2 - {1, 2}, s3 - {I, 2}, s, - {I, 2, 3, 4}, s5 - {I, 2, 4, 5}, s6 — {I, 2, 3, 5, 6} и начальное паросочетание л = {(sb 1), (s2, 2), (s4 , 3), (s5 , 4), (s6 , 5)}. 182. Используя алгоритм чередующихся цепей (см. п.6.14.3), рас- ширить заданное начальное паросочетание в двудольном графе Г= (F! u V2, U, Ф) до максимального паросочетания, где V{ = {sb s2, ,УЗ, ^4> S 5> S 6> -s 1 ?} и ^2 = (1) 2, 3,4, 5, 6, 7}; смежные вершины в гра- фе:Sl - {1, 2}, *2 - {2, 5, 6}, J3 - {5}, *4 - {!» 2, 5}, *5 - {3, 4, 5, 6}, s6 — {4, 5, 7}, s7 — {5, 6}, и начальное паросочетание я = {(jb 1), (s2 , 2), (53 , 5), (s5 , 3), (J6 , 7), (^7 , 6)}. 183. Перераспределить заданный начальный поток по транспорт- ной сети и), б) и в) так, чтобы он стал максимальным, а сеть — на- сыщенной(см. п.6.10). Найти все разрезы транспортной сети и их мощности, сравнить мощность минимального разреза с найден- ным максимальным потоком.
  • 251. Задачи и упражнения 257 184. Решить задачи о назначениях максимального выбора а) 2 8 1 8 9 12 6 7 5 7 11 9 4 2 3 1 1 9 7 4 4 2 3 4 1 3 3 0 3 5 2 5 3 1 6 7 б) 10 7 17 2 9 15 1 18 11 14 11 14 16 8 6 2 8 16 3 1 9 6 15 5 10 185. Решить задачи о назначениях минимального выбора а) 4 13 9 12 6 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 9—2697
  • 252. 258 Задачи и упражнения 186. Фирма по перевозке грузов должна забрать пять контейнеров в пунктах района края А, В, С, D, Еи доставить их в пункты а, Ь, с, d, e. Расстояния в километрах между пунктами загрузки и пункта- ми назначения контейнеров приведены ниже: А-а 60 В-Ь 30 С-с 100 D-d 50 Е-е 40 Фирма располагает пятью грузовиками двух типов Хи Гна сто- янках S, Т, U, V, W. Три грузовика типа ^находятся на автостоян- ках S, U, Vw.два грузовика типа Гнаходятся на автостоянках Т, 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
  • 253. Задачи и упражнения 259 Компания хочет организовать полеты туда и обратно так, что- бы минимизировать время простоя при условии, что каждому са- молету требуется 1 час для дозаправки. 188. Авиалиния связывает три города А, В, С. Полеты происходят семь дней в неделю согласно расписанию: Вылет Город А А А А А А В В В В С С Прибытие Время 8.00 9.00 10.00 14.00 18.00 20.00 7.00 9.00 13.00 18.00 9 . 0 0 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. Показать, что Gl = {nn & Z} — группа с операцией сложения чисел, где Z— множество целых чисел; G2 = {2л | « е Z} — группа с операцией сложения чисел; G3 = {2" п е Z} — группа с опера- цией умножения чисел; G$ — множество квадратных матриц по- рядка л, определитель которых не равен нулю, является группой с операцией умножения матриц; G5 — множество ортогональных матриц порядка п является группой с операцией умножения мат- риц; G6 = {1, —1} — группа с операцией умножения чисел; G1 — множество рациональных чисел является группой относительно операций сложения и умножения (без нуля); (78 — множество ве- щественных чисел является группой относительно операций сло- жения и умножения (без нуля). Установить, какие из групп явля- ются подгруппами других групп.
  • 254. 260 _ Задачи и упражнения 190. Пусть М— подмножество группы Он Va, b еМвыполняется ab~{ е М . Показать, что М— подгруппа. 191. Пусть (?!, G2 — группы и отображение/: G{ -» G2 — гомомор- физм. Показать, что ядро и образ гомоморфизма являются под- группами. 192. Пусть GI = {х е R+ } и G2 = {х е R}, где R+ — положительные вещественные числа, R — вещественные числа. Показать, что Gl — группа с операцией умножения, G2 — группа с операцией сложения. Рассмотрим отображение ф : G{ -> G2 такое, что Vx e Gi ф(х) = 1п(х) е G2 . Показать, что ф — изоморфизм групп. 193. Пусть G — группа и г е G — фиксированный элемент. Опре- делим отображение ф : G -» G формулой Vg e G(p(g) = r~l gr. Дока- жите, что ф — изоморфизм группы на себя. 194. Докажите, что если порядок группы G равен In и Н — под- группа порядка « группы G, то Н — ее нормальный делитель. 195. Доказать, что если в квадратной матрице порядка п содер- жится нулевая подматрица размера rx.snr+s>n, то определи- тель матрицы равен нулю. 196. Найти порядок группы, порожденной подстановкой 12345} 2 3 4 5 lj' 197. Разложить подстановки (3 2 4 7 5 6 i s) и (? 6 2 ? 4 з 5J в про- изведение независимых циклов и в произведение транспозиций, определить их четность. 198. Пусть Н е S^, где 54 — симметрическая группа. Будет ли Н подгруппой в следующих случаях: ян ffl 2 3 4W1 2 3 4W1 2 3 4Wl 2 3 4a > a -(l 2 3 4Д2 1 4 ЗДЗ 4 1 2J'U 3 2 l fi^y ff -If1 2 3 4Wl 2 3 4Wl 2 3 4Wl 2 3 4 °> H -(l 2 3 4>U 3 1 4>U 1 2 4>U 4 1 199. Пусть G — циклическая группа, G = т. Показать, что число образующих группы равно ф(/и) — функция Эйлера. 200. Пусть G — циклическая группа. Показать, что элементы группы одинакового порядка являются образующими одной и той же подгруппы Не G. 201. Пусть G — группа порядка G=p,p — простое число. Пока- зать, что G — циклическая группа. 202. Показать, что циклическая группа — коммутативна. ( (
  • 255. Задачи и упражнения 261 203. Пусть G — группа. Показать, что для всякого g е G найдется такое целое k, что g = e. 204. Показать, что число образующих циклической группы G = {g, g*,...,/' = е} равно значению функции Эйлера ср(л) — количество чисел из множества {1,2,...,л-1} взаимно простых с и. 205. Пусть G — конечная абелева группа порядка G = р^р^2 ... />"*, r№p,,p2,...,pk — простые различные числа; множество А(р) =К = (х е G x | =ра }, где <х принимает произвольные целые значе- ния. Показать, что А(р) — подгруппа. 206. Пусть Gb G2, — коммутативные группы порядков G{ = 56, |G2 = 64. Найти количество возможных прямых разложений каж- дой из групп на циклические подгруппы. 207. Определить множество левых и правых смежных классов симметрической группы S3 по подгруппе Н, где Н— циклическая подгруппа с образующим элементом ^ | Доказать что Н — нормальный делитель. 208. Найти цикловой индекс группы самосовмещений (автомор- физмов), действующей на множестве а), б), в), г). Отдельно рас- смотреть случаидействия группы на плоскости и в пространстве. V 209. Применить теорему Пойа для определения количества воз- можных раскрасокдвумя и тремя красками вершин графов а), б), в), г) предыдущей задачи. 210. Используя теорему Пойа, найти количество различных оже- релий, которые можно составить из четырех бусинок пяти цветов. Рассмотреть отдельно варианты, когда группа самосовмещений (автоморфизмов) действует на плоскости и в пространстве. Алгоритмы и графы 211. Задача о стоянке. На некоторой улице с одностороннимдви- жением имеется п мест для стоянки автомобилей, расположен- ных в ряд и перенумерованных от 1 до т. Муж везет в автомобиле
  • 256. 262 Задачи и упражнения жену. Внезапно жена просыпается и требует остановиться. Он послушно останавливается на первом свободном месте. Если нет свободных мест, к которым можно подъехать, не поворачивая об- ратно (т.е. если жена проснулась, когда машина достигла k-то ме- ста для стоянки, но все «позиции» k, k+ 1,..., т заняты), то муж приносит свои извинения и едет дальше. Предположим, что это происходит с я различными машинами, причему'-я жена просыпается в момент, когда машина находится перед местом а/. Сколько имеется таких последовательностей а1; а2,...,а„, при которых все машины удачно припаркуются, предпо- лагается, что первоначально улица пуста и никто со стоянки не уезжает? Составить алгоритм—программу вычисления всех воз- можных перестановок alt a2,..., ап и соответствующие им располо- жения автомобилей. Исходные данные — т, п. Например, если т = п = 9 и (а{, а2,..., а„) = (3, 1, 4, 1, 5, 9, 2, 6, 5), то автомобили расположатся следующим образом: 2, 4, 1, 3, 5, 7, 8, 9, 6. 212. Фальшиваямонета. Банк «Золотой Ящик» получил информа- цию, что в последней партии из п монет ровно одна монета фаль- шивая и отличается от других монет по весу. Для определения фа- льшивой монеты кассиру выдали только аптечные весы без гирь. Первым шагом кассир перенумеровал все монеты от 1 до п. Таким образом, каждая монета получила уникальный номер — целое число. После этого он начал взвешивать различные группы монет по составу, отмечая, какие из них больше, меньше или равны. Ваша задача — написать алгоритм—программу, которая по ре- зультатам взвешиваний, выполненных кассиром, определит фа- льшивую монету или определит, что этого нельзя сделать. Текстовый файл входных данных содержит следующую ин- формацию. Первая строка файла содержит два целых числа п и k, разде- ленных пробелами, где я — число монет в партии (п > 2) и k— чис- ло взвешиваний, выполненных кассиром. Следующие Ik строк файла описывают результаты взвешивания. Каждое взвешивание представляется двумя строками файла. Первая из них начинается числомpt (!</?,< я/2), которое обо- значает число монет, участвовавших при взвешивании на каждой чашке весов. Следующие PJ чисел на этой же строке файла явля- ются номерами монет, которые располагались на левой чашке ве- сов, и последниеpi чисел на этой же строке файла являются номе- рами монет, которые располагались на правой чашке весов.
  • 257. Задачи и упражнения 263 Вторая строка содержит один из знаков: <, > или =. • Знак < означает, что вес левой чашки меньше веса правой чаш- ки весов. • Знак > означает, что вес левой чашки больше веса правой чаш- ки весов. • Знак = означает, что вес левой чашки равен весу правой чашки весов. Ниже приведен пример файла входных данных. Результаты определения номера фальшивой монеты сохра- нить в текстовом файле. Если по выполненным взвешиваниям нельзя выявить фальшивую монету, то в качестве результата со- хранить 0. Ниже приведен пример файла результатов. ФАЙЛ ИСХОДНЫХ ДАННЫХ 5 3 2 1 2 3 4 < 1 1 4 1 2 5 ФАЙЛ РЕЗУЛЬТАТОВ ФАЙЛ ИСХОДНЫХ ДАННЫХ б 4 3 1 2 3 4 5 6 < 1 1 2 2 1 3 4 5 < 2 4 5 2 6 > ФАЙЛ РЕЗУЛЬТАТОВ О 213. Грядки. Садовый участок, имеющий прямоугольную формуй разбитый на квадратные клетки со стороной 1 метр, имеет шири- ну п и длину т метров. На этом участке вскопаны грядки. Грядкой называется совокупность клеток, удовлетворяющих условиям: • из любой клетки этой грядки можно попасть в любую другую клетку этой же грядки, последовательно переходя по грядке из клетки в клетку через их общую сторону; • никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам клеток (касание грядок по углам клеток допускается). Составьте алгоритм—программу расчета количества грядок на садовом участке. Исходные данные задаются в текстовом файле. В первой стро- ке располагаютсядва числа: п и т, разделенные одним или неско- лькими пробелами. Далее следуют п строк по т символов. Символ
  • 258. 264 Задачи и упражнения «#» обозначает территорию грядки. Символ «.» соответствует не- занятой территории. Других символов в исходном файле нет. В выходной текстовый файл вывести количество грядок на садовом участке. Пример файла исходных данных: 5 10 ## ## . # . . # . . . # . .### ## . .## ## #. Выходной файл для данного примера имеет вид: з. 214. Спуск с горы. 1 3 8 8 1 0 2 7 4 4 4 5 2 6 5 На рисунке показан числовой треугольник. Написать алго- ритм—программу, которая находит максимальную сумму чисел в вершинах треугольника при движении сверху вниз по ребрам тре- угольника, т.е. из каждой вершины можно двигаться вниз налево или вниз направо. Например, для данного треугольника маршрут движения по узлам 7,8,1,7,2 дает сумму 25. Результаты расчетов сохранить в текстовом файле. Исходные данные представлены в текстовом файле, имеющем следующую структуру. Первая строка: п — число уровней в треу- гольнике. Вторая и следующие строки содержат описание треуго- льника. Пример файла исходных данных: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Пример файла выходных данных: 30 7 3 8 7 5
  • 259. Задачи и упражнения 265 215. Перестановка корзин. Даны 2л корзин с шарамиЛ и В, распо- ложенные в ряд, как на рисунке (п < 5). ABBA ABAB Два места под корзины пустые. Другие п - 1 корзина содержат шары А и п - 1 корзина — шары В. Составьте алгоритм—программу, которая бы переставляла корзины с шарами А с одной стороны, а корзины с шарами В с другой стороны. Правила перемещения корзин: разрешается пе- реставлять на пустые места любые две смежные (пара) непустые корзины, сохраняя их первоначальный порядок. Исходные данные представлены в текстовом файле со следую- щей структурой. Первая строка: 2л — число корзин с пустыми ме- стами. Вторая строка: | Л | 2? | .Я | Л | | | Л | 5 | Л | .51— исходное расположение корзин. Расчетные данные сохранить в текстовом файле со следующей структурой. Каждая строка — состояние корзин после каждой перестановки. 216. Комнаты музея. Составьте алгоритм—программу определе- ния числа комнат в музее и площади каждой комнаты в клетках. План музея показан ниже на рисунке. 11 6 11 б 7 9 6 13 1 10 12 7 13 11 10 8 3 5 13 10 10 7 13 14 13 Цифровая карта Карта перекрытий Площадь музея состоит из клеток: л рядов и т столбцов. В каждой клетке такой матрицы (цифровая карта) проставляется число, в котором кодируется наличие стен уданной клетки. Значение чис- ла в каждой клетке является суммой чисел: 1 (клетка имеет стену на западе), 2 (клетка имеет стену на севере), 4 (клетка имеет стену на востоке), 8 (клетка имеет стену на юге). Например, если в клет- ке стоит число 11 (11 = 8 + 2+1), то клетка имеет стену с южной стороны, с северной и с западной. Исходные данные представляются в текстовом файле со сле- дующей структурой. Первая строка: п, т — размерность сетки. Вторая строка, третья и следующие строки содержат описание матрицы цифровой карты по строкам. Расчетные данные сохра- нить в текстовом файле со следующей структурой. Число в пер- вой строке — количество комнат в музее. Вторая строка — пло- щадь каждой комнаты.
  • 260. 266 Задачи и упражнения Пример файла исходных данных: 4 7 11 6 11 6 3 10 6 7 9 6 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. Первоначально все бокалы стоят дном вниз. Над бокалами можно выполнять операцию «пе- реворот». За один переворот ровно М(1 < М< N) любых бокалов переворачиваются так, что те бокалы, которые стояли дном вниз, оказываются перевернутыми вверх дном, а остальные из М бока- лов ставятся вниз дном. Составить алгоритм-программу, которая за минимальное ко- личество шагов позволяет перевернуть все бокалы вверх дном или определяет, что это сделать невозможно. Исходные данные N, Mзадаются в текстовом файле. Результа- ты последовательных переворотов сохранить в текстовом файле. 218. Течение воды. Все улицы в некотором городе имеют направ- ление с севера на юг (п улиц) или с запада на восток (т улиц), как на рисунке. Для каждого перекрестка улиц задается высота его над уровнем моря: H[i, j ] , i = l,M, j = ,N — матрица высот над уровнем моря. Требуется написать алгоритм—программу, кото- рый находит путь от перекрестка А до перекрестка В или в обрат- ном направлении. Путь должен проходить по таким улицам, ко- торые не ведут к возвышенностям (уровень при движении не дол- жен возрастать). м N Исходные данные представлены в текстовом файле со следую- щей структурой. Первая строка: М, N — размерность матрицы и
  • 261. Задачи и упражнения 267 улиц. Вторая строка: А = (iaja), B= (ib,jb) — координаты двух пе- рекрестков. Третья и следующие строки определяют значения элементов матрицы высот H[i,j}, i- ,M,j= ,N. Результаты рас- четов сохранить в выходном текстовом файле со следующей структурой. Каждая строка — координаты и высоты перекрест- ков, через которые пролегает маршрут. 219. Бомба. Требуется составить алгоритм—программу для опре- деления наименьшей окружности (центр и минимальный ради- ус), охватывающей не менее k из п заданных точек на плоскости. Исходные точки на плоскости (хь j>j), (jc2, у2),•••, (х„, уп) задаются в текстовом файле. Результаты расчетов (координаты центра окружности, радиус ее и точки (;с„ >>,), попадающие в окружность) сохранить в текстовом файле. Решите эту же задачу, но искомая окружность должна включать все заданные точки (х„ yt). 220. Ханойская башня. Задача о ханойской башне проиллюстриро- вана на следующем рисунке: А В С п- и Имеются три колышка А, В, С. На колышекА нанизано п дисков радиуса 1, 2,..., п (каждый с отверстием в середине) таким обра- зом, что диск радиуса /является /-м сверху. Задача состоит в том, чтобы переместить все диски на колышек Стаким образом, чтобы диск радиуса / был опять /-м сверху. За один раз разрешается пе- ремещать только один диск с любого колышка на любой другой (можно пользоваться колышком В). При этом должно выполня- ться следующее условие: на каждом колышке ни в какой момент никакой диск не может находиться выше диска с меньшим номе- ром. Составить рекурсивную алгоритм—программу требуемых перемещений дисков. Результаты расчетов: состояние каждого колышка на каждом шаге перекладывания дисков сохранять в текстовом файле. 221. Числа. Дана последовательность п различных между собой целых чисел аг , а2 ,..., а„. Трансформацией называется следующая последовательность действий: некоторые из чисел увеличивают-
  • 262. 268 Задачи и упражнения ся на 1, если в последовательности оказываются два одинаковых числа, то одно из них исключается из последовательности. Вы- полним данную трансформацию k раз, с целью достигнуть мини- мального количествачисел в последовательности а{, о2,..., а„. Со- ставить алгоритм—программу, которая вычисляет;? — количество чисел, оставшихся в последовательности. Исходные данные n,kw. последовательность а, а2,..., а„ задаются в текстовом файле. Най- денное число р сохранить в текстовом файле. Пример файла исходных данных: 5 2 7 1 15 8 3. Пример файла выходных данных: з. 222. Знакомства. Имеется п человек, где 1 < п < 1000. Каждому из них приписано некоторое число, которое определяет количество человек, с которыми ему предписано познакомиться. При этом знакомство взаимно, т.е. если человек с номером / знакомится с человеком с номерому, то и человек с номером./ знакомится с че- ловеком с номером /. Составить алгоритм—программу, задача ко- торой состоит в следующем. Необходимо организовать знаком- ства, чтобы после их реализации участники могли быть разбиты на 2 команды таким образом, что в первой команде находятся участники, знакомые друг с другом (каждый знает каждого), а во второй — только незнакомые (никто никого не знает). При этом численность первой команды должна быть максимальна. В слу- чае невозможности реализации знакомств в выходной файл запи- сать ответ «NO». Формат файла входных данных. В первой строке входного фай- ла находится число п. В каждой /-и из следующих п строк нахо- дится число — количество человек, с которыми необходимо пере- знакомиться человеку с номером /'. Формат файла выходных данных. В первой строке выходного файла находится численность первой команды или «NO». В слу- чае, если реализация знакомств возможна, то в каждой из следую- щих строк должны находиться 2 числа, разделенные пробелом — номера людей, которым необходимо познакомиться. Приведем примеры расчетов для конкретных исходных данных.
  • 263. Задачи и упражнения 269 Пример выходного файла:Пример входного файла: 3 1 2 1 3 1 4 2 3 223. Обмен. Каждому из п жителей одного городка шериф присво- ил личный номер — целое число от 1 до и и сообщил его, а затем поручил секретарше разослать по почте жетоны с личными номе- рами. Но она разложила их по конвертам случайным образом. Для восстановления порядка, когда у жителя находится жетон с его номером, необходимо организовать обмен жетонами. Каж- дый житель может обменять в один день жетон, который находит- ся у него, на другой только с одним другим жителем. В один день обмениваться жетонами могут любое количество пар жителей. Составить алгоритм-программу поиска минимального количе- ства дней т, необходимых для того, чтобы все жители получили свои жетоны. Формат файла входных данных. Первая строка содержит целое число п, 1 < п < 1000, равное количеству жителей городка. Следу- ющие п строк содержат по одному числу — номеру жетона, т.е. в (/+ 1)-й строке, соответствующей /-му жителю, находится номер того жетона, который он получил по почте. Выходной файл дан- ных содержит одну строку с найденным числом дней т. 224. Кокосы. В газетах 9 октября 1926 года сообщалось о корабле- крушении судна в Индийском океане. Пять человек и одна обезь- янка спаслись на необитаемом острове. В первый день пребыва- ния на острове они собирали кокосы. Среди ночи один из них проснулся и решил разделить кокосы. Он разделил кокосы на пять равных частей. Однако остался один кокос, который он от- дал обезьянке. Свою часть он взял с собой и пошел досыпать. Да- лее второй, третий, четвертый и пятый поступили аналогичным образом и каждый раз оставался один кокос, который они с удо- вольствием отдавали обезьянке. Напрашивается вопрос: сколько было кокосов? Однако мы решим несколько другую задачу (об- ратную). Составить алгоритм—программу поиска максимально возможного числа людей и одной обезьянки, которые могут про- делать рассмотренную ночную операцию, если изначально изве- стно количество собранных кокосов?
  • 264. 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 — интервал про- должительности времени в секундах непрерывного цвета свето- фора: зеленого, желтого и красного. Результаты расчетов допустимых целочисленных скоростей движения Фила сохра- нить в выходном текстовом файле:
  • 265. Задачи и упражнения 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, 32, 33, 36, 37, 38, 41, 42, 43, 44, 45, 48,49,50,51,52,53,54,59,60 0 — признак отсутствия такой скорости. 226. Парламент. Парламент состоит из N делегатов. Делегаты должны разделиться на группы (фракции), количество депутатов в каждой группе отличается от количества депутатов в любой дру- гой группе. Каждый день каждая фракция посылает одного пред- ставителя в президиум. Парламент начинает работу в том случае, когда состав президиума отличен от составов президиумов пре- дыдущих дней. Составьте алгоритм—программу, которая бы определяла опти- мальное число фракций и количество делегатов в каждой из них так, чтобы парламент мог работать как можно дольше. Число де- легатов задается в исходном текстовом файле. Рассчитанные зна- чения количества делегатов в каждой фракции, сортированные по возрастанию, сохранить в выходном текстовом файле. Приве- дем примеры оптимальных расчетов для N=7 и N=31. Файл исходных данных 7 31 Файл выходных данных 3 4 2 3 5 6 7 8 227. Кот и Лиса. Дан ориентированный граф Г= (X, U, Ф), верши- ны которого являются позициями в следующей игре. Участвуют два игрока — Кот и Лиса. Они двигают фишку из позиции в пози- цию по дугам графа. Множество позиций .^разделено на два под- множестваХ= К<и Л. В позициях Л'ход делаетЛиса, а в позициях К— Кот. Если игра находится в позиции х е X, владелец этой по- зиции выбирает произвольную выходящую дугу (х, у) е С/и двига- ет фишку из х в у. Игра начинается в некоторой позиции. Лиса выигрывает, если фишка оказалась в фиксированной вершине Z 6 X. Если за любое количество ходов фишка не попадает в эту позицию z 6 X, то выигрывает Кот.
  • 266. 272 Задачи и упражнения Составить алгоритм—программу, которая определяет все вы- игрышные стартовые позиции для Лисы при оптимальной стра- тегии обеих сторон. Считаем, что Х={1, 2,..., п), <п< 1000. Исходные данные представлены в текстовом файле, имеющем следующую структуру. Первая строка: п, т, z, где п — число вершин, т — число дуг, Z — заключительная позиция. Со второй строки записаны: Ь1} Ь2,..., Ъп и ху± х^ ... х„ут, где bj=l, если вершина i принадлежит Лисе; bt = 0, если вершина i принадлежит Коту; xyt — список дуг графа, х, — начальная вер- шина, У! — конечная вершина соответствующей дуги. Все параметры — целые числа, разделенные пробелами. Пример входного файла: 7 12 7 0 1 0 0 0 1 0 1 2 1 4 1 3 2 4 2 5 3 1 3 6 3 7 4 3 4 6 5 6 6 7 Результат представить в текстовом файле, в котором записать п целых чисел с1г с2 ,..., с„, где с, = 1, если позиция /выигрышнаядля Лисы; иначе с, = 0. Для примера результаты расчетов представляются строкой: 0 1 0 0 1 1 1 228. Ящик с молоком. Ящик имеет п х п ячеек для бутылок с моло- ком. Мистер Смитдля каждого столбца и каждой строки заготовил отдельный листок бумаги, где записал наличие или отсутствие в ячейке бутылки молока: 1 — ячейка занята молоком, 0 — ячейка не занята молоком, но забыл проставить на каждом листе чему он соответствует: строке или столбцу и все это вложил в коробку. В пути ящик попал под дождь, и часть записей на листах пропала. Испорченные цифры 1 и 0 были заменены цифрой 2. Составить алгоритм—программу, которая по таким записям восстанавливает исходное расположение бутылокс молоком, т.е. определить, какие записи относятся к строкам, а какие — к столбцам. Исходные ис- порченные записи по строкам и столбцам задаются в текстовом файле. Результаты сохранить в текстовом файле.
  • 267. Задачи и упражнения 273 Пример. Исходные данные 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 01210 21120 21001 12110 12101 12101 00011 22222 11001 10010 Восстановленные 6 Q 3 2 8 4 1 1 1 1 0 данные 1 10 0 1 1 1 0 1 0 0 1 0 7 0 0 0 1 1 5 1 1 1 0 1 229. Длина объединения. Текстовый файл содержит целые числа: «!, 6j, о2 ! Ь2 ,..., а„, Ьп . Эта последовательность определяет на оси ОХп отрезков. Составить алгоритм—программу, которая опреде- ляет длину объединения всех отрезков. Результаты расчетов со- хранить в текстовом файле. Исходные данные представлены в текстовом файле со следующей структурой. Первая строка: п — количество отрезков. Вторая строка, третья строка и т.д: a,, bt — параметры соответствующего отрезка. Результаты расчетов со- хранить в текстовом файле. Пример файла исходных данных: з О 2 -1 1 О 1. Пример файла выходных данных: з. 230. Площадь объединения. Условие данной задачи — это условие предыдущей задачи, где вместо отрезков на прямой рассматрива- ются прямоугольники на плоскости, стороны которых паралле- льны осям координат. Составить алгоритм—программу определе- ния площади объединения таких прямоугольников. 231. Прямоугольные области. Условие данной задачи — это усло- вие предыдущей задачи. Однако требуется составить алго- ритм—программу определения количества областей, на которые границы прямоугольников разбивают плоскость.
  • 268. 274 Задачи и упражнения 232. Несвязные области. На плоскость ХОYпроизвольным обра- зом размещают 7Vпроизвольных прямоугольников со сторонами, параллельными осям координат. Взаимное расположение прямо- угольников допускает их пересечение. Требуется составить алго- ритм—программу определения количества несвязных областей, на которые прямоугольники разбивают плоскость XOY. Входные и выходные данные. В первой строке входного файла содержится число N. В каждой из следующих Nстрок располагаются коорди- наты одного прямоугольника: (я,, Ь,) — координаты левого верх- него угла; (с/, d,) — координаты правого нижнего угла. Выходной файл должен содержать единственное число, равное количеству несвязных областей. Пример файла исходных данных: б 1 3 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 3 3 4 3 4 3 5 3 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 2 1 0 0 1 2 3 1 2 2 3 2 0 0 2 2 3 2 2 3 2 0 0 2 3 2 3 4 3 0 0 2 3 3
  • 269. Задачи и упражнения 275 4 0 4 1 4 1 4 2 5 0 5 1 5 1 5 2 5 2 5 3 Пример файла результатов: 11 — площадь участка 234. Совмещение ломаных. Две ломаные построены по ребрам се- точной области с целочисленными координатами. Требуется со- ставить алгоритм—программу проверки совпадения двух лома- ных, составленных из отрезков, с точностью до параллельного переноса и поворота на 90°, 180°, 270°. Исходные данные — число отрезков ломаных и значения координат их концов — определя- ются в текстовом файле. Выходной файл результатов должен со- держать признак 1, если ломаные совпадают, и 0 — в противном случае. Пример файла исходных данных: 4 — количество отрезков первой ломаной 0 0 1 0 3 0 2 0 1 0 2 0 3 0 3 1 2 — количество отрезков второй ломаной 1 1 1 4 0 4 1 4 Пример файла результатов: 1 — ломаные совпадают. 235. Деление на равные половины. Текстовый файл содержит по- следовательность целых чисел — веса элементов: а^, а2 ,..., а„. Со- ставить алгоритм—программу деления этих предметов на две группы так, чтобы общие веса двух групп были максимально близкими друг к другу. Результаты расчетов сохранить в тексто- вом файле. Исходные данные представлены в текстовом файле со следующей структурой. Первая строка: п — количество чисел. Следующие строки содержат веса элементов а/. Пример файла исходных данных: 5 6 3 1 4 5 . Пример файла выходных данных: б 3 1 — первая группа 4 5 — вторая группа. 236. Простой круг. Натуральные числа 1, 2,..., я (я — чётное чис- ло) располагают по кругу как на диаграмме. Первое число по кру-
  • 270. 276 Задачи и упражнения гу всегда должно быть 1. Все остальные числа располагаются таким образом, чтобы сумма двух соседних чисел по кругу была простым числом, начиная с 1. Составить алго- ритм—программу определения всех указанных расстановок. Исходное число п задается в тек- стовом файле. Результаты расчетов сохранить в текстовом файле. Пример файла исходных данных Пример файла результатов 1 4 3 2 5 6 1 1 2 3 8 5 6 7 4 1 1 2 5 8 3 4 7 6 1 237. Почтальон. Дана последовательность из /Уулиц (по названи- ям). Каждая улица соединяет два перекрестка. Первая и послед- няя буквы названия улицы определяют два перекрестка для этой улицы. Длина названия улицы определяет стоимость проезда по ней. Все названия улиц состоят из строчных символов алфавита. Например, название улицы «computer» показывает, что улица на- ходится между перекрестками «с» и «г», адлина ее 8. Нет улиц, ко- торые имеют одинаковые первые и последние символы. Есть не более одной улицы, напрямую соединяющей два любых перекре- стка. Всегда есть путь между любыми двумя перекрестками. Чис- ло улиц с данным перекрестком называется степенью этого пере- крестка. Есть не более двух перекрестков нечетной степени. Все остальные перекрестки — четной степени. Составить алго- ритм—программу определения минимальной стоимости проезда по всем улицам, по крайней мере, один раз. Путешествие должно начаться и закончиться на одном и том же перекрестке. Стои- мость проезда по улице равна ее длине. Пример входного файла 3 one two three Пример выходного файла 11 238. Пересечение с отрезками. Имеются Nотрезков, концы кото- рых задаются двумя парами точек на плоскости: (*![/], yl[i) и (x2[i], y2[i]). Требуется составить алгоритм—программу определе-
  • 271. Задачи и упражнения 277 ния такой прямой линии, которая пересекает как можно большее количество заданных отрезков. Исходные данные определяются в текстовом файле, имеющем следующую структуру. Первая строка: N — количество отрезков. Вторая и следующие строки: xl[i], yl[i] и x2[i], y2[i] — пары точек на плоскости (концы отрез- ков). Результаты расчетов сохранить в выходном текстовом фай- ле^ имеющем следующую структуру данных. Строки файла — но- мера отрезков в возрастающем порядке, которые пересекает най- денная прямая. Если найденная прямая линия проходит через концы отрезков, то это учитывать как пересечение. 239. Простые суммы. Даны числа от 1 до л, 1 < п < 5000. Требуется составить алгоритм—программу разбиения данных чисел на ми- нимальное количество групп, в каждой из которых сумма являет- ся простым числом. Например, при п = 8 такими группами могут быть: {1,4, 5,6, 7}, {2, 3, 8}. Примечание: число 1 не считается про- стым. Файл исходных данных содержит число я. Выходной файл должен содержать п чисел (номера групп), которые показывают в какую группу входит соответствующее по порядку число. Для ну- мерации групп должны использоваться идущие подряд натураль- ные числа, начиная с единицы. Пример файла исходных данных: Пример файла выходных данных: 1 2 2 1 1 1 1 2 . 240. Движение плота. Квадратное озеро, покрытое многочислен- ными островами, задается матрицей размером NX N. Каждый эле- мент матрицы — либо символ «#» — решетка, обозначающий ост- ров, либо символ «—» — минус, обозначающий участок воды. В верхнем левом углу озера находится квадратный плот размером М х Мклеток. За один шаг плот может перемещаться на одну клет- ку по горизонтали или вертикали. Составить алгоритм—программу для определения минимального числа шагов, за которое плот мо- жет достигнуть правого нижнего угла озера. Входной файл исход- ных данных содержит числа Ми N. В следующих Nстроках распо- лагается матрица, представляющая озеро. Выходной файл должен содержать единственное число — количество необходимых шагов. Если правого нижнего угла достичь невозможно, то выходной файл должен содержать число —1 (минус один).
  • 272. 278 Задачи и упражнения Пример файла исходных данных: —#- #-##- —1# Выходной файл для данного примера: 18. 241. Пират в подземелье. В поисках драгоценных камней пират проваливается в подземелье. План подземелья — матрица NX M комнат с драгоценными камнями. Камни из одной комнаты име- ют одинаковую стоимость. Пирату в каждой комнате разрешается взять с собой лишь один камень и следовать в любую другую со- седнюю с ним комнату. Каждую из комнат пират может посещать неоднократно. Требуется составить алгоритм—программу опре- деления маршрута посещения пиратом К комнат лабиринта та- ким образом, чтобы он набрал камней на максимально возмож- ную сумму. Входные и выходные данные. В первой строке входного файла содержатся числа N, Ми К. В следующих ./Vстроках распо- лагается матрица N •*. М лабиринта. Каждый элемент матрицы представляется стоимостью камня соответствующей комнаты. Маршрут начинается с левой верхней угловой комнаты лабирин- та. Выходной файл должен содержать единственное число, рав- ное общей стоимости взятых с собой камней. Пример файла исходных данных: 3 4 7 1 1 1 1 1 1 2 1 1 1 2 3 Выходной файл для данного примера: 12. 242. Оставить условие задачи №241 и предписать пирату, чтобы он за К шагов еще и вернулся в начальную комнату лабиринта.
  • 273. Задачи и упражнения 279 243. Задана Д.Андре. Составить алгоритм—программу поиска всех способов заполнения числами 1, 2,..., п массива из п ячеек так, чтобы во всех строках и столб- цах они располагались в возраста- ющем порядке (слева-направо и сверху—вниз). Исходное число п задается в текстовом файле. Резу- льтаты заполнения сохранить в файле результатов. 244. Сумма чисел. Дано натуральное число т. Вставить между не- которыми цифрами: 1, 2, 3, 4, 5, 6, 7, 8, 9, записанными именно в таком порядке, знаки +, - так, чтобы значением получившегося выражения было число т. Например, если т = 122, то подойдет следующая расстановка знаков: 12 + 34-5-6 + 78 + 9. Требуется составить алгоритм—программу определения всех расстановок знаков +, -, отвечающих условию задачи. Исходное число т зада- ется во входном текстовом файле. Выходной текстовый файл дол- жен содержать найденные расстановки знаков. Если требуемая расстановка знаков невозможна, то выходной файл должен со- держать число —1. 245. Обслуживание авиалиний. Имеется некоторый город М, кото- рый связан маршрутами с городами А^,А^,...,Ап . Пусть, согласно расписанию, маршрут MAjMобслуживается в интервале времени [cijjb,]. Другими словами, я, — это тот момент, начиная с которого самолет связан с маршрутом MAt M, a bt — тот момент, когда эта связь прекращается. Таким образом, задано п временных интер- валов [а,,6,], / = 1, 2,..., п. Требуется составить алгоритм—програм- му определения минимального числа самолетов, достаточного для обслуживания всех рейсов. Файл исходных данных Файл результатов 3 — количество городов 1 2 — интервалы времени 2 3 3 5 1 самолет на все рейсы
  • 274. 280 Задачи и упражнения 2 самолета на все рейсы5 — количество городов 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. Таблица инверсий. Составить алгоритм—программу определе- ния таблицы инверсий d^d2 ...dn перестановки (оь д2 ,..., а„), где dj — число элементов, больших j и расположенных левее j (см.п. 1.13). Исходные данные — число п и произвольная переста- новка чисел 1, 2,..., п — определяются в текстовом файле. Выход- ной файл результатов должен содержать найденную таблицу ин- версий. Пример файла исходных данных: 5 — число п 5 3 4 2 1 — перестановка Пример файла результатов: 4 3 1 1 0 — таблица инверсий.
  • 275. Ответы 1. Множество D всех сочетаний С% разобьем на два непересекаю- щихся подмножества D = Dl и D2 , где Д n D2 = 0. Множество Z)t включает все сочетания с произвольным фиксированным эле- ментом, |Dj | = C^Jj 1 . Множество Z>2 включает все сочетания без вы- деленного фиксированного элемента, D2 = C*_l . Следовательно, 2. Используйте бином Ньютона (l+jc)" = 3. Применить индукцию по п. 7. 2". л 8. Воспользуйтесь тождеством (а + b)" = ^С„а Ь"~ . k=0 9. Воспользуйтесь тождеством (1 + х) т ( + х)" = (1 + х) 10. Воспользуйтесь тождеством (! + (! + 1))" = 3". 11—13. Воспользуйтесь тождеством (1+х)" = 14. Указание. Воспользуйтесь полиномиальным разложением формулы (1 + 1 + ... + 1)" = k". 15.21. 16. С„2 +2 . 17. 2п2 х2п2 . 18. 2л2 х (2л2 - 2л). 19. 2пт . 20.Л5 3 ,С431 21. З6 . 22.63. 23. С„2 —двусторонних словарей, Л„2 - односторонних словарей, п — словарей при переводе по циклу. 24. Д£. 25.P(5,7,3)=3f5[=C1 5 5C1 7 0C3 3 . 26.С%+т . 27. С^. 28. Л^ +А^ +АП — учитывается порядок имен. 29. Р(2,2,2,1,1). ЗО.С„*С*И 31. 2л!л!и2л!л!/2л = я!(л-1)!. 32. q4 ^ 4!. 33. «!/2л, где деление на число п обозначает совпадение соседей при циклическом перемещении исходной перестановки; в цифре 2 учитываются одни и те же соседи при отраженном (зеркальном) расположении исходной перестановки. 34. Cf0 (Cf0 -l)(Cf0 -2) =А^ . 35. C^C^qj . 36. С„ 6 ((С6 2 С4 2 С2 2 )/3!) =15cJ. 37. С„ 6 ((С6 2 С4 2 С2 2 )/3!) =15С„ 6 . 38. ((2и)!/(2!)")/«! — неупорядоченное разбиение множества.
  • 276. 282 ____ Ответы 39. См. решение задач 7 и 8. 40. 9!-С^7!3!+С3 2 5!3!3!3!-С3 3 3!3!3!3!. АЛ г 1 г 1 ) r w г 110 г-ю г 110 r l ri r 2 r s 41. ^4*"48' U 52 -*-48> | -52 ~*-48 ^ 1 -4 1 -48' и 4 ( -48 • 42.(С4 С 3 з)(С'з) 3 +(С 2 (С 2 з) 2 ХС1 1 3 ) 2 . 43. 3 ffl 44. З 17 . 45. т". ±( С т ~1 47 Г""-1 _/"""-! гчп-2 fm-k-lчи< Si+wi-Г ч / ' ^(п-/л)+ш-1 ~Si-l ' *"(я-*)+т-2' | "(л-£а, )+«-*-! ' """1 """1 """1 2 2 6 """1 51. 5 4 , А% . 52. С|6. 53. С^ , С|6 -С^ -СС^ -С2 ^ . 55. Р(3, 2,3,1). 56. C^Cj 3 . 57. (1 + a i )(l + a2 )...(l +а„), l-n°l 1-^2 j _ а„ - * -- — ... - - — . 59. п - [п/р] — столько чисел среди 1, 2,..., 1-Л 1-Л !-Л и не кратных^. Всего произведений С*, тогда число произведе- ний, кратных.р, равно С„ -С%_[п/р] . 60. л! - т(п -т+) (объеди- нить т элементов в один элемент). 61. 2(С 2 ) 2 =5J±!L _ способов поставить две ладьи так, чтобы они не угрожали друг другу. (С},) 2 (п-)=п 2 (п-) — способов по- ставить две ладьи так, чтобы они угрожали друг другу. Для ответа на вопрос задачи осталось сравнить указанные числа. 63. С 2 0 +С 2 0 =90. 66. 18. 68. 31. 71. С*;^, С*;/. 72. 205223000, см. п. 1.13. 73. 27354186, см. п. 1.13. 75. Указание: воспользуйтесь тем, что перестановка двух соседних меток N и М не оказывает влияния на произведение 2"~ т . 76.3CJ,2". 77. (foi)!/(OH)"ii!). 78. 79. (С№/2)-(С$сЦ). 80. (C 2 0 C8 2 C6 2 C4 2 C2 2 )/5! = 81. 9!/((1!) 1 (2!) 4 1!4!). 82. 9!/((3!) 3 3!). 83. Р(2,2,2,2,2,2,1, 1,1,1). 84. Cf5 Cf0 . 85. 4 8 -С^З 8 +С|2 8 -С4 3 1 8 — воспользоваться форму- лой включений и исключений для свойств: Р, — пустой /'-и этаж, ... 89. Cj;j_г 90. С^^^ -1, где -1 обозначает число 0. 91. С^+1 . 92. C*+k . 93. Схема посева сортов пшеницы должна соот- ветствовать латинскому квадрату т х т. 94. С^. 95. Г. 96. ХНУ С*(Л-/Г. /=о
  • 277. Ответы 283 k-r k-r 07 W IV'Г"1 Cr+l (b r /V -r""W 1V Г" CJ- г Лш "'• 2—i*~ ' r+i^k 1^~Г—1) ~*-'k2-i^~ ' k-r ~ ~ > ' i=0 i=0 m m t *=o *=o m * /1=0 /UO m-r m-r t /UO ' A=0 102. Введем обозначения. Д — свойство, что k-я пара враждую- щих рыцарей сидит рядом, k = 1,2,..., л. ДО) — размещение рыца- рей, которые не обладают ни одним из указанных свойств, т.е. требуемые размещения по условию задачи. ДО) = Ж(0) - W(l) + + W(2) - ... + (-l)"W(n), где W(k) — количество размещений ры- царей, когда k и более враждующих пар сидят вместе. Объединим каждую из k указанных пар в один объект. Тогда имеем 2л - k объ- ектов, которые можно расположить (2л - £)! способами. В каждой из k заданных пар врагов можно поменять местами 2 k способами. Выбор k враждующих пар можно сделать C k способами. Следова- п тельно, искомое число равно ДО) = V^(-l) C k 2 (2n-k)l k=0 103. 542. 104. 734. 106. 20%, 60%, 70%. 107. 2, 6, 3. 109—110. Решение подобного уравнения рассмотрено в п.1.7. 111. |°5 ! I'^yV- 112. С„ 3 _2 . Действительно, выбирая из л-2 три различных предмета С„ 3 _2 способами, можно однозначно отобра- зить их в разбиения, требуемые по условию. Если выбраны пред- меты с номерами ^ < k2 < k3 , то в исходном ряду их номера будут Ш. 2 + 1 < &з + 2. 115. 2", ^—. 116. п + 1. 117. Количество прямоугольников размера i xj равно (л - / + 1) х (n -j + 1). Каждый прямоугольник учиты- вается в сумме столько раз, какова его площадь. Тогда сумма рав- на
  • 278. 284 Ответы 118. а) Л!С*С* +2(Л;-1)!С*- 1 С*- 1 +(k-2)C k n~ 2 C k m 2 ; в) п + 1. 119. _4л__-Ш-+ _?!_. по. (П(п + 1)/2Г. 121. 1) 7 + 3"; 2)и2п =[9•З 2 "+МЛ/10,«2п+1 =[9•3 2n+1 +3•(-1Л/10,п>0; 3) (+9)"; 4) (+4)"; 5) (-!)"(« - 1) + 2; 6) 2". 122. 1) С 2 +2 -2С 2 +1 +2С 2 ; 2) -2(-4)" + 3 • 2" + 5"; Ш 1 ,1 Л ПЯ-1. 0 ^ . D . Ч". -54 X l J.T-V-' | . П | I"'VJ . II Л : 125. an =2 n+l (2n +7), bn =2" +1 (-2я~3). 126. 4 129. Использовать формулу включений и исключений. 130. a) R(x, С] = х(1 + х)3 + (1 + Зх + ла )(1 + х). 133. а) 2", с) 2 • З"" 1 . Составить рекуррентное соотношение (см.п.3.3). 134. а) 2 " +( з 1)Л2 , б) |(3"- J -(-l)"' 1 ). Составить рекур- рентное соотношение (см.п.3.3). 135. 4". л 136. С2„2.](С„ ) =(С2„) . Воспользуйтесь производящей функ- 2" 2« цией x + — +>> + — = х + ~ у + — всех ломаных маршрутов длины 2л по рассматриваемой сетке. Свободный член в правой части является искомым числом для замкнутых маршру- тов (см. п.3.4). 137. С^, (см. указание к предыдущей задаче). 183. а) 14; б) 18; в) 9. 184. а) 43; 6)61. 185. а) 37; б) 100; в) 158.
  • 279. 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.
  • 280. Предметный указатель Алгоритмы Евклида 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 петля 110 подграф 111 полный 112 простой 112 псевдограф 111 связный 113 сильно 113 слабо 113 транспортная сеть 156-159 фундаментальные циклы 172—176 хроматический 194 цепь ИЗ простая 113 замкнутая 113 гамильтонова 113 эйлерова 130 цикл 113 простой 113 замкнутый 113 гамильтонов 113 эйлеров 130 эйлеров 130 Группа 197 абелевы 203 вычетов 233—234 гомоморфизм 198 образ 199 ядро 199 изоморфизм 199 теорема Кэли 212
  • 281. Предметный указатель 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
  • 282. 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