Автор: Липский В
Теги: анализ теория вероятностей математическая статистика комбинаторный анализ теория графов программирование алгоритмы комбинаторика
ISBN: 5-03-000979-5
Год: 1988
В.Липский
Комбинаторика
для программистов
Издательство «Мир»
I
\УИо1с! Ырзк!
КОМВЖАТОКТКА
ОЬА Р₽ОСКАМ18Тб\У
\УУРА№М1СТ\УА МА11КСЖО-ТЕСНШС2МЕ
ШК82АМА 1982
В.Липский
Комбинаторика
для программистов
Перевод с польского
В. А. Евстигнеева и
О. А. Логиновой
под редакцией
А. П. Ершова
Москва «Мир» 1988
ББК 22.17
Л 61
УДК 517.8
Липский В.
Л 61 Комбинаторика для программистов: Пер. с польск.—
М.: Мир, 1988. — 213 с. ил.
I8В^ 5-03-000979-5
Книга польского специалиста по программированию знакомит читателей с
широким спектром комбинаторных и теоретико-графовых алгоритмов. Описание
алгоритмов дано на языке Паскаль; стиль изложения близок к справочному —
постановка задачи, алгоритм ее решения, комментарии, трудоемкость, примеры.
Русское издание дополнено новыми результатами.
Для специалистов в области информатики, исследования операций, методов
оптимизации, а также для студентов вузов как учебное пособие.
1702070000-058
Л 01(041)-88 ' 35“88’ Ч’ ’
ББК 22.17
Редакция литературы по математическим наукам
I8В^ 5-03-000979-5
© Ьу Ыаико^о-ТссЬгпсгпе,
^агзгаи'а 1982
© перевод на русский язык, с дополнения-
ми, «Мир», 1988
Предисловие редактора перевода
Широкое применение ЭВМ создало новый жанр математи-
ческой литературы. В книгах этого жанра изложение начинает-
ся с теоретического обзора и заканчивается описанием алго-
ритмов, практически готовых к автоматическому исполнению
на ЭВМ. Конечно, новизна такого подхода относительна и тра-
диция завершения математического трактата правилами вычис-
лений восходит, по меньшей мере, к ал-Хорезми. Но все же
оформление операционного багажа математики в виде машин-
ных программ существенно отличает новые книги от классиче-
ских инженерных руководств по прикладной математике, от-
личным примером которых служит известный справочник
И. Н. Бронштейна и Н. Н. Семендяева.
Первые публикации подобного рода относились к традицион-
ным разделам вычислительной математики. Дальнейшее рас-
ширение круга задач, решаемых на ЭВМ, потребовало выхода
на модели дискретной математики, что привело к подлинному
возрождению теории графов и комбинаторики, которые за не-
сколько десятков лет трансформировались из разделов «досу-
говой» математики в первостепенный инструмент решения
огромного числа задач.
После выхода первых трех томов еще не завершенной мо-
нументальной серии «Искусство программирования для ЭВМ»
Д. Кнута [т. 1 «Основные алгоритмы» (М.: Мир, 1976), т. 2
«Получисленные алгоритмы» (М.: Мир, 1977), т. 3 «Сорти-
ровка и поиск» (М.: Мир, 1978)] аналогичных руководств не
появлялось в течение длительного времени. В отечественной
литературе следовало бы в связи с этим отметить руководство
В. А. Евстигнеева «Применение теории графов в программиро-
вании» (М.: Наука, 1985). При всей обстоятельности этой книги
она далеко не исчерпывает операционный запас дискретной ма-
тематики. Уже в ходе ее написания автор и редактор познако-
мились с предлагаемой вниманию читателей монографией поль-
ского специалиста Витольда Липского и увидели, насколько она
хороша и полезна.
Не стоит предвосхищать авторское вступление к монографии
В. Липского, да и ее оглавление говорит само за себя. Хоте-
лось бы только обратить внимание читателей на своеобразное
сочетание традиционного и новаторского подходов к изложению
материала, который особенно проявляется при изложении ком-
бинаторных задач, имеющих давнюю историю. Именно это об-
стоятельство побуждает высказать не столько критическое за-
мечание, сколько пожелание авторам будущих книг.
Еще нерешенной проблемой изложения математической тео-
рии, завершающейся алгоритмами, является отсутствие дока-
зательной логической связи между теоретическим материалом
и алгоритмами. Доказательное программирование в его логи-
ческом и трансформационном подходах предлагает те или иные
процедуры систематического извлечения алгоритма из специ-
фикации задачи, использующие отношения и факты соответ-
ствующей теории, однако мы еще далеки от того, чтобы изла-
гать эти процедуры в стандартном и непринужденном стиле,
вошедшем в обыденную научно-литературную практику. Акту-
альность этой проблемы постоянно нарастает, особенно потому,
что часто практическая реализация алгоритмов требует их
определенной модификации, которая не должна снижать сте-
пень математической достоверности окончательного варианта
программы.
Это предисловие приходится закончить печальной вестью о
безвременной кончине автора этой монографии, последовавшей
после тяжелой болезни 30 мая 1985 г. на 36-м году жизни. За
14 лет интенсивной научной деятельности В. Липский опубли-
ковал свыше пятидесяти работ по комбинаторике, теории ин-
формационного поиска и вычислительной геометрии, а также
написал три монографии: «Комбинаторные аспекты теории ин-
формационного поиска» (1975 г.), данная монография (1982 г.)
и «Комбинаторный анализ» (посмертное издание 1987 г.).
Переводчики и автор этих строк посвящают свой скромный
труд доброй памяти одного из ведущих представителей поль-
ской информатики, д-ра наук, доцента Витольда Липского.
Академгородок, А. П. Ершов
январь 1987 г,
От автора
Сейчас трудно было бы, пожалуй, назвать раздел теорети-
ческой информатики, в котором в течение последнего десяти-
летия были бы достигнуты большие успехи, нежели в конструи-
ровании и анализе комбинаторных алгоритмов. С одной сто-
роны, было обнаружено много новых, более эффективных ме-
тодов решения комбинаторных задач с помощью ЭВМ, с дру-
гой— получены теоретические результаты, свидетельствующие
все более явно о том, что для широкого класса проблем не
существует «достаточно эффективных» алгоритмов. Эффектив-
ные комбинаторные алгоритмы находят применение во .многих
областях нечисленной обработки информации, особенно в дис-
кретной оптимизации и в исследовании операций.
В настоящей книге представлены некоторые разделы ком-
бинаторики, причем особое внимание уделено конструктивному
алгоритмическому подходу — рядом с обсуждаемыми комбина-
торными проблемами, как правило, приводятся алгоритмы их
решения вместе с анализом их вычислительной сложности. Эти
алгоритмы представляют собой сжатые варианты программ,
написанных на языке Паскаль. На выбор обсуждаемых про-
блем, в большой мере случайный, принимая во внимание огра-
ниченный объем книги, а также обширность рассматриваемой
области, оказали влияние как интересы автора, так и желание
скорей дополнить, нежели продублировать две другие книги
с родственной тематикой, подготовленные к изданию в серии
«Библиотека технологии программирования» [2] и в серии
«Информатика» [76].
Первая, самая большая глава данной книги содержит изло-
жение наиболее классических разделов комбинаторики (пере-
становки, разбиения множеств и чисел, биномиальные коэффи-
циенты, производящие функции и т. д.), а также многие — не-
обязательно классические — алгоритмы генерирования упомя-
нутых комбинаторных объектов. Во второй главе представлены
основные методы, используемые при конструировании алгорит-
мов на графах, в особенности методы систематичного обхода
графов. Тематика, связанная с графами, затрагивается и в
двух следующих главах: в одной из них обсуждаются методы
нахождения кратчайших путей в графах, ребрам которых при-
писаны произвольные «длины», в другой — основное внимание
сконцентрировано на задаче отыскания максимального потока
в сети (т. е. в графе с определенными «пропускными способ-
ностями» ребер). В последней главе рассматривается примене-
ние комбинаторного понятия матроида для решения некоторого
класса оптимизационных задач.
Книга предназначена для программистов, желающих рас-
ширить свои знания в области комбинаторных алгоритмов, а
также пополнить свои практические знания теоретическими. От
читателя требуются элементарные сведения из математики, а
также знакомство с языком программирования Паскаль [36,
75] и некоторый опыт программирования на языке высокого
уровня.
В заключение хочу поблагодарить д-ра наук Виктора Ма-
река за ряд ценных замечаний, которые позволили устранить
погрешности первоначального варианта этой книги.
Варшава, декабрь 1980 Витольд Липский
Моим родителям
I. Введение в комбинаторику
1.1. Основные понятия
В этом разделе приводятся основные определения и обозна-
чения, относящиеся к используемым логическим и теоретико-
множественным понятиям, а также представленные в приводи-
мых ниже алгоритмах.
Начнем с логических и теоретико-множественных понятий
(читателя, заинтересованного в более глубоком знакомстве с
этими понятиями, мы отсылаем к работам [49] и [57]). Мы
будем употреблять логические связки V (или), Л (и), “I (не),
=> (если..., то), -<=> (тогда и только тогда, когда). Тот факт,
что х есть элемент множества X, будем записывать в виде
хе7, его отрицание — в виде х^.Х. Множество тех элементов
множества X, которые удовлетворяют условию Ф, будем обо-
значать через {х е X; Ф} (или {х: Ф}, если известно, о каком
множестве X идет речь), запись же {а], ..., ап} будет обо-
значать множество, элементы которого суть Пь ..., ап
(в частности, единственным элементом множества {а} яв-
ляется а). Теоретико-множественные операции объединения,
пересечения и разности обозначаются соответственно О, П и .\\
пустое множество обозначается 0. Тот факт, что множество А
содержится в множестве В (т. е. А есть подмножество множе-
ства В), будет записываться в виде А^В или В^А (всегда
имеют место включения 0^Л, А Л); -символ «с=» зарезер-
вирован для случая, когда исключается равенство А = В (при
этом будем говорить, что А есть собственное подмножество мно-
жества В). Множество всех подмножеств множества X будем
обозначать через ^(Х), мощность множества X (т. е. число
его элементов)—через |Х|.
Последовательность длины л, члены которой суть аь ал,
будем обозначать через <П1, ..., ал>, либо просто через ...
..., ап или а\ ... ап. Последовательность <а, 6> длины два бу-
дем называть упорядоченной парой. Декартово произведение
АУ(В множеств А и В определяется как множество всевоз-
можных пар <а, 6>, где аеД Ь^В. Под бинарным отноше-
нием (с левой областью А и правой областью В) подразуме-
вается произвольное подмножество А X Если А = В, то
будем говорить о бинарном отношении на множестве А. Вме-
сто <а, &> е К часто пишут аНЬ.
По поводу отношения /? на множестве X говорят, что оно:
(а) рефлексивно, если х#х для каждого х е X,
(б) транзитивно, если (х/?у Д уЦх) => х/?г для произвольных
х, у, г е X,
(в) симметрично, если х/?у => у^х для произвольных х,
У X,
(г) антисимметрично, если (х/?у Д уЦх) => х = у для произ-
вольных х, у е X.
Произвольное бинарное отношение, обладающее свойствами
рефлексивности, транзитивности и симметричности, называется
отношением эквивалентности, а обладающее свойствами реф-
лексивности, транзитивности и антисимметричности, — отноше-
нием частичной упорядоченности. Отношение частичной упоря-
доченности обычно обозначается через «^», а пара (X, на-
зывается частично упорядоченным множеством. Будем приме-
нять также очевидные обозначения, такие как х у для у х,
х < у для х у Д х у и т. д. Примером частично упорядо-
ченного множества может служить множество целых чисел с
отношением делимости, множество целых (или вещественных)
чисел с обычным отношением меньше или равно «^», а также
множество Ф(Х) с отношением включения &
Если функция (отображение) / сопоставляет каждому эле-
менту х^Х элемент /(х)е У, то будем писать /: У (такая
функция может трактоваться как отношение с тем
свойством, что для каждого хеХ существует в /? точно одна
пара вида <х, у>, у е У; для наших же целей достаточно, од-
нако, интуитивного понятия функции). Для произвольных
А X, В У определим
/ (Л) = {у е У: существует такое х е Л, что у = / (х)}
(В) = {х е Х-. } (х) е В}
(вместо будем просто писать /“!(&)).
Если /(Х)=У, то будем говорить о функции из X на У.
Функция /: Х->У называется обратимой (взаимно однознач-
ной), если для произвольных а, Ь еХ
а Ф Ь => I (а) I (Ь).
Мы часто будем использовать понятие графа (см. [9], [31]).
Под неориентированным графом (или короче графом) будем
понимать такую произвольную пару О — (У,Е), что
Е {{и, ц): и, V е V Л и Ф у}.
Ориентированным графом1) будем называть такую произ-
вольную пару О = < V, Е), что Е V X V- В обоих случаях мно-
жества V и Е будем называть соответственно множеством вер*
шин и множеством ребер2) графа О.
Граф обычно изображается на плоскости в виде множества
точек, соответствующих вершинам, и соединяющих их линий,
соответствующих ребрам3). Линия, изображающая ребро {и, и}
или <и, ц>4), соединяет точки, изображающие вершины и, и,
причем во втором случае стрелка обозначает направление от и
к V (рис. 1.1).
Рис. 1.1. а) Неориентированный граф; б) Ориентированный граф.
В контексте определенного графа О = <7, Е} будем часто
использовать обозначения и — V, и-+ V вместо {и, Е и
<и, у> е Е соответственно. Если ребро е имеет вид {и, у} или
<и, у), то будем говорить, что ребро е инцидентно вершинам и
и у, в то время как вершины и и о смежны между собой. Сте*
пень вершины определим как число ребер, инцидентных ей 5 б).
Вершину нулевой степени будем называть изолированной (на-
пример, вершина у5 на рис. 1.1, а). Путем в графе О = <У, Е}
назовем последовательность вершин у0, ...» такую что
!) Или короче орграфом. — Прим, перев.
2) Элементы множества Е для орграфа называются дугами.—Прим, перев,
3) Дуга в орграфе изображается линией со стрелкой, указывающей ориен-
тацию дуги, т. е. направление от ее начала к концу. — Прим, перев.
4) Угловые скобки используются для обозначения дуг орграфа. — Прим,
перев.
б) Для вершин орграфа определяются полустепени захода (число заходя-
щих в вершину дуг) и исхода (число выходящих дуг). Степень вершины опре-
деляется как сумма полустепеней захода и исхода. — Прим, перев.
4>0и ^--^ж (или если граф О — ориентирован-
ный), 1 = 0, ..., к— I.1) Вершины у0 и V* будем называть со-
ответственно началом и концом пути, а число к — длиной пути.
Путь, начало и конец которого совпадают, будем называть цик-
лам2). Если все вершины пути V* различны, то будем
говорить об элементарном пути. Соответственно цикл и*
(^1 = ук) будем называть элементарным, если вершины иь ...
..., различны. Подграфом графа 0<У, Е) будем называть
такой произвольный граф С' = <У', Е'>, что и Е'^Е3).
Пусть 0 = <У, Е)— произвольный неориентированный граф,
и пусть V е V. Пусть А — множество тех вершин и е V. к ко-
торым существует путь из V. Множество А вместе с ребрами
графа О, инцидентными вершинам из А, определяет некоторый
подграф, называемый компонентой связности графа О. Очевид-
но, что множества вершин компонент связности произвольного
графа попарно не пересекаются. Например, для графа на
рис. 1.1, а это суть множества = {гл, ^2, ^з» &б}, Уг =
= {^5} И Уз = {^7, V*. У9, О10, ^11}.
Будем говорить, что графы 0 = <У, Е>, О' = <У', Е'> изо-
морфны. если существует такое взаимно однозначное отображе-
ние I из V на V'. что для произвольных и. V е V имеем {и.
^Е<=> {/(и),/(у)} ^Е' ({и. V) е Е <=> </(«)/(у) > ей'в случае
ориентированных графов). Обычно изоморфные графы не раз-
личаются между собой.
Для произвольного вещественного числа х мы будем упо-
треблять обозначения [х] и [х] соответственно для наиболь-
шего целого числа, не превосходящего х, и для наименьшего це-
лого числа, не меньшего х, например [3.5] =3, [3.5] =4,
[-3.5] = —4, [—3.5] = —3.
Перейдем теперь к понятиям, связанным с алгоритмами.
Алгоритмы будем обычно записывать на языке программирова-
ния, являющимся неформальной версией языка Паскаль [36,
75]. Если реализация какого-либо фрагмента программы оче-
видна, но трудоемка и затемняет идею алгоритма, то такой
фрагмент будем иногда заменять описанием на естественном
языке. Мы будем также применять неформальные конструкции,
такие как, например, циклы (ТогхеХ <1оР (выполнять коман-
9 Термин «путь» в теории графов используется только в отношении ор-
графов, для графов используются термины «цепь» или «маршрут». — Прим,
пере в.
2) Введенный так термин «цикл» в теории графов используется только в
отношении графов, для орграфов используется термин «контур». — Прим, пе-
ред.
3) В отечественной литературе по теории графов граф О' называется чаще
частью графа, или частичным графом, под подграфом же понимается частич-
ный граф, удовлетворяющий дополнительному условию V х, у х. у^У'/\{х.
у} е Е => {х, у} еЕ'). — Прим, персе.
ду Р для всех элементов х множества X в произвольной по-
следовательности), СТЕК<=х (поместить значение переменной
х в стек), х-ф= СТЕК (считать элемент х из вершины стека и
принять его за значение переменной х), ОЧЕРЕДЬ ч=х (вклю-
чить х в очередь в качестве последнего элемента), хч= ОЧЕ-
РЕДЬ (взять первый элемент из очереди и принять его в ка-
честве значения переменной х) и т. д. Мы будем обычно опу-
скать описания типов и переменных (иногда для избежания
недоразумений будем помещать соответствующие пояснения в
комментарий). Переменная, появляющаяся в процедуре, рас-
сматривается как локальная для данной процедуры, исключая
тот случай, когда в комментарии не сказано что-либо иное.
Строки программы нумеруются так, чтобы можно было указать
на «цикл 17», «блок 9» и т. д.
Основным параметром алгоритма, который будет нас ин-
тересовать, является его вычислительная сложность (или просто
сложность), т. е. число шагов, выполняемых алгоритмом в худ-
шем случае как функция размерности задачи, представленной
входными данными. Например, если алгоритм принимает как
данные произвольный граф 6 = <7, Е>, то под размерностью
задачи можно понимать |У|. Сложность алгоритма опреде-
ляется тогда как функция /, такая что }(п) равно наибольшему
числу шагов алгоритма для произвольного графа с п верши-
нами. Можно также считать размерностью задачи пару
<|У|,|Е|> — тогда сложностью является функция двух пере-
менных и /(и, т) равно наибольшему числу шагов, выполняе-
мых алгоритмом для произвольного графа с п вершинами и т
ребрами. Остается еще объяснить точнее, что мы понимаем под
«шагом» алгоритма. Допустим, что наши программы трансли-
руются на машинный язык типичной ЭВМ, имеющей в наборе
своих команд команды переноса слова из памяти в буфер и
наоборот, арифметические операции сложения, вычитания,
умножения и деления, условные переходы, операции ввода-вы-
вода, а также косвенной адресации, выполненной аппаратно
(т. е. определение аргумента операции через адрес ячейки па-
мяти, содержащей адрес этого аргумента). Выполнение любой
из указанных выше команд мы и будем считать шагом алго-
ритма. Очевидно, что при таком определении шага сложность
алгоритма зависит от конкретного вида машинных команд. Од-
нако нас никогда не будет интересовать точная сложность ал-
горитма, а только асимптотическая сложность, т. е. асимптоти-
ческая скорость увеличения числа шагов алгоритма, когда раз-
мерность задачи неограниченно растет (чтобы можно было го-
ворить о такой скорости роста, предполагаем, что объем па-
мяти нашего компьютера неограниченный, а также, что каждая
ячейка памяти может содержать произвольно большое целое
число). Ясно, что при двух произвольных «разумных» способах
трансляции соответствующие сложности различаются не более
чем на мультипликативную постоянную, а их скорость роста
одинакова. Читателя, желающего уточнить приведенные выше
очень неформальные рассуждения, отсылаем к работам [1]
И [2].
При сравнении скорости роста двух функций /(п) и §(п)
'(с неотрицательными значениями) очень удобны следующие
обозначения:
/ (п) = О (п)) <=> существуют константы С, > 0, такие
что Цп)^.С • §(п) для всех
/ (п) = Й (§ (и)) <=> существуют константы С, № > 0, такие
что / (и) С • § (п) для любого п М.
Конечно, }(п) = & тогда и только тогда, когда ^(п) =
== О(/(«)). Символы и читаются соответствен-
но: «порядка не более чем §{п)» и «порядка не менее чем
§(«)». Если сложность какого-либо алгоритма есть О(^(п)), то
мы говорим, что этот алгоритм «затрачивает порядка О(^(п))
времени»1). Подобным же образом определяются символы
О(^(П1, .пк)) и й(я(«1, .пк)) для функции многих пе-
ременных, например:
(/(«1...«л)) = О(йр(п1...просуществуют
константы С, такие что
/(п1( .... п*ХСг(«1....пк) для всех пь .... пА>М.)
Определенную таким образом сложность иногда называют
временной сложностью в отличие от сложности по памяти,
определяющей величину объема памяти, использованного алго-
ритмом, как функцию размерности задачи.
1.2. Функции и размещения
Классической задачей комбинаторики является задача опре-
деления числа способов размещения некоторых объектов в ка-
ком-то количестве «ящиков» так, чтобы были выполнены за-
данные ограничения. Эту задачу можно сформулировать не-
сколько более формально следующим образом. Даны множе-
ства X, У, причем |Х| = п, |У|=/и. Сколько существует функ-
9 Символьную запись /(п) =0(§(п)) не следует трактовать как равен-
ство; например, из /(и) =.О(#(п)) и 1г(п) = О($(п))> конечно, не вытекает
/.(*)= Л (и),
ций /: Х->У, удовлетворяющих заданным ограничениям? Эле-
менты множества X соответствуют объектам, элементы множен
ства V — ящикам, а каждая функция X -> У определяет не-
которое размещение, указывая для каждого объекта х е X
ящик /(х)е У, в котором данный объект находится. Другую
традиционную интерпретацию получим, трактуя У как множе-
ство «цветов», а /(х) как «цвет объекта х». Наша задача, та-
ким образом, эквивалентна вопросу, сколькими способами мож-
но покрасить объекты так, чтобы были соблюдены некоторые
ограничения.
Заметим, что без потери общности можем всегда считать, что
Х = {1, .п} и У ={1, ...» т}, Каждую функцию / можно
тогда отождествить с последовательностью </(1), ...»
Наша задача имеет самый простой вид, если не наклады-
вается никаких ограничений на размещения. Имеет место сле-
дующая теорема.
Теорема 1.1. Если 1X1= и, |У|=/п, то число всех функций
/: Х-> У равно тп.
Доказательство. Считая, что Х = {1, ..., п}, сводим нашу
задачу к вопросу о числе всех последовательностей <#ь ..., упУ
с членами из пг-элементного множества У. Каждый член после-
довательности у1 мы можем выбрать т способами, что дает тп
возможностей выбора последовательности упУ-
Легко также найти число размещений, для которых каждый
ящик содержит не более одного объекта — такие размещения
соответствуют взаимно однозначным функциям. Обозначим че-
рез [/п] п число всех взаимно однозначных функций из /г-эле-
ментного множества в пг-элементное множество.
Теорема 1.2. Если |Х| = п, |У| =пг, то число всех взаимно
однозначных функций X -> У равно
[гп\п = т(т — 1) ... (пг — п + I) (1.1)
(полагаем [ш]0=1).
Доказательство. Будем определять на этот раз число инъек-
тивных (т. е. имеющих все различные члены) последовательно-
стей <г/1, ..., упу с членами из множества У. Элемент у\ та-
кого множества мы можем выбрать пг способами, элемент у2—
пг — 1 способами, в общем случае если уже выбраны элементы
1/ь ..., 1, то в качестве можем выбрать любой из ш — I + 1
элементов множества У.\{уь ...» У1-\} (принимаем п /и;
если п > пг, то очевидно, что и \пг\п и искомое число функ-
ций равны нулю). (Это дает т (т — I) ... (т — п+1) возмож-
ностей выбора инъективных последовательностей <//ь ...
уп>.)
Приведем в качестве примера [4]3 = 24 последовательности
длины 3 с элементами из множества Х = {1, 2, 3, 4}:
(1,2,3) (2, 1,3) (3, 1,2) (4, 1,2)
(1,2,4) (2, 1,4) (3, 1, 4) (4, 1,3)
(1,3, 2) (2, 3, 1) (3, 2, 1) (4, 2, 1)
(1,3, 4) (2, 3, 4) (3, 2, 4) (4, 2, 3)
(1,4, 2) (2, 4, 1) (3, 4, 1) (4, 3, 1)
(1,4, 3) (2, 4, 3) (3, 4, 2) <4, 3, 2)
Если т = и, то каждая взаимно однозначная функция
является взаимно однозначным отображением множе-
ства X на множество У. В таком случае [п]п = п(п — 1) ... 1
обозначаем п\ (п факториал). Каждое взаимно однозначное
отображение (; X -> X называется перестановкой множества X.
Как частный случаи теоремы 1.2 получаем следующую теорему.
Теорема 1.3. Число перестановок поэлементного множества
равно п\
Перестановки мы будем обсуждать в последующих разде-
лах, сейчас же остановимся еще на одном типе размещения
объектов по ящикам. Предположим, что мы размещаем п объ-
ектов по пг ящикам так, чтобы каждый ящик содержал бы по-
следовательность, а не множество, как прежде, помещенных в
нем объектов. Два размещения назовем равными, если в ка-
ждом ящике содержится одна и та же последовательность
объектов. Размещения такого типа будем называть упорядо-
ченными размещениями п объектов по т ящикам. Обозначим
число таких упорядочений через [т]п.
Теорема 1.4. Число упорядоченных размещений п объектов
по пг ящикам равно
[т]п = пг (т + 1) ... (пг + п — 1) (1.2)
(полагаем [ди]° = 1).
Доказательство. Будем строить упорядоченное размещение,
добавляя по очереди новые объекты. Первый объект мы мо-
жем разместить пг способами, второй — т + 1 способами, ибо
его можно разместить в одном из т — 1 пустых ящиков или
в ящике, содержащем первый объект, перед ним или после
него. В общем случае предположим, что уже размещено I — 1
объектов, причем для к = 1, 2, ..., пг в к-м ящике находятся
Гк объектов. Тогда 1-й объект можем добавить в й-й ящик г* 4- 1
способами, что дает в сумме
(г1+0+ ••• + (''/пЧ-1) = (Г1 + ... + гт) + пг = пг + г—1
возможностей. Таким образом, всех упорядоченных размеще-
ний будет т(т^ 1) ... (/п + и — 1).
На рис. 1.2 представлены [З]2 = 12 упорядоченных разме-
щений элементов а, Ь в трех ящиках.
Рис. 1.2. Размещение (упорядоченное) элементов а. Ь в трех ящиках.
Приведем в заключение следующие простые зависимости:
[/л]а = (т — п+ 1)[т]„_1, (1.3)
[т]п = т!/п1, (1.4)
[тГ = [т + п-1]„. (1.5)
1.3. Перестановки: разложение на циклы,
знак перестановки
Напомним, что перестановкой1) «-элементного множества X
называется произвольная взаимно однозначная функция /:
’) Обычно функция Х-+Х называется подстановкой, а перестановкой
называется вторая строка таблицы, определяющей подстановку. В этом раз-
деле и далее термин «перестановка» используется для обозначения обоих по-
нятий, что, однако, не приводит к какой-либо двусмысленности. — Прим, пе~
рев.
Обычно перестановка определяется с помощью таблицы с дву-
мя строками, из которых каждая содержит все элементы мно-
жества X, причем элемёнт /(х) помещается под элементом х.
Для примера рассмотрим такую перестановку / множества
{а, Ь, с, Л}, что
На) = * /(6)=а; /(с) = с; /(</) = *;
она записывается в виде
а Ь с <1
й а с Ь
Если порядок элементов в верхней строке фиксирован, то ка-
ждой перестановке однозначно соответствует последователь-
ность, содержащаяся в нижней строке, например для переста-
новки / это есть <«?, а, с, ЬУ, Поэтому будем называть иногда
произвольную инъективную последовательность длины п с эле-
ментами из множества X перестановкой «-элементного множе-
ства X.
В наших исследованиях природа элементов множества X
несущественна — примем для простоты Х = {1, ..., п}. Обозна-
чим множество всех перестановок этого множества через 5П.
Произвольная перестановка | е 5п будет обычно отождеств-
ляться с последовательностью <аь ...,апУ, где а/= /(/). Под
суперпозицией перестановок I и § мы будем понимать пере-
становку /^, определяемую следующим образом-
/я(0=/(я(0).
Отметим, что для суперпозиции двух перестановок, скажем
/1 2 3 4 5\ _ / 1 2 3 4 5 \
= \5 3 2 1 47’ ^ = \2 5 314/’
достаточно изменить порядок столбцов в перестановке I таким
образом, чтобы в первой строке получить последовательность,
имеющуюся во второй строке перестановки §, тогда вторая
строка перестановки / дает суперпозицию (§. В нашем случае
_/1 2 3 4 5\
г = 5 3 1 47’
/2 5 3 1 4\
^ = \3 4 2 5 1 7’
1 2 3 4 5
3 4 2 5 1
Перестановку
1 2
1 2
п
п
е =
будем называть тождественной перестановкой. Очевидно, что
= }е = / для произвольной перестановки / е 5Л. Легко так-
же заметить, что каждая перестановка (е 5п однозначно опре-
деляет перестановку /-1, такую что /7-1 = /-1/ = е- Будем на-1
зывать ее перестановкой, обратной к Чтобы ее определить,
достаточно поменять местами строки в записи перестановки Д
Например, для
/ 1 2 3 4 5 \
1з 4 2 1 5/
получаем
/3 4 2 1 5\ / 1 2 3 4 5 \
? ' = 2 3 4 5/ = \4 3 1 2 5/
Из наших рассуждений следует, что для произвольных пере-
становок Л е 8п выполняются условия
(/е)А=/(?л), (1.6)
1е = еГ = 1, (1.7)
Г7 = /Г'=<?. (1.8)
Чтобы отразить этот факт, будем говорить, что Зп образует
группу относительно операции суперпозиции. Эту группу будем
называть симметрической группой степени п. Произвольное под-
множество О для которого выполнены условия
I,
о,
будем называть группой перестановок степени и.
Каждую перестановку / е 5П можно представить графиче-
ски с помощью ориентированного графа с множеством вершин
Х = {1, , п}> в котором х—^у тогда и только тогда, когда
Кх) — У- Из каждой вершины х выходит в точности одно ребро,
а именно <х,/(х)>. Подобным же образом убеждаемся, что
единственным ребром, входящим в вершину х, является
(1~'(х)>х)- Легко заметить, что, выходя из произвольной вер-
шины х0 и рассматривая по очереди вершины Х1 = /(х0), х2 =
= ЦХ1), мы дойдем после конечного числа шагов до вер-
шины хо, т. е. х/=/(х;-1) = х0 для некоторого / 1. Отсюда
следует, что наш граф состоит из некоторого числа элементар-
ных циклов с различными множествами вершин, в сумме дакь
щих все множество X. Предположим, что в этом разложении
появляются к циклов
... 1=19 ...,
Каждому такому циклу соответствует перестановка
называемая также циклом (длины т), которая определяется
следующим образом:
/,«>)=<’. лт-ог’...........6 (<».,)-4
/,(х) = х для хеЛ\{«|"....
Нашу перестановку можно представить в виде суперпозиции
циклов
(=[«... . <»_,]... [«« ... <«_,].
Такое представление перестановки будем называть разложе-
нием на циклы. Будем говорить, что перестановка [ есть пере-
Л 2 3 4 5 6 7\
^7 5 1 4 2 3 6/
Рис. 1.3. Разложение перестановки на циклы.
становка типа <Хь ...» Лл>, если она содержит в разложении
на циклы в точности циклов длины /, /=1, 2, ..., и. Тип
<Х1, Хл> обычно записывается символически 1Л‘ ... пКп (если
Л/= 0, то 1К* опускается). Например, перестановка
/1234567Х
= 5 1 4 2 3 6 /
имеет следующее разложение на циклы:
/ = [1 7 6 3] [2 5] [4],
следовательно, она имеет тип РгЧ1. Это проиллюстрировано на
рис. 1.3. Пару <а„ а/>, I < /, будем называть инверсией переста-
новки (а/, ..., ал), если а, > а/. Для произвольной перестанов-
ки / е 5п обозначим через /(/) число ее инверсий, а также опре-
делим знак этой перестановки следующим образом:
88П (/) = (-1)'(П.
Перестановку / назовем четной, если 5^п(/) = 1, и нечетной,
если 55п(/)=—1. Проиллюстрируем эти понятия на ряде при-
меров. Тождественная перестановка (1, ...» п) не содержит ни-
каких инверсий, и, следовательно, Це)= 0, и для любого п эта
перестановка будет четной. Перестановка (п, п—1, ...» 1) со-
держит п(п— 1)/2 инверсий (число всех пар (/, /), I =И= /, равно
[и]2 = п(п— 1), причем каждой паре (/, /), I < /, соответствует
пара (/, /), / > /). Таким образом, наша перестановка будет чет-
ной для п вида 4А или 4й + 1 и нечетной в остальных случаях.
Перестановка <2, 4, 3, 5, 15 имеет следующие инверсии: \2, 1),
^(4, 3), (4, 1), (3, 1), (5, 1), следовательно, является нечетной.
Знак перестановки можно определить с помощью непосред-
ственного подсчета всех инверсий, однако такой алгоритм в об-
щем случае требует количества шагов такого же порядка, что и
число инверсий, т. е. по меньшей мере Й(л2). Опишем теперь ал-
горитм сложности О(п). Для этой цели нам понадобится не-
сколько лемм.
Произвольную перестановку, являющуюся циклом длины 2,
будем называть транспозицией. Важную роль в дальнейших рас-
суждениях будут играть транспозиции соседних элементов, т.е.
транспозиции вида / + 1].
Лемма 1.5. Произвольную перестановку I е 8п можно пред-
ставить в виде суперпозиции Ц[) транспозиций соседних эле-
ментов.
Доказательство. Заметим прежде всего, что если / имеет вид
<П1, ...» ап) и 1= [I *+ 1], то суперпозиция Ц имеет вид
<Я1, ..., а», ах+2, ...» ап}. Обозначим через п число
инверсий, расположенных перед элементом к
= /\а/>а1}\.
Легко заметить, что в <аь ..., ап) мы можем переставить эле-
мент 1 =аГ1+ 1 на первую позицию, произведя п транспозиций
соседних элементов, затем элемент 2 переставить на вторую по-
зицию, произведя г2 транспозиций соседних элементов и т. д.
В конце концов после гх + ... + гп = / (/) шагов получим после-
довательность (1, ..., п}. Это означает, что = е, где
Л, ...» 6(п — транспозиции соседних элементов. Итак,
/ = (Л ... 6 (п)”1 = /Г(л ... Л”1!
что завершает доказательство леммы, где = I для произ-
вольной транспозиции Л
Лемма 1.6. Для произвольных перестановок I, §^5п
»еп (/^) = з8п(/)зяп(^).
Доказательство. Положим сначала, что & есть транспозиция
вида I = [» I + 1]. Если / = (яь ..., ап), то
и = {а1> •••• а1-1> а( + 1> а1> а1+2г •••» ап)
и, очевидно,
Г(Г/\ — еСЛИ а‘<а1+1>
—1, если я<>а/+1.
В обоих случаях з§п(//) =—(—= —з§п(/). Произволь-
ную перестановку § мы можем на основе предыдущей леммы
представить в виде 1\ ... где Л, ..., суть транспозиции со-
седних элементов и к = !(§) Имеем
зеп (/я) = зеп .../*) = — з^п М . /Л_!) =
= (-1)*8еп(/) = 82П(§)5еп(/).
Лемма 1.7. Каждая транспозиция есть нечетная перестановка.
Вообще знак произвольного цикла длины к равен (—I)*"1.
Доказательство. Первая часть леммы вытекает из того фак-
та, что последовательность
<1, /—1, /, /+1, ..., / —1, /, /+1, ..., п)
можно преобразовать в последовательность (1, ..., п), произ-
ведя сперва /— I транспозиций
[/— 1 /], [/ —2/— 1], ..., [//+1],
а затем (/ — I) — 1 транспозиций
[/+1 / + 2], [/ + 2/ + 3], [/— 1 /].
Это означает, что транспозиция [(/] может быть представлена
в виде суперпозиции (/ — I) + (/ — I) — 1 = 2(/ — /) — 1 транс-
позиций соседних элементов. Согласно предыдущим леммам,
знак нашей транспозиции [//] равен (—1)2(/-о-1 = —1.
Вторая часть леммы есть следствие первой и того факта, что
произвольный цикл [би ... а&\ есть суперпозиция к — 1 транспо-
зиций:
[О'! ... ак] = [я, я2] [я2 я3] ... [я*_! ак].
Лемма 1.8. Знак произвольной перестановки [ типа 1к‘ ... пп
определяется формулой
зеп (/) = (-!)/-* 2Л
Доказательство, Если I имеет в разложении на циклы точно
Л/ циклов длины то по предыдущим леммам
п - 1.П/2Л
&еп(П = Л [(-О'-1] ' = П (-1)М = (-1)М\+-.
/=1 /-1
Заметим, что о числе инверсий перестановки множества X мы
можем говорить только в случае X = {1, ...» п}, более общо:
когда на множестве X определен линейный порядок. Однако
знак перестановки зависит только от ее типа и, следовательно,
не зависит от того, как упорядочено множество X.
Обещанный эффективный метод определения знака переста-
новки основан на знании типа этой перестановки и на использо-
вании леммы 1.8.
Алгоритм 1.9. (Определение знака перестановки)
Данные: Произвольная перестановка / е 8п, заданная в виде
последовательности Р[1], Р[п] (Р[Д =^(0)«
Результат: По завершении работы алгоритма 5 = з^п({),
1 Ъевт
2 $:=1;
3 Тог I := 1 п до НОВЫЙ [/] := истина;
4 1ог I := 1 п до
5 И НОВЫЙ [/] Леп (* найден цикл, содержащий I *)
6 Ье^п /:=/>[/];
7 \уЫ1е / =/= I до
8 Ье$1п НОВЫЙ [Д:=ложь; $:= — $; /:=Р[Д
9 епд
10 епд
11 епд
Этот алгоритм просматривает последовательно позиции 1, ...» п
перестановки (цикл 4) и каждый раз, когда элемент Р[П не был
еще проанализирован (НОВЫЙ [Д := истина), выявляется цикл,
к которому этот элемент принадлежит (блок 6). Заметим, что
если этот цикл имеет длину А, то цикл 7 исполняется к — 1 раз.
При последовательных исполнениях этого цикла знак перемен-
ной 5 изменяется на противоположный тогда и только тогда,
когда к четно. Первоначальное значение переменной 5 равно
единице, и, следовательно, после обнаружения всех циклов
5 = (—1)р, где р есть число циклов четной длины. По лемме 1.8
имеем 5 = 85п(/).
Легко также убедиться, что число шагов алгоритма в точ*
ности равно п для произвольной перестановки / е 8п. Чтобы это
доказать, заметим, что суммарное число шагов, исполняемых
в цикле 4, не считая шагов во внутреннем блоке 6, есть О(/г),
Суммарное число шагов, исполняемых в блоке 6 в процессе ра-
боты алгоритма, равно сумме длин всех циклов, что в свою оче-
редь равно О(п). Это дает общую сложность О(п).
1.4. Генерирование перестановок
Займемся алгоритмом генерирования всех п\ перестановок
п-элементного множества. Этой проблеме посвящено много пуб-
ликаций (см., например, статью [60]). Она имеет давнюю исто-
рию, ее возникновение можно отнести к началу XVII века, когда
в Англии зародилось особое искусство колокольного боя, осно-
ванного, если говорить упрощенно, на выбивании на п разных
колоколах всех п\ перестановок [14], [74]. Перестановки эти сле-
довало выбивать «по памяти», что способствовало разработке
сторонниками этого искусства первых простых методов система-
тического перечисления всех перестановок (без повторений). Не-
которые из этих незаслуженно забытых методов были переот-
крыты в настоящее время в связи с появлением цифровых
машин. Это искусство — хотя и мало известное в Польше — про-
существовало до наших дней, поскольку знаменитая «Книга ре-
кордов Гиннеса» [29] содержит упоминание о выбивании всех
8! = 40 320 перестановок на 8 колоколах в 1963 году; установ-
ление этого рекорда потребовало 17 часов 58 1/2 минут! Конечно,
использование цифровых машин позволяет генерировать пере-
становки значительно быстрее, однако разница не так уж ве-
лика, как можно было бы подумать — за 18 часов даже самая
быстрая машина не сможет получить все перестановки и-эле-
мептного множества, если п > 13 (с другой стороны, переста-
новки 8-элементного множества можно получить в течение доли
секунды). Это простое следствие того факта, что п! растет весь-
ма быстро с ростом п.
В этом разделе мы опишем три разных метода генерирования
последовательности всех п\ перестановок и-элементного множе-
ства. Будем предполагать, что элементы нашего множества за-
поминаются в виде элементов массива Р[1],..., Р[п\. Во всех
трех методах элементарной операцией, которая применяется к
массиву Р, является поэлементная транспозиция, т. е. обмен зна-
чениями переменных Р[/] и Р[/], где 1 /, / п. Эту операцию
будем обозначать через Р[<] : = :Р[/]. Очевидно, что она экви-
валентна последовательности команд
рот := Р [/]; Р [/] := Р [/]; Р [/] := рот,
где рот есть некоторая вспомогательная переменная.
Первый из методов, который мы опишем, легче всего понять,
если в качестве переставляемых элементов взять числа 1, 2, ...
..., п. На множестве всех перестановок — более общо: на мно-
жестве всех последовательностей длины п с элементами из мно-
жества X = {1, п} — определяется лексикографический по-
рядок:
<*! х2..хп}<(уь уп)<=>существует й>1,
такое что хк^.ук и Х( = у[ для каждого I < к.
Заметим, что если вместо чисел 1, 2, п взять буквы
а, Ь, ...» г с естественным порядком то
лексикографический порядок определяет стандартную последова-
тельность, в которой слова длины п появляются в словаре. По-
добным же образом определяется антилексикографический по-
рядок, обозначаемый через с той разницей, что как очеред-
ность позиций в последовательности, так и упорядочение эле-
ментов множества X обратны по отношению к исходным:
хл) <'(//!, уп) <=> существует такое А^п,
что хк > ук и Х[ = У1 для каждого I > А.
Для примера приведем перестановки множества X = {1,2,3}
в лексикографическом (а) и антилексикографическом (б) по-
рядке:
(а) (б)
123 123
132 213
213 132
2 3 1 3 12
312 231
321 321
Алгоритм генерирования перестановок в антилексикографи-
ческом порядке сформулировать немного удобнее. Заметим с
этой целью, что последовательность перестановок множества
{1, ...» п} в этом случае имеет следующие свойства, вытекаю-
щие непосредственно из определения:
(А1) В первой перестановке элементы идут в растущей по-
следовательности, в последней — в убывающей; другими слова-
ми, последняя перестановка — обращение первой.
(А2) Нашу последовательность можно разделить на п бло-
ков длины (и—1)!, соответствующих убывающим значениям
элемента в последней позиции. Первые п — 1 позиций блока,
содержащего элемент р в последней позиции, определяют после-
довательность перестановок множества {1, ,,,, л)\{р) в анти-
лексикографическом порядке.
Эти свойства определяют следующий простой рекурсивный
алгоритм:
Алгоритм 1.10. (Генерирование всех последовательностей в
антилексикографическом порядке.)
Данные: п.
Результат: Последовательность перестановок множества
{1, .... л} в антилексикографическом порядке.
1 ргоседиге РЕУЕРЗЕ (т); (* обращение последовательности
Р[1], .... Р [/л]; массив Р — глобальный *)
2 Ье^т /:=1; /:=т;
3 \уЫ1е I < / до
4 Ьед1п Р [/] :=: Р [/]; / := I + 1; /:=/-!
5 епд
6 епд; (*РРУЕР5Р*)
7 ргоседиге АЫТУЬЕХ(пг)\ (* массив Р — глобальный *)
8 Ье&1п
9 И т=\ 1Веп (*Р[1], ..., Р[л] содержит новую пере-
становку *)
10 мгИе (Р[1], .... Р[и])
11 е1$е
12 Тог I := 1 <о т до
13 Ьее1п АЫТУЕЕХ(т — 1);
14 И Кт Шеп
15 Ье&1п Р [/] :=: Р [т]; РЕУЕРЗЕ (пг — 1)
16 епд
17 епд
18 епд; (*А№ГУЬЕХ*)
19 Ье§1п (* главная программа*)
20 Тог /:=1 1о и до Р[»’] :=:/;
21 АЫТУЕЕХ(п)
22 епд
Чтобы понять, как работает этот алгоритм, отметим прежде
всего, что выполнение процедуры РЕУЕРЗЕ (т) приводит к
обращению очередности в последовательности элементов
Р[1], ,,., Р[иг]. Чтобы доказать правильность алгоритма, доста-
точно показать индукцией по т, что если Р[1] <...-< Р[ш], то
вызов АМТУЕЕХ(т) приводит к генерированию всех перестано-
вок множества {Р[1], ..., Р[т]} в антилексикографическом по-
рядке (при неизменных значениях Р [т + 1], ..., Р [л]). Предпо-
ложим, что Р[/] = а,-, 1 1т, а\ < ... < ат, и рассмотрим
цикл 12, Эффект выполнения первой итерации этого цикла будет
следующий:
Р[1] Р[2] ... Р[т-2] Р[т — 1] Р[т}
«1 а2 ат-2 а,™
^/п-1 ат-2 а2 ат (после выполнения А№УЕЕХ(т—\.))
ат ^т-2 «2 а, ат-1 (после транспозиции Р[1]:=:Р[т])
«1 ат-2 ат-1 (после выполнения ЕЕУЕЯ8Е(т- 1))
(Мы воспользовались здесь индуктивным предположением о том,
что АЫТУЕЕХ(т—1) корректно генерирует все перестановки
элементов ..., ат-1 в антилексикографическом порядке.)
Аналогичным способом, индукцией по г, доказываем, что 1-я ите-
рация цикла 12 приводит к генерированию всех перестановок
элементов аь ..., ат-и ат-1+2, ...» ат при Р[т] = ат-1+\. Со-
гласно свойству А2 это означает, что Д{\[ТУЬЕХ(т) генерирует
все перестановки элементов аь ..., ат в антилексикографиче-
ском порядке. 3
Следует отметить, что условие Р[/] = 1 I п, в начале
работы программы (см. строка 20) было существенно только
Для облегчения понимания работы алгоритма. Сам алгоритм
сформулирован в терминах позиций, значения которых подвер-
гаются изменениям, и в нем ни в коей мере не используется со-
держание переменных Р[1],..., Р[л].
Рассмотрим теперь, сколько транспозиций выполняет алго-
ритм 1.10 при генерировании каждой следующей перестановки.
Легко отметить, что это число есть величина переменная: каждая
вторая перестановка получилась за счет одной транспозиции
Р[1]: =: Р[2]; но наряду с ними имеются и такие, которые тре-
буют [(и— 1)/2 ] + 1 = | (и + 1)/2 ] транспозиций. Хотя сред-
нее число транспозиций, приходящихся на каждую перестановку,
невелико (см. задачу 1.13), однако в некоторых приложениях
лучшим был бы алгоритм, в котором каждая следующая пере-
становка образуется из предыдущей с помощью выполнения
только одной транспозиции. Это может оказаться существенным
в ситуации, когда с каждой перестановкой связаны некоторые
вычисления и когда существует возможность использования ча-
стичных результатов, полученных для предыдущей перестанов-
ки, если последовательные перестановки мало отличаются друг
от друга.
Покажем сейчас, что такой алгоритм действительно возмо-
жен. Его основную схему можно описать с помощью следующей
рекурсивной процедуры:
1 ргоседиге РЕРМ(тУ,
(♦массив Р — глобальный ♦)
2 Ье^1п
3 И т=1 1Ьеп (*Р[1], Р[и] содержит новую пере-
становку *)
4 гюгИе (Р[1].......РН)
5 е!зе
6 Гог I := 1 1о т до
7 Ье&1п РЕРМ(т — 1);
8 И I < щ Шеп Р [В [т, г]] :=: Р [т]
9 епд
10 епд
Задачей этой процедуры является генерирование всех пере-
становок элементов Р[1], Р[и] через последовательное гене-
рирование всех перестановок элементов Р[1]....Р[п— 1] и за-
мену элемента Р[п] на один из элементов Р[1], Р\п—1],
определяемый из массива В[т, /], 1 I <. пг п. Очевидно,
что для того чтобы эта схема работала правильно, мы должны
определить массив В так, чтобы гарантировать, что каждая транс-
позиция Р[В[/п, 1]]: = : Р[т\ в строке 8 вводила бы новый эле-
мент в Р[/п]. Представим теперь алгоритм, в котором значение
В[т, I] вычисляется динамически как функция от пг и I [44]
Алгоритм 1.11. (Генерирование всех перестановок за мини-
мальное число транспозиций.)
Данные: п.
Результат: Последовательность перестановок множества
{1, ..., п}, в котором каждая последующая пере-
становка образуется из предыдущей путем выпол-
нения одной транспозиции.
1 ргоседиге В(т, /);
2 Ье&1п
3 И (т тод 2 = 0) апд (пг > 2) Жеп
4 И I < пг — 1 1Неп В := г
5 е1зе В :=т — 2
6 е1зе В :—т — 1
7 епд; (♦ В ♦)
8 ргоседиге РЕРМ (т)-,
(♦ массив Р — глобальный *)
9 Ьея1п
10 И пг = 1 (Ьеп (*Р[1], .... Р[п] — новая перестановка ♦)
11 (Р[1], .... Р[п])
12 е1зе
13 Тог I := 1 1о пг до
14 Ье&1п РЕЕМ (т — 1);
15 И I < т Нтеп Р [В (т, /)] :=: Р рп]
16 епд
17 епд; (*РЕРМ*)
18 Ьед1п (♦главная программа*)
19 Тог I := 1 1о п до Р [/] :=: /;
20 РЕЕМ(п)
21 епд
Отметим, что для нечетного т транспозиция в строке 15 сво-
дится к Р[т—1 ]: =: Р[иг], для каждого I <. т для четного т
значение Р[т] меняется последовательно на значения Р[1],
Р[2], .... Р{т — 3], Р[т — 2], Р[т — 1] (Р[1] для т = 2).
Для каждого т 1 определим перестановку <рт следующим
образом:
Фт(0 = индекс /, такой что Р [/] содержит начальное
значение переменной Р [/] после выполнения РЕЕМ (т).
Например, если сначала переменные Р[1], .... Р[4] содержат
последовательность 1 2 3 4, то легко убедиться, что после вы-
полнения РЕЕМ (4) эта последовательность изменится на
4 12 3. Это означает, что ф4 является циклом 1 2 3 4.
Покажем теперь, что алгоритм 1.11 корректен; точнее, дока-
жем для каждого т 1 выполнимость следующего условия:
Условие УРт. Выполнение РЕЕМ(т) вызывает генерирование
всех перестановок элементов Р[1]....Р[т], причем <рот есть
транспозиция [т т — 1], если т нечетное (т > 1), или цикл
[1 2 ... т], если т четно.
Доказательство осуществляется индукцией по т так, как это
обычно делается при доказательстве корректности рекурсивных
алгоритмов. Легко убедиться непосредственно, что условия №1
и 1^2 выполняются. Предположим, что т 3. Докажем выпол-
нимость Мт, предполагая истинность И/т_1. Доказательство ра-
зобьем на две части в зависимости от того, четное т или не-
четное.
Случай 1, т нечетное. В силу индуктивного предположения
выполнение РЕРМ(т — 1) в строке 14 приводит каждый раз к
сдвигу значений Р[ 1]..Р[т — 1] вдоль цикла [1 2 ... иг — 1].
Таким образом, транспозиция Р[иг] : = : Р[т — 1) в строке 15 вы-
бирает каждый раз различные элементы в Р[иг]. Если вначале
Р[г] = а,, 1 I т, то в Р[/п] помещаются поочередно элемен-
ты ат, ат-2, вт-з, •••, аь ат-1. Следовательно, РЕРМ(т) гене-
рирует все перестановки элементов Р[1]..Лт].
Заметим, что сдвиг Р[1], ..., Р[т — 1] вдоль цикла [1 2 ...
... т — 1], а затем выполнение транспозиции Р[иг] : = : Р[пг — 1]
эквивалентно сдвигу Р[1], .... Р[иг] вдоль цикла [1 2 ... т—3
Таблица 1.1. Изменение значений переменных Р [1], ...» Р [т]
во время выполнения процедуры РЕЕМ (т) при т четном
Число выполненных итераций цикла 13 НИ Р [21 Р [т-31 Р [т —2] Р[т-Ц Р[т]
0 а2 дт-з ат—2 ат—1 ат
1 ат Д/п-з ат-\ ат-2
2 ат ат-з ат~2 ат—1 а2
т — 3 ат дт-4 ат-1 ат-2 ат-з
т — 2 ат-4 ат-з ат—1 ат—2
т — 1 ат ат—4 ат-2 ат-з ат—\
пг ат ат—4 ат-з ат—2 ат—1
т — 2 т т—1] длины т. Если бы транспозиция в строке 15
выполнялась для каждого I т, то выполнение цикла 13 вы-
звало бы возвращение всех элементов на свои исходные места.
В действительности же последняя транспозиция для I = п не вы-
полняется. Следовательно, ср™ = [т, т— 1].
Случай 2, т четное. Проследим за содержанием массива Р
во время исполнения РЕРМ(т). Изменения, которым подвер-
гается он, представлены в табл. 1.1.
Из этой таблицы следует, что каждый элемент появляется в
Р[т], следовательно, РЕРМ(т) генерирует все перестановки, и
что фт является циклом [1 2 ... т]. Доказательство правильно-
сти алгоритма тем самым закончено.
Алгоритм 1.11 обладает одним свойством, которое может ока-
заться полезным в некоторых приложениях. Представим себе,
что мы ищем перестановку, удовлетворяющую определенным
условиям. В такой ситуации, если для некоторого т значения
Р[т +1] ... Р[п] не удовлетворяют требуемым ограничениям,
то нет необходимости в вызове РЕКМ(т) и в прохождении
всех т\ перестановок элементов Р[1], ..., Р[ги]. Эти переста-
новки мы можем опустить, выполняя перестановку элементов
Р[1], ..., Р[т], обозначаемую через ф™. Заметим, что переста-
новки фт имеют в нашем случае очень простую форму.
Последний алгоритм генерирования перестановок, который
мы здесь представляем, строит последовательность, в которой
разница между двумя последовательными перестановками еще
меньше: каждая следующая образуется из предыдущей с по-
мощью однократной транспозиции соседних элементов. Этот ал-
горитм обычно приписывается Джонсону [38] и Троттеру [68].
Его идею легче всего проиллюстрировать на примере. Предпо-
ложим, что уже построена последовательность перестановок эле-
ментов 2, 3, .... п, обладающая этим свойством, например: 2 3,
3 2 для п = 3. Тогда требуемую последовательность перестано-
вок элементов 1, 2.....п получим, вставляя элемент 1 всеми
возможными способами в каждую перестановку элементов
2, 3, ,,,, п. В нашем случае получаем
1 2 3
2 1 3
2 3 1
3 2 1
3 1 2
1 3 2
В общем виде элемент 1 перемещается между первой и послед-
ней позициями попеременно вперед и назад (п — 1)! раз.
На основе этой конструкции можно легко получить рекурсив-
ный алгоритм, генерирующий требуемую последовательность пе-
рестановок для произвольного п. Однако этот метод, применен-
ный непосредственно, имеет недостаток: последовательность
перестановок строится «целиком» и только после окончания
всего построения ее можно считывать. Очевидно, что решение
такого типа потребовало бы огромного объема памяти. Поэтому
мы сейчас покажем нерекурсивный вариант этого алгоритма.
В этом варианте для каждого /, 1 I <. п, булева переменная
Р/ф"] содержит информацию о том, переносится ли элемент I
вперед (Р/ф]=истина) или же назад (РР[|]=ложь), перемен-
ная же С[«] показывает, какую из возможных п — I + 1 позиций
элемент I занимает относительно элементов .... п на
своем пути вперед или назад. Позицию элемента I в таблице
Р определяем на основании его позиции в блоке, содержащем I,
I 4- 1, ,,., п, а также на основании числа элементов из 1, 2, .,.
.I— 1, которые находятся слева от этого блока. Это число,
будучи значением переменной х, вычисляется как число элемен-
тов / < I, которые, двигаясь назад, достигли бы своего крайнего
левого положения (С[/] = п — /4-1, РР[/] = ложь). Каждая но-
вая перестановка образуется транспозицией самого меньшего из
элементов /, который не находится в граничном положении (т. е.
С[/] < и — /4-1) с его левым или правым соседом. Это реали-
зует приведенный ниже алгоритм. Доказательство его правиль-
ности предоставляется читателю.
Алгоритм 1.12. (Генерирование всех перестановок с мини-
мальным числом транспозиций соседних эле-
ментов.)
Данные: п.
Результат: Последовательность перестановок множества
л}, в которой каждая последующая обра-
зуется в результате выполнения однократной
транспозиции соседних элементов.
1 Ье(?1п
2 Тог / := 1 То п до
3 Ье&!п Р [/]:=/; С[/]:=1; РР [{]:= истина;
4 епд;
5 С[п]:=0; (*так, чтобы С[«] ф п — I + 1 в строке 10 для
I = п *)
6 хюгИе (Р [1]......Р [п]);
7 /:=1;
8 луИНе I < п до
9 Ье^!п /:=1; х:=0;
10 5уЫ1е С [»] = п — I + 1 до
11 Ье&1п РР [/] := по! РР [/]; С [/] := 1:
12 И РР И Шеп х:=х+ 1;
13
14 епд;
15 И I < п Шеп
16 Ье&1п (* выполнение транспозиции *)
17 И РР [/] Шеп к := С [/] + х
18 е1«е к :=п — I + 1 — С [/] + х\
19 Р [*]:=: Р [6 + 1];
20 хягИе (Р[1], .... Р[п]);
21 С[»]:=С[/]4-1
22 епд
23 епд
24 епд
Отметим, что в этом алгоритме, как и в двух предыдущих,
не используется ни в какой мере знание значений переменных
Р[1], ..., Р[п]. Это очевидно, так как данные переменные появ-
ляются только в строке 19 (если не считать инициализации в
строке 3 и вывода результатов).
На рис. 1.4 представлены последовательности перестановок,
полученные для п = 4 при помощи алгоритмов 1.10, 1.11 и 1.12.
Укажем в заключение одну любопытную интерпретацию по-
следовательности, полученной с помощью алгоритма 1.12. Рас-
смотрим с этой целью граф Оп, вершины которого соответствуют
всем перестановкам множества {1, ..., п} и в котором две вер-
шины, соответствующие перестановкам I и ё, соединены ребром
тогда и только тогда, когда ё образуется из / однократной транс-
позицией соседних элементов (таким образом, каждая вершина
соединена в точности с п—1 другими вершинами). Нетрудно
заметить, что последовательность перестановок, полученная при
СО (в)
12 3 4 12 3 4 12 3 4
213 4 2 13 4 2 13 4
13 2 4 2 3 14 2 3 14
3 12 4 3 2 14 2 3 4 1
2 3 14 3 12 4 3 2 4 1
3 2 14 13 2 4 3 2 14
12 4 3 4 3 2 1 3 12 4
2 14 3 3 4 2 1 13 2 4
14 2 3 3 2 4 1 13 4 2
4 12 3 2 3 4 1 3 14 2
2 4 13 2 4 3 1 3 4 12
4 2 13 4 2 3 1 3 4 2 1
13 4 2 4 13 2 4 3 2 1
3 14 2 14 3 2 4 3 12
14 3 2 13 4 2 4 13 2
4 13 2 3 14 2 14 3 2
3 4 12 3 4 12 14 2 3
4 3 12 4 3 12 4 12 3
2 3 4 1 4 2 13 4 2 13
3 2 4 1 2 4 13 4 2 3 1
2 4 3 1 2 14 3 2 4 3 1
4 2 3 1 12 4 3 2 4 13
3 4 2 1 14 2 3 2 14 3
4 3 2 1 4 12 3 12 4 3
Рис. 1.4. Последовательности перестановок, полученные с помощью а) алго-
ритма 1.10, б) алгоритма 1.11, в) алгоритма 1.12.
Рис. 1.5. Интерпретация последовательности перестановок, полученной с по-
мощью алгоритма 1.12.
помощи алгоритма 1.12, соответствует гамильтонову пути в ОП9
т. е. пути, содержащему каждую вершину графа в точности один
раз. Это проиллюстрировано на рис. 1.5 для п = 3 и л = 4.
1.5. Подмножества множества,
множества с повторениями,
генерирование подмножеств множества
Каждое «-элементное множество X = {хь .,., хп} имеет в
точности 2" подмножеств. Чтобы убедиться в этом, достаточно
каждому подмножеству У = X сопоставить бинарную последова-
дельность (т.е. с членами 0 или 1) Ъ\Ъ% ... Ьп, определяемую
следующим образом:
если х1 ф У,
если х1 е У.
Тем самым мы устанавливаем взаимно однозначное соответствие
между элементами множества ^(Х) всех подмножеств множе-
ства X и всеми бинарными последовательностями длины п. Чис-
ло таких последовательностей в точности равно 2п, а значит в
силу установленного соответствия имеет место равенство
=2Л- ь
Определенная нами последовательность &1О2... оп становится
удобным машинным представлением подмножества У, особенно
в ситуации, когда мощность множества X невелика и последо-
вательность ...Ьп может быть закодирована в виде одного
машинного слова. Такое представление подсказывает простой
метод генерирования всех подмножеств. Достаточно заметить,
что каждая бинарная последовательность Ьп-}Ьп-2 ... Ьо соответ»
ствует взаимно однозначному целому числу из интервала
п—1
О г 2" — 1, а именно числу г—^Ь(21, для которого
Ьп-1Ьп-2.. .Ьо есть двоичное представление. Это число будем
обозначать через [&л-1&я-2.. .60]. Таким образом, мы можем по-
следовательно получать все числа из интервала 0 г 2Л— 1
(начиная, например, с 0 и добавляя 1 на каждом шаге), а их
двоичные представления дадут все подмножества «-элементного
множества. Этот метод особенно выгоден для реализации на вну-
треннем языке машины.
В некоторых ситуациях нам важно, чтобы каждое последую-
щее полученное подмножество наименьшим образом отличалось
от предыдущего. Объяснение полезности алгоритма такого типа
совершенно аналогично случаю алгоритмов 1.11 и 1.12 генериро-
вания перестановок: при проведении реальных вычислений, свя-
занных с каждым полученным подмножеством, имеется возмож-
ность использовать частичные результаты, полученные для пре-
дыдущего подмножества. Заметим, что в случае описанного
выше алгоритма, основанного на двоичном представлении чисел,
последовательно получаемые подмножества могут сильно отли-
чаться друг от друга: например, после (и — 1)-элементного мно-
жества, отвечающего числу 011 ... 1, идет одноэлементное мно-
жество, отвечающее числу 100... 0.
Опишем теперь другой метод, при котором каждое последую-
щее подмножество получается из предыдущего добавлением или
удалением одного элемента. Опирается он на следующее простое
наблюдение. Если последовательность С1, С2, ...» Ст содержит
все т = 2к бинарных последовательностей длины А, причем С/
отличается от С+1 в точности в одной координате (/= 1,
..., т — 1), то последовательность
СД С20, Ст0, Ст1, Ст_!1, си
содержит все бинарные последовательности длины к + 1, причем
каждые две соседние последовательности будут отличаться в
точности в одной координате. Этим непосредственно определяет-
ся некоторый алгоритм рекуррентного построения последова-
тельности всех подмножеств. Получаемая этим способом после-
довательность Сь ..., С2п называется бинарным кодом Грэя
порядка п. Опишем теперь нерекуррентную версию этого алго-
ритма.
Алгоритм 1.13. (Генерирование всех подмножеств п-эле-
ментного множества.)
Данные: и.
Результат: Последовательность всех подмножеств и-элемент-
ного множества, в которой каждое последующее
подмножество получается из предыдущего добав-
лением или удалением единственного элемента.
Каждое подмножество представляется бинарной
последовательностью В [ 1 ], ..., В [и].
1 Ье&1п
2 Гог /:=1 Го п <1о В[/]:=0; (* пустое множество*)
3 /:=0; (*/ = числу сгенерированных до этого момента
подмножеств *)
4 гереа!
б гмгНе (В [/], ..., В [и]);
6 /:=/4-1; р:=1; /:=/;
7 ?Н1Пе ] той 2 = 0 йо
8 Ье&1п (*/2р“1=/*)
9 /:=//2: р:=р-|-1
10 епд; (* р = (?(/)+ 1 *)
11 И р п 1Неп В [р] := 1 — В [р] (* смена позиции р *)
12 ип(П р > п
13 епс!
Докажем теперь, что описанный алгоритм действительно ге-
нерирует все бинарные последовательности длины п. Пусть
обозначает наибольшую степень двойки, которая делит I. Если
мы представим I в двоичном виде как / = [ЬпЬп-1... &]], то, оче-
видно, имеем <2(04- 1 = Ш1п{/: Ь/ = 1}. Покажем вначале, что
после выхода из внутреннего цикла 7 будем иметь р = <2 (04- 1.
С этой целью заметим, что до входа в цикл /2₽-1 = I (где р = 1,
/ = 0 и каждая итерация цикла не нарушает этого равенства
(так как (//2)2(₽+1)-1 = /2₽-1). После выхода из цикла / нечетно,
следовательно, = р—1, т. е. действительно р = <2(04-1.
Предположим теперь, что к < п и что в первых 2й итерациях
цикла 3 были получены все 2* бинарные последовательности
Ь1&2 ... Ьп, такие что Ьь+1 = ... = Ьп = 0 (это очевидно спра-
ведливо для к = 0). В последней из этих 2й итераций перемен-
ная 1 принимает значение 2к (строка 7). Переменная р получает
значение <2(2Й)4- 1 = к 4- 1, и, следовательно, наступает измене-
ние значения переменной В[й 4- 1] с 0 па 1. Рассмотрим теперь
последовательность
(2(2й4-1)4-1, (э(2й4-2)4-1...... <2(24+,)+1 (1.9)
значений переменной р, сгенерированных в последующих 2к ите-
рациях цикла 3. Отметим, что С?(2кт) = С?(2к — т) для
0 т 2к — 1 (этот факт становится особенно очевидным,
если рассматривать сложение чисел 2к + т и 2к — т, записан-
ных в двоичной форме). Последовательность (1.9) является зер-
кальным отображением последовательности значений перемен-
ной р, полученных в первых 2к итерациях цикла 3. Отсюда сле-
дует, что и последовательности В[1], В[2], ..., В[Л], полученные
в первых 2к итерациях, появляются в обратном порядке в по-
следующих 2к итерациях. Это дает все бинарные последователь-
ности Ь\Ь2... Ьп, такие, у которых 6*4-1 = ... = Ьп = 0, получен-
ные в первых 2*+1 итерациях. Отсюда становится ясно, что наш
алгоритм генерирует все бинарные последовательности длины п
в таком же порядке, что и предыдущий рекурсивный алгоритм.
Последовательность подмножеств, полученных при помощи
алгоритма для п = 4, представлена на рис. 1.6.
Можно показать, что среднее число шагов, необходимых для
генерирования каждого следующего подмножества (не считая
процедуры написания этого подмножества),ограничено констан-
той, не зависящей от п (см. задачу 1.21). Последовательность
подмножеств, полученных с помощью алгоритма 1.13, можно так
же, как мы это делали для последовательности перестановок,
полученных с помощью алгоритма 1.12, проиллюстрировать на
графе, вершины которого соответствуют бинарным последова-
тельностям длины п и две вершины которого соединены ребром,
если соответствующие последовательности отличаются в точ-
ности в одной позиции. Такой граф будем называть (двоичным)
п-мерным кубом. Очевидно, что последовательность, полученная
0 0 0 0
10 0 0
110 0
0 10 0
0 110
1110
10 10
0 0 10
0 0 11
10 11
1111
0 111
0 10 1
110 1
10 0 1
0 0 0 1
Рис. 1.6. Последовательность подмножеств, порожденных алгоритмом 1.13
для п = 4.
с помощью нашего алгоритма, соответствует гамильтонову пути
в этом графе. На рис. 1.7 это продемонстрировано для
п= 1,2,3, 4.
В некоторых приложениях более естественным, нежели поня-
тие множества, является множество с повторениями. Каждый
элемент множества с повторениями может появляться в этом
множестве несколько раз, число этих вхождений является суще-
ственным и носит название кратности элемента в множестве.
Множество с повторениями, содержащее, например, элемент а
кратности 2, элемент Ь кратности 3 и элемент с кратности 1,
будем обозначать (а, а, 6, &, &, с) или (2* а, 3*Ь, 1 *с). Поря-
док элементов не существен:
(а, а, Ь, 6, 6, с) = (Ь, а, 6, а, с, &)= ...
существенна только кратность каждого элемента — имеем
(а, а, Ь, 6, &, с)=/=(а, Ь, с)
в отличие от равенства множеств
{а, а, &, Ь, 6, с} = {а, Ь, с}.
Если в некотором множестве с повторениями кратность каж-
дого элемента равна единице, то, очевидно, мы можем отожде-
ствлять его с обычным множеством. Пусть Л, В — два множе-
ства с повторениями. Будем говорить, что А есть подмножество
В (обозначение Л^В), если кратность каждого элемента в А
не больше кратности этого элемента в В. Пусть X — множество
Рис. 1.7. Гамильтоновы пути в и-мерных кубах.
с повторениями, содержащее г разных элементов хь ..., х,
с кратностями к\, ..., кг соответственно. Число |Х| = &1 + ...
... + кг будем называть мощностью X. Каждому подмножеству
А X однозначно соответствует последовательность
(/Ь......тг),
О тг кг,
(1.Ю)
где пи обозначает кратность элемента х, в А. Отсюда сразу же
следует, что число всех подмножеств А X равно
(61+1)(/г2+1) ... (6г+1) (1.11)
Эти подмножества, а точнее соответствующие им последова-
тельности (1.10), можно генерировать способом, подобным тому,
который был использован в алгоритме 1.13. Для этого доста-
точно заметить, что если последовательность С2, ..., Ст со-
держит все р = (*14-1) ... (^4-1) последовательностей
ть ..., т5, 0 ГП[ О т3 к3, то последователь-
ность
СД С20, ..., Ср0, Ср1, Ср_{\, .... СД С{2, С22, ..., Ср2, Ср3, ...
(1.12)
длины р(&$+1 + 1) содержит все последовательности </иь ...
..., ^5+]>, 0 к\, ..., 0 ги5+1 &$+1. Очевидно, что
последовательность подмножеств, полученная с помощью та-
Рис. 1.8. Гамильтонов путь в графе, соответствующем подмножествам множе-
ства с повторениями (хь хь х2, х3, х3).
кого построения, будет обладать таким свойством, что каждое
последующее подмножество образуется из предыдущего добав-
лением или удалением одного элемента. Предоставляя читателю
исключить рекурсию из этого алгоритма, проиллюстрируем его
с помощью гамильтонова пути в некотором графе (рис. 1.8).
Этот рисунок интерпретируется так же, как и рис. 1.7.
1.6. /г-элементные подмножества,
биномиальные коэффициенты
Число всех А-элемеитных подмножеств п-элементного мно-
жества будем обозначать ("). Символ называется бино-
миальным коэффициентом, исходя из следующей формулы для
п-й степени бинома х + у.
(х + у)п = ^(П)хкуп-к. (1.13)
Чтобы убедиться в истинности этой формулы, достаточно за-
метить, что коэффициент при хкуп~к равен числу способов, кото-
рыми из п сомножителей (* + */) ... (х + у) можно выбрать к
сомножителей.
Очевидно, (^) = 0 для к > п. Напомним, что 6-элементные
подмножества п-элементного множества назывались в старой
литературе по комбинаторике 6-членными комбинациями для
п-элементного множества без повторений.
С биномиальными коэффициентами связано много интерес-
ных тождеств. Вот некоторые из них.
(1.14)
Эта формула следует из того, что сумма слева выражает
число всех подмножеств п-элементного множества.
(1.15)
Для доказательства этой формулы составим список, содер-
жащий по порядку все подмножества п-элементного множества
X. Этот список содержит (?) 1-элементных подмножеств для
1 = 1, ..., п; таким образом, его длина (так называемое число
появлений элементов множества X) выражается суммой в ле-
вой части формулы (1.15). С другой стороны, каждый элемент
хеХ появляется в списке 2Л~1 раз, так как таково число под-
множеств, содержащих х (их столько, сколько имеется всех
подмножеств множества Х\{х}). Поэтому длина нашего списка
равна п2л~1. Доказательство тем самым закончено.
п \ / п \
6 / \п — 6/
(1.16)
Это прямое следствие того факта, что каждому 6-элемект-
ному подмножеству У^Х однозначно соответствует (п — 6)-
элементное подмножество Х\У множества X.
/п —-’1\ /п—1\
1г ) + \к-1)
(1.17)
Эта формула получается из следующих рассуждений. Зафик-
сируем некоторый элемент х п-элементного множества X. Мно-
жество всех й-элементных подмножеств множества X распа-
дается на два непересекающихся класса: класс подмножеств.
которые не содержат элемент х, и класс подмножеств, которые
его содержат. Мощность первого класса составляет ), а
второго (*!})> т. е. столько, сколько имеется (к—1)-элемент-
ных подмножеств у множества Х\{х}.
Тождество (1.17) тесно связано со следующим треугольни-
ком Паскаля:
1
1 1
1 2 1
13 3 1
1 4 6 4 1
1 5 10 10 5 1
Если перенумеровать по порядку строки этого треугольника
числами 0,1,2, ..., то /-я строка окажется состоящей из чисел
(Х)-0
В силу формулы (1.17) каждое из них, кроме крайних, рав-
ных единице, можно получить как сумму чисел, находящихся
над ним в предыдущем ряду. Это дает простой метод построе-
ния треугольника Паскаля, а тем самым нахождения коэффи-
циентов разложения (х + у)‘— они задаются Ли строкой тре-
угольника (ср. с (1.13)).
Докажем еще одно тождество, связанное с биномиальными
коэффициентами, а именно тождество Коши:
Для этого представим себе, что из группы, состоящей из т
мужчин и п женщин мы хотим выбрать к человек. Мы можем
сделать это (т*л) способами (левая часть тождества). Все
Л-элементиые подмножества нашего множества можно класси-
фицировать по числу мужчин в подмножестве, ^-элементное
подмножество, содержащее 5 мужчин, можно получить, выбирая
сначала 5 мужчин одним из возможных способов, а затем
(к — з) женщин одним из (л2$) способов. Таким образом, чис-
ло всех возможных подмножеств из к человек, включающих 5
мужчин, равно )• Отсюда непосредственно следует фор-
мула (1.18).
Отметим, что для т = к = п данная формула приобретает
вид
2п \ _ у / п \2
(М9)
Мы хотим доказать еще одно тождество:
(1.20)
Для доказательства подсчитаем число таких пар <К, под-
множеств п-элементного множества X, что |/<| = А,
|М| = /п. С одной стороны, подмножество К можно выбрать
способами, а подмножество М е К можно выбрать (*) спосо-
бами, что дает (^)(т) возможных пар </<, М) (левая часть
(1.20)). С другой стороны, для каждого из (") подмножеств
М^Х можно выбрать ("Г™) способами подмножество
так как такое подмножество К однозначно определяется через
{к— /и)-элементное подмножество Х\К (п — /и)-элементного
множества Х\М. Искомое число пар </С, М) равно, таким обра-
зом, (т)("-Г) (пРавая часть (1.20)).
Дадим теперь формулу, позволяющую вычислять(д) непо-
средственно.
Теорема 1.14.
п(п~1) ... (п — к + \) НОВ
& ~~ к!(п — к)1 1-2. ... -к *
Доказательство. Каждая из [п] к инъективных последователь-
ностей длины к определяет ^-элементное подмножество, состоя-
щее из элементов, появляющихся в этой последовательности,
причем одно и то же подмножество 5 получаем в точности из
к\ последовательностей, соответствующих всем перестановкам
множества 5. Отсюда (^) = [п]*/й!. Теперь достаточно восполь-
зоваться теоремой 1.2.
Отметим, что эта теорема легко позволяет доказать все тож-
дества, рассмотренные в этом разделе. Например, для (1.17)
имеем
/ п А___ и! __________ п\ ( п — к . к \_____________
& ) к\(п — к)\ к\(п — к)\\ п * п )
_ («-1)1 , (« —1)1 _
— А1 (в — 1 — А)1 (й — 1)1 (« — А)1 — у к
Однако такое «алгебраическое» доказательство, основанное
на механическом преобразовании выражений, гораздо менее по-
нятно, чем «комбинаторное» доказательство, данное выше.
С другой стороны, формула (1.21) позволяет легко доказать
следующее свойство биномиальных коэффициентов!
/ п \ / п \
1гл/2и>чгп/21+1,1> ••• >\п7
(п > 1). Достаточно заметить, что
__ п (п — 1) ... (п — /) _ п — I
— 1-2. ... ./(/+1) —7+Т
п (п — 1) ... (п — / + 1) <
1.2. ... -I ~
П — I / Л
* + 1 \ / /
Имеем (п —+ 1)> 1 для I < (п—1)/2, т. е. для
< [м/2] , аналогично (м — 0/0 + О < 1 Для I > (п— 1)/2 т. е.
для/^ Гп/2],и(п- [п/2])/([п/2] +1)= Гп/2]/[п/2] =
= 1, если п нечетно (для четного п имеем [п/2] = [п/2] и
среднее равенство в (1.22), очевидно, выполняется).
Займемся теперь отысканием числа ^-элементных подмно-
жеств множества с повторениями (к*х\, ..., й*хл). Другими
словами, зададимся вопросом, сколькими способами можно по-
родить А-элементное множество с повторениями, имея в распоря-
жении п разных элементов, скажем 1, ..., п, из которых каж-
дый может использоваться произвольное число раз. Следует от-
метить, что это число равно числу неубывающих последователь-
ностей длины к с элементами из множества {1, и}. Это вы-
текает из того факта, что элементы каждого подмножества мож-
но однозначно расставить в неубывающую последовательность.
Очевидно, что подмножествам без повторений соответствуют воз-
растающие последовательности.
Теорема 1.15. Число к-элементных подмножеств множества
(к*х\.....Ьхл) равно
/п+к-1
I к
(1.23)
Доказательство. Мы должны определить число убывающих
последовательностей <аь ..., а&> с элементами из множества
{1, п}. Каждую такую последовательность можно разделить
на п частей, где 1-я часть содержит некоторое, быть может ну*
левое, число следующих друг за другом элементов г. Если мы
отделим эти части одну от другой п—1 нулями, использован*
ными в качестве разделителей, то получим последовательность
длины кп—1. Например, для п = 5, А = 4 последователь*
ности <2, 2, 4, 5> соответствует последовательность <0, 2, 2, 0, 0,
4, 0, 5>. Последняя последовательность однозначно определяется
размещением появляющихся в ней нулей. Действительно, мы
можем восстановить ее, заполняя часть до первого нуля экземп*
лярами элемента 1, часть от первого до второго нуля — экземп-
лярами элемента 2 и т. д. А число размещений п—1 нулей на
к + п— 1 позициях равно
+ / п + й — 1 \ /п + й—1\
\ п—1 / \(л + 4- 1) —и— к / "
Полученное таким образом число подмножеств с повторе-
ниями можно записать несколько иначе:
/п + 6-1\ п(н+1) ... (п + А-1) [п]к п ол.
к ) ---------------к\---------= тг- С1-24)
Дадим комбинаторную интерпретацию этого тождества. На-
помним с этой целью, что [п]А есть число упорядоченных раз-
мещений к элементов хь ..., Хк в п ячейках. Отметим, что каж-
дому такому размещению, содержащему п элементов в /-й ячей-
ке, соответствует й-элементноеподмножество (Г1*уь .... тп*Уп)
множества с повторениями (к*у\, ..., к*уп). В этом упорядо-
чении существенно только число элементов в каждой из ячеек.
Таким образом, размещениям
ячейка 1 ячейка 2 ячейка 3
*з х2
Х< Х{
Хз Х{ х4
хг Х3 х5
соответствует одно и то же подмножество 2 * у\, 3 * уз. Ясно, что
каждые два размещения, соответствующие одному и тому же
подмножеству, отличаются перестановкой объектов хь ..., х*.
В результате число всех й-элементных подмножеств множества
с повторениями (А*г/ь ...» к*уп) равно [п]ЛД!. Очевидно, что
это рассуждение вместе с формулой (1.24) представляет собой
другое доказательство теоремы 1.15.
1.7. Генерирование /г-элементных
подмножеств
Опишем сейчас два алгоритма генерирования всех А-элемент-
ных подмножеств п-элементного множества X. Без ограничения
общности можно принять Х={1, п}. Тогда каждому А-эле-
ментному подмножеству взаимно однозначно соответствует воз-
растающая последовательность длины к с элементами из X; на-
пример, подмножеству {3,5, 1} соответствует последовательность
<1,3, 5>.
Можно легко указать алгоритм, с помощью которого гене-
рируются все такие последовательности в лексикографическом
порядке. Достаточно с этой целью заметить, что при таком по-
рядке последовательностью, непосредственно следующей за по-
следовательностью <Я1, а^>, является
...» Ьк) = (а1..ар_1, ар+1, ар + 2.....ар + /г — р + I),
где
р = тах {/: а1 < п — к + 1}.
Более того, последовательностью, непосредственно следую-
щей за <61, ..., 6*>, является
<с„ ..ск) =
= (61...6₽'-1, 6р'+1, 1^ + 2.....Ь^ + к-р'+Г),
где
( р — 1, если 6* = л,
р' = < , ,
(к, если Ьъ< п
(будем предполагать, что последовательности <аь ..., ак) и
<61, 6*> отличаются от <п — к + 1, ..., п> — последней по-
следовательности в нашем порядке). Это приводит к следую-
щему простому алгоритму.
Алгоритм 1.16.(Генерирование всех А-элементных подмно-
жеств множества {1, ..., п} в лексикографи-
ческом порядке.)
Данные: п, к.
Результат: последовательность всех ^-элементных подмно-
жеств множества {1, ..., п} в лексикографиче-
ском порядке.
1 Ъед1п
2 Тог I := 1 То к до А [/] :=(♦ первое подмножество *)
3 р:=к;
4 ууНПе р <1 1 до
5 Ьедт и>г11е (4[1]........И [Аг] );
6 И А[к] = п Й1еп р:=р — 1 е1эе р-.— к’,
7 И р^1 ТНеп
8 Тог I := к доАУпТо р до Л [/] := А [р] +1 — р + 1
9 епд
10 епд
Последовательность всех 4-элементных подмножеств множе-
ства {1, .6}, полученная с помощью этого алгоритма, пред-
ставлена на рис. 1 9.
12 3 4
12 3 5
12 3 6
12 4 5
12 4 6
12 5 6
1 3 4 5 Рис. 1.9. Последовательность 4-элементных под-
1 3 4 6 множеств множества {I, .... 6}, построенная при
1 3 5 6 помощи алгоритма 1.16.
14 5 6
2 3 4 5
2 3 4 6
2 3 5 6
2 4 5 6
3 4 5 6
Другой алгоритм, который мы опишем ниже, генерирует все
^-элементные подмножества таким образом, что каждое после-
дующее подмножество образуется из предыдущего удалением
одного элемента и добавлением другого. Этот алгоритм предста-
вим в рекурсивной форме. Обозначим с этой целью через О (п, к)
список, содержащий все й-элементные подмножества множества
{1, л}> в котором первым подмножеством является
{I, ..., к}, последним—{1,2, ..., к—1, п} и каждое следую-
щее подмножество образуется из предыдущего удалением неко-
торого элемента и добавлением другого. Отметим, что если
О(п—1,А) и О(п—\,к—1) уже построены, то О(п, к) можно
рпределить следующим образом:
О (п, к) = С (п - 1, к)9 О* (п - 1, к - 1) 0 {и}, (1.25)
где О*(м—\,к—1)0{п} обозначает список, образованный из
6(п—1,й—1) изменением порядка элементов списка на обрат-
ный и последующим добавлением элемента п к каждому множе-
ству. Действительно, О(п—1,й) содержит все А-элементные
подмножества множества {1. .... п}, не содержащие п, О* (и — 1,
<?(2,2)
{14
<?С4,2)
Рис. 1.10. Построение списка 6(4, 2).
к—1)и{п}—все ^-элементные подмножества, содержащие и,
причем последним подмножеством в списке О(п — 1, к) является
{1,2, ,к—1, п—1}, а первым подмножеством в списке
Рис. 1.11. Гамильтонов путь в графе, соответствующем всем двухэлементным
подможесгвам множества {1, 2, 3, 4).
6*(п—1,А—является {1,2, ..., к—1,п}. На рис. 1.10
показан процесс построения списка 0(4,2).
Списку О(п> к) мы можем так же, как и в случае генериро-
вания всех подмножеств, поставить в соответствие некоторый
гамильтонов путь в графе, вершины которого соответствуют.
двухэлементным подмножествам множества {1,2,3,4}, причем
вершины, соответствующие подмножествам А и В, соединены
ребром тогда и только тогда, когда |ЛПВ| = й—1 = 1. Это
проиллюстрировано на рис. 1.11.
Предоставляем читателю самому избавиться от рекурсии в
описанном алгоритме (см. задачу 1.29).
1.8. Разбиения множества
Под разбиением п-элементного множества X на к блоков бу-
дем понимать произвольное семейство л = {В1, ..., Вк}, такое
что В) и ... и Вь = X, В, Л В/ = 0 для 1 к и В1 0
для 1 I к. Подмножества Вь ..., Вк будем называть бло-
ками семейства л. Множество всех разбиений множества X на
к блоков будем обозначать ПЛ(Х), а множество всех разбиений
через П(Х). Очевидно, что П(Х) = П) (Х)0 ... ОПДХ) (более
того, {П1 (X), ..., ПЛ(Х)} является разбиением множества
п(Х)).
С разбиением связано понятие отношения эквивалентности.
Каждому разбиению л мы можем поставить в соответствие от-
ношение эквивалентности
Е(П)= и (ВХВ)
Вел
(1.26)
(элементы х, у^Х находятся в отношении В (л) тогда и только
тогда, когда они принадлежат одному и тому же блоку разбие-
ния л). И наоборот, каждому отношению эквивалентности Е на
множестве X мы можем поставить в соответствие разбиение
Х/Е={х/Е\х<=Х}, (1.27)
где х/Е обозначает класс эквивалентности элемента х, т. е. мно-
жество всех элементов, находящихся в отношении Е к эле-
менту х:
х/Е = {у<=Х\хЕу}. (1.28)
Нетрудно заметить, что формулы (1.26) и (1.27) определяют
взаимно однозначное соответствие между разбиениями и отно-
шениями эквивалентности на множестве X.
Если л, а е П(Х) и каждый блок В е а является суммой не-
которого числа блоков разбиения л, то будем говорить, что л
есть измельчение разбиения а, и будем писать л а. Например:
({1}, {2,5}, {4,6}, {3}}<{{1, 2, 3, 5}, {4, 6}}.
Легко проверить, что л а тогда и только тогда, когда для
отношений эквивалентности, соответствующих данным разбие*
ниям, выполняется соотношение Е(л)^Е(о). Очевидно, что оп-
ределенное таким образом отношение является частичным
упорядочением на множестве П(ЛГ). Некоторые свойства множе-
ства П(Х), упорядоченного с помощью отношения измельчения,
напоминают аналогичные свойства множества ^(Х), упорядо-
ченного на основе включения. Остановимся сейчас на одном из
таких свойств.
Частично упорядоченное множество <Д, =^> будем называть
решеткой, если для произвольных элементов х, у^А суще-
ствуют такие элементы а, Ь А, что
(а) а^х, а^у и для произвольного элемента с, такого что
с^х, с^.у, имеем с^а,
(б) Ь^х, Ь^у и для произвольного элемента с, такого что
с^х, с^у, имеем с^Ь.
Такие элементы, если они существуют, однозначно опреде-
ляются через х и у. Действительно, для произвольных элементов
яь ^2, отвечающих условию (а), имеем 02 #1 и щ Яг, т. е.
01 = 02; аналогично доказывается (б). Элемент о будем назы-
вать нижней границей элементов х, у и обозначать хЛ у, а эле-
мент Ь будем называть, верхней границей и обозначать х V у.
Примером решетки является <^(Х),^>. Очевидно, что в
этом случае имеем Л А В = Д Я и А V В = А О В.
Теорема 1.17. Множество П(Х), упорядоченное на основе от-
ношения измельчения образует решетку, причем
л До = {Д я в : (Л е л)Д(В е= о)Д(Д Г) В^ 0)}, (1.29)
т. е.
В(лДо) = В(л)Я^(а), (1.30)
а разбиение л V а определяется следующим образом:
(х, у) Е(лVо)<=> существует к^1 и такая последователь-
ность хь , хк, что х = хь
у = хк и (хо х/+1>еВ(л) или (1.31)
(хо х/+1)е В (о) для /=1, 2, ...
.... 9 к-1.
Доказательство. Отметим прежде всего, что простым следствием
определения отношения эквивалентности является тот факт, что
пересечение двух отношений эквивалентности есть отношение
эквивалентности. Таким образом, В (л) Я В (а) есть отношение
эквивалентности, которое в свою очередь однозначно определяет
некоторое разбиение а, такое что В (л) Я Е(о) = Е(а) (ср. (1.27)).
Очевидно, что В(а)^В(л), В(а)^В(а), а, следовательно,
а_^л, а а. Более того, для каждого разбиения а'> такого что
а'=^л, а'<т, имеем Е(а')^Е(л), Е(а')^Е(а) и в резуль-
тате Е(а')^ Е(л)(}Е(а) = Е(а), т. е. а'а. Следовательно,
а = л^’ст, что доказывает формулу (1.30). Отметим, что х,уе
е Д(л Л о) = Е(я)(\Е(а) тогда и только тогда, когда х и у при-
надлежат к одному и тому же блоку разбиения лик одному
блоку разбиения а, т. е. х, у е А П В, где <4 ел В с а. Послед-
нее и доказывает формулу (1.29).
Предположим теперь, что /? — бинарное отношение, опреде-
ленное правой частью формулы (1.31). Нетрудно проверить, что
К— отношение эквивалентности. Действительно, хЦх (доста-
точно принять к = 1), хКу влечет за собой уЦх (достаточно рас-
смотреть последовательность Хк, Хк-1, .... Х1) и хКу, уКг влекут
за собой хВ.г (достаточно рассмотреть конкатенацию соответ-
ствующих последовательностей). Отношение /? однозначно опре-
деляет разбиение р, такое что Е(р) = /?. Очевидно, что Е (л) =
= /? = Е (Р) и Е (о) = /? = Д(р), т. е. л р и о р. Предполо-
жим теперь, что Р' — произвольное разбиение, такое что л^ р',
а Р', и пусть (х,(/)бЕ(р), Тогда существует последователь-
ность х — X], Х2, .... Хк— у, удовлетворяющая правой части фор-
мулы (1.31), и, следовательно, <х/, хА+1> е Е(л)1)В(а) = В(р'),
1^1^ к. Вследствие транзитивности отношения В(р'), имеем
<х, у> е Е(Р'). Таким образом, мы доказали, что Р Р', а сле-
довательно, и р = л V а.
1.9. Числа Стирлинга
второго и первого рода
Число Стирлинга второго рода 8(п,к) определяется как
число разбиений п-элементного множества на к блоков:
8(п, 6) = |Щ(Х)|, где |Х| = п. (1.32)
Например, 5(4, 2) = 7, так как существуют в точности 7 раз-
биений множества {1, .... 4} на два блока:
{{1, 2, 3), {4}}
{{1, 2, 4), {3)}
{{I. 3, 4), {2}}
«1, 2), {3, 4}}
{{1, 3}, {2, 4}}
{{1. 4}, {2, 3)}
{(О, {2, 3, 4}}
Очевидно, что 8(п,к) = 0 для к > п. Примем также
5(0,0)=1, так как пустое семейство блоков является в соот-
ветствии с определением разбиением пустого множества. С чис-
лами Стирлинга второго порядка связано, как и с биномиаль-
ными коэффициентами, много любопытных тождеств. Докажем
сначала тождество, напоминающее тождество (1.17), связанное
с треугольником Паскаля:
Л) = 5(п-1, Л — 1)4-— 1, к) для 0 < к < п, (1.33)
5(п, п)=1 для п>0, (1.34)
5(п, 0) = 0 для п > 0. (1.35)
Формулы (1.34) и (1.35) очевидны. Для доказательства фор-
мулы (1.33) рассмотрим множество всех разбиений множества
{1, ..., п} на к блоков. Это множество распадается на два раз-
личных класса: тех разбиений, которые содержат одноэлемент-
ный блок {п}, и тех разбиений, для которых п является элемен-
том большего (по крайней мере двухэлементного) блока. Мощ-
ность первого класса равна 8(п— 1, к — 1), т. е. такова, каково
число разбиений множества {1, ..., п,— 1} на к—1 блоков.
Мощность другого класса составляет к8(п— 1,Л), так как каж-
дому разбиению множества {1, ..., п— 1} на к блоков соответ*
ствует в этом классе в точности к разбиений, образованных до-
бавлением элемента п, поочередно к каждому блоку.
Формулы (1.33), (1.34) и (1.35) позволяют легко вычислять
значения 5 (и, к) даже для больших значений п и к. В табл. 1.2
представлены числа 5(п, к) для 0 и, к 10.
Отметим, что эту таблицу можно трактовать как «треуголь-
ник Стирлинга», в котором каждое значение, кроме крайних,
равных единице, можно получить как сумму чисел, находящихся
над ним, а именно числа, расположенного в точности над ним
и умноженного на к, и числа над ним с левой стороны.
Таблица 1.2. Числа Стирлинга второго ряда
п \ 0 1 2 3 4 5 6 7 8 9 10
0 1 0 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 0
2 0 1 1 0 0 0 0 0 0 0 0
3 0 1 3 1 0 0 0 0 0 0 0
4 0 1 7 6 1 0 0 0 0 0 0
5 0 1 15 25 10 1 0 0 0 0 0
6 0 1 31 90 65 15 1 0 0 0 0
7 0 1 63 301 350 140 21 1 0 0 0
8 0 1 127 966 1 701 1050 266 28 1 0 0
9 0 1 255 3 025 7 770 6 951 2 646 462 36 1 0
10 0 1 511 9 330 34 105 42 525 22 827 5 880 750 45 1
Вот пример другой рекуррентной зависимости, связанной с
числами Стирлинга второго рода:
/п- 1\
8(п, к) = % . 5(/, к- 1) для 6>2. (1.36)
/=6-1 \ * /
Для доказательства тождества рассмотрим множество всех
разбиений 8(п,к) множества X = {1,..., п}. Это множество
распадается на различные классы, соответствующие разным под-
множествам множества X, которые являются блоками, содержа*
щими элемент п. Отметим, что для каждого 6-элементного под-
множества В^Х, содержащего элемент п, существует в точно-
сти 5 (и — 6, к—1) разбиений множества X на к блоков, содер-
жащих В в качестве блока. Действительно, каждое такое раз-
биение однозначно соответствует разбиению множества Х\В на
к—1 блоков. 6-элементное множество В е X, содержащее эле-
мент п, можно выбрать (*2{) способами; таким образом,
/п _ 1\
8(п, к)= Е . . $(п-6, к-1) =
6 = 1 \о — 1/
= Е „_,,5(п-6,6-1) =
д=1 \П У/
Л“1 /П —
= Е ( , Ъ(л 6-1).
Число Белла Вп определяется как число всех разбиений
п-элементного множества
В„ = |П(Х)|, где |Х| = п. (1.37)
Другими словами,
В„=Е5(п,6). (1.38)
Докажем теперь следующую простую рекуррентную зависи-
мость, связанную с числами Белла:
(1.39)
(принимаем Во = 1). Доказательство проводится аналогично
доказательству тождества (1.36). Множество всех разбиений
множества Х={1, п + 1} можно разбить на различные
классы в зависимости от блока В, содержащего элемент п + 1,
или — что равнозначно — в зависимости от множества Х\В.
Для каждого множества Х\В^{1, ..., п} существует в точ-
Таблица 1.3. Числа Белла Вп
п вп
0 1
1 1
2 2
3 5
4 15
5 52
6 203
7 877
8 4 140
9 21 147
10 115 975
11 678 570
12 4213597
13 27 644 437
14 190 899 322
15 1 382 958 545
16 10 480 142 147
17 82 864 869 804
18 682 076 806 159
19 5 832 742 205 057
20 51 724 158 235 372
ности | П(Х\В)| = В|х\в| разбиений множества X, содержа-
щих В в качестве блока. Группируя наши классы в зависимо-
сти от мощности множества Х\В, получаем формулу (1.39).
Числа Вп для 0 п 20 представлены в табл. 1.3.
Существует строгая зависимость между числами 5 (и, к) и
числом всех функций из п-элементного множества на /г-эле-
ментное множество, т. е. функций Х->У, ЦХ) = У для |Х| =
= и, |У| = А. Каждой такой функ-
ции I можно поставить в соответ-
ствие следующее разбиение множе-
ства X на к блоков:
А' (/) = {/-' (У) (1-40)
называемое ядром функции / (усло-
вие /(Х)=У дает гарантию того,
что подмножества /-1(#) непустые).
С другой стороны, нетрудно заме-
тить, что каждому разбиению лЕ
еЩ(Л соответствует в точности
к\ функций из X на У, таких что
дг(^) = л. Каждая такая функция
взаимно однозначно соответствует
соотнесению блоков разбиения
л элементам множества У. Обозна-
чая через 8п, к число функций из X
на У, получаем, следовательно,
^к = к\8^ к). (1.41)
Пользуясь этой формулой, мы можем доказать еще одно
свойство чисел Стирлинга второго рода, которое касается связи
между многочленами хк и многочленами
[хЬ = х(х-1)...(х-*+1). (1.42)
Произвольный многочлен Р(х) от неизвестного х степени п
п
мы можем однозначно представить как Р (х) = ак [х]А. Это
л=о
частный случай того очевидного факта, что существует одно-
п
значное разложение Р (х) = акрк (х) для произвольной по-
/г=0
следовательности многочленов Ро(*)» Р1(*), •••> такой что
рл(х) есть многочлен степени к для каждого к 0. Другими
словами, каждая такая последовательность образует базис в
линейном пространстве многочленов. Оказывается, что числа
Стирлинга второго рода в точности равны коэффициентам пе«
рехода от базиса 1, х, х2, ... к базису 1, [х]д, [х]2, . »
Теорема 1.18. Для каждого п О
п
хл=Е5(Л, *)№•
Л-О
(1.43)
Доказательство. Предположим сначала, что х — неотрица-
тельное целое число. Подсчитаем двумя способами число всех
функций /: Л->В, где |Д| = п, |В| = х. С одной стороны, оно
равно хп (см. теорему 1.1). С другой стороны, множество таких
функций / мы можем классифицировать относительно множе-
ства /(Л). Очевидно, что каждая функция / является отобра-
жением множества Л на множество /(Л), таким образом, для
произвольного подмножества У^В, где | У | = к, число всех
функций /: Л->В, таких что /(Л)= У, равно 5Л, *, т. е. в со-
ответствии с формулой (1.41) А!5(п, к). Учитывая тот факт, что
подмножество У мощности к можно выбрать
С)
способами,
получаем в конечном итоге
*’’ = Е(Л*!$(п, *)=Е И*5(п, к) (1.44)
6=0 \К/ &=0
(верхний индекс суммирования можно заменить с х на и, так
как 5(п, А) = 0 для к>п и [х] * = 0 для к < х). Поскольку
равенство многочленов выполняется для произвольного целого
числа х 0, эти многочлены тождественно равны (так как их
разность либо является тождественно равной нулю, либо имеет
бесконечное число нулей).
Числа Стирлинга первого рода з(п,к) определяются как ко-
эффициенты при последовательных степенях переменной х в
многочлене [х]_*:
Ип=Е $(«, (1-45)
л=о
Другими словами, числа з(п, к) играют обратную роль в от-
ношении к числам 8(п, к)—позволяют перейти от базиса 1,
[х]ь [х] 2, ...» к базису 1 х, х2, ... . Очевидно, что 5 (и, к)=0
для к > п. Числа 5 (и, к) удобно вычислять, пользуясь следую-
щими рекуррентными зависимостями:
$(п, к) = 8 (п — 1, к — 1) — (и — 1)5 (п — 1, к)
для 0 < к < п, (1.46)
5(п, п) = 1 для п>0, (1.47)
5(п, 0) = 0 для и > 0. (1.48)
Формулы (1.47) и (1.48) очевидны, формулу (1.46) полу-
чаем, сравнивая коэффициенты при хк с обеих частей равенства
И» = Ии-1 (х - п + 1). (1.49)
То есть имеем
п П —1
2} $(п, к)хк = (х — п + 1) У. $(п — 1, к)хк —
к-0 к-О
п-1 п-1
= 2 «(п — 1, к) хк+1 — (п — 1) з(п, к)хк =
Л=0 Л-0
п-1
= Е (8(п-1, /г — 1) — (п — 1)«(п — 1, Л))х* +
Л-1
+ $(п — 1, п — 1)х" — (п — 1)$(п — 1, 0).
В табл. 1.4 представлены числа «(/г, к) для 0 п, к 10.
Таблица 1.4. Числа Стирлинга первого рода
\ Л п \ 0 1 2 3 4 5 6 7 8 9 10
0 1 0 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 0
2 0 —1 1 0 0 0 0 0 0 0 0
3 0 2 -3 1 0 0 0 0 0 0 0
4 0 -6 И -6 1 0 0 0 0 0 0
5 0 24 -50 35 -10 1 0 0 0 0 0
6 0 — 120 274 -225 85 -15 1 0 0 0 0
7 0 720 -1 764 1 624 -735 175 -21 1 0 0 0
8 0 -5 040 13 068 -13 132 6 769 -1 960 322 -28 1 0 0
9 0 40 320 -109 584 118 124 -67 284 22 449 -4 536 546 -36 1 0
10 0 —362 880 к1 026 576 -1 172 700 723 680 -269 325 63 273 -9 450 870 -45 0
1.10. Генерирование разбиений множества
Опишем теперь алгоритм генерирования всех разбиений мно-
жества. Идею этого алгоритма легче всего объяснить, сформу-
лировав его в рекуррентной форме. Отметим сначала, что ка-
ждое разбиение л множества {1, ..., п} однозначно определяет
разбиение Яп-1 множества {1, ..., п —1), возникшее из л пос-
ле удаления элемента п из соответствующего блока (и удале-
ния образовавшегося пустого блока, если элемент п образовы-
вал одноэлементный блок). Напротив, если дано разбиение
а= {Вь .в*} множества {1, ..., п—1}, легко найти все
разбиения л множества {1, ..., п}, такие что лл-1 = а, т. е.
следующие разбиения:
{п}, в2....вк,
в1( в2 и {п}, ..., вк,
: (1.50)
В„ В2, ... , вк1){п},
Вь В2, ... , Вк, {п}.
Это подсказывает следующий простой рекуррентный метод
генерирования всех разбиений: если нам дан список Ьп-\ всех
разбиений множества {1, и—1}, то список Ьп всех раз-
биений множества {1, п} будем создавать, заменяя каждое
разбиение а в списке на соответствующую ему последова-
тельность (1.50). Отметим, что при этом мы можем гарантиро-
вать, что разбиения, идущие друг за другом, будут мало от-
личаться друг от друга, точнее говоря, мы можем принять, что
каждое следующее разбиение в списке образуется из предыду-
щего посредством удаления некоторого элемента из некоторого
блока (это может повлечь за собой удаление одноэлементного
Рис. 1.12. Построение списков Г2,
блока) и добавления его в другой блок либо создания из него
одноэлементного блока. Действительно, последовательные раз-
биения последовательности (1.50) отвечают этому условию.
Если обратить порядок последовательности (1.50) для каждого
второго разбиения списка 1л_ь то элемент п будет двигаться
попеременно вперед и назад, и разбиения «на стыке» последо-
вательностей, образованных из соседних разбиений списка
будут мало отличаться друг от друга (при условии, что сосед-
ние разбиения списка Еп-\ мало отличаются один от другого).
На рис. 1.12 показано построение списка Ьп для п = 1, 2, 3
(разбиения представлены в несколько упрощенной записи, на-
пример (1 2) (3) означает {{1, 2}, {3}}).
Дадим сейчас нерекуррентную реализацию этого алгоритма
(это измененная версия алгоритма, описанного в [39]). Раз-
биение множества {1, ..., п} мы будем представлять с по-
мощью последовательности блоков, упорядоченной по возра-
станию самого маленького элемента в блоке. Этот наименьший
элемент блока мы будем называть номером блока. Отметим,
что номера соседних блоков, вообще говоря, не являются со-
седними натуральными числами. В этом алгоритме мы будем
использовать переменные ПРЕД[1\. СЛЕД[1], 1 и, со-
держащие соответственно номер предыдущего и номер следую-
щего блока для блока с номером I (СЛЕД[1] = 0, если блок с
номером I является последним блоком разбиения). Для каждого
элемента г, 1 I п, номер блока, содержащего элемент г,
будет храниться в переменной БЛОК[1], направление, в кото-
ром «движется» элемент /, будет закодировано в булевской пе-
ременной ВПЕРЦ] (ВПЕР[1] = {гие, если / движется вперед;
здесь можно заметить некоторое подобие алгоритму 1.12).
Алгоритм 1.19. (Генерирование всех разбиений множества
1, п.)
Данные: и.
Результат: Последовательность всех разбиений множества
{1, .... П}, в которой каждое следующее разбиение
образуется из предыдущего путем перенесения един-
ственного элемента в другой блок.
1 Ье^т
2 Тог /: = 1 То п до (* поместить / в первый блок *)
3 Ье#1п БЛОК. И : =1; ВПЕР [/]: = истина;
4 епд;
5 СЛЕД[1]:=0;
6 выписать разбиение;
7 /: =п; (*/ = активный элемент *)
8 5уЫ1е / > 1 до
9 Ье?1п к : = БЛОК [/];
10 И ВПЕР [/] ТЬеп (* / движется вперед *)
11 Ье&1п
12 И СЛЕД [й] = 0 ТЬеп(* йесть последний блок *)
13 Ьеет СЛЕД\к]-. = р,ПРЕД[1]-. = к-,СЛЕД[!]-. = Ъ
14 епд;
15 И СЛЕД [/г] > / ТЬеп (♦ / образует новый блок *)
16 Ъе&1п ПРЕД [/]: = к; СЛЕД []]: = СЛЕД [6]
17 ПРЕД [СЛЕД [/]]: = /; СЛЕД [6]: = /
18 епд;
19 БЛОК [/]: = СЛЕД [6]
20 епд
21 е1зе (♦ / движется назад *)
22 Ье&1п БЛОК [1]: = ПРЕД [/?];
23 И к = /' ТНеп (* / образует одноэлементный блок *)
24 И СЛЕД [/г] = 0 ТЬеп СЛЕД [ПРЕД [Л]]: = 0
25 е1зе Ьееш СЛЕД [ПРЕД [к]]: = СЛЕД [&];
26 ПРЕД [СЛЕД [&]]: = ПРЕД [6]
27 епд
28 епд;
29 выписать разбиение;
30 = п;
31 \уЫ1е (/’> 1) епд
32 ((ВПЕР [/] апд (БЛОК [/] = /)) ог (поТ ВПЕР [/]
апд (БЛОК [/] = 1))) <1о
33 Ьееш ВПЕР [/] = по! ВПЕР [/]: /: = / - 1
34 епд
35 епд
36 епд
Этот алгоритм строит сначала разбиение {{I, ,л}}
(цикл 2) —отметим, что это первое разбиение в списке соз-
данном при помощи описанного нами рекуррентного метода.
Задача основного цикла 8 — перемещение «активного» элемен-
та ] в соседний блок — предыдущий или последующий (в по-
следнем случае может возникнуть необходимость создания но-
вого блока вида {/}), а затем определение активного элемента
во вновь образованном разбиении. Из описанного рекуррент-
ного построения следует, что данный элемент перемещается
только тогда, когда все элементы, большие его, достигают сво-
его крайнего левого или правого положения; точнее, активный
элемент /* является таким наименьшим элементом, что для ка-
ждого большего элемента / выполняется одно из двух следую-
щих условий:
(1) ВПЕР [/]апд (БЛОК [/] = /), т. е. элемент движется впе-
ред и достигает своего крайнего правого положения (очевидно,
/ не может быть элементом блока с наименьшим элементом,
большим /).
(2) по! ВПЕР[]\ апд(5Л0К[/] = 1), т. е. элемент / движет-
ся назад и достигает своего крайнего левого положения (в пер-
вом блоке).
Этот принцип реализуется в строках 30 4-34. Заодно ме-
няется направление движения элементов / > /♦. Дополнитель-
ным условием цикла 31 является / > 1, так как из самого
представления разбиения следует, что / = 1 не может быть
активным элементом (очевидно, что элемент 1 всегда является
элементом блока с номером 1). Если каждый из элементов
/>1 отвечает условию (1) или (2), то легко убедиться, что
уже порождены все разбиения. В таком случае на выходе цик-
ла 31 имеем ] = 1 и следует выход из основного цикла 8, т. е.
имеем окончание работы алгоритма. Из рекуррентности алго-
ритма вытекает также, что активным элементом для первого
разбиения списка Ьп, т. е. для {{1, ..., п}}, является элемент
п. Такое же значение приписывается переменной / перед вхо-
дом в цикл 8 (строка 7).
Проанализируем теперь процесс переноса активного эле-
мента (строки 9 4-28). Сначала отыскивается номер блока, со-
держащего активный элемент; пусть это будет к. Если этот
элемент движется вперед, достаточно перенести его в блок с
номером СЛЕД [6] (см, строку 19), а в двух остальных случаях
переменную СЛЕД [й] нужно сначала модифицировать. Пер-
вый случай имеет место, когда СЛЕД [А] = 0, т. е. когда к
есть номер последнего блока разбиения. Тогда / образует одно-
элементный блок; при этом достаточно принять СЛЕД [6] := /
и соответственно изменить значения переменных СЛЕД [/] и
ПРЕД [/] (см. строку 13). Второй случай имеет место, когда
СЛЕД [й] > /, он рассматривается аналогично. Условие
СЛЕД |й] > / означает, что все блоки справа от блока с но-
мером к содержат элементы, большие / (все эти элементы за-
нимают свои крайние правые позиции, в противном случае /
не был бы активным элементом). Из рекуррентности алгоритма
Рис. 1.13. Последовательность разбиений множе-
ства {1, 2, 3, 4), порожденная алгоритмом 1.19.
< 1234)
< 1 2 3 )( 4 )
( 1 2X3X4)
( 1 2X34)
< 1 2 4X3)
( 1 4X2X3)
( 1 X 2 4X3)
( 1 X 2 X 3 4 )
( 1 X 2)( 3 X 4 )
( 1 X 2 3 )( 4 )
(1X234)
(14X23)
( 1 3 4 ) ( 2 )
( 1 3 )( 2 4 )
( 1 3 X 2 ) ( 4 >
легко вытекает, что в этом случае нужно создать одноэлемент-
ный блок, содержащий /. Это выполняется в строках 16-4-17
(единственная разница с первым случаем состоит в том, что
в данном случае вновь созданный блок не является последним
блоком разбиения).
В ситуации, когда элемент / движется назад (см. строку 21),
достаточно поместить его в предыдущий блок (см. строку 22)
и выполнить соответствующее изменение значений переменных
СЛЕД и ПРЕД, если / создавал одноэлементный блок — это
имеет место в точности тогда, когда БЛОК. [/] = к = /, так как
каждый элемент т > / блока с номером / был бы выбран
активным элементом в цикле 31.
На рис. 1.13 представлены все разбиения множества {1, ...
..., 4}, порожденные алгоритмом. Можно показать, что сред-
нее число шагов, необходимых для построения каждого следую-
щего разбиения, ограничено постоянной, не зависящей от п
(ср. с задачей 1.38; конечно, здесь не учитывается число шагов,
необходимых для написания разбиения).
1.11. Разбиения чисел
Займемся теперь следующей задачей: сколькими способами
можно записать данное натуральное число п в виде суммы
п = &! + ... + Ьк,
(1.51)
где к, ..., Ьк > 0. При этом будем считать суммы эквива-
лентными, если они отличаются только порядком слагаемых.
Класс эквивалентных сумм вида (1.51) мы можем однозначно
представить последовательностями ак, где а\ ...
... ак и числа аь ...» ак являются числами ..., Ьк,
упорядоченными по невозрастанию (аналогичным образом мы
представляли подмножества множества возрастающими после-
довательностями и подмножества множества с повторениями
неубывающими последовательностями). Каждую такую после-
довательность «1, ..., ак будем называть разбиением числа п
на к слагаемых. Число разбиений числа п на к слагаемых бу-
дем обозначать Р(и, А), а число всех разбиений числа п (на
произвольное число слагаемых)—через Р(и). Очевидно, что
п
Р (п) = Е (Р (п, к), п > 0
Л=|
(1.52)
(принимаем Р(0, 0) = Р(0) = 1). Например, Р(7)=15, а все
разбиения числа 7 представлены на рис. 1.14.
Используя очень простой способ представления разбиения
числа, называемый диаграммой Феррерса, можно доказать
много любопытных свойств чисел Р(п). Диаграмма Феррерса
для разбиения п — а^ + ... + ак состоит из к строк, соответ-
ствующих слагаемым разбиения, причем /-я строка содержит
последовательность из точек (рис. 1.15).
Каждому разбиению числа п однозначно соответствует со-
пряженное разбиение этого числа, которое получается транс-
позицией диаграммы Феррерса (перемена ролями строк и
столбцов) (см. задачу 1.15). Легко заметить, что транспозиция
диаграммы Феррерса определяет взаимно однозначное соответ-
ствие между разбиениями числа п на к слагаемых и разбиения-
ми числа п с наибольшим слагаемым, равным к.
Отметим этот факт:
Теорема 1.20. Число разбиений числа п на к слагаемых рав-
но числу разбиений числа п с наибольшим слагаемым, рав-
ным к.
Докажем еще одну теорему этого типа.
Теорема 1.21. Число разбиений числа п на попарно разли-
чимые слагаемые равно числу разбиений числа п на нечетные
слагаемые.
Доказательство. Установим взаимно однозначное соответ-
ствие между разбиениями, о которых идет речь в теореме, Рас-
Рис. 1.14. Последовательность разбиений числа 7,
построенная с помощью алгоритма 1.22.
7
6 1
5 2
3 1 1
4 3
4 2 1
4 111
3 3 1
3 2 2
3 2 11
3 1111
2 2 2 1
2 2 111
2 11111
1111111
смотрим разбиение числа п на нечетные слагаемые
где слагаемое появляется в разбиении п раз,
Пусть
Г/ = 27' + 2^ + ... (^| > <72 > • • •)
...» ЬР9
1 I р.
есть двоичное представление числа и. Произведем теперь за-
мену п слагаемых 6/ на попарно различимые слагаемые
(эта замена сохраняет сумму слагаемых разбиения). Повторяя
эту операцию для каждого /, 1 I р, и упорядочивая сла-
16=6+4+4+2 16=4+4+3+3+1+1
Рис. 1.15. Диаграмма Феррерса для разбиения числа и сопряженного ему раз-
биения.
гаемые по невозрастанию, получаем в результате разбиения
числа п на попарно различимые слагаемые. Это следует из того
факта, что каждое натуральное число можно однозначно пред-
ставить в виде произведения нечетного числа на степень двой-
ки. В качестве примера проведем описанное преобразование для
разбиения 26 = 74-5 + 5 + 34- 3 + 1 + 1 + 1:
7 + 5 + 5 + 3 + 3+1 + 1 + 1= 7-2° + 5-21 + 3.21 +
+ 1(2* +2°) = 7+ 10 + 6 + 2 + 1 = 10 + 7 + 6 + 2 + 1.
Легко заметить, что можно выполнить обратное преобразо-
вание для произвольного разбиения на попарно различимые
слагаемые, представляя каждое слагаемое как р2?, где р не-
четное, группируя затем слагаемые в зависимости от «нечетно-
го множителя» р и заменяя каждую такую группу р2я\ р2Я2 ...
на г = 2д1 + 2^2 ... слагаемых, равных р. Таким образом,
описанное преобразование определяет взаимно однозначное со-
ответствие между разбиениями на нечетные слагаемые и раз-
биениями на попарно различимые слагаемые.
Другие теоремы этого типа сформулированы в задачах
1.39-7- 1.41.
Покажем теперь простой алгоритм генерирования всех раз-
биений числа. Он будет генерировать разбиения в порядке, об-
ратном лексикографическому, т. е. разбиение
п = с[+...+с1 (1.53)
будет порождено — необязательно непосредственно — после раз-
биения
п = а1+...+а* (1.54)
тогда и только тогда, когда существует индекс р^т1п(А, /),
такой что ср < ар и ст = ат для 1 т < р (ср. с рис. 1.14).
Очевидно, что первым разбиением в этом порядке является
разбиение, содержащее' одно слагаемое, равное п, а послед-
ним — разбиение на п слагаемых, равных единице. Зададимся
вопросом, как выглядит разбиение, непосредственно следующее
за разбиением (1.54). Будем искать разбиение, которое имеет
самое большое число начальных слагаемых, равных начальным
слагаемым разбиения (1.54)—обозначим эти слагаемые аь ...
,I, — и оставшиеся слагаемые которого определяются
разбиением, непосредственно идущим за разбиением $ = а, +
+ а/-н + ... + ак. Легко заметить, что эти условия однозначно
определяют
/ = тах {г. а1 > 1).
Таким образом, задача сводится к нахождению разбиения,
непосредственно идущего за разбиением
а< > 1.
к—I раз
Нетрудно заметить, что такое разбиение имеет вид
8 = 1+ ... + I + (5 тод /),
I 5/1 и раз
где I = й( — 1.
В алгоритме, который мы сейчас опишем, разбиение будет
представлено переменными 5(1], . ,.,5(д], содержащими по-
парно различимые слагаемые разбиения (5[1]>. ... >5[д]),
а также переменными /? [1].......7? [д], где /? [1] содержит ии-
формацию о том, сколько раз слагаемое 5(1*] появляется в раз-
биении (#Ь’]> 0). Это позволяет находить каждое следующее
разбиение за число шагов, ограниченное некоторой постоянной,
не зависящей от п.
Алгоритм 1.22 (Нахождение всех разбиений числаД
Данные: п.
Результат: последовательность разбиений числа п в порят-
ке, обратном легсикографическому.
1 Ье&1п
2 5[1]: = п; /?[!]; = 1; д:=1; (♦ первое разбиение *)
3 выписать разбиение;
4 тН111е 5 [1] > 1 до (♦ нахождение следующего разбиения ♦)
5 Ьее1п зит: = 0; (♦ 8ит = сумма устраненных слагае-
мых ♦)
6 И 5 [</] = 1 №еп (♦ удаление слагаемых, равных еди-
нице *)
7 Ье^п зшп: = зиш 4- (</]; = д. — 1
8 епд;
9 зит: = зит4-5[</]; /? [д]: = /? [д] — 1; /: = 5[д] —1;
10 И /?[д]>0 №еп (!: = (!+ 1;
11 5[г/]: = /; 7?[с?]: = зит (Ну/;
12 /: = зиттод/;
13 И 1=&0 1Ьеп (♦ добавить последнее слагаемое, равг
ное /
14 Ьее1п а-. = а+ 1; 5№ = /; К№ = 1
15 епд:
16 выписать разбиение
17 епд
18 епд
1.12. Производящие функции
В комбинаторных задачах на подсчет числа объектов при
наличии некоторых ограничений искомым решением часто яв-
ляется последовательность ао, щ, а2, ..., где ак— число иско-
мых объектов «размерности» к. Например, если мы ищем число
разбиений числа, то можем принять а* = Р(&), если ищем чис-
ло подмножеств п-элементного множества, то = и т. д.
В этом случае удобно последовательности а0, а\, а2, поста-
вить в соответствие формальный ряд
А(х)=%акхк, (1.55)
л=о
называемый производящей функцией для данной последова-
тельности. Название «формальный ряд» означает, что (1.55)'
мы трактуем только как удобную запись нашей последователь-
ности— в данном случае несущественно, для каких (действи-
тельных или комплексных) значений переменной х он сходится.
Поэтому мы никогда не будем вычислять значение такого ряда
для конкретного значения переменной х, мы будем только вы-
полнять некоторые операции на таких рядах, а затем опреде-
лять коэффициенты при отдельных степенях переменной х. Для
произвольных рядов
А (х) = У акх\ В(х)= У Ькхк
А=0 й=0
мы определим операцию сложения:
Л(х) + В{х)=Е(ай + ^)х\ (1.56)
А=0
операцию умножения на число (действительное или комплекс-
ное) ;
рА (х) = 2 РакХк (1.57)
й=0
И произведение Коши (коротко: произведение):
А (х) • В (х) = СкХк, (1 -58)
А=0
где к
ск = айЬк + а^й-1 + ... + ак^й = X. 0 -59)
Если а,ъ =0 для к > и, то ряд (1.55) будем отождествлять
с многочленом апхп + ... + ао-
Из математического анализа известно (см., например, [41]),
что если ряд (1.55) сходится в некоторой окрестности нуля, то
его сумма А (х) является аналитической функцией в этой
окрестности и
аА = Л(й)(0)/й!» к = 0, 1, 2, ... (1.60)
(Л<*>(0) обозначает значение А-й производной функции А (х)
для х = 0; ряд (1.55)—это не что иное, как ряд Маклорена
функции Д(х)). Более того, если Л(х), В(х) являются анали-
тическими функциями в окрестности нуля, то формулы (1.56)-?
-=-(1.59) будут справедливы, если А (х) и В(х) трактовать как
значения функций Л и В в точке х, а ряды понимать в обычном
смысле, т. е. так, как в математическом анализе. Это сохра-*
няющее операции взаимно однозначное соответствие между ря-
дами, сходящимися в окрестности нуля, и функциями, анали-
тическими в окрестности нуля, позволяет отождествить фор-
мальный ряд (1.55) с определенной через него аналитической
функцией в случае рядов, сходящихся в окрестности нуля (не-
смотря на то, что ряды мы будем трактовать всегда как фор-
мальные ряды, т. е. только как формальную запись их коэф-
фициентов). Таким образом, будем писать, например,
ОО
У хк = (1 — х)-‘,
6 = 0
6=0
и т. д.
Найдем теперь производящие функции для некоторых про-
стых последовательностей. В соответствии с (1.13) имеем
ёХл>-еД*=('+’>“.
таким образом, для заданного п производящая функция после-
довательности (о), (“), (“), ... есть (1 + х)п.
Имеем
X 2кхк = X (2х)6 = (1 - 2х)-1>
к=0 6=0
и, следовательно, производящая функция последовательности
1, 2, 4, 8..2*, ... есть (1 —2Х)-1. Пользуясь тем, что ана-
литическую функцию можно дифференцировать почленно, мож-
но написать
^кхк = х^кхк~' = х-~^хк = х-^(\—хГ1 = х(1 — х)“2,
Л=0 Л=0
и, следовательно, производящая функция для последовательно-
сти 0, 1, 2, 3, есть х(1 — х)-2.
Познакомимся поближе с формулой (1.61). Каждый мно-
житель (1 + х) мы можем трактовать как соответствующий
некоторому элементу а, множества Х = {аь ..., ап} и как
представляющий два возможных числа появлений этого эле-
мента в подмножестве: нуль раз (слагаемое х° = 1) и один раз
(слагаемое х1 = х). Очевидно, что каждое подмножество мно-
жества X однозначно определяется указанием числа появлений
в нем каждого из элементов, т. е. выбором одного из слагае-
мых из каждого множителя произведений (1 + х) (1 + х).
Определенное таким образом слагаемое разложения этого про-
изведения дает вклад в коэффициент при х*, где к — мощность
нашего подмножества, равный единице. Это рассуждение есте-
ственным образом переносится на ситуацию, в которой число
появлений элемента может быть большим единицы, т. е. на
множества с повторениями. Предположим, например, что Х =
— (2*аь 3*а2, 1*а3, 4*а4), и обозначим через сь число А-эле-
ментных подмножеств этого множества с повторениями. В силу
рассуждения, аналогичного приведенному выше, производящая
функция для последовательности с0, й, с2, ... равна
1скХк =
6=0
= (1 +х + х2)(1 +х + х2 + х3)(1 + х)(1 + X + X2 + X3 + X4) =
= 1 + 4х + 9х2 + 15х3 + 20х4 + 22х5 + 20х6 +
+ 15х7 + 9х8 + 4х9 + х10»
Соответствующим подбором ьго множителя можно наклады-
вать произвольные ограничения на число вхождений элемента
а,. Например, этот множитель имеет вид 1+х3 + х7, если ьй
элемент может появляться 0, 3 или 7 раз, 1 + х2 + х4 + ...
... =(1 —х2)”1, если этот элемент может появляться произ-
вольное четное число раз и т. д. В частности, если мы не на-
лагаем никаких ограничений на число вхождений элемента а/,
1 I п, то производящая функция имеет вид
(1 + * + х2+ +* + х2+ = -*)-*...(! -х)->=«
Если вспомнить, что А-я производная функции (1—х)”л
равна
(1 _Х)-П = (—п)(—п—1)...(—п —1)(1 —х)-л-*х
Х(-1)А = Нй(1-х)-п-\
и разложить (1 — х)~п в ряд Маклорена, то получим
(1-хг"=ХМг=х(»+‘-')д
что дает еще одно независимое доказательство теоремы 1.15.
Производящие функции являются также удобным инстру-
ментом для доказательства тождеств, связанных с биномиаль-
ными коэффициентами. Например, (1.18) можно получить,
сравнивая коэффициенты в обеих частях равенства
(мы воспользовались здесь формулой произведения Коши двух
рядов, в нашем случае это формула произведения многочле-
нов).
Покажем теперь, как производящие функции можно приме-
нять в некоторых задачах, связанных с разбиением чисел. От-
метим сначала, что каждое разбиение п = ах + ... + а* можч
но однозначно представить последовательностью <ХЬ ..., Хл>,
где X/ обозначает число слагаемых, равных /, т. е. X/ = | {/:
а7 = г А 1 к}. Имеем, очевидно,
п.
У, /А/ = п,
1 = 1
и каждая последовательность <А1........Ап> (М, ..., Ая^0),
отвечающая этому условию, однозначно определяет разбиение
числа п, содержащее А< слагаемых, равных I, 1 Г п.
Обозначим через Рь(п) число разбиений числа п на слагае-
мые, не превышающие Л.
Теорема 1.23. Производящая функция для последовательно-
сти Рл(0), Рл(1), Рл(2), ... равна
(1 4-ХЛ + х2 + х3+ ...)(1 +х2 + х4 + х6+ ...)...
... (1 + Хн + X2* + Хзл +...) = (1 - х)-1(1 - .. (1 - Xй)’1.
Доказательство. Согласно определению произведение И ря-
дов с правой стороны является суммой слагаемых вида
хК{ х2*2... хккь (Л, — номер члена, выбранного из гго ряда). Та-
ким образом, коэффициент при хп равен числу последователь-
н
ностей <Хь ..., Хй>, таких что = а, следовательно, в
1 = 1
соответствии с нашими предыдущими замечаниями он равен
Рь(п).
Аналогичным образом доказывается следующая теорема:
Теорема 1.24. Производящая функция для последовательно-
сти Р(0), Р(1), Р(2), ... равна
(1 4-х4-х2 + х3+ ...)(1 +х2 + х4 + х6+ ...) ...
... (1 +хл + х2Л + *ЗА +...)... = П (1 - л-")-'.
л=1
Замечание. В этом месте следовало бы строго опре-
делить ряд, являющийся бесконечным произведением рядов
. Обозначим через /л(х) «частичное произве-
дение» (х)-Г2(х) • ... -^(х) и через рп — наименьшую не-
нулевую степень с ненулевым коэффициентом в Еп(х) (для про-
изведения (1.62) имеем рп = п). Положим, что коэффициент
при нулевой степени в каждом из рядов Рп(х) равен единице
и что Нтрп = оо (оба этих предположения выполнены для
П->оо
произведения (1.62)). Тогда коэффициент при хп в 1щ(х) один
и тот же для всех /и, больших некоторого числа тп (такого,
что рт> п для т>тп). Именно этот коэффициент мы при-
нимаем как коэффициент при хп в ряде, определенном беско-
нечным произведением Л (х) •/?2(^) • ••• •
Техника производящих функций позволяет провести простые
доказательства некоторых свойств разбиений числа. Приведем
в качестве примера другое доказательство теоремы 1.21. От-
метим в этой связи, что производящая функция для разбиений
на попарно различимые слагаемые (т. е. для последовательно-
сти и, г2, ...» где гп — число разбиений числа п на попарно
различимые слагаемые) равна
Я (*) = (! + х)(1 + Х2)(1 + X3) ... (1 + X*) ... ,
а производящая функция для разбиений на нечетные слагаемые
равна
(х) = (1 - х)"1 (1 - X3)"1... (1 - х2^-1)-1 ....
чаем
Пользуясь зависимостью
1 + хк =(1 — х2к) / (1 — х*)\ полу-
1 — X2
1 — X
1 — X4 1 — X6 _______
1 — X2 1 — X3 * ’ *
_ 1_________1________1 .
1 — X • 1 — X3 ’ 1 — X5 • •
= У(х). (1.62)
Приведем еще два примера применения производящих
функций. Первый относится к так называемым числам Фибо-
наччи рп. Эти числа являются решением рекуррентного урав-
нения
+ «>1. (1-63)
с начальными условиями
Р. = РХ = 1. (1.64)
Производящая функция Р(х) для последовательности Р^
Л, р2> ... удовлетворяет уравнению
/;«=Ел?=1 + х+ X (^-2 + ^-.)^=
Л-0 к=2
= 1 + X + X2 ^ Рк-чХк~2 + X Ек-1Хк-' =
= 1 +х + х2.Р(х) + л-(/;’(х)- 1)= 1 +(х + х2)Р(х).
Отсюда получаем производящую функцию для чисел Фибоначчи
Р(х) = (1 -х-х2)"'.
Найдя корни уравнения 1 — х — х2 = 0, получаем разложение
1— х — х2 = (1—ах)(1—Ьх), где
а = (1+У5)/2, 6 = (1-д/5)/2.
Теперь, используя метод неопределенных коэффициентов, най-
дем
1 А В __ А + В — (АЬ + Ва)х_
(1 — ах) (1 — Ьх) 1 — ах 1 — Ьх (1 — ах) (1 — Ьх)
Сравнивая коэффициенты в числителе, получаем Л + В = 1,
т. е. В=1—Л, а далее АЬ + (1 — Л)а = 0, что дает А =
= а/(а — Ь), В = —Ь/(а — Ь); таким образом,
Р(х) = А(1 —ах)-' + В (1 -дх)-1 =
А«0 А-0 /?=0
и окончательно
(1.65)
Этот метод можно перенести на произвольные линейные
рекуррентные уравнения с постоянными коэффициентами (см.
задачу 1.46).
В качестве последнего примера применения производящих
функций вычислим число бинарных деревьев с п вершинами.
Под бинарным деревом с п вершинами мы понимаем пустое
дерево Т = 0, если п = 0, или тройку Т = (Ь, г, Р), где г —
вершина, называемая корнем дерева, Л (левое поддерево) —
бинарное дерево с I вершинами, Р (правое поддерево)—би-
нарное дерево с р вершинами и I + р 4- 1 = и. Будем говорить,
что бинарные деревья Т\ и Т2 изоморфны, и писать 7\ ~ Т2,
если Т1 = Т2 = 0 или Т\ = <11, гь Р1>, Т2 = <А2, г2, Р2), где
Ь\ ~ Ь2 и Р\ ~ Р2, Обозначим через ск число неизоморфных
бинарных деревьев с к вершинами (рис. 1.16).
Из данного рекурсивного определения следует, что с0 = 1
и если 0 5 А, то существует в точности с8Сь-\-3 неизоморф-
ных деревьев вида <Л, г, Р>, где Ь — бинарное дерево с 5 вер-
шинами. Число 5 может принимать любое из значений между 0
и к — 1, следовательно,
ск = с(А-1 + с\^к-2 + ••• + СЙ_1СО, к > 0. (1.66)
Неизоморфные бинарные деревья для А = 0, 1, 2, 3 представ-
лены на рис. 1.16.
ОО
Рассмотрим производящую функцию С (х) = У, скхк. Равен-
ство (1.66) весьма напоминает формулу для коэффициентов
сг г
Рис. 1,16, Бинарные деревья с к вершинами, к = 0, 1, 2, 3,
произведения Коши С(х)С(х) = С2(х), точнее говоря, имеет
место уравнение
С(х) = хС2(х)+1
или
хС2(х)-С(х)+ 1=0. (1.67)
Покажем теперь, что существует функция С(х)\ аналитиче-
ская в окрестности нуля, удовлетворяющая этому уравнению.
В силу упомянутого выше взаимно однозначного соответствия
между рядами и аналитическими функциями коэффициенты
этого решения определяют формальный ряд, удовлетворяющий
уравнению (1.67). Рассматривая (1.67) как квадратное урав-
нение с неизвестной С(х) (значение искомой аналитической
функции в точке х), получаем для х =/= 0
СМ='±1'~4'
(1.68)
Разложим 'х/Х — 4х = (1 — 4х)1/2 в ряд Маклорена. Для к > 0
имеем
... (|-/г+1)(1- 4х),/2~й(-4)* =
= 2*(-1) • 1 - 3-5 • ... • (2/г - 3)(1 — 4х)|/2“й
и, следовательно,
Л = 1
— 1 _ V 2* • (2к - 2>' ? = I _ 9 V <2к - 2)! гк
~1 Й1.2-4- ... - (2* — 2) Х Х21»й!(й - 1)1
Л-1 Л-1
Отсюда видно, что для получения решения с положитель-
ными коэффициентами следует выбрать знак минус в (1.68),
Таким образом, имеем
Отсюда окончательно получаем
(1.69)
Числа Ск называются числами Каталана' они часто появ-
ляются в контексте целого ряда других комбинаторных задач
(см. задачи 1.47, 1.48).
1.13. Принцип включения и исключения
Основная теорема, которую мы докажем в этом разделе,
есть обобщение очевидной формулы
|ЛиВ| = |Л| + |В|-|ДПВ|.
которая справедлива для произвольных множеств А, В
(рис. 1.17).
ЦУв| = |л|+|5|-
|лоаис|= |л|+ |а|+|с[ - ]лпд| - |япс| - |лпс|+|лпвпс[
Рис 1.17. Простые частные случаи принципа включения и исключения.
Предположим, что даны подмножества А, ..., Ап (необя-
зательно различные) некоторого конечного множества X, и мы
ищем мощность их объединения А\0 ... иЛл. В качестве пер-
вого «приближения» этой мощности мы можем принять
Ш+...+1ЛД (1.70)
однако это число в общем случае слишком большое, так как
если АГМ/^0» то элементы пересечения АЛА считаются
дважды. Попробуем исправить ситуацию, вычитая из (1.70}
сумму
X 1АЛЛ;!. (1.71)
Но в таком случае мы получим слишком маленькое число, так
как если А, Г1А/ (]Ак 0, то элементы пересечения Д/ПД/ПДЙ
считаются в (1.71) трижды. Следующим шагом может быть до-
бавление суммы 1ДГМУГ1Лд|, но по причине, по-
1 < К} <к <п
добной предыдущему случаю, получим слишком большое чис-
ло. Все же оказывается, что через п шагов мы всегда получаем
правильный результат. То есть имеет место следующая теорема.
Теорема 1.25 (Принцип включения и исключения).
п
и а,
1 — 1
Е 1А.ЛА/1 +
</</<п
= Е I А/1 -
» = 1
+ 2 |АЖА/ПАй|-...+(-1Г,|А1П...ЛАл |.
1 < 1<1'<к <п
Доказательство. Применим индукцию по п. Для п = 1 тео-
рема очевидно справедлива. Предположим, что для произволь-
ных подмножеств ..., Ап^
"О* А, = Е|А,|- Е |А<ЛА/|4-...
1=1 * = 1 1<1</<П-1
...+(-1)'1-2'|А1П...ПА„_1|,
Применяя эту формулу к сумме
п-1
(А1и...ил„_1)пА„= [Шпал
1 = 1
получаем
п-1 п-1
И ЛПАЯ =Е|А/ЛАП|- Е |А/ПА/ПА„|+...
1 = 1 1 = 1 1</</<П-1
... + (- 1Г2| п ... П А„|,
а отсюда
и л
/ = 1
п — 1 п—1
Да, +1А„|— Да,па„
= Е|А„|- Е I А,ПА/|+ ... +(- 1)п-1| А,л ... П АЛИ
1 = 1 1</</<«
Покажем теперь несколько применений принципа включе-
ния и исключения.
Теорема 1.26. Если |Х| = п, | У| = пг, то число всех функций
из X на V (т. е. функций }: Х-> У, таких что }(Х)= У), равно
зп,т = Е(-0'( . 1(т —0". (1-72)
х=0 \ I /
Доказательство. Пусть У = {уь ...» у™}. Обозначим через
Л/ множество таких функций /: Х->У, для которых у,§ё/(Х).
Тогда очевидно, что
т
/(Х)=^У^/е О Л.
/•»!
Мы знаем, что число всех функций /: X—>У равно тп (тео-
рема 1.1), достаточно, таким образом, определить мощность
объединения А\0 ... уАт. Отметим сначала, что для произ-
вольной последовательности 1 Р\ < ... < р/ т пересече-
ние ЛР1 П •.. П АР[ есть множество всех функций /: У, таких
что у₽1, , уР/^/(Х), а, следовательно, мощность этого пере-
сечения составляет (т — р)п столько, сколько имеется функций
/: X —>У\{уР1, ..., урД. /-элементное множество {уР1, ...
. ..,уР/}еУ мы можем выбрать (7) способами, и, следова-
тельно, согласно принципу включения и исключения имеем
Стоит отметить, что в силу формулы (1.41) теорема дает про-
стую формулу для вычисления чисел Стирлинга второго рода:
=4-*=тг Е (- *)' ) (/г - (Ь73)
Другим применением принципа включения и исключения мо-
жет служить определение числа подмножеств из А элементов
множества с повторениями X = (к\ *а^ ..., кп*ап) (пока на-
помним только, что таких подмножеств насчитывается если
А1=...=АЯ=1, и если Аь ..., Ап А). Заметим,
что эта проблема равносильна проблеме определения числа це-
лочисленных решений системы
Х1 + ... +хп = А,
О^Х/^А^ для /=1, ... , п.
Метод решения этой задачи проиллюстрируем на примере.
Пусть X = (4 * аь 3 * о2, 7 * о3), А = 11. Создадим множества
А = множество всех А-элементных подмножеств множества
с повторениями (А*оь А * а2, к*а3),
А{ = множество таких У е Л, которые содержат более чем 4
вхождения элемента оь
А2 = множество таких УеЛ, которые содержат более чем
3 вхождения элемента а2,
Л3 = множество таких УеЛ, которые содержат более чем
7 вхождений элемента а3.
Имеем | Я | = (п+*-1 ) = = ( = 78, очевидно, что |Л1|
составляет столько, сколько имеется 6-элемснтных (/?— 5 = 6)
подмножеств множества с повторениями (11 *аь 11 *а2, И *аз),
т.е. (3+66-,) = С) = 28, аналогично | А21 = (3+77-') = (?) = 36,
I А31 = (3+з~! ) = (3) = Ю. Также легко заметить, что | А1 П А21 =
= (3+2 1) = (2) = $ столько, сколько имеется двухэлементных
(к — 5 — 4 = 2) подмножеств множества с повторениями (11*аь
11 *а2, Н *Дз), и Л2ГМз = Л1 Г)Л3 = 0.
Подмножество У А является подмножеством множества
с повторениями X тогда и только тогда, когда оно не принадле-
жит Ль А2 и Л3, а следовательно, по принципу включения и
исключения искомое число й-элементных подмножеств множе-
ства с повторениями X равно
|Л|-|Л1|-|Л2|-|Л3| + 1Л1ПЛ2| + |Л2ПЛ3| + |Л1ПЛ3|-
- I А1 п А2 л Л3 I = 78 - 28 - 36 - 10 + 6 + 0 + 0 - 0 = 10.
Наконец мы остановимся еще на одном применении прин-
ципа включения и исключения: на определении числа инверсий
на п-элементиом множестве. Под инверсией на множестве
{1, ..., п} мы будем понимать произвольную перестановку /
этого множества, такую что /(/)#=/ для 1 п. Обозначим
через Вп множество всех инверсий на множестве {1, ..., п} и
Л, = {/е5п: /(/) = /}, » = 1, ...,п
(напомним, что 8п означает множество всех перестановок мно-
жества {1, ..., п}). Перестановка / является инверсией тогда и
только тогда, когда она не принадлежит ни к одному из мно-
жеств Л/, а, следовательно, согласно принципу включения и ис-
ключения
т=|5п|-Еш+ е 1Л.ПЛ/1-...
1-1
...+(-1)п"'|Л1Л ...ПЛ„
Для произвольной последовательности 1 Р1 < ... < р,- л
пересечение Л₽1 Л ... Л АР1 является множеством таких переста-
новок Д для которых Цр1) = р! для и значит,
| ЛР) Л • • • П АР. | = (п. —:)!. Заметив, что последовательность
1 Р\ <С ... < п можно выбрать ( " ) способами, получаем
в итоге
п п
/=0 Х1/ 1=0
= п1(1—^ + ±-4+...+(-!) ±).
Стоит отметить, что сумма в скобках является начальным
ОО
членом ряда е"1 = (—!)*—• ^то означает> чт0 инверсии со-
/=0
ставляют е~х =0.36788 ... всех перестановок.
1.14. Задачи
1.1. В соревновании принимают участие 8 спортсменов. Сколь-
кими способами могут быть разделены медали (золотые, се-
ребряные и бронзовые?)
1.2. Доказать, что число способов, сколькими можно рассадить
п человек среди т человек за круглым столом, равно
[т]л/п. (Размещения, отличающиеся только циклическим
перемещением людей вокруг стола, считаем равными.)
1.3. Сколько чисел между 1000 и 10 000 состоят из нечетных
цифр, сколько из различных цифр?
1.4. Сколько существует возможных результатов, которыми мо-
гут закончиться соревнования, в которых стартует 10 чело-
век в трех видах спорта, если каждый человек стартует в
одном, произвольно выбранном виде спорта? (Под резуль-
татом соревнования мы будем понимать распределение мест
для всех спортсменов, стартующих в каждом виде.)
1.5. Сколько палиндромов длины п можно образовать, исполь-
зуя 26 букв алфавита? (Палиндромом называется произ-
вольное выражение, которое читается одинаково как слева
направо, так и в обратном направлении, например, топот.)
1.6. Доказать, что порядок произвольной группы О е 8п яв-
ляется делителем порядка 8п. (Указание: показать, что мно-
жества вида /О = {(ё- ё^ е 8Л} составляют разбиение
группы 8п на непересекающиеся | О|-элементные блоки.)
1.7. Доказать, что число перестановок }^8п типа ... п’п
равно п!/(1Х1 ... ... Ап|).
1.8. Доказать, что перестановки /, е 8Л являются перестанов-
ками одного и того же типа тогда и только тогда, когда
существует перестановка йе5п, такая что =
1.9. Перестановка е 5п называется инволюцией, если // = е.
Доказать, что [ 8п является инволюцией тогда и только
тогда, когда она имеет тип + 2Л2 = п), и что произ-
вольная перестановка является суперпозицией двух инво-
люций.
1.10. Для перестановки <пь ,,,, ап> определим инверсивный
вектор как <йь ..., с1п), где =| {/ < к а/ > а,} |. Дока-
зать, что инверсивный вектор однозначно определяет пере-
становку.
1.11. Доказать, что множество всех четных перестановок обра-
зует группу.
1.12. Доказать, что алгоритм 1.10 будет генерировать все пере-
становки (в несколько иной очередности), если убрать
команду Р[/] : = :Р[/и] в строке 15. Пусть /1, ...» /убу-
дет последовательностью перестановок, полученных с по-
мощью такого модифицированного алгоритма. Доказать,
что последовательность и! элементов Л-1 (/), /Г1 (/)> • • • >
..., (0 является для каждого I (1 I п) одинаковой
с точностью до циклического сдвига (ср. [45]).
1.13. Доказать, что асимптотическое значение (для п->оо) сред-
него числа транспозиций, приходящихся на каждую пере-
становку, полученную при помощи алгоритма 1.10, равно
/ °о х
сЬ 1 = 1,543... ( сИх = х2*/(2&)!), если же алгоритм
модифицирован так, как в предыдущей задаче, то это зна-
✓ о° X
чение составляет зЬ 1 = 1,175 ...( зИ х = х2й+1/(2&+1)! )•
X А = 0 /
1.14. Доказать, что каждое из чисел 0, ..., и! — 1 можно одно-
п — 1
значно представить в виде / = ^ с!кк!, где 0 сЦ I, при-
чем последовательности ..., (Ц, соответствующие оче-
редным числам, появляются в лексикографическом по-
рядке. Предложите алгоритм построения последовательно-
сти ..., Й1>, соответствующей числу /.
1.15. Удалить рекурсию из алгоритма 1.11. Описать такую реа-
лизацию, в которой число шагов, необходимых для по-
строения каждой последующей перестановки (не только
среднее значение числа шагов!) ограничено константой, не
зависящей от п. (Указание: рассмотрим лексикографически
упорядоченный список Ьп всех последовательностей <сл, ...
..., с2>, где 1 с, Л Доказать, что /-я транспозиция,
проведенная алгоритмом 1.11, имеет вид Р[В[р, ср] ] :=:
: = :Р[р], где р = тт{г С[ < /}, а <сл, ..., с2> есть /-я
последовательность в списке Ьп. Дальнейшие последова-
тельности в списке Еп можно эффективно генерировать,
представляя последовательность <гл, с2> последова-
тельностью <сл, с2>, где С/=1, если а=1 и с, = С/
в противном случае, или же, используя буфер, фактическим
содержанием которого всегда является последовательность
Ь\, 02, Ьг, а5, такая что
и {I: &,} = {к с, < /}.
<7-1
Наибольший элемент буфера определяет ранее упомянутый
индекс.
1.16. Написать программу, реализующую «обычную» нерекур-
сивную версию алгоритма 1.11, а также версию, предло-
женную в предыдущей задаче. Проверить эмпирически, вы-
полнив программу, сильнее ли последняя версия в смысле
среднего времени, необходимого для построения каждой
следующей перестановки.
1.17. Предположим, что для каждого нечетного т имеет место
соотношение В [т, 1 ] = .. = В\т, /п — 1 ] = 6(т>, и что для
произвольного четного т 4 последовательность
В[т, 1], ..., В [/и, т—1] удовлетворяет одному из сле-
дующих условий:
(1) Каждый из элементов 1, .т—1 появляется в ней
в точности один раз, причем расстояние между позициями,
содержащими т — 1 и Ыт~х} четное (расстояния между по-
зициями / понимаем как |/ — /|).
(и) Каждый из элементов множества {1,..., т—1}\{т —
— 1, Ь{т~Х}} появляется в нем в точности один раз, и эле-
мент т— 1 или Ь{т~х>> появляется дважды, причем расстоя-
ние между этими вхождениями нечетное.
Доказать, что в этом случае процедура РЕ#М(п) гене-
рирует все перестановки элементов Р[1], ...» Р[п], причем
фл (см. доказательство корректности алгоритма 1.11) яв-
ляется транспозицией для каждого нечетного п 3 и цик-
лом длины п для каждого четного п (ср. [44]).
1.18. Пользуясь предыдущим заданием, доказать, что следующие
варианты процедуры В (иг, I) в алгоритме 1.11 приводят к
правильному алгоритму генерирования всех перестановок:
(1) И (пг той 2 = 0) апс! (т > 2) (Ьеп
И / > 1 (Ьеп В\ = т — I
е!зе В: = пг — 2
е!$е В: = пг — 1
(2) И пг тод2 = 0 Жеп
И (I == 1) ог (/ = т — 1) 1Ьеп В: = гп — I
еке В: =1
еке В: = 1
(3) И (/и той 2 = 0) ап<1 (г > 2) 1Ьеп В: = пг — I
еке В: = пг - 1 (* \Уе1к [71] *)
(4) И пг то<12 = 0 1ЬепВ: = /
еке В: = 1 (* Неар [32] *)
(5) И пг той 2 = 0 1Неп В: = I
еке В: =пг — 2
Какой вид имеет перестановка в каждом из этих слу-
чаев? Дать другие возможные варианты этой процедуры,
1.19. Доказать, что среднее число шагов, необходимое для гене-
рирования каждой следующей перестановки в алгоритме
1.12, ограничено константой, не зависящей от п. Предста-
вить вариант алгоритма, в котором это замечание справед-
ливо также для числа шагов для каждой конкретной по-
лученной перестановки (ср. с задачей 1.15).
1.20. Алгоритмы 1.11 и 1.12 генерируют последовательности, со-
держащие попеременно четные и нечетные перестановки
(почему?). Верно ли это для алгоритма 1.10?
1.21. Доказать, что среднее число шагов, необходимое для гене-
рирования каждого следующего подмножества с помощью
алгоритма 1.13, ограничено константой, не зависящей от п.
Предложить вариант алгоритмам котором это верно также
для каждого конкретного подмножества (см. задачу 1.15).
1.22. Предложить нерекурсивную версию алгоритма, генерирую-
щего все подмножества с повторениями.
1.23. Использовать алгоритм 1.13 для решения следующей за-
дачи: Даны п+ 1 ^-мерных векторов а\у ..., ап, 8 с це-
лыми координатами. Проверить, существует ли подмно-
жество ] ^{1, ...» п), такое что У а, = $.
/е/
1.24. Доказать тождества
«+1\ (п\ /л—1\ (п — к\
к / = + и —1/ + \А!-2,1+ •,<+1 0 л
п+1\ (п\ (п~ 1
/г + МКй/’Ц к 7 + к к +
двумя способами: многократно используя формулу (1.17)1
и придавая правой части некоторую комбинаторную ин-
терпретацию (например, в первом тождестве (*2/) есть
число й-элементных подмножеств А ^{0, п}9 таких что
шт {г: А} = /).
1.25. Доказать тождество
подсчитав двумя способами пары <а, К), где а К и К
является А-элементным подмножеством фиксированного
п-элементного множества X. Использовать это тождество
для вывода формулы (1.21).
1.26. Доказать, что произведение к произвольных последователь-
ных натуральных чисел делится на &!. {Указание: рассмот-
реть биномиальный коэффициент
Д.27. Доказать, что для произвольных натуральных чисел р,д,п
[р + Я}п = X ( “ ) [р]й Мп-4»
А=0 4 * '
[р+«г=2('"')и*м"-‘-
л»о ' К '
{Указание: для доказательства первого тождества подсчи-
тайте двумя способами число всех взаимно однозначных
функций (: где |X| = п, \Р\ = р, |(?|=?, ₽Г1
(\(2 = 0. Для второго тождества найти подобную интер-
претацию в терминах размещений, упорядоченных в р + д
ячейках.)
1.28. Доказать, что
(х. + х2 "Ь • • • + х )п = У ( х”1 ... хПр
412 \ п.п2 . . . По / 1 р
Л1 + ...+Пр=п 1 р
(п А
| = п!/(п1!н21 ••• Лр1)’ Дайте комбинатор-
М1П2 ... пр /
/ п \
ную интерпретацию коэффициентов.Чему равно I Р
1.29. Дать нерекурсивную версию алгоритма генерирования
А-элементных подмножеств, основанную на формуле (1.25).
Показать, что рекуррентная зависимость
О(п, к) = О{п — 1, к),
0{п — 2, Л — 2) 0 {п — 1, и}, О* (и —2, к — !)□{«}
определяет также некоторый список А-элементных подмно-
жеств, в котором соседние подмножества мало отличаются
друг от друга. Дать нерекурсивный алгоритм, основанный
на этой зависимости.
1.30. Показать, что решетка разбиений не является дистрибу-
тивной, т. е. л^У р)#=(лАа)\/(л Ар). Указать соот-
ветствующие разбиения л, а, р.
^(/) п1№4) 1 п в
(И)*1 ...кгЛ(п\)кп '
1.31. Доказать, что число последовательностей длины п с эле-
ментами из й-элементного множества, содержащих каж-
дый элемент этого множества по крайней мере один раз,
равно А!5(п, к),
1.32. Разбиение л п-элементного множества X имеет тип 1Х12Х2
... и*" (где Х1 + 2Х2 + ... + пКп = п), если оно содер-
жит X/ /-элементных блоков для 1 = 1, 2, ..., п. Доказать,
что число разбиений типа 1Х*2Х2 .,. пКп равно п!/(А1! ,..
... М(1!)м ... («!)Ч
1.33. Обозначим для каждого к О
Доказать, что
п
Г
/=0 &|+&2+.. .+&п=/
к{+2к2+. ..+лйп«п
*1» *2>..., кп >0
Показать, что сумма коэффициентов при всех слагаемых
вида ••• (§(п))*л равна числу Белла Вп.
1.34. Доказать, что для каждого пг 0 матрица чисел Стир-
линга первого рода [$(и, к<т есть обратная мат-
рица для матрицы чисел Стирлинга второго рода
[5(п, А)]0^п к^т*
1.35. Доказать, что
[*Г=Е |5(п, к)\хк.
й=0
1.36. Доказать, что |$(и, А) | есть число тех перестановок п-эле-
мснтного множества, которые имеют в разбиении на циклы
в точности к циклов.
1.37. Рассмотрим следующую программу:
т1п := оо;
1ог / := 1 1о п <1о
И Р [/] < тгп Н1еп пип := Р [/];
Доказать, что вероятность того, что для произвольно вы-
бранной перестановки Р[1], ...» Р [и] команда т1п: =
:=Р[/] будет выполняться в точности к раз, составляет
|$(п, к) \/п\. (Указание: воспользоваться предыдущей зада-
чей или найти взаимно однозначное соответствие между
перестановками, имеющими к циклов в каноническом пред-
ставлении, и перестановками, для которых эта команда вы-
полняется к раз.) Доказать, что среднее число выполнений
указанной команды для произвольно выбранной переста-
п
новки есть О(1о^п), точное значение равно —р. (Указа-
л=1
ние: подсчитать число циклов во всех п! перестановках.)'
1.38. Доказать, что среднее число шагов, необходимых для по-
строения каждого следующего разбиения в алгоритме 1.19,
ограничено константой, не зависящей от п. Дать модифи-
кацию алгоритма, гарантирующую ограниченность этого
числа константой для каждого порожденного разбиения
(ср. с задачей 1.15).
1.39. Доказать, что число разбиений числа п, в котором ни одно
из слагаемых не превосходит А, равно числу разбиений
числа п + к на к слагаемых, т. е. Р(п-\-к, к).
1.40. Доказать, что число самосопряженных разбиений числа п
(т. е. равных сопряженному разбиению) равно числу раз-
биений числа п на попарно различные нечетные слагаемые.
1.41. Обозначим через Е(п) и О (и) соответственно число раз-
биений числа п на попарно различимые четные слагаемые
и на попарно различимые нечетные слагаемые. Доказать,
что
{(—1)\ если п имеет вид (ЗА2±А)/2,
0 в противном случае.
1.42. Разработать алгоритм генерирования всех Р(п,к) разбие-
ний числа п на к слагаемых в порядке, обратном лексико-
графическому, такой что число шагов, необходимое для
построения каждого следующего разбиения, ограничено
константой, не зависящей от п.
1.43. Ряд
ТАхк
к=0
будем называть экспоненциальной производящей функцией
для последовательности с0, с\, ... . Пусть ск — число раз-
личных последовательностей длины к с элементами из мно-
жества У={//1, ...» {/«}, в которых число появлений эле-
мента у1 принадлежит множеству {та, т<2, ...} (тп <
< ГЩ2 < •••)• Доказать, что экспоненциальная производя-
щая функция для последовательности с0,
с2, ... есть
й,
----------1- .
* /п12! ‘
/"21 хт22
/«211 Ш221
ГП.,
п. I
,тп2
тпг\
1.45. Доказать, что число бинарных последовательностей длины
м, пе содержащих единиц ни на каких двух соседних пози-
циях, равно числу Фибоначчи Гп+\-
1.46. Описать метод решения возвратных уравнений вида
4“ 4" ... “р Сг^п—г == О
(с начальными условиями, определяющими значения Яо,
Д1, ..., аг-\) при помощи производящих функций, анало-
гичный методу, использованному для нахождения формулы
(1.65), определяющей числа Фибоначчи.
1.47. Пусть рп — число всевозможных расположений скобок в
произведении х0, ...» хп (например, р2 = 2, так как имеет-
ся два способа расстановки скобок: ((х0*1)*2), (хо(Х1*2)).
Доказать, что рп равно числу Каталана сп.
1.48. Доказать, что число способов, которыми можно разбить
плоский выпуклый (п 4- 2) -угольник на различные треуголь-
ники с помощью п—1 диагоналей, не пересекающихся
внутри этого (п + 2) -угольника, равно числу Каталана сп-
1.49. Обозначим через л(х) количество простых чисел, не пре-
восходящих х. Доказать, что
Л (и) — л(7п) = п— 1 — 2 |т_| +
где А> = л(д/л)-
1.50. Обозначим через ср (и) количество натуральных чисел, не
превосходящих п и взаимно простых с п (т. е. не имеющих
общего делителя, большего единицы). Доказать, что
где д™. являются различными простыми делителями
числа п.
2. Алгоритмы на графах
2.1. Машинное представление графов
Очевидно, что наиболее понятный и полезный для человека
способ представления графа — изображение графа на плоскости
в виде точек и соединяющих их линий — будет совершенно бес-
полезным, если мы захотим решать с помощью ЭВМ задачи, свя-
занные с графами. Выбор соответствующей структуры данных
для представления графов имеет принципиальное влияние на
эффективность алгоритмов, поэтому мы подробнее остановимся
на этой проблеме. Мы покажем несколько различных способов
представления и кратко разберем их основные достоинства и не-
достатки.
Мы будем рассматривать как ориентированные, так и нео-
риентированные графы. Граф мы будем всегда обозначать
0 = <У, Е\ где V обозначает множество вершин, а Е — мно-
жество ребер*), причем Е УХ V для ориентированного графа
и Е ^{{х, у}; х, у^ V /\х =/=(/} для неориентированного графа.
Будем также использовать обозначения |У| = п и |2?| = /и.
В теории графов классическим способом представления гра-
фа служит матрица инциденций. Это матрица А с п строками,
соответствующими вершинам, и пг столбцами, соответствующими
ребрам. Для ориентированного графа столбец, соответствующий
дуге <х, у^^Е, содержит —1 в строке, соответствующей вер-
шине х, 1 в строке, соответствующей вершине у, и нули во всех
остальных строках {петлю, т. е. дугу вида <х, х>, удобно пред-
ставлять иным значением в строке х, например, 2). В случае
неориентированного графа столбец, соответствующий ребру
{х,у}, содержит 1 в строках, соответствующих х и у, и нули
в остальных строках. Это проиллюстрировано на рис. 2.1. С ал-
горитмической точки зрения матрица инциденций является, ве-
роятно, самым худшим способом представления графа, который
только можно себе представить. Во-первых, он требует пт ячеек
*) В отечественной литературе ребра ориентированного графа принято
называть дугами. В дальнейшем мы будем употреблять этот термин везде, где
речь идет об орграфах, используя термин «ребро» как более общий, — Прим,
перге.
памяти, причем большинство этих ячеек вообще занято нулями.
Неудобен также доступ к информации. Ответ на элементарные
вопросы типа «существует ли дуга <х, у>?», «к каким вершинам
ведут ребра из х?» требует в худшем случае перебора всех столб-
цов матрицы, а следовательно, т шагов.
Лучшим способом представления графа является матрица
смежности, определяемая как матрица В = [67] размера пХл,
Рис. 2.1. а) Ориентированный граф и его матрица инциденций; б) Неориенти-
рованный граф и его матрица инциденций.
1 ’-1 -ТОО
2 10 10
3 0 1-1-1
4 0 0 0 1
5 0 0 0 0
6 0 0 0 0
0 0 0
0 0 0
0 0 0
1 0 0
-1 -1 1
0 1 -1
1111000000
2100110000
3010101000
4000001110
5001010101
6000000011
где Ьц = 1, если существует ребро, идущее из вершины х в вер-
шину у, и 6// = 0 в противном случае. Здесь мы подразумеваем,
что ребро {х, у} неориентированного графа идет как от х к у,
так и от у к х, так что матрица смежности такого графа всегда
является симметричной. Это проиллюстрировано на рис. 2.2.
Основным преимуществом матрицы смежности является тот
факт, что за один шаг можно получить ответ на вопрос «су-
ществует ли ребро из х в у?». Недостатком же является тот
факт, что независимо от числа ребер объем занятой памяти
составляет п2. На практике это неудобство можно иногда
уменьшить, храня целую строку (столбец) матрицы в одном
машинном слове — это возможно для малых п.
В качестве еще одного аргумента против использования
матрицы смежности приведем теорему о числе шагов, которое
должен выполнить алгоритм, проверяющий на основе матрицы
смежности некоторое свойство графа.
Пусть Р — некоторое свойство графа (Р(6) = 0 или Р(О) =
= 1 в зависимости от того, обладает или не обладает О на-
шим свойством. Предположим, что свойство Р удовлетворяет
следующим трем условиям:
(а) Р(6) = Р(О'), если графы О и О' изоморфны;
(б) Р(О) = 0 для произвольного пустого графа (V, 0> и
Р(О)=1 для произвольного полного графа <У, Аг(Ю> с до-
статочно большим числом вершин;
(в)' добавление ребра не нарушает свойства Р, т. е. Р(О)^
^Р(О') для произвольных графов О=(У, Е) и 6' =(У, Е'),
таких что Е е Е'.
Примером такого свойства Р является существование цикла
(в графе, имеющем по крайней мере три вершины).
Теорема 2.1. Если Р — свойство графа, отвечающее условиям
(а), (б), (в), то каждый алгоритм, проверяющий свойство Р
(т. е. вычисляющий значение Р(О) для данного графа С) на
основе матрицы смежности, выполняет в худшем случае Й(и*)
шагов, где п — число вершин графа.
Эта теорема справедлива также для ориентированных гра-
фов и для свойств, не зависящих от петель графа, т. е. отве-
чающих дополнительному условию
(г) Р(О) = Р(О') для произвольных ориентированных гра-
фов 6 = <У,Р>, О' = <у,Еи<у, у», V.
Доказательство теоремы читатель может найти в работах
[5] и [59].
Более экономным в отношении памяти (особенно в случае
неплотных графов, когда ш гораздо меньше м2) является ме-
тод представления графа с помощью списка пар, соответствую-
щих его ребрам. Пара <х, уУ соответствует дуге <х, уУ, если
граф ориентированный, и ребру {х, у} в случае неориентиро-
ванного графа (рис. 2.3). Очевидно, что объем памяти в этом
случае составляет 2т. Неудобством является большое число
шагов — порядка т в худшем случае, — необходимое для по-
лучения множества вершин, к которым ведут ребра из данной
вершины.
Ситуацию можно значительно улучшить, упорядочив мно-
жество пар лексикографически и применяя двоичный поиск, но
Рис. 2.3. Списки ребер, соответствующие
графам на рис. 2.1.
лучшим решением во многих случаях оказывается структура
данных, которую мы будем называть списками инцидентности.
Она содержит для каждой вершины о е V список вершин и,
таких что и-^и (или V — и в случае неориентированного гра-
фа). Точнее, каждый элемент такого списка является записью
г, содержащей вершину г. строка и указатель г. след на сле-
дующую запись в списке (г. след = ш'1 для последней записи
в списке). Начало каждого списка хранится в таблице НАЧА*
ЛО\ точнее, НАЧАЛО{о\ является указателем на начало спи-
ска, содержащего вершины из множества {и: о-^и} ({и: V — и}
для неориентированного графа). Весь такой список обычно не-
формально будем обозначать ЗАПИСЬ[у], а цикл, выполняю-
щий определенную операцию для каждого элемента и из этого
списка в произвольной, но четко установленной последователь-
ности, соответствующей очередности элементов в списке, будем
записывать «Гог и е ЗАПИСЬ [у] с!о ...».
Отметим, что для неориентированных графов каждое ребро
{и, у} представлено дважды: через вершину V в списке
ЗАПИСЬ[и] и через вершину и в списке ЗАПИСЬ[о]< Во мно-
гих алгоритмах структура графа динамически модифицируется
добавлением и удалением ребер. В таких случаях полагаем, что
в наших списках инцидентности элемент списка ЗАПИСЬ [ц],
содержащий вершину ц, снабжен указателем на элемент спи-
ска ЗАПИСЬ^}, содержащий вершину и, и что каждый эле-
мент списка содержит указатель не только к следующему эле-
менту, но и к предыдущему. Тогда удаляя некоторый элемент
(я) (<0
из списка, мы можем легко за число шагов, ограниченное кон-
стантой, удалить другой элемент, представляющий то же са-
мое ребро, не просматривая список, содержащий этот элемент
(см. задачу 2.3).
Аналогичным способом определяем для каждой вершины V
неориентированного графа список ПРЕДШ[и], содержащий
вершины из множества {и: и->у}.
Число ячеек памяти, необходимое для представления графа
с помощью списков инцидентности, будет, очевидно, иметь по-
рядок т + и. На рис. 2.4 представлены списки инцидентности,
соответствующие графам на рис. 2.1.
2.2. Поиск в глубину в графе
Существует много алгоритмов на графах, в основе которых
лежит систематический перебор вершин графа, такой что ка-
ждая вершина просматривается в точности один раз. Поэтому
важной задачей является нахождение хороших методов поиска
в графе. Вообще говоря, метод поиска «хорош», если
(а) он позволяет алгоритму решения интересующей нас за-
дачи легко «погрузиться» в этот метод и
(б) каждое ребро графа анализируется не более одного
раза (или, что существенно не меняет ситуации, число раз,
ограниченное константой).
Опишем теперь такой метод поиска в неориентированном
графе, который стал одной из основных методик проектиро-
вания графовых алгоритмов. Этот метод называется поиском
в глубину (англ. дерШ Пгз1 зеагсЬ [66]) по причинам, кото-
рые, как мы надеемся, вскоре станут ясными.
Общая идея этого метода состоит в следующем. Мы начи-
наем поиск с некоторой фиксированной вершины Затем вы-
бираем произвольную вершину и, смежную с оо, и повторяем
наш процесс от и. В общем случае предположим, что мы на-
ходимся в вершине у. Если существует новая (еще непросмот-
ренная) вершина и, и — V, то мы рассматриваем эту вершину
(она перестает быть новой) и, начиная с нее, продолжаем по-
иск. Если же не существует ни одной новой вершины, смежной
с и, то мы говорим, что вершина V использована, возвращаемся
в вершину, из которой мы попали в V, и продолжаем процесс
(если V = Уо, то поиск закончен). Другими словами, поиск в
глубину из вершины V основывается на поиске в глубину из
всех новых вершин, смежных со.
Это можно легко записать с помощью следующей рекур-,
сивной процедуры:
1 ргоседиге ГС (у)
(* поиск в глубину из вершины о;
переменные НОВЫЙ, ЗАПИСЬ глобальные *)
2 Ье^!п рассмотреть о\ НОВЫИ[о]:= ложь;
3 Тог ие=ЗАПИСЬ[о] до
4 И НОВЫИ[и] 1йеп ГС (и)
5 епс! (* вершина о использована *)
Поиск в глубину в произвольном, необязательно связном
графе проводится согласно следующему алгоритму-
1 Ье&1п
2 Тог о е V до НОВЫИ[о] := истина; (* инициализация *)
3 Тог о е V до
4 И НОВЫИ[о] П1еп ГО (о)
5 епд
Покажем теперь, что этот алгоритм просматривает каждую
вершину в точности один раз и его сложность порядка О(м+гп)'.
Отметим сначала, что вызов ГО (у) влечет за собой просмотр
всех вершин связной компоненты графа, содержащей о (если
НОВЫЙ [и] = истина для каждой вершины и этой компонен-
ты). Это непосредственно следует из структуры процедуры ГОз
после посещения вершины (строка 2) следует вызов процедуры
ГО для всех ее новых соседей, Отметим также, что каждая
вершина просматривается ие более одного раза, так как про-
сматриваться может только вершина у, для которой
НОВЫ И = истина, сразу же после посещения этой вершины
исполняется команда НОВЫЙ [у] := ложь (строка 2).
Наш алгоритм начинает поиск поочередно от каждой еще
не просмотренной вершины, следовательно, просматриваются
все вершины графа (необязательно связного).
Чтобы оценить вычислительную сложность алгоритма, от-
метим сначала, что число шагов в обоих циклах (строки 2 и 3)
порядка п, не считая шагов, выполнение которых инициировано
вызовом процедуры №0. Эта процедура выполняется не бо-
лее п раз во втором цикле сразу после посещения каждой из
вершин для каждого из ее новых соседей, итого суммарно
О(м + /и) раз. Полное число шагов, выполняемых циклом в
строке 3 процедуры Ц7О (не считая шагов, выполняемых
,1ГО(п)), для всех вызовов этой процедуры будет порядка т,
где т — число ребер. Это дает общую сложность алгоритма
О (м + т).
Отметим, что алгоритм поиска в глубину в произвольном
графе можно легко модифицировать так, чтобы он вычислял
связные компоненты этого графа. Зафиксируем этот факт:
Следствие 2.2. Связные компоненты произвольного графа,
представленного списками инцидентности, можно вычислить за
время О(н + /и). О
В связи с тем что поиск в глубину играет важную роль в
проектировании алгоритмов на графах, представим также не-
рекурсивную версию процедуры №0. Рекурсия устраняется стан-
дартным способом при помощи стека (см., например, [1]). Ка-
ждая просмотренная вершина помещается в стек и удаляется
из стека после использования.
1 ргоседиге 1ГО1 [и];
(* поиск в глубину в графе, начиная с вершины V —
нерекурсивная версия процедуры 1ГО; предполагаем,
что в начале процесса поиска Р [и] = указатель на
первую запись списка ЗАПИСЬ[и\ для каждой вершины
и\ массивы Р, НОВЫЙ — глобальные *)
2 Ъее1п С77?/С:=0; СГЕ/С-<=о; рассмотреть я;
НОВЫЙ [у] := ложь;
3 мгЪПе СТЕК =#= 0 до
4 Ье&1п / := 1ор (СТЕК), (*/—верхний элемент
стека ♦)
(*найти первую новую вершину в списке ЗАПИСЬ[1]*)
5 ПР И = п11 №еп Ь ;= ложь
6 е1зе Ь := по! НОВЫЙ [Р [/) строка];
7 ууИПе Ь до
8 Ье§1п Р [/] :=Р [/] | след-,
9 И Р [/] = п!1 !Веп Ь := ложь
10 е!зе Ь := по! НОВЫЙ строка]
11 епд;
12 1*1 Р [/] =/= п!1 !Ьеп (* найдена новая вершина*
13 Ье§1п строка; СТЕК<=1;
14 рассмотреть I; НОВЫЙ [/]:=ложь
15 епд
16 еке (* вершина I использована *)
17 1<=СТЕК. (*удалить верхний элемент стека*)
18 епд
19 епд
Корректность этой процедуры можно доказать путем незна-
чительной модификации анализа процедуры №0. Мы оставляем
Рис. 2.5. Нумерация вершин графа (в скобках), соответствующая очередности,
в которой они просматриваются в процессе поиска в глубину.
это читателю. На рис. 2.5 показан граф, вершины которого
перенумерованы в соответствии с тем порядком, в котором они
просматриваются в процессе поиска в глубину (мы отождеств-
ляем эти вершины с числами 1, 10 и полагаем, что в спи-
ске ЗАПИСЬ^] вершины упорядочены по возрастанию).
Методика поиска в глубину очевидным образом переносится
на ориентированные графы. Нетрудно проверить, что в случае
ориентированного графа результатом вызова процедуры №О(а),
а также №01 (у) будет посещение за 0(м-|-т) шагов всех
вершин и9 таких что существует путь из V в и (см. задачу 2.11)<
2.3. Поиск в ширину в графе
Теперь рассмотрим несколько иной метод поиска в графе,
называемый поиском в ширину (англ.: ЬгеадШ Пгз1 зеагсИ).
Прежде чем описать его, отметим, что при поиске в глубину
чем позднее будет посещена вершина, тем раньше она будет
использована — точнее, так будет при допущении, что вторая
вершина посещается перед использованием первой. Это прямое
следствие того факта, что просмотренные, но еще не исполь-
зованные вершины скапливаются в стеке. Поиск в ширину,
грубо говоря, основывается на замене стека очередью. После
такой модификации чем раньше посещается вершина (поме-
щается в очередь), тем раньше она используется (удаляется из
очереди). Использование вершины происходит с помощью про-
смотра сразу всех еще непросмотренных соседей этой вершины.
Вся процедура представлена ниже
1 ргоседиге (у);
(* поиск в ширину в графе с началом в вершине и;
переменные НОВЫЙ, ЗАПИСЬ — глобальные*)
2 Ье^1п
3 ОЧЕРЕДЬ :=0; ОЧЕРЕДЬ<=о\ НОВЫЙ [и] := ложь
4 \?ЬПе ОЧЕРЕДЬ =/= 0 до
5 Ьег1п р^ ОЧЕРЕДЬ; посетить р\
6 Тог и (== ЗАПИСЬ [р] до
7 И НОВЫЙ [и] Шеп
8 Ье&Ш ОЧЕРЕДЬ <=и\ НОВЫЙ [и]:=ложь
9 епд
10 епд
11 епд
Способом, аналогичным тому, какой был применен для по-
иска в глубину, можно легко показать, что вызов процедуры
№5 (у) приводит к посещению всех вершин связной компоненты
графа, содержащей вершину V, причем каждая вершина про-
сматривается в точности один раз. Вычислительная сложность
поиска в ширину также имеет порядок т 4- и, так как каждая
вершина помещается в очередь и удаляется из очереди в точ-
ности один раз, а число итераций цикла 6, очевидно, будет
иметь порядок числа ребер графа.
Оба вида поиска в графе — в глубину и в ширину могут
быть использованы для нахождения пути между фиксирован-
ными вершинами V и и. Достаточно начать поиск в графе с
вершины V и вести его до момента посещения вершины и.
Преимуществом поиска в глубину является тот факт, что в мо-
мент посещения вершины и стек содержит последовательность
вершин, определяющую путь из V в и. Это становится очевид-
ным, если отметить, что каждая вершина, помещаемая в стек,
является соседом верхнего элемента в стеке. Однако недостат-
ком поиска в глубину является то, что полученный таким об-
разом путь в общем случае не будет кратчайшим путем из V
в и.
От этого недостатка свободен метод нахождения пути, осно*
ванный на поиске в ширину. Модифицируем процедуру №5,
заменяя строки 7 4- 9 на
И НОВЫЙ [и] 1Ьеп
1е?1п ОЧЕРЕДЬ<=и\ НОВЫЙ [и]:=ложь;
ПРЕДЫДУЩИЙ [и]:=р
епд
По окончании работы модифицированной таким образом
процедуры таблица ПРЕДЫДУЩИЙ содержит для каждой
просмотренной вершины и вершину ПРЕДЫДУЩИЙ[и\> из
которой мы попали в и. Отметим, что кратчайший путь из и
в V обозначается последовательностью вершин и = и,2, ...
.ик = ц, где ш+х = ПРЕДЫДУЩИЙ [ьц] для 1 I < к и
к является первым индексом /, для которого и, = V. Действи-
тельно, в очереди помещены сначала вершины, находящиеся
на расстоянии 0 от V (т. е. сама вершина ц), затем поочередно'
все новые вершины, достижимые из ц, т. е. вершины, находя-
щиеся на расстоянии 1 от у, и т. д. Под расстоянием здесь мы
понимаем длину кратчайшего пути. Предположим теперь, что
мы уже рассмотрели все вершины, находящиеся на расстоянии,
не превосходящем г, от V, что очередь содержит все вершины,
находящиеся от V на расстоянии г, и только эти вершины и что
таблица ПРЕДЫДУЩИЙ правильно определяет кратчайший
путь от каждой, уже просмотренной вершины до V способом,
описанным выше. Использовав каждую вершину р, находящую-
ся в очереди, наша процедура просматривает некоторые новые
вершины, и каждая такая новая вершина и находится, оче-
видно, на расстоянии г +1 от V, причем, определяя ПРЕДЫ-
ДУЩИЙ[и\:=р, мы продлеваем кратчайший путь от р до V
до кратчайшего пути от и до V. После использования всех вер-
шин из очереди, находящихся на расстоянии г от ц, она (оче-
редь), очевидно, содержит множество вершин, находящихся на
расстоянии г + 1 от ц, и легко заметить, что условие индукции
выполняется и для расстояния г+ 1.
На рис. 2.6 представлен граф, вершины которого зануме-
рованы согласно очередности, в которой они посещаются в про-
цессе поиска в глубину.
Как и в случае поиска в глубину, процедуру 1Г5 можно
использовать без всяких модификаций и тогда, когда списки
Рис. 2.6. Нумерация вершин графа на рис. 2.5 (в скобках), соответствующая
очередности, в которой они просматриваются в процессе поиска в ширину.
инцидентности ЗАПИСЬ[о], о <= V, определяют некоторый
ориентированный граф. Очевидно, что тогда посещаются толь-
ко те вершины, до которых существует путь от вершины, с ко-
торой мы начинаем поиск (см. задачу 2.12).
2.4. Стягивающие деревья (каркасы)
Деревом называется произвольный неориентированный связ-
ный граф без циклов. Для произвольного связного неориенти-
рованного графа 0 = <У, Е) каждое дерево <И, Т>, где Т^Е,
будем называть стягивающим деревом1) графа О. Ребра та-
кого дерева будем называть ветвями, а все остальные ребра
графа будем называть хордами (очевидно, что о ветвях и хор-
дах в графе мы можем говорить только в контексте фиксиро-
ванного стягивающего дерева).
Отметим, что каждое дерево с п вершинами имеет п — 1
ребер. Этот факт можно просто доказать, применяя индукцию
относительно п. Очевидно, что это справедливо для п = 1. Если
п > 1, то отметим сначала, что в каждом дереве с п верши-
нами существует «висячая» вершина, т. е. вершина степени 1.
Действительно, рассмотрим в таком дереве произвольный путь
— о2— ... — ок с максимальной длиной (^ =#= V/) для I =й= Л
Вершины VI, ок «висячие», так как ни от одной из них нельзя
провести второго ребра ни к одной из вершин ..., ок (де-
рево не содержит циклов), ни к любой другой вершине (путь
максимальный). Удаляя из нашего дерева вершину ок и ребро
{ул-1, ул} (либо вершину VI и ребро {01,02}), получаем, оче-
!) В литературе по теории графов широко распространены также термины
каркас и остов, — Прим. перев.^
видно, дерево с п — 1 вершинами, которое в силу индуктивно-
го предположения имеет п — 2 ребер. Следовательно, наше пер-
воначальное дерево имело п — 2 + 1 = п — 1 ребер.
Процедуры поиска в глубину и в ширину можно простым
способом использовать для нахождения стягивающих деревьев.
В обоих случаях достижение новой вершины и из вершины V
вызывает включение в дерево ребра {у, и}.
Алгоритм 2.3. (Нахождение стягивающего дерева связного
графа методом поиска в глубину.)
Данные: Связный граф О = <У, Е), заданный списками ин-
цидентности ЗАПИСЬ]^], V е V.
Результаты: Стягивающее дерево <У, Г> графа О.
1 ргоседиге 11^67) (^);
(*поиск в глубину, соединенный с нахождением ребра
дерева; переменные НОВЫЙ, ЗАПИСЬ, Т — глобальные*)
2 Ье&1П НОВЫЙ [у]:=ложь;
3 Гог и ЗАПИСЬ М до
4 И НОВЫЙ [и] ГЬеп (* {^, и} —новая ветвь*)
5 Ье^1п Г:=Т1Ш и}\ МОИ (и)
6 епд
7 епд; (*№6Д*)
8 Ье^1п (♦главная программа*)
9 Гог и е V до НОВЫЙ [и] := истина; (* инициализация *)
10 Т := 0; (* Т = множество найденных к этому моменту
ветвей *)
И 1ГОО(г) (* г — произвольная вершина графа*)
12 епд
Для доказательства того, что алгоритм 2.3 корректно строит
стягивающее дерево произвольного связного графа» достаточно
отметить следующие три факта. Во-первых, в момент добавле-
ния к множеству Т новой ветви {ц, и} (строка 5) в <У, 7) су-
ществует путь из г в V (этот факт мы доказываем по индукции).
Таким образом, алгоритм строит связный граф. Во-вторых, ка-
ждая новая ветвь {у, и}, добавляемая к множеству 7, соеди-
няет уже рассмотренную вершину V (т. е. НОВЫЙ [у] = ложь)
с новой вершиной и. Отсюда следует, что построенный граф
<У, Ту не содержит циклов. Действительно, последняя ветвь,
«замыкающая» цикл, должна была бы соединить две уже рас-
смотренные вершины. И наконец, в-третьих, из свойства поиска
в глубину следует, что процедура УРСИ просматривает все вер-
шины связного графа. Следовательно, граф <У, 7>, построен-
ный нашим алгоритмом, есть стягивающее дерево графа О.
Вычислительная сложность алгоритма есть, очевидно, О(н4-/и),
О’» е, того же порядка, что и поиск в глубину. Пример стяги-
вающего дерева, построенного алгоритмом 2.3, приведен на
рис. 2.7, а. Каждое стягивающее дерево, построенное указан-
ным алгоритмом, имеет любопытное свойство, которое мы сей-
час опишем. Вершину г, с которой мы начинаем поиск в гра-
фе, назовем корнем стягивающего дерева <1/, Т>. Очевидно, что
в дереве <К, существует в точности один путь от произволь-
ной вершины к корню (см. задачу 10).
Рис. 2.7. Стягивающие деревья, построенные с помощью алгоритма 2.3 (а) и
алгоритма 2.5 (б).
Для двух различных вершин V и и дерева <К, будем го-
ворить, что и является потомком вершины V, если V лежит на
пути (в дереве <К, Г>) из и в корень. Если при этом имеет
место V — и, то будем говорить, что и — сын вершины у, а V —
отец вершины и.
Теорема 2.4. Пусть (У,!"} — стягивающее дерево связного
графа О = (У,Е), построенное алгоритмом 2.3, и пусть
{и,и}^Е. Тогда либо и — потомок V, либо V — потомок и.
Доказательство. Предположим без ограничения общности,
что вершина V будет просмотрена раньше, чем и. Рассмотрим
процесс поиска в глубину, начиная с вершины V. Очевидно, что
по окончании его должно быть НОВЫЙ [и] = ложь, ибо V — и.
Но это означает, что ребра, добавленные в множество Т в те-
чение этого процесса, содержат путь из V в и, откуда следует,
что V лежит на пути из и в корень. И
Подобным же способом можно построить стягивающее де-
рево, используя метод поиска в ширину.
Алгоритм 2.5. (Нахождение стягивающего дерева связного
графа методом поиска в ширину.)
Данные: Связный граф О = <К Е}, представленный списка-
ми инцидентности ЗАПИСЬ[о], V е V.
Результаты: Стягивающее дерево <7, Т) графа О.
1 Ье^1п
2 Гог и<=У до НОВЫЙ [и] := истина; (* инициализация *)
3 Т:=0; (*Г-множество найденных к этому моменту ветвей*)
4 ОЧЕРЕДЬ = 0; ОЧЕРЕДЬ^г,
5 НОВЫЙ [г] := ложь; (* г-корень стягивающего дерева *]
6 \уЫ1е ОЧЕРЕДЬ =^= 0 до
7 Ье^т V <=ОЧЕРЕДЬ\
8 Гог и <= ЗАПИСЬ [у] до
9 1Г НОВЫИ[и] Й1еп (* {у, и} = новая ветвь*)
10 Ье$1п ОЧЕРЕДЬ<=и\ НОВЫЙ [и] := ложь;
Г := Г 0 {V, и}
11 епд
12 епд
13 епд
Способом, аналогичным использованному для алгоритма 2.3»
можно доказать, что данный алгоритм корректно строит стяги-
вающее дерево для произвольного связного графа за О(н + /и)
шагов.
На рис. 2.7,6 дан пример стягивающего дерева, построенно-
го алгоритмом 2.5.
Рассуждения разд. 2.3 приводят непосредственно к следую-
щей теореме:
Теорема 2.6. Пусть — стягивающее дерево связного
графа О = <У, Е}, построенное при помощи алгоритма 2.5. То-
гда путь в из произвольной вершины V до корня г яв-
ляется кратчайшим путем из V в г в графе О. I
В гл. 3 особо обсуждается более общая задача отыскания
кратчайших путей в графе, ребрам которого приписаны «дли-
ны», не обязательно равные единице.
Рассуждения данного раздела легко переносятся на произ-
вольные графы, не обязательно связные. Максимальный под-
граф без циклов произвольного графа О называется стягиваю-
щим лесом графа О. Очевидно, что стягивающий лес графа с к
компонентами связности определяется через стягивающие де-
ревья этих компонент и, следовательно, содержит п — к — 1
ребер.
2.5. Отыскание фундаментального
множества циклов в графе
Тесно связана с задачей нахождения стягивающего дерева
задача построения фундаментального множества циклов. Если
к стягивающему дереву <7, Т> графа О = <У, Л"> мы добавим
произвольную хорду е е Е\7\ то нетрудно отметить, что воз-
никший при этом подграф <7, 7,Ы{е}> содержит в точности
один цикл1), который мы будем обозначать через Се. Очевидно,
что Се содержит ребро е. Множество ={Се: е Е\Т} будем
называть фундаментальным множеством циклов графа О (от-
носительно стягивающего дерева <1Л Т>). Название «фундамен-
тальный» связано с тем фактом, что, как мы докажем позднее,
каждый цикл графа О можно некоторым естественным спосо-
бом получить из циклов множества
Введем для произвольных множеств Л и В операцию
л®в=(див)\(лпв).
Множество А Ф В будем называть симметрической разностью
множеств А и В.
Отметим, что симметрическая разность множеств Ль Ак
содержит независимо от расстановки скобок в точности те эле-
менты, которые появляются в нечетном числе множества А[.
Действительно, это нетрудно доказать индукцией по к. Для
к = 1 и к = 2 это, очевидно, так. Для к >2 наша симметри-
ческая разность имеет вид А Ф В, где А является симметриче-
ской разностью множеств Ль ..., Лр, а В — симметрической
разностью множеств Ар+1, ..., Лр+р, где р, дСк и р 4- д = к.
Множество Л Ф В содержит в точности те элементы, которые
появляются только в одном из множеств Л или В. Пользуясь
индуктивным предположением, сделаем вывод, что Л Ф В яв-
ляется множеством тех элементов, которые появляются в не-
четном числе множеств из Ль ..., Ар и в четном числе из
Лд+1, ..., Лр+^, или же в нечетном числе множеств из Лр+ь ...
..., Ар+Я и в четном числе множеств из Ль ..., Ар. А это в
точности множество тех элементов, которые появляются в не-
четном числе множеств из Ль ..., Ак.
Из доказанного выше свойства следует, что мы можем опу-
стить скобки в симметрической разности произвольного числа
множеств и писать Л1 Ф Л2 Ф ... Ф Ак.
Множество С ребер графа называется псевдоциклом, если
каждая вершина графа <7, С> имеет четную степень. Приме-
*) В этом разделе под циклом мы всегда будем понимать элементарный
цикл,
ром псевдоцикла является пустое множество и произвольный
цикл графа.
Лемма 2.7. Симметрическая разность произвольного числа
псевдоциклов является псевдоциклом.
Доказательство. Очевидно, что достаточно рассмотреть слу-
чай двух псевдоциклов С\ и С2. Обозначим для произвольной
вершины V через 5,(ц) и 52(у) множество ребер соответствен-
но из С| и Сг, инцидентных с V. Множества 51 (о) и 52(о) имеют
четную мощность, четной является также мощность множества
ребер из С1 ® С2, инцидентных с V, так как |5, (у)® 52(о) | =
= |51(У)| + |52(ц) 1 — 215, (^)П52(ц)|. И
Теперь мы можем доказать теорему о фундаментальном
множестве циклов.
Теорема 2.8. Пусть (7 = <!/,/?> — связный неориентирован-
ный граф, а <7, Т) — его стягивающее дерево. Произвольный
цикл графа О можно однозначно представить как симметри-
ческую разность некоторого числа фундаментальных циклов.
В общем случае произвольный псевдоцикл С графа О можно
однозначно выразить как
С= ф Се. (2.1)
е-С\Т
Доказательство. Симметрическая разность ф Се являю-
е<=С\Т
щаяся псевдоциклом в силу предыдущей леммы, состоит
из множества хорд С\Т и некоторых ветвей. Это вытекает из
того факта, что каждая хорда е е С\Г принадлежит в точ-
ности к одному фундаментальному циклу, а именно к Се. Мно-
жество
С® ф Се (2.2)
е ее С\Т
является также в силу предыдущей леммы псевдоциклом, при-
чем он может содержать только ветви. Однако ни один непу-
стой псевдоцикл не может содержаться в Г, так как каждый
непустой подграф без циклов содержит вершину степени 1 («ви-
сячую»). Отсюда следует, что множество (2.2) пустое, что экви-
валентно равенству (2.1). Однозначность представления (2.1)'
легко следует из того, что цикл Се является единственным фун-
даментальным циклом, содержащим хорду е (е^Е\Т).
Теорема, которую мы доказали, имеет очень простую ин-
терпретацию в терминах линейных пространств. Пусть Е =
~ ет} и каждому псевдоциклу С поставлен в соот-
ветствие вектор <аь ...» ат), где
Г 1, если е1 е С,
^=1 Л
(О в противном случае.
Сумме таких векторов в предположении, что суммы координат
берутся по модулю 2, соответствует симметрическая разность
некоторых псевдоциклов. Лемма 2.7 утверждает, что векторы,
поставленные в соответствие псевдоциклам, образуют подпро-
странство т-мерного линейного пространства над двухэлемент-
ным полем (состоящим из 0 и 1с операциями сложения по мо-
дулю 2 и умножения). Отметим, что произвольная линейная
комбинация в пространстве над двухэлементным полем соот-
ветствует симметрической разности, так как единственным не-
нулевым элементом (коэффициентом) может быть только 1.
В свою очередь теорема 2.8 говорит, что фундаментальные цик-
лы определяют базис нашего подпространства.
Нахождение фундаментального множества циклов имеет су-
щественное значение при анализе электрических цепей. Точнее
говоря, каждому фундаментальному циклу в графе, соответ-
ствующему данной электрической цепи, мы можем сопоставить
уравнение, определяющее закон Кирхгофа для напряжений (см.,
например, [61]): сумма падения напряжений вдоль цикла рав-
на нулю. Тогда ни одно из этих уравнений не зависит от осталь-
ных, от них же зависит произвольное уравнение, определяющее
закон Кирхгофа для произвольного цикла графа.
Опишем теперь простой алгоритм нахождения множества
фундаментальных циклов. Этот алгоритм основывается на по-
иске в глубину и имеет структуру, аналогичную рекурсивному
алгоритму нахождения стягивающего дерева (алгоритм 2.3).
Каждая новая вершина, встречающаяся в процессе поиска, по-
мещается в стек, представленный таблицей СТЕК, и удаляется
из стека после использования. Очевидно, что стек всегда со-
держит последовательность вершин с рассматриваемой в дан-
ный момент вершины V до корня. Поэтому же если анализируе-
мое нами ребро {ц, и} замыкает цикл (т. е. >
> > 0 и и не находится непосредственно под верхним
элементом стека), то вершина и — также в силу теоремы 2.4 —
находится в стеке и цикл, замыкаемый ребром {ц, и} представ-
лен верхней группой элементов стека, начиная с V и кончая
вершиной и.
Алгоритм 2.9. (Нахождение множества элементарных цик-
лов графа.)
Данные: Граф О = (V, Е), представленный списками инци<
дентности ЗАПИСЬ[о], V е V.
Результаты: Множество элементарных циклов графа О.
1 ргоседиге ЦИКЛ(р)\
(♦нахождение фундаментального множества циклов для
компоненты связности, содержащей вершину ц; перемен-
ные б/, пит, СТЕК, ЗАПИСЬ, МОИ —- глобальные *)
2 Ье^1П (1 := <1 + 1; СТЕК И] := у; пит := пит + 1;
М0И[у]\=пит\
3 Тог и^ЗАПИСЬ[с] до
4 И МОИ [и] = 0 Шеп ЦИКЛ (и)
5 еке И (и Ф СТЕК [с1 - 1] апд (МОИ [у] > ГСМ [и])
Шеп
(* {V, и} замыкает новый цикл*)
6 выписать цикл с вершинами
7 СТЕКУ], СТЕК [4- 1 ..., СТЕК[с], где СТЕК [с] = и\
8 1 (* использованная вершина V удаляется
из стека *)
9 епд; (* ЦИКЛ *)
10 Ье&1п (*главная программа*)
11 Тог V е V до ГСМ [ц] :=0; пит := 0; (* инициализация *)
12 б/:=0; СТЕК [0] := 0; (* с1 = число элементов в стеке*)
13 Тог уе V до
14 1Т МОИ М = 0 Шеп ЦИКЛ (ц)
15 епд
Оценим теперь вычислительную сложность этого алгоритма.
Отметим сначала, что общее число шагов, не считая выписы-
вания циклов (строки 6, 7)—как и во всех алгоритмах, осно-
ванных на поиске в глубину, — имеет порядок О(п 4- пг). К это-
му следует прибавить суммарную длину всех циклов. Эта дли-
на не превосходит (пг — п + 1)п, что дает общую сложность
алгоритма О(пт-\~п) (или О (пт), если отбросить вырожден-
ный случай т = 0).
2.6. Нахождение компонент
двусвязности
Вершину а неориентированного графа О = (У,Е} будем
называть точкой сочленения, если удаление этой вершины и
всех инцидентных ей ребер ведет к увеличению числа компо-
нент связности графа. Равнозначное утверждение состоит в том,
что а является точкой сочленения, если существуют вершины о
и и, отличные от а, такие, что каждый путь из и в V, а мы
предполагаем, что существует по крайней мере один такой путь,
проходит через вершину а. Неориентированный граф называет-
ся двусвязным1 если он связный и не содержит точек сочлене-
Рис. 2.8. а). Граф с точками сочленения; б) Блоки этого графа.
ния. Произвольный максимальный двусвязный подграф графа О
называется компонентой двусвязности или блоком этого гра-
фа.
Двусвязность графа—очень желательный признак для не-
которых приложений. Представим себе, что вершины графа
изображают узлы некоторой информационной сети, а ребра со-
ответствуют линиям передачи. Если наш граф двусвязный, то
выход из строя отдельного узла ш никогда не приведет к по-
тере соединения между любыми двумя узлами, отличными от о/.
Знание блоков графа также очень важно, если принять во вни-
мание то, что многие графовые задачи, такие как нахождение
всех элементарных циклов или установление факта планарно-
сти графа (граф называется планарным, если его можно так
начертить на плоскости, чтобы никакие два ребра не пересе-
кались), приводят естественным путем к аналогичным задачам
для блоков данного графа.
Отметим, что если <У1,В1>, <У2, В2>— два разных блока
графа О, то У\ П У2 = 0 или 1Л Г) 1Л> ={я}, где а—точка со-
членения графа С. Действительно, рассмотрим подграф
<1Л 0 Уг, В{ и В2>. Если было бы 11/1 П У2| 2, то этот подграф
был бы двусвязным вопреки предположению о максимально-
сти <1/ь В\) и <У2, В2>. Невозможен также случай 1/1 Г) У2 = {а}>
где а не является точкой сочленения графа О. Ибо тогда в О
существует путь между вершинами и е Уь и =# а и се У2)
V ф а, не включающий вершину а. Нетрудно отметить, что под-
граф, возникающий из <У1 0 У2, В{ и В2> добавлением вершин
и ребер этого пути, будет двусвязным, что противоречит
предположению о максимальности <УЬ В1> и <У2, В2), На
рис. 2.8 дан пример графа, имеющего точки сочленения и
блоки,
Нахождение точек сочленения и блоков графа является
классической задачей, которую можно эффективно решить по-
гружением в процедуру поиска в глубину (см. Тарьян [66]).
Прежде чем представить частный алгоритм, сделаем предва-
рительно несколько замечаний.
Теорема 2.10. Пусть О = <!/,?>— стягивающее дерево с
корнем г связного графа С = (V, Е\ построенное с помощью
поиска в глубину (алгоритм 2.3). Вершина V е V является точ-
кой сочленения графа О тогда и только тогда, когда либо
V = г и г имеет по крайней мере двух сыновей в О, либо V ф г
и существует сын ю вершины V, такой что ни хм, ни какой-либо
его потомок не связаны ребром ни с одним предком вершины V.
Доказательство. Рассмотрим сначала случай V = г. Если
вершина V имеет только одного сына (либо является изолиро-
ванной вершиной), то ее устранение не увеличит числа компо-
нент связности, ибо это не нарушает связности дерева. Если
она имеет по меньшей мере двух сыновей, то после удаления
вершины V эти сыновья лежат в разных компонентах связно-
сти. Действительно, из теоремы 2.4 вытекает, что каждый путь
между двумя различными сыновьями должен проходить через
корень—в противном случае он содержал бы хорду {и,/}, где
ни и не является потомком I, ни I не является потомком и. Ана-
логично, для случая ц =/= г. Если после устранения вершины V
существует путь от ее сына ш до корня, то, как и в предыду-
щем случае из теоремы 2.4, следует, что этот путь должен со-
держать ребро, соединяющее или некоторого потомка вер-
шины хл) с некоторым предком вершины V. В
Идея алгоритма следующая: ведем поиск в глубину в гра-
фе, начиная с некоторой вершины г, вычисляя для каждой вер-
шины V два параметра: №ОМ[ц] и В [у]. Первый из них — это
просто номер вершины V в порядке, в котором вершины посе-
щаются при поиске в глубину, начиная с вершины г. Если че-
рез О = <1/, Г> мы обозначим дерево, соответствующее нашему
поиску в глубину, то другой параметр определяет наименьшее
значение №ОМ[и], где и=^ или вершина и связана хордой
с вершиной V или ее произвольным потомком в О. Параметр
Ь [у] легко вычислить по индукции относительно дерева О, если
мы знаем Л[<^] для всех сыновей вершины V. Обозначив
А = гшп {Ь [ш]: ш • сын вершины в}9
В = тт[1Г6ЛГ[и]: {и,о}е=Е\Т}9
имеем Ь [у] = тт {МОП [с/], Л, В}.
Из теоремы 2,10 следует, что у является точкой сочленения
или корнем тогда и только тогда, когда Ь [ш] для
некоторого сына и вершины V (полагаем, что п > 1).
Алгоритм 2.11. (Нахождение компонент двусвязности гра-
фа).
Данные: Граф С = (У,Е) без изолированных вершин, пред-
ставленный списками инцидентности ЗАПИСЬ[и],
V е V.
Результаты: Множества ребер всех компонент двусвязности.
1 ргоседиге ДВУСВ(р, р);
* поиск в глубину, начиная с вершины V и полагая, что р
является отцом вершины V в этом процессе; параллельно
выписываются ребра найденных компонент двусвязности;
переменные пит, Ь, СТЕК — глобальные *)
2 Ье&т пит ‘.— пит + 1; [о]:=пит;
3 Ь [о] := 1Г6ЛГ [о];
4 и Тоге ЗАПИСЬ [о] до
5 И УРСИ [и] = О Шеп («вершина п — новая,
{о, и} — ветвь *)
6 Ьее1п СТЕК<={у, и); ДВУСВ {и, о);
7 Ь [и] ’= пип (Ь [о], Ь [«]);
8 И Ь [и] > 1РОЛЦо] Шеп
(* V есть корень или точка сочленения,
а верхняя часть стека до (о, и) включительно
содержит компоненту двусвязности*)
9 Ье^Ш (* выписать ребра компоненты
двусвязности *)
10 гереа! е<=СТЕК\ уег11е(е)
11 ипШ е = {», и);
12 мгг11е (’;’) («знак конца компоненты дву-
связности ♦)
13 епд
14 епд
15 е1$е (* 1ГО2У [и] > 0, т. е. и уже была посещена*)
16 И (и р) апй(УУСЙ [и] < УУСЙ [м]) Шеп
(* ребро {о, и) — хорда и не включается в стек ♦)
17 ЬееШ СТЕК<={о, и},
18 Цо] ;=тт(Цо], 1ГСЛГЫ)
19 епд
20 епд; (♦ ДВУСВ*)
21 Ье^Ш («главная программа*)
22 Тог иеУ до ИГСЛЦи]:«=0; (*инициализация*)
23 СТЕК'.— О)', пит:=0-,
24 Тог и е V до
25 и 1ГеУ[«] = 0 Шеп ДВУСВ(и, 0)
26 епд
Покажем теперь, что вызов процедуры ДВУСВ (у, 0) (строка
25) для еще не рассматривавшейся вершины V влечет за собой
выделение и фиксирование всех блоков компоненты связности
графа, содержащей вершину V. Доказательство проводится ме-
тодом индукции по числу блоков этой компоненты. Если ком-
понента связности не содержит точек сочленения, то нетрудно
отметить, что вызов ДВУСВ (у, 0) приводит к засылке в стек
всех ребер этой компоненты, а затем (см. цикл 10) запись этих
ребер. Предположим теперь, что наша компонента содержит
к > 1 блоков и что алгоритм работает корректно для произ-
вольной компоненты, содержащей менее к блоков. Рассмотрим
первое встретившееся ребро {у, и}, такое что С[г/] [^]
в строке 8. Согласно нашим предыдущим рассуждениям это не-
равенство означает, что V — корень или точка сочленения. Ни
один из потомков вершины V (в дереве поиска в глубину, реа-
лизованном соответствующим алгоритмом) не является точкой
сочленения, и в результате ребра верхней части стека до {у, и}
включительно являются ребрами графа, соединяющими потом-
ков вершины V вместе с самой у, и тем самым создают блок,
который выписывается в цикле 10. Модифицируем теперь нашу
компоненту, удалив описанный выше блок (не удаляя верши-
ну у). Модифицированная таким образом компонента имеет
к — 1 блок, и выполненение для нее процедуры ДВУСВ (у, 0)
вызывает в силу индуктивного предположения корректную
запись этих блоков. Действия алгоритма для модифицирован-
ной компоненты отличаются от действий в случае с исходной
компонентой только тем, что для первой встреченной точки со-
членения (исходной компоненты) V цикл 4 не выполняется для
вершин и, принадлежащих удаленному блоку. Отсюда легко
следует, что ДВУСВ (у, 0) корректно определяет все к блоков
нашей компоненты связности, а тем самым весь алгоритм кор-
ректно определяет все блоки графа.
Оценим теперь вычислительную сложность алгоритма. Цик-
лы 22 и 25 требуют О (и) шагов, причем для второго цикла не
учитываются шаги, выполняемые при вызове ДВУСВ(ц,0) для
каждой еще нерассмотренной вершины. Такой вызов для ком-
поненты связности с П[ вершинами и пц ребрами требует
0(п/ + т/) шагов, не считая шагов в цикле 10, так как такая
процедура ведет в компоненте поиск в глубину, требуя число
шагов, ограниченное константой для каждого просматривае-
мого ребра. Каждое ребро удаляется из стека и попадает в
список ребер блока в точности один раз, что дает в сумме О(т)
шагов, совершаемых циклом 10 во время его выполнения всего
алгоритма. Суммируя все эти слагаемые, получаем в итоге об-
щую сложность алгоритма, равную О(п + т),
2.7. Эйлеровы пути
Эйлеровым путем в графе называется произвольный путь,
проходящий через каждое ребро графа в точности один раз, т. е.
путь 0т+1, такой что каждое ребро е<=Е появляется в
последовательности о\, ..., ут+1 в точности один раз как е =
= {у/, у/+1} для некоторого I. Если = ут+1, то такой путь на-
зывается эйлеровым циклом. Задача существования эйлерова
пути в заданном графе была решена Эйлером в 1736 г., и пред-
ставленное им необходимое и достаточное условие существова-
ния такого пути (см. теорему 2.12) считается первой в истории
теоремой теории графов.
Теорема 2.12. Эйлеров путь в графе существует тогда и толь-
ко тогда, когда граф связный и содержит не более чем две вер-
шины нечетной степени.
Доказательство. Доказательство достаточности условия тео-
ремы будет следствием анализа алгоритма нахождения эйлерова
пути, который мы опишем в данном разделе. Необходимость
условия очевидна, так как если вершина V, отличная от V: и
ут+1, появляется в эйлеровом пути VI, ..., х)т+1 к раз, то это
означает, что степень этой вершины в графе составляет 2к.
Отсюда следует, что вершины нечетной степени, если они су-
ществуют, являются концами эйлерова пути. Здесь следует от-
метить, что не существует графов с одной только вершиной не-
четной степени. Действительно, обозначая степень вершины и
через й(у), имеем
У й (о) =2т,
V е И
ибо в указанной выше сумме каждое ребро {и, о} считается
дважды: один раз в с1(и) и один раз в Отсюда следует,
что число вершин нечетной степени всегда четно. I
Если в связном графе нет вершин нечетной степени, то каж-
дый эйлеров путь является циклом, так как концы эйлерова
пути, не являющегося циклом, всегда вершины нечетной сте-
пени. Предположим, что и и V — единственные вершины нечет-
ной степени связного графа С = (V, Е>, и образуем граф О* до-
бавлением дополнительной вершины / и ребер {иД} и {у,/}
(или просто {и, и}, если {и, о}^Е). Тогда О* — связный граф
без вершин нечетной степени, а эйлеровы пути в О будут в оче-
видном взаимно однозначном соответствии с эйлеровыми цик-
лами в О*. В силу этого в оставшейся части данного раздела
мы будем заниматься только эйлеровыми циклами,.
Алгоритм 2.13 (Нахождение эйлерового цикла).
Данные: Связный граф 0 = <У, Е) без вершин нечетной сте*
пени, представленный списками ЗАПИСЬ [у], у е V.
Результаты: Эйлеров цикл, представленный последователь-
ностью вершин в стеке СЕ.
1 Ъея1п
2 СТЕК:=0\ СЕ\=0\
3 V := произвольная вершина графа;
4 СТЕК<=Щ
5 \уЫ1е СТЕК^0 до
6 Ье&1п и *.= 1ор(СТЕК). (* V = верхний элемент стека*)
7 И ЗАПИСЬ [V] =/= 0 1Ьеп
8 Ье&1п и := первая вершина списка ЗАПИСЬ\р}\
9 СТЕК<=и\
(♦удалить ребро {у, и} из графа*)
10 ЗАПИСЬ [у] := ЗАПИСЬ [у] \ {и}-9
ЗАПИСЬ [п] := ЗАПИСЬ [и] \ {у};
11 у;=и
12 епд
13 еке (* ЗАПИСЬ [у] = 0 *)
14 Ье@1п ъ<=СТЕК\ СЕ<=у
15 епд
16 епд
17 епд
Принципы действия алгоритма можно объяснить следующим об-
разом: пусть Уо—вершина, выбранная в строке 3. Цикл 5 начи-
нает строить путь с началом в у0, причем вершины этого пути
помещаются в СТЕК, а ребра удаляются из графа. Эти действия
продолжаются вплоть до того момента, когда путь нельзя удли-
нить, включив в него новую вершину, т. е. когда ЗАПИСЬ\и\ =
= 0 в строке 7. Отметим, что тогда должно быть V = у0» так
как в любом другом случае это означало бы, что степень вер-
шины V нечетная. Таким образом, из нашего графа был удален
цикл, а вершины этого цикла находятся в стеке СТЕК. Отметим,
что в графе, модифицированном таким способом, степень произ-
вольной вершины останется четной. Вершина V = щ переносит-
ся теперь из стека СТЕК в стек СЕ, а «очередной» вершиной V
становится верхний элемент стека СТЕК. Процесс повторяется,
начиная с этой вершины (если ЗАПИСЬ [у] у= 0), в результате
чего вследствие четности степени всех вершин находится и по-
мещается в стек СТЕК некоторый цикл, проходящий через вер-
шину V. Это продолжается до того момента, когда СТЕК не
станет пустым. Очевидно, что вершины, помещаемые в стек СЕ,
образуют некоторый путь, причем вершина V переносится в стек
СЕ только тогда, когда ЗАПИСЬ [у] = 0, т. е. когда все ребра,
инцидентные с этой вершиной, представлены (парами соседних
вершин) в одном из стеков. Отсюда легко следует, что по окон-
чании алгоритма стек СЕ содержит эйлеров цикл.
Оценим теперь вычислительную сложность нашего алгорит-
ма. Для этого отметим, что каждая итерация главного цикла
(строка 5) либо помещает вершину в стек СТЕК и удаляет
ребро из графа, либо переносит вершину из стека СТЕК в стек
СЕ. Таким образом, число итераций этого цикла — О (т). В свою
очередь число шагов в каждой итерации ограничено константой.
1, 2, 3, 4, 5, 6, 7, 2, 8, 6, 9, 7, 8, 5, 3, 1
Рис. 2.9. Граф и эйлеров цикл в этом графе, найденный с помощью алгорит-
ма 2.13.
Мы предполагаем здесь, что каждый из списков инцидентности
ЗАПИСЬ^}, оеУ, реализован таким образом, что каждая
вершина в этом списке содержит указатели на предыдущую и
последующую вершины, и вершина и в списке ЗАПИСЬ^} со-
держит указатель на вершину V в списке ЗАПИСЬ[и]. Это дает
возможность устранить ребро {у, и} (строка 10) за время, огра-
ниченное константой (см. разд. 2.1). Из приведенных выше рас-
суждений можно сделать вывод, что общая сложность алгоритма
есть О(т). Очевидно, что этот алгоритм оптимальный, так как
уже одно выписывание эйлерова цикла требует й(дп) шагов.
На рис. 2.9 представлен граф и некоторый эйлеров цикл, най-
денный алгоритмом 2.13.
2.8. Алгоритмы с возвратом
Рассмотрим теперь задачу, рассмотренную в предыдущем
параграфе, с той разницей, что на этот раз нас будут интере-
совать пути, проходящие в точности один раз через каждую
вершину (а не каждое ребро)^ данного графа. Эта небольшая,
как могло бы показаться, модификация приводит, как мы убе-
димся, к значительному изменению характера проблемы. Вспом-
ним, что путь с указанным свойством называется гамильтоновым
путем (гамильтонов цикл определяется очевидным образом) >
Пример гамильтонова пути в графе и графа, в котором такого
пути не существует, показан на рис. 2.10.
Рис. 2.10. а) Гамильтонов путь в графе; б) Граф, в котором не существует
гамильтонова пути.
В отличие от эйлеровых путей не известно ни одного про-
стого необходимого и достаточного условия для существования
гамильтоновых путей и это несмотря на то, что эта задача —
одна из центральных в теории графов. Не известен также алго-
ритм, который проверял бы существование гамильтонова пути
в произвольном графе, используя число шагов, ограниченное
многочленом от переменной п (числа вершин в графе). Имеются
некоторые основания, но нет математического доказательства
того, чтобы предполагать, что такое положение вещей вызвано
не столько нашим незнанием, а скорее тем фактом, что такого
алгоритма не существует. Проблема существования гамильто-
нова пути принадлежит к классу так называемых ЫР-полных
задач [27]. Детальное обсуждение этих задач выходит за рамки
этой книги. Отметим здесь только, что это — широкий класс за-
дач, включающий фундаментальные задачи из теории графов,
логики, теории чисел, дискретной оптимизации и других дисцип-
лин, ни для одной из которых неизвестен полиномиальный алго-
ритм (т. е. с числом шагов, ограниченным полиномом от размер-
ности задачи), причем существование полиномиального алгорит-
ма для хотя бы одной из них автоматически влекло бы за собой
существование полиномиальных алгоритмов для всех этих задач.
Именно факт фундаментальности многих МР-полных задач в
различных областях и то, что, несмотря на независимые друг от
друга усилия специалистов в этих областях, не удалось найти
полиномиального алгоритма ни для одной из этих задач, скло-
няет к предположению, что такого алгоритма не существует.
Вернемся к конкретной задаче существования гамильтонова
дути. Очевидный алгоритм, который мы можем применить, это
«полный перебор всех возможностей»: генерируем все п\ раз-
личных последовательностей вершин и для каждой из них про-
веряем, определяет ли она гамильтонов путь. Такие действия
требуют по меньшей мере п\п шагов, но функция от п подобного
вида растет быстрее, чем произвольный многочлен, и даже бы-
стрее, чем произвольная экспоненциальная функция вида ап>
а > 1, ибо
п\п >\_п/2\'-гг,2Л = а'-п12-‘1ог“'-п/2\
Опишем теперь общий метод, позволяющий значительно со-
кратить число шагов в алгоритмах типа полного перебора всех
возможностей. Чтобы применить этот метод, искомое решение
должно иметь вид последовательности <хь ..., хп). Основная
идея метода состоит в том, что мы строим наше решение после-
довательно, начиная с пустой последовательности е (длины 0).
Вообще, имея данное частичное решение <хь ..., х4>, мы ста-
раемся найти такое допустимое значение относительно ко-
торого мы не можем сразу заключить, что <хь ..., х/, х,+1>
можно расширить до некоторого решения (либо <хь ..., х/+1>
уже является решением). Если такое предполагаемое, но еще
не использованное значение х<+1 существует, то мы добавляем
его к нашему частичному решению и продолжаем процесс для
последовательности <Х1, ..., X/, х/+1>. Если его не существует,
то мы возвращаемся к нашему частичному решению <хь ...
..., х/_1> и продолжаем наш процесс, отыскивая новое, еще не
использованное допустимое значение х' — отсюда название
«алгоритм с возвратом» (англ.: ЬасИгаскт^).
Точнее говоря, мы предполагаем, что для каждого к > 0 су-
ществует некоторое множество А*, из которого мы будем вы-
бирать кандидатов для к-й координаты частичного решения.
Очевидно, что множества Ак должны быть определены таким
образом, что для каждого целочисленного решения <хь ..., хп>
нашей задачи и для каждого к п множество Ак содержало
элемент х* (на практике мы не можем вообще исключить си-
туацию, когда множество Ак содержит некоторые «лишние» эле-
менты, не появляющиеся в й-й координате ни одного целочис-
ленного решения). Мы предполагаем также, что существует не-
которая простая функция, которая произвольному частичному
решению <хь ..., х<> ставит в соответствие значение Р(х\, ...
..., х/) (истина либо ложь) таким образом, что если Р(хь ...
..., хА = ложь, то последовательность <хь ..., хг> несомнен-
но нельзя расширить до решения. Если Р(хь ..., х/)= истина
то мы говорим, что значение Х[ допустимо (для частичного реше-
ния <хь ..., х^1», но это отнюдь не означает, что <хь х/-1>
обязательно расширяется до полного решения. Этот процесс
можно записать в виде следующей схемы;
1 Ье&'ш
2
3 \уНПе к > 0 до
4 II существует еще неиспользованный элемент
у е Ак, такой что Р(Х [1], ..., X [к — 1], у) 1Ьеп
5 Ъе?1п Х[к]:=у; (*элемент у использован*)
6 И(Х[1], ...» Х[/ф является целочисленным реше-
нием 1йеп
7 югИе(Х[\], Х[к])-9
8 к:=к+1
9 епд
10 еке (* возврат на более короткое частичное решение;
все элементы множества Ак вновь становятся
неиспользованными *)
Н к-.= к~\
12 епд
Этот алгоритм находит все решения в предположении, что
множества Ак конечные и что существует п, такое что Р(хь ...
...» хп) = ложь для всех Х1 еЛь ..., хп^Ап (последнее усло-
вие означает, что все решения имеют длину меньше п). Пока-
жем наличие более общего свойства:
Пусть 5 >► 0, и пусть <хь ..., х$-1> — некоторое частичное
решение, построенное алгоритмом. Рассмотрим первую итера-
цию цикла 3, для которой к = 5, = X/, 1 I 5. Начиная
с этой итерации, алгоритм генерирует все целочисленные реше-
ния, являющиеся расширением последовательности <хь ...,
и приходит к состоянию, когда к = 5— 1.
Очевидно, что для 5 — 1 приведенное выше свойство озна-
чает просто корректность алгоритма. Доказательство этого свой-
ства в общем виде проводится по индукции «назад» относитель-
но 5. Оно имеет место для 5 = л, потому что не существует ни
одного допустимого элемента для <хь •••» х$-1> и сразу же вы-
полняется второе условие условного оператора в строке 10, т. е.
переменная к принимает значение 5—1. Предположим теперь
правильность нашего свойства для некоторого $ > 1. Покажем
его правильность для 5—1. Пусть <Хь ..., х5-2>— произволь-
ное частичное решение, построенное нашим алгоритмом; рас-
смотрим первую итерацию цикла 3, для которой к = 8— 1,
= 1^/ ^5—1. Если существует элемент у, допусти-
мый для <хь ..., х$_2>, то построение дает частичное решение
<Хь ..., х5-2, у) (строка 5) и переменная к принимает значение
5 (строка 8). Затем согласно нашему индуктивному предполо-
жению будут сгенерированы все решения, являющиеся расшип
рением последовательности <хь ...» х$_2, у), и мы приходим к
состоянию, когда к = 8— 1, после чего процесс повторяется для
следующего неиспользованного элемента у, допустимого для
<%ь х5-2>, пока не будут использованы все такие элементы
(такая ситуация может появиться сразу с самого начала). Пе-
ременная к уменьшается тогда на 1 и принимает значение — 2
(строка 11). Из приведенных выше рассуждений следует, что
алгоритм правильно порождает все решения, являющиеся рас-
ширением последовательности <%ь х5_2>, что завершает до-
казательство шага индукции.
Доказанное нами свойство приводит непосредственно к сле-
дующему простому и очевидному рекурсивному варианту схемы
алгоритма с возвратом:
1 ргоседиге АР(к)\
(* генерирование всех решений, являющихся расширением
последовательности Х[1], Х[й —1]; массив
X — глобальный *)
2 Ъея1п
3 Тог у е Ак такого, что Р (X [ 1], Х[к — 1], у) до
4 Ьее1п X [й] := у\
5 1ТХ[1], ..Х[й] есть целочисленное решение Тйеп
6 ж//е(Х[1], .X[&]);
7 ДР(й+1)
8 епд
9 епд
Генерирование всех целочисленных решений можно вызвать
вызовом ЛР(1). Представление алгоритма с возвратом мы на-
чали с несколько более сложного нерекурсивного варианта толь-
ко потому, что в рекурсивном варианте «возврат» не появляется
в явном виде, будучи частью реализации механизма рекурсии.
Применим теперь алгоритм с возвратом для нахождения га-
мильтонова цикла в графе 0 = <У, Е). Каждый такой цикл
можно представить последовательностью <%ь х2, • •.» при-
чем Х1=Хл+1 = Цо, где ио — некоторая фиксированная вершина
графа, XI — Х/+1 для 1 п и х, #=х/ для 1 I < / п. Со-
гласно этим условиям мы можем положить:
А = 7,
Р(хь .... хк-1, у)-<=>«/€= ЗАПИСЬ [хА_11 Л У е {ХЬ ....
Алгоритм 2.14. (Нахождение всех гамильтоновых циклов
в графе.)
Данные: Граф О = <У, Ё>, представленный списками нищи
дентности ЗАПИСЬ]?], V е И.
Результаты: Список всех гамильтоновых циклов графа
1 ргоседиге ГАМИЛЬТ{к)\
(* генерирование всех гамильтоновых циклов, являющихся
расширением последовательности (Х[1], X [А — 1]);
массив X — глобальный *)
2 Ьее«п
3 Гог у <= ЗАПИСЬ [X [к — 1] ] до
4 И (к = п + 1) апд (у = оО) Гйеп хмгИе (X [1], ..X [л], с/0)
5 е1$е И ПОР [у] Гйеп
6 Ье$1п Х[А]:=г/; ПОР [у] := ложь;
7 ГАМИЛЬТ(к+ 1);
8 ПОР [//] := истина
9 епд
10 епд; (*ГАМИЛЬТ*)
И (* главная программа*)
12 Гог V е V до ПОР [о] := истина; (* инициализация *)
13 Х[1]:=у0; (* у0 = произвольная фиксированная вершина
графа *)
14 ПОР[х)0] := ложь;
15 ГАМИЛЬТ(2)
16 епд
Работу этого алгоритма, так же как и произвольного алго*
ритма с возвратом, можно проиллюстрировать процессом поиска
в некотором дереве. Каждая вершина дерева естественным об-
разом соответствует некоторой последовательности <хь ..., х*>,
причем вершины, соответствующие последовательностям вида
<хь хк,у), являются сыновьями этой вершины (корень со-
ответствует пустой последовательности е). Рассмотрим полное
дерево П, состоящее из всех возможных последовательностей
вида <хь ..., хк), где 0 /г и и х, е Л, для 1 I А, и вре-
менно допустим, что каждый элемент у^Ак является допусти-
мым для <%1, Хк-[)> если к л, и ни один элемент не яв-
ляется допустимым для <х1, Х/г-1>, если к > п; другими сло-
вами,
( истина, если к^п,
Р(х., ХЛ_1, Хк) — \ ,
41 1 I ложь, если к> п
(х;еЛ для 1^4^ к). Тогда нетрудно отметить, что вызов
ЛР(1) вызывает поиск в глубину во всем дереве П (начиная от
корня е). Для случая менее тривиальной функции Р, определяю-
щей допустимость вершин, процесс поиска «опускает» рассмот-
рение вершин поддерева с корнем в каждой встреченной «недо-
пустимой» вершине (т. е. вершине, соответствующей последова-
тельности <Х1, Хл>, для которой Р(хь Хл)=ложь).
Рис. 2.11. Граф и дерево, иллюстрирующие алгоритм с возвратом нахождения
всех гамильтоновых циклов в этом графе.
В этом, собственно говоря, заключается эффективность алго-
ритма с возвратом в отношении полного перебора всех возмож-
ностей. Для алгоритма 2.14 это иллюстрируется рис. 2.11.
Следует отметить, что для большинства приложений число
шагов алгоритма с возвратом хотя и будет меньше, чем в слу-
чае полного перебора, однако же в наихудшем случае растет по
экспоненте с возрастанием размерности задачи. Это справед-
ливо и для случая, когда мы ищем только одно, а не все ре-
шения (тогда мы просто прерываем выполнение алгоритма
после получения первого решения; отметим, что, когда задача
не имеет решения, эта модификация не влияет на ход выполне-
ния алгоритма).
2.9. Задачи
2.1. Доказать, что для произвольного неориентированного гра-
фа матрица смежности В выражается через матрицу инци-
дентности А следующим образом:
В=ААТ — д!а^[б/1,
где Ат есть транспонированная матрица А, дл— степень
4-й вершины, (Над^, дп] —матрица размера л Хи
с элементами ..., с1п на главной диагонали.
2.2. Для произвольного неориентированного графа определим
матрицу соседства ребер С = [с//], где Сц = 1, если 4-е и
и /’-е ребра инцидентны с общей вершиной, и Сц = 0 в про-
тивном случае (принимаем сц=0). Как можно выразить
матрицу С через матрицу инцидентности? Определяет ли
матрица соседства ребер граф с точностью до изомор-
физма?
2.3. Представить детальную реализацию списков инцидент-
ности и процедур удаления и добавления ребер за время,
ограниченное константой (следует помнить, что при удале-
нии ребра {и, у} необходимо удалить соответствующие эле-
менты из обоих списков ЗАПИСЬ [и] и ЗАПИСЬ^]; мы
предполагаем, что указатель на один из этих элементов
представлен как параметр процедуры).
2.4. Написать процедуры перехода между каждыми двумя спо-
собами представления графа, описанными в разд. 2.1, и оце-
нить вычислительную сложность указанных процедур.
2.5. Некоторые графовые алгоритмы используют только О(м)
или 0(п4-/и) из п2 элементов матрицы смежности В.
В то же время в начале алгоритма следует инициализация
всех элементов матрицы В, в результате чего сложность
алгоритма автоматически становится равной й(л2). Пред-
ложить способ, позволяющий избежать столь дорогую ини-
циализацию. Указание', для каждого элемента &//, использо-
ванного алгоритмом первый раз, помещаем в стек указа-
тель па этот элемент, а при Ьц размещаем указатель на соз-
данный таким образом новый элемент стека. Чтобы прове-
рить, был ли данный элемент инициализирован ранее, до-
статочно посмотреть, ведет ли указатель при к указа-
телю в стеке, определяющему возврат к Ьц) [1].
2.6. Предложить алгоритм сложности О(м) проверки, содержит
ли данный ориентированный граф, заданный матрицей
смежности, вершину, к которой примыкают дуги от осталь-
ных п—1 вершин и из которой не исходит ни одна дуга
(такой алгоритм показывает, что условие (в) в теореме 2.1
существенно).
2.7. Исследовать метод, отличающийся от поиска в ширину
только тем, что вновь достигнутая вершина помещается в
стек (такой алгоритм описывается в точности процедурой
11/5, в которой ОЧЕРЕДЬ заменена на СТЕК) [35].
2.8. Исследовать метод поиска в графе, при котором посещен-
ные, но еще неиспользованные вершины помещаются в оче-
редь, и который точнее можно описать следующим спосо-
бом: рассматриваем последнюю (позже всех помещенную)^
вершину V из очереди (вначале это будет произвольная вер-
шина графа). Если существует новая вершина ие
е ЗАПИСЬ [у] , то мы помещаем ее в конце очереди и повто-
ряем процесс до тех пор, пока помещенная в очередь вер-
шина не имеет новых соседей (этот фрагмент напоминает
поиск в глубину). Затем исследуем первую (раньше всего
помещенную) вершину из очереди. Если у этой вершины
существует новый сосед, то мы ставим его в конец очереди
и повторяем для этой вершины описанный выше процесс
поиска в глубину. В противном случае первая вершина из
очереди использована, и мы убираем ее из очереди, а затем
рассматриваем следующую за ней вершину. Весь процесс
повторяется до тех пор, пока очередь не будет пустой.
Представить детальную реализацию данного метода.
2.9. Доказать, что приведенная ниже процедура просматривает
каждую вершину графа в точности один раз.
ргоседиге ПОИСК (г)\
(* вначале СТАТУС [ц] = новый для каждой V е V *)
Ъее1п
посетить г; СТ АТУС[г] := посещенный;
1лгй11е существует в V посещенная вершина до
Ьедт V := произвольная посещенная вершина;
И существует новая и е ЗАПИСЬ [о] 1Ьеп
Ье&1п и := первая новая вершина
списка ЗАПИСЬ [о];
посетить и; СТ АТУ С [и] ;= посещенная
епд
е1$е СТАТУС [о] := использованная
епд
епд
Показать, что поиск в глубину и в ширину, а также ме-
тоды, описанные в задачах 2.7 и 2.8, можно рассматривать
как частные случаи этой процедуры.
2.10. Пусть Р = <1/, Т>— подграф связного графа 0 = <У, Е).
Доказать, что следующие условия эквивалентны:
(а) Р является стягивающим деревом графа О.
(б) Т| = | VI—1 и Р не содержит циклов.
(в) Для каждой пары вершин и, V е V существует в Р
точности один путь из и в ц.
(г) |Т| = | У|—1 и для каждой пары вершин и, V е V су-
ществует в Р хотя бы один путь из и в V.
(д) | Т | = | V | — 1 и для каждой пары вершин и, V е V су-
ществует в Р не более чем один путь из и в V.
2.11. Рассмотреть детальнее метод поиска в глубину для ориен-
тированных графов, упомянутый в конце параграфа 2.2.
Показать, что если в ориентированном графе О существует
путь из вершины г к каждой другой вершине, то алгоритм
2.3 (измененный так, что в строке 5 добавляется дуга
<у, и)) строит подграф <У, Т>, который при игнорировании
ориентации дуг является стягивающим деревом графа О.
Показать, что в <У, Г) существует в точности один путь из
г к каждой вершине V е V. Можно ли перенести теорему
2.4 на ориентированные графы? Как следовало бы ее тогда
изменить?
2.12. Рассмотреть детальнее метод поиска в ширину в ориенти-
рованном графе. Показать, что если в ориентированном
графе О существует путь из вершины г к каждой другой
вершине, то алгоритм 2.5 находит подграф (V, Г>, содер-
жащий в точности один путь из г к каждой другой вер-
шине, причем это кратчайший путь в О.
2.13. Используйте поиск в глубину для нахождения в связном
графе неориентированного цикла (с повторяющимися реб-
рами и вершинами), проходящего каждое ребро в каждом
направлении в точности один раз.
2.14. Мостом графа О называется каждое ребро, удаление ко-
торого приводит к увеличению числа связных компонент
графа. Представить алгоритм нахождения всех мостов
графа за время О(т-\-п). (Указание: используйте поиск
в глубину как в случае отыскания точек сочленения.)
2.15. Граф 0 = <У, Е) называется двудольным, если существует
разбиение У=ДиВ, А(]В = 0, такое что каждое ребро
ее Е имеет вид е={а,Ь}, а^А, Ь^В. Доказать, что
граф является двудольным тогда и только тогда, когда он
не содержит простых циклов нечетной длины. Предложить
два алгоритма, проверяющих, будет ли данный граф дву-
дольным, за время О (т 4-м) — один, основанный на по-
иске в глубину, другой — на поиске в ширину.
2.16. Написать алгоритм, проверяющий за время О(/п4-л)
ацикличность данного ориентированного графа.
2.17. Ориентированный граф называется сильно связным, если
для каждой пары вершин и и V существует путь из и в V,
Под компонентой сильной связности понимается произволь-
ный максимальный сильно связный подграф. Показать, что
компоненты сильной связности определяют разбиение мно<
жества вершин на иепересекающиеся непустые подмноже-
ства. Написать алгоритм нахождения компонент сильной
связности за время О(т + и). (Указание: использовать
поиск в глубину.)
2.18. Написать алгоритм нахождения за время О(с(т + п))
всех простых контуров ориентированного графа, где с —
число контуров. (Указание: использовать поиск в глубину.)
2.19. Предложить необходимое и достаточное условие существо-
вания эйлеровых контуров в ориентированном графе (иден-
тичное условию для неориентированных графов). Показать,
что алгоритм 2.13 (после удаления строки 9) правильно
строит эйлеров контур для ориентированного графа.
2.20. Циклом де Брёйна порядка п называется циклическая би-
нарная последовательность длины 2п, в которой каждая из
2п бинарных последовательностей длины п выступает как
подпоследовательность п последовательных членов. Дока-
зать существование цикла де Брёйна порядка п для каж-
дого п 1. (Указание: рассмотреть граф, вершины кото-
рого соответствуют бинарным последовательностям длины
п—1, а каждое ребро соответствует бинарной последова-
тельности длины и, причем ребро Ь\ ... Ьп ведет от Ь\ ...
... Ьп-\ к62 ... Ьп. Доказать существование эйлерова пути
в таком графе [8].)
2.21. Изменить представленную в § 2.8 схему алгоритма с воз-
вратом так, чтобы он определял только одно решение, а
не все.
2.22. Доказать, представив соответствующие графы, что число
шагов в алгоритме 2.14 (в наихудшем случае) растет
экспоненциально с ростом п.
2.23. Использовать алгоритм с возвратом для решения следую-
щих задач:
(а) Нахождение размещения 8 взаимно не нападающих
друг на друга ферзей на шахматной доске.
(б) Нахождение клики наибольшей мощности в неориенти-
рованном графе. (Кликой называется произвольное под-
множество вершин, в котором каждая пара различных вер-
шин соединена ребром графа.)
(в) Нахождение раскраски вершин графа минимальным
числом цветов так, чтобы ни одно ребро не соединяло двух
вершин одного цвета.
(г) Для данных целых чисел а\у ап, Ь нахождение
множества индексов У^{1, .м}, такого что ^1 = Ь9
если такое множество / существует.
(д) Установление изоморфизма двух графов.
3. Нахождение кратчайших путей
в графе
3.1. Начальные понятия
В этой главе мы будем рассматривать ориентированные
графы 6 = <У, Е), дугам которых приписаны веса. Это озна-
чает, что каждой дуге <и, у) е Е поставлено в соответствие не-
которое вещественное число а (и, у), называемое весом данной
дуги. Полагаем, кроме того, что а (и, у)=оо, если Если
последовательность вершин
«о, »1...»Р (3.1)
определяет путь в О, то его длина определяется как сумма
р
1 = 1
(Отметим, что если в произвольном графе мы примем вес каж-
дой дуги равным единице, то мы получим обычное определение
длины пути как числа дуг; как и ранее, принимаем, что длина
пути равна 0 при р = 0.) Нас будет интересовать нахождение
кратчайшего пути между фиксированными вершинами 5, / еУ.
Длину такого кратчайшего пути мы будем обозначать ^/($, /) и
называть расстоянием от 5 до I (расстояние, определенное та-
ким образом, может быть отрицательным). Если не существует
ни одного пути из 5 в /, то полагаем ^($,/) = оо. Отметим, что
если каждый контур нашего графа имеет положительную длину,
то кратчайший путь будет всегда элементарным путем, т. е. в
последовательности (3.1) не будет повторов. С другой стороны,
если в графе существует контур отрицательной длины, то рас-
стояние между некоторыми парами вершин становится неопреде-
ленным, потому что, обходя этот контур достаточное число раз,
мы можем показать путь между этими вершинами с длиной,
меньшей произвольного вещественного числа. В таком случае
можно было бы говорить о длине кратчайшего элементарного
пути, однако задача, поставленная таким образом, вероятно бу-
дет значительно более сложной, так как, в частности, она содерч
жит в себе задачу существования гамильтонова пути (см. зач
дачу 3.1) к
Можно дать много практических интерпретаций задачи о
кратчайших путях. Например, вершины могут соответствовать
городам, а каждая дуга — некоторому пути, длина которого
представлена весом дуги. Мы ищем затем кратчайшие пути ме-
жду городами. Вес дуги также может соответствовать стоимости
(или времени) передачи информации между вершинами. В та*
ком случае мы ищем самый дешевый (или самый скорый) путь
передачи информации. Еще одну ситуацию мы получаем, когда
вес дуги <и,у> равен вероятности р(и, у) безаварийной работы
канала передачи информации. Если предположить, что аварии
каналов не зависят друг от друга, то вероятность исправности
пути передачи информации равна произведению вероятностей
составляющих его дуг. Задачу нахождения наиболее надежного
пути легко можно свести к задаче о кратчайшем пути, заменяя
веса р(и, у) на
а (и, у) =—1о$р(и, у).
Еще с одним приложением задачи о кратчайшем пути мы
познакомимся в разд. 3.4.
В данном разделе мы дадим алгоритмы нахождения расстоя-
ния между вершинами, а не самих путей. Однако, зная расстоя-
ние, мы можем при условии положительной длины всех контуров
легко определить кратчайшие пути. Для этого достаточно отме-
тить, что для произвольных 5, V ($ У= /) существует вершина
V, такая что
(1(8, 1) = (1(8, у) + а (у,/).
Действительно, таким свойством обладает предпоследняя вер-
шина произвольного кратчайшего пути из 5 в I. Далее мы мо-
жем найти вершину и, для которой (1(8, и) = (1(8, и) + а (и, ц),
и т. д. Из положительности длины всех контуров легко следует,
что созданная таким образом последовательность у, и, ... не
содержит повторений и оканчивается вершиной 5. Очевидно, что
она определяет (при обращении очередности) кратчайший путь
ИЗ 5 В /.
Таким образом, мы получаем следующий алгоритм:
Алгоритм 3,1. (Нахождение кратчайшего пути).
Данные: Расстояния О [у] от фиксированной вершины 5 до
всех остальных вершин у е V, фиксированная вер-
шина 1, матрица весов ребер А[и, у], и, V е V.
Результаты: СТЕК содержит последовательность вершин, оп-
ределяющую кратчайший путь из 5 в /.
1 Ьееш
2 СТЕК := 0; СТЕК С V := /;
3 'члгЬПе у =/= $ до
4 Ъедш
5 и := вершина, для которой I) [с/] = Б [и] + А [и, и];
6 СТЕК^и\
7 V := и;
8 епд
9 епд
Пусть <У,Е) — ориентированный граф, |У| = я, |Е| = /п<
Если выбор вершины и в строке 5 происходит в результате про-
смотра всех вершин, то сложность нашего алгоритма — О(п2)<
Если мы просматриваем только список ПРЕДШ^}. содержа-
щий все вершины и, такие что и у, то в этом случае слож-
ность будет О (/и).
Отметим, что в случае положительных весов ребер задача
о кратчайшем пути в неориентированном графе легко сводится
к аналогичной задаче для некоторого ориентированного графа.
С этой целью достаточно заменить каждое ребро {и, о} двумя
дугами <«, у> и <у, «>, каждая с таким же весом, что и {и,
Однако в случае неположительных весов это приводит к воз-
никновению контуров с неположительной длиной.
В данной главе мы всегда будем предполагать, что О =
= <1/, Е) является ориентированным графом, м=|1/|, /и=|Е'|<
В целях упрощения изложения и избежания вырожденных слу-
чаев при оценке сложности алгоритмов будем принимать т —
= й(м) (т. е. п = О(ги)). Это исключает ситуации, при которых
«большинство» вершин изолированные. Будем предполагать так-
же, что веса дуг запоминаются в массиве А [и, о], и, V €=
е V (Л [и, у] содержит вес а (и, у)).
3.2. Кратчайшие пути
от фиксированной вершины
Большинство известных алгоритмов нахождения расстояния
между двумя фиксированными вершинами $ и / опирается на
действия, которые в общих чертах можно представить следую-
щим образом: при данной матрице весов дуг Л [и, р], и, V е V,
вычисляет некоторые верхние ограничения на расстояния
от 5 до всех вершин и V. Каждый раз, когда мы устанавли-
ваем, что
Я М + А [и, V] < й [о], (3.2)
оценку й [и] улучшаем: О [о] := О [и] + А [м, о].
Процесс прерывается, когда дальнейшее улучшение ни од-
ного из ограничений невозможно. Легко можно показать, что
значение каждой из переменных О [у] равно тогда <1(8, у)—рас-
стоянию от 5 до V. Заметим, что, для того чтобы определить
расстояние от 5 до мы вычисляем здесь расстояния от 5 до
всех вершин графа. Не известен ни один алгоритм нахождения
расстояния между двумя фиксированными вершинами, который
был бы существенным образом более эффективным, нежели из-
вестные алгоритмы определения расстояния от фиксированной
вершины до всех остальных.
Описанная нами общая схема является неполной, так как
она не определяет очередности, в которой выбираются вершины
и и V для проверки условия (3.2). Эта очередность оказывает,
как будет доказано, очень сильное влияние на эффективность
алгоритма. Опишем теперь более детально методы нахождения
расстояния от фиксированной вершины, называемой источни-
ком, его всегда будем обозначать через 5, до всех остальных
вершин графа.
Сначала представим алгоритм для общего случая, в котором
предполагаем только отсутствие контуров с отрицательной дли-
ной. С этим алгоритмом обычно связывают имена Л. Р. Форда
{22] и Р. Е. Беллмана [3].
Алгоритм 3.2. (Нахождение расстояния от источника до
всех вершин — метод Форда — Беллмана.)
Данные: Ориентированный граф <1/, Е> с п, вершинами с вы-
деленным источником 5 е V, матрица весов дур.
А [и, у], и, V е V (граф не содержит контуров отри-
цательной длины).
Результаты: Расстояния от источника до всех вершин графа;
И = й(5, у), V е К
1 Ьееш
2 Тог V е V до Р [у] := А [5, у]; Р [5] := 0;
3 Тог к := 1 То п — 2 до
4 Тог V е V \ {5} до
5 Гог и е V до Р [у] := пип (Р [у], Р [и] + А [и, у] )
6 епд
Докажем правильность этого алгоритма. Для этого обозна-
чим через д(т)(у) длину кратчайшего из путей из $ в V, содер-
жащих не более т дуг (д(т)(у) = оо, если не существует ни
одного такого пути). Тогда имеем
й(/п+1) (у) = т1п {й(щ) (и) + а(и, V): и <=У}> V е V. (3.3)
В самом деле, для каждого и е V очевидно имеем
^(^+1)(у)^ д(т)(и)+а(и, у), причем равенство появляется, ко-
гда и является предпоследней вершиной произвольного крат-
чайшего пути ИЗ 5 В V.
Покажем теперь, что если при входе в очередную итерацию
цикла 3
4 ($1 В М ^(т) ($) Для всех V е V, (3.4)
то по окончании этой итерации
б/ (5, [у] < й(/п+1) (у)
для всех у е 7. (3.5)
В самом деле, предполагая выполнение условия (3.4) и ана-
лизируя действие оператора в строке 5, мы видим, что по окон-
чании нашей итерации цикла 3 имеем
б/ (5, [у] гп1п (и) + а(и, ю):и^ V},
что, принимая во внимание равенство (3.3), дает условие (3.5).
Отметим, что при входе в цикл 3 имеем = б/ф), V е V,
следовательно, после выполнения п — 2 итераций этого цикла
будут выполняться неравенства с?(5, у)
к ф] ф] В [4] ф]
О 1 ОО ОО 3
10 14 4-1
2 0 1 4 3-1
3 0 1 4 3-1
Рис. 3.1. Работа алгоритма Форда — Беллмана,
V е V. Теперь достаточно показать, что г/(л_1)(о) = с?(5, ц). Это
справедливо, поскольку каждый путь более чем с п — 1 дуга-
ми содержит контур, устранение которого не увеличивает дли-
ны пути (ведь мы предполагаем отсутствие контуров отрицав
тельной длины). Тем самым закончено доказательство кор-
ректности алгоритма.
Очевидно, что временная сложность алгоритма есть О (и3) .
Мы можем, конечно, закончить вычисления, когда выполнение
цикла 4 не вызывает изменения ни одной из переменных й [у],
V е V. Это может наступить для к < п — 2, однако такая мо-
дификация алгоритма не изменяет существенным образом его
сложности. Для редких графов (гп п2) удобнее представлять
граф списками инцидентности ПРЕДШ^}, V е V. Заменяя
строку 5 на
Тог и е ПРЕДШ [у] до := т!п(О [у], 1> [и] 4- Л [и, у] ),
получаем алгоритм со сложностью О (пт).
Работа алгоритма Форда — Беллмана проиллюстрирована
на рис. 3.1 (И={1, ..., 5}, веса дуг даны числами в скобках
циклы 4 и 5 выполняются в порядке возрастания номеров вер-
шин).
3.3. Случай неотрицательных весов—
алгоритм Дейкстры
Известны более эффективные алгоритмы для двух важных
случаев, а именно: когда веса всех дуг неотрицательны или ко-
гда граф бесконтурный. Сначала опишем алгоритм для первого
случая — алгоритм Дейкстры [И]. Вторым случаем займемся
в следующем параграфе.
Алгоритм 3.3. (Нахождение расстояния от источника до
всех остальных вершин в графе с неотрица-
тельными весами дуг — метод Дейкстры.)
Данные: Ориентированный граф <У, Е) с выделенным ис-
точником 5 е V, матрица весов дуг А [и, V], и, V V
(все веса неотрицательны).
Результаты: Расстояния от источника до всех вершин графа
О [у] = с! (5, V) , V е V.
1 Ье^1п
2 Тог V е V до Р[у]:=А[$, о]; й[$]:=0;
3 Г:=у\{5};
4 ууНПе Г =/= 0 до
5 Ье^п
6 и := произвольная вершина г е Т, такая, что
7
8
Р [г] = гшп {Р [р]: р е Т}\
Т.— Т\{иу
Тог до Р[у] :=ппп(Р[у], Р[и] + А [и, с/])
9 епд
10 епд
Чтобы понять действие алгоритма, покажем, что следую-
щее условие является инвариантом цикла 4:
для каждой V е V \ Т Р [у] = й ($, с/),
для каждой уеГ О [у] = длине кратчайшего из тех
путей из 5 в ц, для которых пред-
последняя вершина принадлежит
множеству V \ Т. (3.6)
В самом деле, в строке 5 мы находим вершину «е Т, такую
что значение О [и] является минимальным (из всех) значением
Р[/], для /еГ Покажем, что О[и] = и). Это именно так,
потому что если кратчайший путь из 5 в и имеет длину меньше
Д[ц], то в силу второй части условия (3.6) его предпоследняя
вершина принадлежит множеству Т. Пусть / будет первой вер-
шиной пути, принадлежащей множеству Т (см. рис. 3.2). На-
чальный отрезок нашего пути из 5 в / составляет кратчайший
Рис. 3.2. Обоснование алгоритма Дейкстры.
путь из 5 в /, причем его предпоследняя вершина не принад-
лежит множеству Г. По второй части условия (3.6) имеем
/) [/] = /), Используя предположение о неотрицательности
весов, получаем
Р[/] = ^(5, /)<</($, и)<й[и]
вопреки принципу, по которому была выбрана вершина и.
Таким образом, П[и] = с1($, и) и мы можем в строке 7 уда-
лить и из множества Г, не нарушая первой части условия (3.3).
Чтобы обеспечить выполнение также и второй части этого
условия, следует еще проверить пути из 5 в у е Т, предпослед-
няя вершина в которых есть и, и выполнить актуализацию пе-
ременных Р[у], V е Т. Именно это выполняет цикл 8.
Очевидно, что условие (3.6) выполняется при входе в
цикл 4. По окончании действия алгоритма Т = 0, а следова-
тельно, согласно условию (3.6), О [у] = у), у еК.
Перейдем теперь к оценке сложности алгоритма Дейкстры.
Цикл 4 выполняется п — 1 раз, причем каждое его выполнение
требует О(п) шагов: О(п) шагов для нахождения вершины и
в строке 6 (предполагаем, что множество Т представлено спи-
ском) и О(п) шагов для выполнения цикла 8. Таким образом,
сложность алгоритма есть О(п2).
Тщательно подбирая структуры данных, можно получить
вариант алгоритма со сложностью О(т\о§п). Для этого мно-
жество Т нужно представить бинарным деревом с высотой
О(1о^п) и с таким свойством, что для произвольных его вер-
шин и и ц
если и —сын у, то 2) [и] ^2) [у] (3.7)
(подобная структура данных используется в алгоритме сорти-
ровки Неарзог!, см. [21], [1]). Вершина и, для которой значе-
ние 2) [и] минимально, является тогда корнем дерева. Этот ко-
рень можно устранить за О(1о^л) шагов, сохраняя свойство
уменьшения значения 2) [/] на каждом пути до корня. Доста-
точно сместить на место корня его сына 5 с большим (или
равным) значением 2) [/], затем на освободившееся место пе-
редвинуть сына вершины 5 с большим значением 2> [/] и т. д.
Если граф представлен списками ЗАПИСЬ[и], то стро-
ку 8 можно заменить на
!ог V е ЗАПИСЬ [и] до
И 2) [и] + А [и, [у] Н1еп
Ьеет
2) [у] := 2) [и] + А [и, о];
передвинуть вершину в дереве в направлении корня
так, чтобы сохранить условие (3.7)
епд
Если предположить существование таблицы указателей на
вершины нашего дерева, то передвижение вершины V, о которой
идет речь в данной части раздела, может быть осуществлено
за О(1о^л) шагов. Достаточно заменять V поочередно верши-
нами, находящимися непосредственно над пей.
В алгоритме, модифицированном таким способом, каждая
дуга графа анализируется в точности один раз, причем с этим
связано О(1о^п) шагов на передвижение соответствующей вер-,
шины в дереве, представляющем множество Т. Это дает в сум*
ме О(т\оёп) шагов. Сюда нужно добавить О(п1о^п) шагов,
необходимых для построения нашего дерева и для устранения
л—1 раз из него корня. Общая сложность алгоритма есть
О(лг1о^л) (см. задачу 3.6).
Неизвестно, существует ли алгоритм сложности О (/л) на-
хождения расстояния от фиксированной вершины до всех осталь-
ных вершин графа с неотрицательными весами всех дуг.
Можно показать, что существует константа С, такая что эта за-
дача для произвольного к > 0 может быть решена за время
Ск(т + п^к) (см. [37]).
Работа алгоритма Дейкстры проиллюстрирована на рис. 3.3
(У={1, 6}, веса дуг даны в скобках, значения Р[у],
оеГ, обозначены кружками, минимальные значения — двойны-
ми кружками).
3.4. Пути в бесконтурном графе
Займемся теперь вторым случаем, для которого известен
алгоритм нахождения расстояний от фиксированной вершины
за время О (л2), а именно случаем, когда граф является бес-
контурным (веса дуг могут быть произвольными). Сначала до-
кажем следующую лемму.
Лемма 3.4. В произвольном бесконтурном графе вершины
можно перенумеровать так, что каждая дуга будет иметь вид
<гц, У/>, где I < /.
Пример такой нумерации приведен на рис. 3.4.
Рис. 3.4. Самый длинный путь в бесконтурном графе.
Для доказательства предложим алгоритм, который кон-
струирует такую нумерацию.
Алгоритм 3.5. (Нумерация вершин бесконтурного графа.)'
Данные: Ориентированный бесконтурный граф <У, Е), опре-
деляемый списками инцидентности ЗАПИСЬ [и],
V е V.
Результаты: Для каждой вершины V е V номер ,
такой что для произвольной дуги <и, у) е 5
выполняется неравенство Л//? [//] < М/? [о].
1 Ье$1п
2 Гог V <= V до 73ДХ[у]:=0;
(* 43 АХ [у] = число дуг, заходящих во*)
3 Тог и е V до
4 Тог V <= ЗАПИСЬ [и] до 43АХ [у] := 43АХ[у] + 1;
5 СТЕК:=0-,
6 Тог V е V до
7 И УЗАХ [о] = 0 ТЬеп СТЕК<=^
8 пит:=0’>
9 \уЬ11е СТЕК =/= 0 до
10 Ьедт и<=СТЕК\
11 пит := пит 4- 1; ИК [и] := пипц
12 Гог V (= ЗАПИСЬ [и] до
13 Ье&т УЗАХ[о]:= УЗАХ [и] — 1;
14 11 43АХ[у] = 0 ГЬеп СТЕК<=и
15 епд
16 епд
17 епд
Алгоритм основывается на следующем простом факте: в
произвольном (непустом) бесконтурном графе существует вер-
шина, в которую не заходит ни одна дуга. Чтобы убедиться
в этом, выберем произвольную вершину оч графа, затем неко-
торую вершину иу2, такую что ш2->^1, затем вершину ш3, та-
кую что и т. д. Через конечное число шагов мы долж-
ны дойти до некоторой вершины в которую не заходит ни
одна дуга, ибо в силу бесконтурности ни одна вершина не мо-
жет повторяться в последовательности ап, ш2, а>3, ... .
В нашем алгоритме вершины, в которые не заходит ни одна
дуга, накапливаются в стеке. В строке 10 выбирается верхний
элемент стека и (это мог бы быть произвольный элемент сте-
ка), и этой вершине присваивается самый маленький из еще
неиспользованных номеров. Таким образом, мы гарантируем,
то что все дуги, выходящие из этой вершины, ведут к верши-
нам с большими номерами. Затем вершина и вместе с выходя-
щими из нее дугами удаляется из графа. Это приводит к умень-
шению на единицу числа дуг, заходящих в каждую вершину V,
такую что это число запоминается в УЗАХ [у]. Если для
какой-нибудь из вершин V это число сводится к нулю, то V
помещается в стек. В силу бесконтурности графа и наших пре-
дыдущих замечаний полное опустошение стека, вызывающее
окончание выполнения алгоритма (см. цикл 9), наступает не
раньше, чем после присвоения номеров всем вершинам графа.
Легко заметить, что каждая дуга анализируется алгорит-
мом один раз в строке 4 и один раз в строке 12. Таким об-
разом, сложность алгоритма есть О(т) (вспомним, что остает-
ся в силе предположение ги = Й(л)), в противном случае сле-
довало бы написать О(т + п).
Согласно алгоритму 3.5 при описании алгоритма нахожде-
ния путей в бесконтурном графе мы можем предположить, что
каждая дуга идет из вершины с меньшим номером в вершину
с большим номером.
Алгоритм 3.6. (Нахождение расстояний от источника до
всех вершин в бесконтурном графе.)
Данные: Ориентированный граф (У,Е), где V ={уь ...
...» и для произвольной дуги <У/,
имеем / < /. Этот граф определен списками инци-
дентности ПРЕДШ[и\, V е У,
Результаты: Расстояния от до всех вершин графа:
р[у.] = б/(уп /=1, и.
1 Ье&!п
2 р[У1]:=0;
3 Гог /:=2 Го п до Е [&,]:= оо;
4 Гог / :=2 Го п до
5 Гог ПРЕДШ^А до Е [с/у] :=гп1п(О[У/],
+ V,])
6 епд
Нетрудно доказать индукцией по /, что после выполнения
цикла 4 для некоторого значения / выполняется равенство
VI), /=1, ..., /. Достаточно воспользоваться тем
фактом, что все промежуточные вершины кратчайшего пути из
сч в V/ имеют номера меньше у.
Сложность алгоритма есть О(т), так как каждая дуга
анализируется в строке 5 в точности один раз.
Алгоритмы 3.5 и 3.6 могут найти применение в методах
управления выполнением проекта, называемых РЕРТ (РгоуесГ
Еуа1иаНоп апд Ке\ие\у ТесИшцие или СРМ (СпНса! РаП1
МеПюс!). Эти методы основываются на построении графа
(сети РЕРТ или сети СРМ), дуги которого соответствуют не-
которым элементарным задачам, составляющим проект, а их
веса указывают на время, необходимое для решения отдель-
ных задач. Кроме этого, мы предполагаем, что для произ-
вольных дуг этого графа <ц, и <у, задача, изображаемая
дугой (и, V}, должна быть закончена перед началом решения
задачи, изображаемой дугой <у, />. Легко заметить, что такой
граф должен быть бесконтурным. Нашей задачей является на-
хождение самого длинного пути из вершины 5, соответствую-
щей началу проекта, до вершины I, соответствующей его окон-
чанию (см. рис. 3.4). Такой путь называется критическим пу-
тем. Его длина определяет время, необходимое для реализа-
ции всего проекта. Очевидно, что эта задача сводится к за-
даче о кратчайшем пути путем изменения знака каждого веса
а (и, V), где и у, на обратный.
3.5. Кратчайшие пути между
всеми парами вершин,
транзитивное замыкание отношения
Очевидно, что задачу определения расстояния между все-
ми парами вершин можно решить, используя п раз (пооче-
редно для каждой вершины) один из описанных ранее мето-
дов нахождения расстояний от фиксированной вершины. Та-
ким образом, мы получаем алгоритм со сложностью О(м4)
(при использовании метода Форда — Беллмана) или О (л3)
для бесконтурных графов или неотрицательных весов. Однако
оказывается, что в общем случае л-кратное использование ме-
тода Форда — Беллмана не является наилучшим методом. По-
кажем теперь два более эффективных метода.
Для этого рассмотрим ориентированный граф О = <1/, Е),
где V = {уь ..., оп}, и предположим, что А — [а</] есть матри-
ца весов (а// = а(ог, оу)). Обозначив через й/"0 длину кратчай-
шего пути из VI и о/, содержащего не более т дуг, получаем сле-
дующие очевидные уравнения (ср. с (3.3)):
|0, если < = /,
I оо, если I =7= /,
^?+1) = пип И** + акГ. (3.9)
Отметим, что уравнение (3.9) обнаруживает некоторое сход-
ство с определением произведения двух квадратных матриц.
Если операцию пип трактовать как «сумму», операцию «+»—
как «произведение», то матрица [б//7+1)] является «произведе-
нием» матриц и Л = [а//]. Обозначим такое «произведе-
ние» двух матриц А и В через Л*В и отметим, что для этой
операции единичным элементом служит матрица
0 оо ОО ... ОО "
оо 0 оо ... оо
г; _ ОО ОО 0 . . . оо
. х оо оо ... 0
Из уравнений (3.8) и (3.9) теперь легко следует, что
[4°?] = ^ и
= ((.. ((А * А) * А) ...)♦ А) (т > 1). (3.10)
т раз
Возможен один из двух следующих случаев:
(1) й//”1’ = и в результате = (1ц~^ для каждого
т^п. Тогда очевидно = у;).
(2) 4/У/"п =/= с!{ц. Это означает, что существует контур отри-
цательной длины.
Произведение А*В двух матриц размерности п\п можно
вычислить за время О (/г3) (п сложений и м —1 сравнений на
каждый из п2 элементов произведения А*В). Следовательно,
матрицу и тем самым расстояние между всеми парами
вершин можно вычислить за время О (/г4).
Пока сложность этого алгоритма такая же, как и для слу-
чая /г-кратного использования алгоритма Форда — Беллмана.
Однако мы можем ее снизить, если заметим, что операция *
ассоциативна (т. е. (А*В)*С = А*(В*С), см. задачу 3.8). Этот
факт позволяет вычислять произведение (3.10), поочередно
возводя матрицу А в квадрат и тем самым заменяя п — 1
умножение матрицы [1о^ и! умножениями. Таким образом, мы
получаем алгоритм сложности О(/г31о^и), отыскивающий
расстояния между всеми парами вершин в графе без конту-
ров отрицательной длины.
Авторами еще более эффективного алгоритма являются
Уоршалл [70] и Флойд [20]. Идея этого алгоритма следующая.
Обозначим через длину кратчайшего из путей из VI в у/
с промежуточными вершинами в множестве {уь у™}.
Тогда имеем следующие уравнения:
а^ = ац, (3.11)
47+1> = тт(47), 42 + 4??). (3.12)
Обоснование второго уравнения достаточно простое. Рас-
смотрим кратчайший путь из в V/ с промежуточными вер-
шинами из множества {сц, ..., ит, ут+1}> Если этот путь не
содержит то ^+1) = Если же он содержит цт+ь то,
деля путь на отрезки от и/ до цт+1 и от до V/, получаем
равенство 47+0 = + 42.
Уравнения (3.11) и (3.12) дают возможность легко вычис-
лить расстояния Л (р/, »/) = 4?» 1 4 / п-
Алгоритм 3.7. (Вычисление растояний между всеми парами
вершин — метод Флойда.)
Данные: Матрица весов дуг А[/,/], 1^1, / п, ориенти-
рованного графа без контуров отрицательной
длины.
Результаты: Расстояния между всеми парами вершин
/1= ^(У<, V/).
1 Ьее>п
2 Тог I := 1 1о п до
3 Тог /:=1 (о п йо Д[/, /]:=/[/, /];
4 Тог I := 1 То п до О [/, /] := 0;
5 Тог т := 1 То п йо
6 Тог I := 1 То п йо
7 Тог / := 1 То и йо
8 О [/, /] := ГП1П (О [/, /], О [/, пг] + О [пг. /])
9 епй
Обоснование корректности алгоритма предоставляем чита-
телю.
Очевидно, что сложность этого алгоритма есть О (и3). Стоит
отметить, что такую же сложность имел алгоритм Форда —
Беллмана нахождения расстояний от фиксированной вершины
до всех остальных вершин. Любопытно, что для общего слу-
чая (т. е. без предположения о неотрицательности весов либо
о бесконтурности графа) не известен ни один алгоритм на-
хождения расстояния между одной фиксированной парой вер-
шин, который был бы значительно эффективнее алгоритма на-
хождения расстояний между всеми парами вершин.
С задачей определения кратчайших путей в графе тесно
связана задача транзитивного замыкания бинарного отноше-
ния. Вспомним, что под бинарным отношением на множестве
V мы понимаем произвольное подмножество Е<= КХ V. Такое
отношение является транзитивным, если удовлетворяется
условие
если (х, у) е Е и (у, х) е Е, то <х, х) Е
для произвольных х, у, г е Е. Отметим, что бинарное отно-
шение можно однозначно представить ориентиро-
ванным графом 0 = <У, Е). Для произвольного такого отно-
шения мы определяем
Е* = {(х, у): в (У, Е) существует путь ненулевой длины из х в у}.
Нетрудно заметить, что Е* — транзитивное отношение на
множестве V и Более того, Е* является наименьшим
транзитивным отношением, содержащим Е, т. е. для произ-
вольного транзитивного отношения Г 2 Е выполняется вклю-
чение Е* Е. Отношение Е* называется транзитивным замы-
канием отношения Е.
Если отношение Е представить в виде графа (V, Е>, в ко-
тором каждая дуга имеет вес 1, то транзитивное замыкание
Е* можно вычислить с помощью алгоритма 3.7 за время О (и3);
после завершения работы алгоритма имеем
и,) е Е*<^0 [/, /] < сю.
При вычислении транзитивного замыкания удобно принять
Г О, если (вместо оо),
’ 1 1, если (у{, VI) ^Е.
Тогда строку 7 алгоритма 3.7 мы можем заменить на
Р К, /] := Р (/, /] V (Р [<’, т\ Л Р [т, /]),
где V и Л — обычные булевы операции:
V Ю 1 Л |0 1
0 0 1 0 0 0
1 1 1 1 0 1
После завершения работы алгоритма, модифицированного
таким образом (принадлежащего Уоршаллу [70]), очевидно,
имеем
( 1, если V/) Я*,
Л | ф, если
Здесь следует отметить, что известен алгоритм построения
транзитивного замыкания, более эффективный, чем алгоритм
Уоршалла (см. [53]). Он использует связь этой задачи с умно-
жением матриц, обсуждавшуюся в начале этого параграфа,
эта связь для матриц Л, определяемых равенством (3.13), при-
водит к обычному умножению булевых матриц по формуле
са=у («« л Ьк^'
Оказывается (см. [64]), что такое умножение можно вы-
полнить за время О^1027)1)» что дает алгоритм построения
транзитивного замыкания, имеющего сложность О(и10^ 71о^ п).
Такой алгоритм имеет скорее теоретическое значение, посколь-
ку метод умножения матриц за время О(и1ое7) является до-
вольно сложным и, следовательно, обнаруживает свое преиму-
щество перед обычным «школьным» методом только при очень
9 Показатель 1о& 7 может быть немного уменьшен (см. [55]).
больших значениях п. На практике обычно самым эффектив-
ным оказывается алгоритм Уоршалла, соответствующим обра-
зом запрограммированный (см. [65] и задачу 3.9).
Другим способом построения транзитивного замыкания от-
ношения Е является применение поиска в глубину (или в ши-
рину) в графе (V, Е}. Этот способ особенно выгоден, когда
отношение Е симметрично; очевидно, что тогда транзитивное
замыкание строится отдельно для каждой связной компонен-
ты, на которые разбивается неориентированный граф, опреде-
ляемый отношением Е, и это построение может быть получено
за время О(т + ^)- Детали оставляем читателю (см. зада-
чу 3.12).
3.6. Задачи
3.1. Пусть О = (V, Е) — произвольный ориентированный граф.
Зафиксируем некоторую вершину 5 е V, добавим новую
вершину I, заменим каждую дугу <с» 5> еЕ на дугу <ц, />
и поставим в соответствие каждой дуге полученного графа
вес —1. Доказать, что кратчайший элементарный путь из
5 в I имеет длину —м тогда и только тогда, когда в О су-
ществует гамильтонов контур.
3.2. Модифицировать алгоритм 3.1. так, чтобы он определял
(а) кратчайший элементарный путь из 5 в /;
(б) все кратчайшие пути из $ в / в предположении, что
граф не содержит контуров отрицательной длины (может
содержать контуры нулевой длины). Провести анализ
предложенных алгоритмов.
3.3. Изменить алгоритмы 3.2, 3.3 и 3.6 так, чтобы они опреде-
ляли кратчайшие пути из 5 до остальных вершин, не ис-
пользуя алгоритм 3.1. (Указание', для каждой вершины
V е V следует запоминать и активизировать во время ра-
боты алгоритма такую вершину Р/?Е[с’], что
О [у] = О {РНЕ [у] ] + А [РНЕ [у], у].)
3.4. Можно ли условия (3.4) и (3.5) заменить равенствами
о [у] = (о), Р[у]=4/,'П+”(<’)?
3.5. Доказать, что в графе без контуров с неположительной
длиной уравнения
(1(8, 8) —О,
а (8, V) = пип (5, и) + а (и, о): и е V \ {о}}
однозначно определяют расстояния (1(8, о), V е V. Дать
пример графа с циклом (контуром) длины 0, для которого
эта система уравнений имеет бесконечно много решений.
3.6. Дополнить детали описания и анализа варианта алгорит-
ма Дейкстры со сложностью О(т 1о§и).
3.7. Определить кратчайший путь из 5 в I в графе на рис. 3.4.
3.8. Доказать, что операция *, определенная для квадратных
матриц А = [а,/] и В = [Ьц] размерности пУ^п формулой
А *В = [с,/], где сц = ГП1П{аи* + 6/гУ: 1 к и}, является
ассоциативной.
3.9. Доказать, что следующая модификация алгоритма Уор-
шалла стоит транзитивное замыкание отношения [65]:
1 Ье&ш («отношение Е определено матрицей А, см. (3.13)*)
2 Тог пг := 1 1о п до
3 Тог I :=1 То п до
4 1Т А [/, пг\ = 1 Тйеп
5 Тог / := 1 То п до А [/, /] := А [/, /] V А [пг, /]
6 епд (*Л[/, /]= 1 У/)еЕ**)
Предположим, что строка матрицы А помещается в ма-
шинном слове и цикл 5 мы трактуем как одну элементар-
ную операцию (логическое сложение пг-й строки с 1-й). Ка-
кова тогда сложность алгоритма?
3.10. Модифицировать алгоритм Флойда так, чтобы кроме рас-
стояний О [/,/] он определял матрицу М[/,/], где М[е,/]
есть наибольший номер вершины некоторого кратчайше-
го пути из VI в V] (М[/,/] = 0, если этот путь не содержит
промежуточных вершин). Доказать, что рекурсивная про-
цедура
ргоседиге ВЫПИСАТЬПУТЬ(1, ]);
Ье&1п
И М [/, /] = 0 Й1еп И I = / 1Ьеп юг Не (/)
еке гигИеЦ, ])
еке Ье&1п
ВЫПИСАТЬПУТЬ (I, М [I, /]);
ВЫПИСАТЬПУТЬ(М[1, /], /)
епд
епд
выписывает кратчайший путь из о, в V/ за время О (и).
Написать нерекурсивный вариант этой процедуры.
3.11. Под пропускной способностью пути будем понимать наи-
меньший вес дуги этого пути. Написать алгоритм, опре-
деляющий наибольшие пропускные способности путей ме-
жду (а) фиксированной парой вершин; (б) всеми парами
вершин.
3.12. Опираясь на метод поиска в глубину, написать алгоритм,
строящий транзитивное замыкание произвольного отно-
шения за время 0(и2 + пт), и алгоритм
сложности О (и2) для симметричных отношений.
4. Потоки в сетях
и родственные задачи
4.1. Максимальный поток в сети
Под сетью мы будем понимать пару 5 = <0, с>, где 6 =
= (У,Е)— произвольный ориентированный граф, а с: Е->Р —
функция, которая каждой дуге <п, V) ставит в соответствие не-
отрицательное вещественное число с (и, V), называемое лро-
пускной способностью этой дуги. Множества У и Е называются
соответственно множеством вершин и множеством дуг сети 5.
Для произвольной функции
1:Е->К (4.1)
и произвольной вершины V сети 5 рассмотрим величину
01У/(у)= 2 /(“,«)— Е V).
и: и-+и и'.
Если [(и, V) мы интерпретируем как поток из и в V, то вели-
чина В1У/(у) определяет «количество потока», выходящего из
вершины V, Эта величина может быть положительной (если
из вершины V больше выходит, чем входит в нее), отрицатель-
ной (если в вершину входит больше, чем выходит из нее, т. е.
наступает «накопление» потока в вершине у) и, наконец, рав-
ной нулю. Последний случай нас будет интересовать более
всего. Выделим в нашей сети две вершины — источник 5 и
сток I (5=/=/). Под потоком из 5 в I в сети 5 мы будем пони-
мать произвольную функцию вида (4.1), для которой выпол-
няются условия
0^/(и, о)^с(и, о) для каждой дуги (и, с) Е (4.2)
II
В1у^(у) = 0 для каждой вершины V е У \ {5, /}. (4.3)
Величину
будем называть величиной потока
Согласно описанному выше, мы имеем здесь дело с потоком,
который не возникает и не накапливается ни в одной из вершин,
отличных от 5, I, и который удовлетворяет следующему уело-
вию: через дугу <и, у> мы можем пропустить не более чем с (и, V)
единиц потока. Такой поток может описывать поведение газа
или жидкости в трубопроводе, потоки автомобилей в сети авто-
страд, пересылку товаров по железной дороге (без хранения их
на промежуточных станциях), передачу информации в инфор-
мационной сети и т. д.
Мы будем интересоваться главным образом нахождением
максимального потока (т. е. потока с максимальной величиной)
в заданной сети. Докажем сначала несколько простых и интуи-
тивно очевидных фактов. Под разрезом Р(А) сети 5, соответ-
ствующим подмножеству А V (Д =/= 0, Д =/= V), мы понимаем
множество дуг <и, V) е Е, таких что и е А и V е 1/\Д, т. е.
Р(Д) = ЕП(ЛХ(/\Л)).
Для произвольного потока ( в сети 5 .поток через разрез
Р(А) определяется естественным образом:
ЦА,У\А) = X 1(е).
е е Р(А)
Лемма 4.1. Если $ е А и I е 1/\Д, то для произвольного по-
тока I из 5 в I
Г(/) = /(Д, у\А)-1(У\А, Д). (4.4)
Доказательство. Суммируем уравнения В1уДу) = 0 (4.3) для
всех уеД. Эта сумма складывается из некоторого числа сла-
гаемых /(м, у), снабженных знаком плюс и минус, причем хотя
бы одна из вершин и, V принадлежит множеству Д. Если обе
вершины принадлежат Д, то ((и, V) появляется со знаком плюс
в В1У^(и) и со знаком минус в В1у^(у) (и не появляется в вы-
ражении П1У^(г) ни для одного г, отличного от и и и), что в сум-
ме дает 0. Каждое из слагаемых /(и, ц), и е Д, V е У\Д появ-
ляется в точности один раз со знаком плюс в В1У^(и), что в сум-
ме дает /(Д, К\Д). Аналогичные слагаемые /(и, у), ие У\Д,
уеД отвечают за слагаемое /(У\Д,Д) в (4.4). С другой сто-
роны наша сумма равна В1у/($)= №(/), ибо В1уДу) = 0 для
каждого V еЛ\{5}.
Принимая Д = 1/\{0, получаем в этом частном случае из
леммы 4.1
01^(5) = 1Г(/) = /(К\{/}. {/))-/({/}, У\{/}) =
= - а ({0. V \ И) - / (И \ {/}, {/})) = - О1у, (/),
что выражает интуитивно понятный факт: в сток входит в точ-
ности такое количество потока, какое выходит из источника.
В общем виде лемма 4.1 говорит, что общее количество потока
можно измерить в произвольном разрезе, отделяющем 5 от I.
Определим пропускную способность разреза Р(А) следую-
щим образом:
с (А, У\А) = Е с(е).
е е Р (Д)
Под минимальным разрезом, разделяющим $ и /, мы будем по-
нимать произвольный разрез Р(Д), /е И\Я с мини-
мальной пропускной способностью.
Одним из фундаментальных фактов теории потоков в сетях
является классическая теорема о максимальном потоке и мини-
мальном разрезе.
Теорема 4.2 (Форд и Фалкерсон [23]). Величина каждого
потока из 8 в I не превосходит пропускной способности мини-
мального разреза, разделяющего 8 и I. причем существует поток,
достигающий этого значения.
Доказательство. Пусть Р(А)— минимальный разрез. В силу
леммы 4.1 для произвольного потока / имеем
Г(/) = /(Я, У\А) — ((У\А, Я)</(Л, 1/\Л) =
= Е /(*)< Е с(е) = с(Л, 7\Д). (4.5)
ееР(Д) есър(4)
Существование потока, для которого указанное неравенство пе-
реходит в равенство (такой поток, очевидно, максимален),—
более глубокий факт. Мы получаем его как следствие анализа
алгоритма, представленного в следующем разделе. В
Все известные алгоритмы построения максимального потока
асновываюгся на последовательном увеличении потока, причем
модификация потока, увеличивающая его величину, чаще всего
опирается на метод увеличивающих цепей.
Будем говорить, что дуга е сети 5 является допустимой дугой
из и о V относительно потока /, если
е = {и. о) и / (е) < с (е) (4.6)
или
е = (о. й) и /(е)>0. (4.7)
В зависимости от того, какое из приведенных условий имеет
место, первое или второе, будем говорить соответственно о со-
гласованной или несогласованной допустимой дуге из и в V. Уве-
личивающей цепью (длины I) для данного потока / из 5 в I на-
зывается произвольная знакопеременная последовательность
.(попарно различных) вершин и дуг
е19 е2, о2, ...» V/-!, еь (4.8)
такая что = 5, щ = /, и для каждого I I дуга допустима
из в VI относительно потока /,
Знание увеличивающей цепи вида (4.8) позволяет легко уве-
личить величину потока / на
б = тт{Л(е/): 1^/</},
где
( с(е^) — /(е,), если дуга е1 согласована,
А (е.) = 5 ., .
I если дуга не согласована.
Для этого достаточно увеличить на 6 поток по каждой согласо-
ванной дуге ес.
/'(^) = /(еЛ + б,
а также уменьшить на б поток по каждой несогласованной
дуге е,:
Г (*,) = /(*/)-6.
Определенная таким образом функция /' (мы полагаем
/'(е) = /(е) для дуг е, не принадлежащих цепи (4.8)) является
потоком. Действительно, изменение величины О1У^(о/), 1
—1, основывается на ее увеличении на б, связанном с из-
менением потока по ех-+ь и уменьшении ее на б, связанном с из-
менением потока по в1 — это не зависит от типа дуги
В сумме эти изменения компенсируются и в результате
В1У/'(иЛ = В1Уг(^) = 0 (1 I—1). Выполняется также ус-
ловие 0^/'(е)^ с(е) для каждой дуги е. Величина же потока
увеличивается на б:
ТУ (Ц) = (5) = В1У/ (5) + б = Г (/) + б.
На рис. 4.1 показан процесс увеличения потока вдоль уве-
личивающейся цепи. Поток Це) по каждой дуге е указан возле
соответствующих дуг, в скобках указана пропускная способность
дуг с(е). Увеличивающая цепь имеет вид
<«1, Уз), Уз,<у2, Уз), У2, <Уз, у2), Уб,
<У5> Уб), Уб, <У7, Уб) У7> (У7, Ув), У8,
что дает увеличение потока на б = А(щ, у5) = 1 с 10 до 11,
Теорема 4.3. Следующие три условия эквивалентных
(а) Поток из $ в I максимален.
(б) Не существует увеличивающей цепи для /.
(в) У7([) = с(А, У\А) для некоторого А^У, такого что
5Е Л, А.
Доказательство. (а)=>(б). Если поток максимален, то оче-
видно, что для него не существует увеличивающей цепи, ибо
существование такой цепи делало бы возможным увеличение по-
тока.
Рис. 4.1. Увеличение потока вдоль увеличивающей цепи: а) перед модифика
цией, б) после модификации.
(б)=>(в). Предположим, что для некоторого потока / не су-
ществует увеличивающей цепи. Определим множество А V
как множество вершин V, для которых существует цепь
0о, ^1, 01, е2, 02, ..., 0л-1, ек,
такая что 6^0, ио = $, = V и е1— дуга, допустимая из
в VI, 1 1^.к. Очевидно, что 5еЛ, а I ф. Л, поскольку это озна-
чало бы существование увеличивающей цепи для /. Рассмотрим
разрез Р(Л). Для каждой дуги е^Р(А) должно выполняться
равенство }(е) = с(е) согласно определению множества А (см.
условие (4.6)), таким образом, [(А, У\А)= с(А, У\А). Поль-
зуясь определением множества А, аналогичным образом полу-
чаем /(1/\Л,Л) = 0 (см. условие (4.7)). В силу леммы 4.1 от-
сюда вытекает, что
М7(/) = /(Л, у\А)-/(У^Л, Л) = с(Л, У\Л).
(в)=^(а) следует из уже доказанного факта, что величина
произвольного потока не превосходит с (А, К\А) (см. (4.5)).
Нетрудно проверить, что поток на рис. 4.1,6 — максимальный.
«Насыщенный» разрез Р(А)У появляющийся в доказательстве
теоремы 4.3, обозначен через А ={^1, &2, Уз, ^б}-
Для того чтобы из теоремы 4.3 вывести теорему о макси-
мальном потоке и минимальном разрезе, нам еще не хватает
одной, довольно тонкой детали. (Прежде чем читать дальше,
предлагаем читателю догадаться, какой именно.) Этим недо-
стающим фактом является просто существование максимального
потока в произвольной сети. Другими словами, нужно показать,
что невозможна ситуация, в которой, например, для каждого
8 > 0 существует поток с величиной, превосходящей 7 — е, но
не существует потока с величиной, равной 7 (стоит отметить, что
подобной проблемы для минимального разреза не существует —
число различных разрезов в отличие от числа различных пото-
ков является конечным). Этот простой факт, являющийся в сущ-
ности следствием нестрогости неравенства в условии (4.2), мож-
но доказать многими способами. Мы докажем его в следующем
разделе путем анализа некоторого алгоритма построения макси-
мального потока.
4.2. Алгоритм построения
максимального потока
Рассуждения предыдущего раздела подсказывают идею сле-
дующего простого алгоритма построения максимального потока.
Начиная с произвольного потока (например, /(е) = 0 для каж-
дой дуги е^Е)у мы ищем увеличивающие цепи и увеличиваем
вдоль них фактический поток.
Однако здесь возникают два вопроса. Во-первых, закончится
ли работа такого алгоритма через конечное число шагов и, во-
вторых, будет ли полученный поток максимальным. Ответ на
второй вопрос в предположении, что алгоритм остановится через
конечное число шагов из-за невозможности отыскать новые уве-
личивающие цепи, будет утвердительным, что непосредственно
следует из теоремы 4.3. С другой стороны, Форд и Фалкерсон
в работе [23] дали в некотором смысле отрицательный ответ на
первый вопрос. А именно, они привели пример сети, в которой
можно так «злоумышленно» подбирать очередные рассматривае-
мые увеличивающие цепи, что процесс никогда не кончится; бо-
лее того, величина потока в течение всего времени будет меньше
одной четверти величины максимального потока.
Эдмондс и Карп (см. [17]) показали, что если мы увеличи-
ваем фактический поток всегда вдоль кратчайшей увеличиваю-
щей цепи, то максимальный поток строится с использованием не
более /им/2 цепей (как обычно, и=[У| и т=|Е|). Отыскание
кратчайшей цепи легко реализовать при помощи алгоритма, ана-
логичного поиску в ширину (см. разд. 2.3). Точнее говоря, начи-
ная от источника 5, мы ведем поиск в ширину в графе 0^ со-
стоящем из дуг <и, у>, таких что в нашей сети существует дуга,
допустимая от и до V относительного фактического потока
вплоть до момента достижения стока /. Очевидно, что найден-
ный в результате этого процесса кратчайший путь из 5 в / соот-
ветствует кратчайшей увеличивающей цепи из 5 в I в исходной
сети. Принимая во внимание, что процесс поиска в ширину мы
можем выполнить за время О(т + л), мы можем оценить слож-
ность всего алгоритма построения максимального потока как
О(тп(т + м)).Не будем заниматься здесь деталями этого алго-
ритма, так как ниже в данном параграфе мы представим более
эффективный метод, имеющий сложность О (и2).
Любопытный метод использовал для построения максималь-
ного потока Диниц в работе [13]. Этот метод основан на по-
строении некоторой вспомогательной бесконтурной сети (т. е.
с графом, не содержащим контуров), структура которой точно
отображает все кратчайшие увеличивающие цепи из 5 в / от-
носительно фактического потока Обозначим такую сеть через
5^. Мы строим ее при помощи поиска в ширину в уже упомя-
нутом графе О] с дугами, определяемыми допустимыми относи-
тельно фактического потока / дугами в исходной сети. Сеть 5;
содержит источник 5, сток I и дуги графа 0^ вида <и, 0, где и
находится на расстоянии й, а V на расстоянии с1 + 1 от $, 0
(1 < /, где I есть длина сети 5|, т. е. расстояние от $ до /
в графе 0^. Пропускную способность С[(и, V) мы определяем как
с(и, V) — ((и, V) или как /(у, и) в зависимости от того, представ-
ляет ли дуга <и, согласованную дугу или нет (или сумму этих
значений), если одновременно существуют согласованная и несо-
гласованная дуги, допустимые от и к V.
Ниже представлена процедура Р8А, строящая сеть 5^. Ис-
ходная сеть 5 представлена списками инцидентности
ЗАПИСЬ [у], ПРЕДШ[а], уе^и массивом пропускных спо-
собностей дуг С [и, у], и, V е V, а фактический поток / опреде-
ляется массивом Р[и, V], и, V е V. Переменные, относящиеся к
построенной вспомогательной сети 5^, отличаются от перемен-
ных, относящихся к исходной сети 5, первой буквой X: имеем
множество вершин XV, списки инцидентности ХЗАПИСЬ\ъ\>
ХПРЕДШ[а], V ^ХУ, и массивы пропускных способностей ХС
и потоков ХР. Расстояние до вершины от источника в сети 5^
запоминается в массиве ДЛИНА. Структура процедуры Р8А
следующая: за инициализацией в строках 3—7 следует поиск
в ширину в графе 0^ начиная от источника 5 (см. главный цикл
в строке 10). Вершины у, последовательно посещаемые в про-
цессе поиска, помещаются в очередь (строки 13 и 21), каждая-
вершина и, выбираемая из очереди (строка И), используется
в двух циклах (строки 12 и 20). Первый из них ищет согласо-
ванные допустимые дуги <и, 0, второй — несогласованные до-
пустимые дуги <у, и). Отметим, что сеть может одновременно
содержать согласованную допустимую дугу <и, V) и несогласо-
ванную допустимую дугу <и, и). Дуга (и, 0, включаемая в 5(,
имеет в таком случае пропускную способность, равную сумме
пропускных способностей, вносимых этими дугами (см. строки
24 и 28).
1 ргоседиге Р8А\ (* построение вспомогательной
бесконтурной сети 5/; переменные V, XV,
ПРЕДШ, ЗАПИСЬ, ХПРЕДШ, ХЗАПИСЬ, ДЛИНА, С, Е,
ХС, ХЕ, 5, I — глобальные *)
2 Ье&1п
3 Гог и е V до (* инициализация *)
4 Ье^п ДЛИНА [и] := оо; ХПРЕДШ [и] := 0;
XЗАПИСЬ [и]:=0;
5 Гог V <= V до ХС[и, с/]:=0;
6 Гог V е= V до ХЕ [и, р]:=0 (* инициализация
нулевого потока *)
7 епд;
8 ОЧЕРЕДЬ :=0; XV := 0; ДЛИНА [$] := 0;
(♦поиск в ширину, начиная от источника $♦)
9 ОЧЕРЕДЬЮ,
10 \уЫ1е ОЧЕРЕДЬ #= 0 до
11 Ьек1п и<= ОЧЕРЕДЬ-, XV := XVII {и};
12 Гог V е= ЗАПИСЬ [и] до (♦ поиск согласованных дуг *)
13 И {ДЛИНА [и] < ДЛИНА [и] < ДЛИНА [/]) апд
(Г [и, у] < С [и, и]) 1йеп
14 Ьее1п И ДЛИНА [о] = оо 1Ъеп ОЧЕРЕДЬ^;
(* V — новая *)
15 ДЛИНА [у] -.—ДЛИНА [и] + 1;
(* добавить (и, о) к сети 5/ *)
16 ХЗАПИСЬ[и\-.= ХЗАПИСЬ[и\\}{у}-,
17 ХПРЕДШ [у] := ХПРЕДШ [у] 0 {и};
18 ХС [и, у] := С [и, у] - Е [и, у]
19 епд;
20 Тог у е ПРЕДШ [и] до (* поиск несогласованных дуг ♦)
21 И (ДЛИНА [и] < ДЛИНА [у] < ДЛИНА [/]) апд
(Г [у, и] > 0) <Ьеп
22 Ьее!п И ДЛИНА [и] = оо (Ьеп ОЧЕРЕДЬ<=^\
(* новый *)
23 ДЛИНА [у] := ДЛ ИН А [и] + 1;
24 И ХС [и, у] = 0 1йеп (* добавить (и, у) к сети 3? *)
25 Ьее*п ХЗАПИСЬ [и]: = ХЗАПИСЬ [и] 0 {у};
26 ХПРЕДШ [у] := ХПРЕДШ М и {и}
27 епд;
28 ХС [и, V] := ХС [и, у] + Е [у, и]
29 епд
30 епд
31 епд
Пусть по окончании работы процедуры ДЛИНА [/] = I. Если
1 = оо, то это означает, что мы в нашем процессе не достигли
стока /, т. е. в нашей сети не существует увеличивающей цепи
от 5 к /. В силу теоремы 4.3 фактический поток в сети 5 макси-
мальный. Если I < оо, то кратчайшая увеличивающая цепь из 5
в I имеет длину /, более того, легко отметить, что пути из 5 в I
во вспомогательной сети взаимно однозначно соответствуют уве-
личивающим цепям длины I в исходной сети (строго говоря, не-
которые из этих «увеличивающих цепей» могут использовать
одновременно согласованную и несогласованные дуги, допусти-
мые от и до V). Стоит отметить, что после достижения стока,
когда ДЛИНА[1] < оо, вновь встречаемые вершины уже не рас-
сматриваются в процедуре Р8А (см. условия в строках 13 и 21),
так как ни одна такая вершина, находясь на расстоянии I от 5,
не может быть вершиной цепи длины / из 5 в /.
Нетрудно оценить сложность процедуры Р8А. Каждая вер-
шина V помещается в очередь и удаляется из нее не более од-
ного раза. Каждая дуга, инцидентная с V, анализируется в точ-
ности один раз (в циклах 12 или 20), причем число шагов для
каждой такой дуги ограничено константой. Таким образом, об-
щее число шагов будет иметь порядок м + что доминнруется
п2 шагами инициализации массивов ХС и ХЕ (строки 5 и 6).
Таким образом, вспомогательную бесконтуриую сеть можно по-
строить за время О(п2) (можно было бы избежать дорогостоя-
щей инициализации массивов ХС и ХЕ, однако применение та-
кой модифицированной процедуры со сложностью 0(п + т) не
изменило бы оценки О (и3) для всего алгоритма построения мак-
симального потока).
Идея Диница основывается на разбиении процесса увеличе-
ния потока вдоль увеличивающих цепей на фазы, соответствую-
щие использованию кратчайших цепей определенной длины.
Фаза начинается с построения вспомогательной бесконтурной
сети, затем во вспомогательной сети находится так называемый
лсевдомаксимальный поток. П севдомаксимальным потоком
в сети 5^ длины I мы называем произвольный поток /* в 5^ та-
кой что в 5/ не существует увеличивающей цепи длины I отно-
сительно потока /*; другими словами, для произвольного пути
из 5 в / в 5[, определенного последовательностью вершин
Уо, VI, VI (^0=5, VI = I),
существует дуга <У/, ^+1>, 0 такая что /*(у/, у/+1) =
= уг+1). Псевдомаксимальный поток затем «переносится»
из вспомогательной сети в первоначальную сеть: поток /*(и, у)
складывается с /(и, у), а если это вызывает переполнение дуги,
т. е. превышение потока над пропускной способностью дуги
с(и, и), то этот «избыток» ликвидируется соответствующим
уменьшением потока /(у, и) (таким образом, результатом на-
шей модификации всегда является увеличение В1У^(и) на
/*(и, V) и уменьшение В1у^(у) на /*(и, у)). Нетрудно проверить,
что такая модификация потока, проведенная для всех дуг <и, V)
вспомогательной сети, определяет некоторый новый поток та-
кой что 1Г(/') = №(/) + №(/*). Фазу считаем законченной. Ме-
тод Диница основывается на выполнении последовательных фаз,
начиная с нулевого потока, вплоть до момента, пока поток в
нашей сети не станет максимальным.
Это показано на рис. 4.2 (как обычно, при каждой дуге ука-
заны поток по этой дуге и в скобках ее пропускная способ-
ность). Начиная с нулевого потока /о в сети 5, мы получаем
' ’* * "5 * ^4 * * ‘б * ’ '”Т %
Рис. 4.2. а) Сеть 5 и максимальный поток в этой сети; б), в), г) Вспомога-
тельные бесконтурные сети, соответствующие последовательным фазам алго-
ритма Диница с псевдомаксимальными потоками в каждой из них.
вспомогательную бесконтурную сеть 5^ (рис. 4.2,6). Мы нахо-
дим в ней псевдомаксимальный поток (метод эффективного по-
строения такого потока будет разобран далее) и переносим его
в сеть 5, получая поток
Затем мы строим сеть 5/, (рис. 4.2, в) и найденный в ней
псевдомаксимальный поток переносим в сеть 5, что дает поток
/2. В последней фазе мы строим сеть 8^ (рис. 4.2,г). После пе-
ренесения псевдомаксимального потока из 5^ в 5 получаем в 5
поток / (показанный на рис. 4.2,а), который является макси-
мальным, ибо Ц7(/) = 4 = с({$}, У\{$}) (см. теорему 4.3).
Рис. 4.2, в хорошо иллюстрирует тот факт, что псевдомакси-
мальный поток не должен быть максимальным. Действительно,
псевдомаксимальный поток, показанный на этом рисунке, мы
можем увеличить вдоль следующей увеличивающей цепи
длины 5:
<»!. и*), «5. («б. ^4>. «1. <У.З, ^3. <°з, Уб>. Уб. <Уб, &7>, «7-
Отметим еще, что дуга <щ, с3> сети 8/, (рис. 4.2, г) возникла
из двух противоположно направленных дуг сети 5.
Метод ДиниЦо эффективен в основном из-за того, что неза-
висимо от пропускной способности дуг число фаз не превышает
п. Для доказательства этого факта обозначим через 5* вспомо-
гательную бесконтурную сеть, построенную в к-й фазе, а через
1к — длину этой сети. (Внимание: последний вызов процедуры
Р8А, в котором не достигается сток, за фазу не считается.)
Лемма 4.4. Если число фаз превышает к, то 1к < 1и+\-
Доказательство. Обозначим через (1к(и) расстояние в 5* от $
до V. Нужно доказать, что <1к+\(1) > с1к(1). Рассмотрим в 5*+1
произвольный путь Уо, ......Ю1ъ+\ из 5 = уо В *=У1к+Г
Предположим, что для некоторого р 1к+\ все вершины
V/, 0 I р, принадлежат сети 5*. Покажем сначала, что тогда
0</^р. (4.9)
Допустим, что это не так, т. е. что сМу<+1)> + 1 Для не-
которого I. Согласно правилам построения сети 5* это означает,
что 8к не содержит дуг у4+1> (и, очевидно, не содержит
также дуг <у/+ьу/>). Таким образом, во время к-й фазы в 5 не
модифицируется ни поток из VI в у/+1, ни из в VI. Однако
это противоречит существованию в начале (к 4- 1)-й фазы дуги
в 5, допустимой от VI до р/+1, которой не было в начале к-й
фазы. Это противоречие доказывает неравенства (4.9). Из этих
неравенств, учитывая, что бМ^о) = О, индукцией по I выводим,
что
Ак (У/) <»= 1 (У/)> о < Iр.
(4.Ю)
Если все вершины пути Яо, 01, .0/Л+1 принадлежат сети
5*, то отсюда следует неравенство Равенство
^(О = йл+1(О было бы возможно, только когда = ^+1(^0,
0^1 ^1ъ+\, но легко заметить, что повторение пути Уо, 01, •••
..., в и 5*+1 противоречило бы псевдомаксимальности
потока, найденного в 5*. Следовательно, должно быть
Рассмотрим теперь случай, когда существует вершина пути
оо, 0|, 0/Л+1, не принадлежащая 5*. Пусть оР+\— первая
такая вершина (очевидно, что 1 р + 1 1к+х — 1). Рассуждая
аналогично предыдущему, мы можем сделать вывод, что появ-
ление в 5*+1 дуги Ор, Рр+1>, которой не было в 5Л, может быть
вызвано только тем, что дк(ир) = дк(1) — 1, и до вершины 0р+1
мы доходим уже после достижения стока I (так что она не
включается в 5*). Учитывая (4.10) и тот факт, что вершины
0о, 01, ...» 0р-1 принадлежат сети 5/г, получаем
1к = а к (/) = а к (0р) + 1 < (0Р) +1 = р +1 < 1^.
Принимая во внимание то, что /1^1 и 1к п—1 для про-
извольного к, получаем
Следствие 4.5. Число фаз в методе Диница не превышает
п—\.
Нам осталось только рассмотреть эффективный алгоритм по-
строения псевдомаксимального потока во вспомогательной бес-
контурной сети. Авторами метода, который мы опишем, являют-
ся Малхотри, Кумара и Махешвари [48], метод реализуется в
процедуре МЛХР5А, описанной ниже. Чтобы описать эту про-
цедуру, введем понятие потенциала вершины сети, т. е. макси-
мального количества потока, который можно «пропустить» че-
рез эту вершину. Он определяется как минимум двух величин:
максимального возможного потока в вершину V (входной по-
тенциал) и максимального возможного потока из вершины V
(выходной потенциал). Точнее, потенциал вершины V произволь-
ной сети 5 = <0, с} с источником 5 и стоком I равен
П(о) = гтп{ПВХ(о), ПВЫХ(о)},
где
( 2 с (и, у), если 0 =/= $,
ПВХ(о) = <
I оо, если о = $
и
( Е с(0, и), если V =/Ь I,
ПВЫХ(р) = <
I оо, если V — !.
Процедура МАХР8А сначала вычисляет потенциалы всех
вершин во вспомогательной бесконтурной сети (строки 3 4- 12),
помещая вершины с нулевым потенциалом в стек СТЕК, Оче-
видно, что вершину с нулевым потенциалом можно удалить из
сети вместе со всеми инцидентными ей дугами, не оказывая
влияния на какой-либо поток в этой сети. Удаление такой вер-
шины, а точнее, инцидентных ей дуг, может вызвать обращение
в нуль потенциалов некоторых соседних вершин, удаление кото-
рых обращает в нуль потенциалы других вершин и т. д. Этот
процесс реализуется в цикле 17. После выхода из этого цикла
(когда СТЕК = 0) множество ХИ содержит вершины вспомога-
тельной бесконтурной сети с ненулевым потенциалом (вычисляе-
мым в сети, модифицированной последовательным удалением
вершин с нулевым потенциалом). Если ХН = 0, то наступает
важный момент: в ХИ ищется вершина г с минимальным потен-
циалом р = П(г) (строки 38 4-41). Затем мы находим в нашей
бесконтурной сети поток из г в I величины р (строки 42 4- 65) и
поток из 5 в г величины р (строки 66 4-91); в сумме это дает
поток из 5 в I величины р. Опишем первую часть—поток из г
в /; вторая часть полностью аналогична. Наш поток будет ис-
пользовать только согласованные во вспомогательной бескон-
турной сети допустимые дуги, а метод этого вычисления интуи-
тивно лучше всего объяснить следующим образом. Представим
себе, что в вершине г мы поместили «груз» величины ф[г] = р
и хотим этот груз «протолкнуть» до стока I так, чтобы количе-
ство груза, перемещаемое по любой дуге, не превышало ее про-
пускной способности. Для этого мы ведем в нашей сети поиск
в ширину, начиная с вершины г. Как обычно при поиске в ши-
рину достигнутые, но еще не использованные вершины запоми-
наются в очереди. Каждая вершина V, выбираемая из очереди
(строка 43) и не являющаяся стоком, «разгружается» (строки
49 4-64). Это заключается в перенесении груза в вер-
шины и, к которым ведут дуги из V. Этот груз переносится в не-
сколько первых вершин в списке ХЗАПИСЬ [у], причем груз,
перенесенный в каждую такую вершину, за исключением, может
быть, последней, равен пропускной способности ХС[у, и]. Таким
же способом на всех использованных дугах <и, и), за исключе-
нием, может быть, последней, устанавливается поток и] =
= ХС[у, и], и эти «насыщенные» дуги мы можем устранить из
сети (строки 57 4-60; вспомним, что мы ищем псевдомаксималь-
ный поток, следовательно, можно ограничиться согласованными
допустимыми дугами вспомогательной бесконтурной сети). Устра-
нение дуг сопровождается соответствующим уменьшением по-
тенциалов (строки 44 4-46). Вершины сети посещаются со-
гласно схеме поиска в ширину, а следовательно, если
<1 = ДЛИНА [г], весь груз из вершины г переносится в вершины,
находящиеся на расстоянии с1 + 1 от 5, и далее в вершины, на-
ходящиеся на расстоянии с1 + 2 от 5 и т. д., пока весь груз не
достигнет стока I. Отметим, что груз, достигающий каждой вер-
шины V, не превышает р, и эту вершину мы можем разгрузить
(если уУ=/), так как р, будучи-равным минимальному потен-
циалу, несомненно не превышает выходного потенциала вер-
шины V.
После построения аналогичным способом потока величины р
из 5 в г закончена первая итерация главного цикла (строка 15),
состоящая в удалении вершин с нулевым потенциалом и в уве-
личении потока на величину минимального в данный момент
потенциала. Дальнейшие итерации следуют вплоть до момента,
когда уже нет вершин с ненулевым потенциалом (т. е. ХМ = 0).
Очевидно, что найденный тогда в нашей сети поток является
псевдомаксимальным.
1 ргоседиге МАХР8А; (* построение псевдомаксимального
потока во вспомогательной бесконтурной сети методом
Малхотри, Кумара и Махешвари; переменные XV, ХС,
ХР, ХПРЕДШ, ХЗАПИСЬ, 8, / — глобальные*)
2 Ье&1п
3 СГЕ/<:=0; (*СТЕК будет содержать вершины с нуле-
вым потенциалом*)
4 Гог V е XV до (* определение потенциала вершины у*)
5 Ьее1п ПВХ [у] := 0; ПВЫХ [у] := 0;
6 И V = 8 ГЬеп ПВХ[и]:= оо
7 еке Гог и €= ХПРЕДШ [и] до
/7ВХ [и] := ПВХ [о] + ХС [и, о];
8 1Г V = / ГЬеп ПВЫХ [и] := оо
9 еке Гог и е= ХЗАПИСЬ [и] до
ПВЫХ [и] := ПВЫХ [у] + ХС [у, и];
Ю П [и] := пип (ПВХ [и], ПВЫХ М);
11 1Г П [у] = 0 (Ьеп СТЕК => V
12 епд:
13 Гог V XV до ф[у]:=0; (* инициализация грузов в вер-
шинах *)
14 XИ:=XV\ (*ХИ будет содержать вершины с ненулевым
потенциалом *)
15 \уЫ1е ХИ =/= 0 до (* главный цикл*)
16 Ье^т
(♦удаление вершин с нулевым потенциалом*)
17 луНИе СТЕК 7^0 до
18 Ье&1п ^СТЕК\ ХИ -.= ХИ \{у);
(♦удаление дуг, входящих в V *)
19 Гог и е ХПРЕДШ [у] до (* удаление дуги (и, о)*)
150
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Ье?1п
ПВЫХ [и] := ПВЫХ [и] - (ХС [и, у] - ХР [и, и]);
ХЗАПИСЬ [ы] := ХЗАПИСЬ [и] \ {о};
ХПРЕДШ [у] := ХПРЕДШ [о] \ {и};
И П [и] =# 0 Шеп (* модификация П [и]*)
Ьее1п П [и] := тт(77ВХ [и], ПВЫХ[и})\
1! П [и] = 0 Шеп СТЕК<=и
епд
епд
(♦ удаление дуг, исходящих из V *)
Тог и е ХЗАПИСЬ [у] до (* удаление дуги (о, и) *)
Ье?1п ПВХ [и] := ПВХ [и] - (ХС [у, и} - ХР [у, и]);
ХПРЕДШ [ы] := ХПРЕДШ [и] \ { у) ;
ХЗАПИСЬ [у] := ХЗАПИСЬ [у] \ {«};
И П [и] 0 Шеп (* модификация 77 [«} *)
Ьеет П [и] := тт(77ВХ [и], ПВЫХ [и])-
И П[и] = 0 Шеп СТЕК<=и
епд
епд
епд;
(*ХИ является множеством вершин с ненулевым
потенциалом *)
И ХИ 0 Шеп (* поток еще не является макси-
мальным *)
Ье&1п
(* нахождение вершины г с минимальным потен-
циалом *)
р := оо;
Тог у е УМ до И П [у] < р Шеп
Ье?1п г:=у; р-=П[г]
епд:
(* построение потока величины р из г в I *)
ОЧЕРЕДЬ := 0', ОЧЕРЕДЬ <=г\ О[г]:=р;
гереа! у -ф= ОЧЕРЕДЬ',
ПВХ [у] :=/7ВХ[у]-С?[у];
ПВЫХ [у) := ПВЫХ [у] - О’[у];
77[у] := 77 [у] — 0 [у];
И 77 [у] = 0 Шеп СТЕК^о;
И у = / Шеп [у] := р
е!зе
Ье§1п (* разгрузка вершины у *)
и := первая вершина в списке ХЗАПИСЬ [у];
\уЫ1е 0 [у] > 0 до
ЬееШ И 0М = 0 Шеп ОЧЕРЕДЬ <=н;
4/е//а:=ш1п(0[у], ХС[у, и] — ХР [у, и]);
ХР [у, и] :=ХР [у, м] + де//а;
4.2.
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
О М :== $ — йе1(а\
<2 [м] := <2 [“] +
И ы] = ХС[у, и] Шеп (* удале-
ние (V, и)*)
ЬедШ
ХЗАПИСЬ [о] -.=ХЗАПИСЬ [о] \ {«};
ХПРЕДШ [и] :=ХПРЕДШ [и] \ {о}
епд;
11 <2 [а] > 0 Шеп
и := следующая после и вершина
списка ХЗАПИСЬ [и]
епд
епд (* конец разгрузки вершины V *)
ипШ V = /; (* поток из г в I найден*)
(* построение потока величины р из 8 в г *)
ОЧЕРЕДЬ-.= 0-, ОЧЕРЕДЬ <= г; <2[г]:=р;
гереа^у <= ОЧЕРЕДЬ-,
И у г Шеп (* П [о] еще не уменьшен *)
Ье&Ш ПВХ [у] := ПВХ [у] - <2 [у];
ПВЫХ [у] := ПВЫХ [и] - <2 [у];
ЛИ :=/7 [у] - ОМ;
И /7 М = 0 Шеп СТЕК<=и
епд;
И V = 8 Шеп [о] := 0
е!зе
Ье&Ш (* разгрузка вершины V *)
и := первая вершина в списке ХПРЕДШ [у];
\уЫ1е <2 [о] > 0 до
Ьееш И <2(и) = 0 Шеп ОЧЕРЕДЬ^
(1е11а := шт (<2 [у], ХС [и, у] — ХЕ [и, о]);
ХЕ [и, о] := ХЕ [и, и] + 4е11а;
[°] •= [°] — <1е11сг,
9 [«]:= С [«] + <1е11а\
ИХ/7[и, ^] = ХС[и, о] Шеп (*удаление
(и, V)*)
Ье&Ш
ХПРЕДШ [у] := ХПРЕДШ [о] \ {и};
ХЗАПИСЬ[и]-.=ХЗАПИСЬ\и\\{р}
епд;
И О М > 0 Шеп
и := следующая после и вершина
в списке ХПРЕДШ [у]
епд
епд (* конец разгрузки вершины у *)
ипШ у — 8 (♦ найден поток из 5 в г *)
94 епд (*конец увеличения потока вдоль единичной
вершины *)
95 епд (* конец главного цикла *)
96 епд (* конец процедуры МАХР8А *)
Оценим теперь число шагов, выполняемых процедурой
МАХР8А. Определение потенциалов (строки 3 4- 12) требует
О(п + /п) шагов, поскольку каждая дуга <и, V) анализируется
не более двух раз: при вычислении ПВЫХ[и] и ПВХ[и]. Общее
число шагов во всех итерациях главного цикла, выполняемых
фрагментом процедуры, удаляющим вершины с нулевым потен-
циалом (строки 17 4-35), также порядка О(п + ги), так как
каждая вершина заносится в СТЕК в точности один раз, а при
удалении этой вершины из стека удаляются все инцидентные ей
дуги (циклы 19 и 27), так что каждая дуга удаляется не более
одного раза. Каждая итерация главного цикла вызывает обра-
щение в нуль потенциала хотя бы одной вершины, а именно вер-
шины г. Таким образом, число итераций этого цикла не прево-
сходит п. Каждая итерация, кроме проанализированного уже
процесса удаления вершин с нулевым потенциалом, содержит
две части, являющиеся в основном процессами поиска в ши-
рину— от г до I и от 5 до г. Сложность этих частей порядка
числа анализируемых дуг. Анализ дуги может быть «уничто-
жающим», когда анализируемая дуга насыщается потоком и
удаляется из сети, или «неуничтожающим», когда дуга остается
в сети и может быть проанализирована в последующих итера-
циях главного цикла. Очевидно, что в течение всех итераций
главного цикла мы анализируем уничтожающим способом О(т)
дуг, а во время каждой итерации неуничтожающим способом
анализируем не более п, дуг, по одной на каждую посещаемую
вершину. В сумме это дает число шагов во всех итерациях глав-
ного цикла порядка /и 4-и2, т. е. О(п2). Отсюда мы делаем вы-
вод, что общая вычислительная сложность процедуры Л4АХР5А
равна О(п2).
Во время нашего анализа мы предполагали, что удаление
дуг из нашей сети (строки 19, 27, 58 и 85) можно выполнить за
время, ограниченное константой. Это возможно, если появление
вершины V в списке ХЗАПИСЬ [и] и вершины и в списке
ХПРЕДШ [у] взаимно связаны указателями и каждый элемент
списка содержит указатель как на предыдущий, так и на после-
дующий элементы списка.
Теперь мы можем собрать уже описанные процедуры Р8А и
МАХР8А в полный алгоритм построения максимального потока.
Алгоритм 4.6. (Построение максимального потока в сети.)
Данные: Сеть, представленная списками инцидентности
ПРЕДШ[ц\, ЗАПИСЬ^], V е V, пропускные спо-
собности с [и, у], и, V е V, источник и сток
/ (= V.
Результаты: Максимальный поток Р[и, у], и, V V.
1 Ье&1п
2 Тоги е V йо
3 Тог у е V йо Г [и, у] := 0; (* нулевой начальный поток *)
4 гереаТ Р8А\ (* построение вспомогательной бесконтур-
ной сети *)
5 1Т ДЛИНАМ] Ф оо Тйеп (* поток Р не является ма-
ксимальным *)
6 Ье#1п Л4ДХР5Л; (* построение максимального по-
тока во вспомогательной сети *)
(* перенести поток из вспомогательной сети
в главную*)
7 Тог и XV йо (* XV = множество вершин вспо-
могательной сети *)
8 Тог V е XV йо
9 Ьебш Р[и, у] + ХР [и, о];
10 ИР [и, у]>С[и, у] (йен
11 Ье^п
Л [о, и] := Р [у, и] — (Р [и, у] — С [и, с/]);
12 Р[и9 у] :=С[и, у]
13 епй
14 епй
15 епй (* конец фазы *)
16 ипШ ДЛИНА[1] = (х> (* поток Р — максимальный *)
17 епй
Исходя из проведенного уже анализа процедур Р8А и
Л4ДХР5Л, а также из того, что число фаз не превышает п (см.
следствие 4.5), получаем
Следствие 4.7. Алгоритм 4.6 правильно строит максималь-
ный поток за время О(пг).
Отметим, что анализом этого алгоритма мы доказали суще-
ствование максимального потока в произвольной сети и тем са-
мым предоставили недостающий фрагмент для доказательства
фундаментальной теоремы о максимальном потоке и минималь-
ном разрезе (теорема 4.2).
Стоит отметить, что алгоритм 4.6 не подходит непосред-
ственно под схему последовательного увеличения потока вдоль
увеличивающих цепей, однако метод, использованный в этом
алгоритме, можно считать обобщением методики увеличивающих
цепей. Увеличение потока (на значение, равное минимальному
потенциалу) происходит вдоль несколько более общей струк-
туры, чем единичная увеличивающая цепь от 5 до I. Эту струк-
туру можно было бы назвать «кратной увеличивающей цепью»
эт 5 до /, проходящей через вершину г (с минимальным потен-
циалом). Использование такой кратной цепи приводит к удале-
нию из сети хотя бы одной вершины, а не одной дуги, как в
случае единичной увеличивающей цепи — отсюда меньшее число
итераций и тем самым лучшая оценка сложности алгоритма.
В заключение сформулируем следующее очевидное, но важ-
ное свойство алгоритма 4.6.
Теорема 4.7. Если все пропускные способности дуг являются
целыми числами, то максимальный поток [, построенный алго-
ритмом 4.6, — целочисленный, т. е. ((е) является целым числом
для каждой дуги е.
4.3. Наибольшие паросочетания
в двудольных графах
Паросочетанием в неориентированном графе О = <!/,/?> на-
зывается произвольное множество ребер М Е, такое что ни-
какие два ребра из М не инцидентны одной вершине. Другими
словами, М есть паросочетанне, если для каждых двух ребер
в1, е2 М имеем либо е\ = е2, либо в1Г)е2 = 0. Для каждого
ребра {и, ц} е М мы говорим, что М сочетает и с V, а каждую
вершину, не принадлежащую ни одному ребру паросочетания,
будем называть свободной. Особенно интересны задачи, связан-
ные с паросочетаниями в двудольных графах, т. е. в неориенти-
рованных графах О=<1/, Е), таких что множества их вершин
можно разбить на непересекающиеся множества У = Х0У,
Х(]У = 0, причем каждое ребро ее Е имеет вид е={х, у}, где
хеХ, г/е У (см. задачу 4.15). Двудольный граф будем обозна-
чать <Х, У, Е} (это обозначение предполагает фиксацию некото-
рого разбиения множества вершин па множества X и У — оно не
определяется однозначно через множества V и Е).
В этом разделе мы займемся задачей нахождения наиболь-
шего паросочетания в заданном двудольном графе. Это класси-
ческая задача комбинаторики, известная также под названием
«задачи о супружеских парах». Такое название связано со сле-
дующей интерпретацией. Пусть X и У — соответственно множе-
ства юношей и девушек, и пусть {х,у}^Е означает, что юноша
х знаком с девушкой у. Тогда каждое паросочетание М соот-
ветствует возможному множеству супружеских пар, в котором
каждая пара образована из юноши и девушки, знакомых между
собой, причем каждый человек участвует не более чем в одной
паре.
Оказывается, что задачу нахождения наибольшего паросоче-
тания в двудольном графе можно простым способом свести к
построению максимального потока в некоторой сети. Пусть
Н — <Х, У, Е} — произвольный двудольный граф. Построим сеть
8(Н) с источником 5, стоком г ($ =/= I и 5, У), множеством
вершин
г={$, оихиг,
множеством дуг
Е* = {($, х): х <= X} II {{у, у <= У}
У {{х, у}-. х^Х Л У <^У Л {х, у} е Е}
и пропускной способностью с (и, у)=1 для каждой дуги
(и, и> е Е*.
Рис. 4.3. Построение сети Ь(Н) для двудольного графа И и нуль-единичный
поток, соответствующий паросочетанию М = {{хь у2}, {*з» Уб}, Уз}}-
На рис. 4.3 показано построение сети 5 (Я) для некоторого
двудольного графа.
Отметим, что согласно теореме 4.7 в 8(Н) существует макси-
мальный нуль-единичный поток, т. е. максимальный поток /, та-
кой что /(е) = 0 или /(е)=1 для каждой дуги е^Е*.
Теорема 4.8. Существует взаимно однозначное соответствие
между паросочетаниями в Н и нуль-единичными потоками в
8(Н)9 при котором паросочетанию М = {{хь г/1}, ..., {хк, у*}}
мощности к (х, е X, у[ е У для 1 I к) соответствует поток
1м величины й, определяемый следующим образом:
!м (5, хд = [м (хо у{) = }м (у1г 0=1, 1 СI < (4.11)
и [м(е) = 0 для остальных дуг е сети 8(Н); потоку [ величины к
соответствует паросочетание |Л14 = й, определяемое сле-
дующим образом:
М} = {{х, у}: хеХДуеГ Л/(х, (4.12)
Доказательство. Если М=((Х1,#1}.....{хк, Уь}}—паросо-
четание мощности й, то вершины х\> ...» хъ> а также у\, уь
попарно различны. Отсюда сразу же следует, что 01У/Л1(х/) =
= = 0, 1</<й, т. е. функция /м, определяемая фор-
мулой (4.11), является потоком из $ в / в 3(Я). Легко заметить
также, что разным паросочетаниям М соответствуют разные по-
токи /м. С другой стороны, если / — нуль-единичный поток в
5(Я), то количество потока, прибывающего в (а следовательно,
и вытекающего из) каждую вершину хеХ, не превосходит еди-
ницы (единственная дуга, входящая в х,— это дуга <$, х> с про-
пускной способностью, равной 1). Отсюда следует, что в мно-
жестве определяемом (4.12), нет ребер вида {х, у\}, {х, г/2},
У1 =^= у2. По аналогичным причинам в М/ нет ребер вида
{х^у}, {*2, */}, Х1#=Х2. Следовательно, М; является паросочета-
нием в Я. Нетрудно также отметить, что отображение
является обратным к отображению т. е. / и
М<=М.
* м
Теорема 4.8 позволяет использовать произвольный алгоритм
построения максимального потока (целочисленного) для опреде-
ления максимального паросочетания. Используя алгоритм 4.6,
мы находим наибольшее паросочетание за О(п3) шагов. Ока-
зывается, однако, что особая форма сети 8(Н) позволяет по-
строить более эффективный алгоритм. Этот алгоритм, авторами
которого являются Хопкрофт и Карп [33], использует общую
схему Диница, т. е. состоит из фаз, соответствующих увеличе-
нию потока вдоль кратчайших увеличивающихся цепей опреде-
ленной длины. Особый вид сети позволяет, однако, как ограни-
чить число фаз, так и построить более эффективный алгоритм
построения псевдомаксимального потока в каждой фазе.
Отметим сначала, что каждая увеличивающая цепь в 8(Н)
будет нечетной длины и будет состоять после отбрасывания пер-
вой и последней дуг из последовательности попеременно чере-
дующихся согласованных и несогласованных дуг (начинающей-
ся и заканчивающейся согласованной дугой). Для данного па-
росочетания М мы будем называть чередующейся цепью (длины
I = 2й 4“ 1 из X в У) относительно М произвольное множество
дуг Р Е вида
Р = {{*0. 01). {у\, *1). у*}, {Ук, хк), {хк, ук+1}}, (4.13)
где к > 0, все вершины х0, .Хк, у\, ...» ук+\ различны,
Ло — свободная вершина в X, ук+\ — свободная вершина в У,
каждая вторая дуга принадлежит М, т. е.
РДМ = {{//!, х^, {у2, х2}, ..., {ук, хк}}.
Очевидно, что чередующуюся цепь можно однозначно опреде-
лить последовательностью Хо, Уь Х1,у2, ...» Ук, Хк, Ук+ь Разу-
меется, что при описанном в теореме 4.8 соответствии между
паросочетаниями в Н и нуль-единичнымп потоками в сети 8(11)
чередующаяся цепь (4.13) естественным образом соответствует
некоторой увеличивающей цепи относительно потока /м в 8(Н),
а именно цепи
5, <5, х0), х0, (х0, У{), У1, <*1> !/1>. хи (х1г у2), у2, ...
Ук, <*к, Ук), Хк, (Хк, ук+\), ук+1, (ук+1, I), I,
причем увеличение потока /м вдоль этой цепи дает поток, соот-
ветствующий паросочетанию, определенному симметрической
разностью М Ф Р. Это проиллюстрировано на рис. 4.4.
Л/ Р М®р
Рис. 4.4. Увеличение паросочетания М вдоль чередующейся цепи Р.
Из приведенных выше рассуждений непосредственно выте-
кает следующая теорема.
Теорема 4.9 (Берж). Паросочетание М в двудольном графе
Н наибольшее тогда и только тогда, когда в Н не существует
чередующейся цепи относительно М. Я
Рассмотрим, как выглядит псевдомаксимальный поток во
вспомогательной бесконтурной сети, построенной для сети 8(Н)
и некоторого целочисленного, а следовательно, нуль-единичного
потока в этой сети. Потенциал каждой вершины, отличной от 5
и /, составляет 0 или 1, так как входной потенциал каждой
вершины хеХ и выходной потенциал каждой вершины уЕ У,
во вспомогательной сети равен единице. Нетрудно заметить, что
«увеличивающая кратная цепь», найденная на каждой итерации
главного цикла процедуры МАХР8А (см. предыдущий раздел),
имеет вид одиночной увеличивающей цепи. Более того, все про-
межуточные вершины (т. е. отличные от 5 и /) такой цепи имеют
потенциал, равный единице, а, следовательно, при увеличении
потока вдоль этой цепи их потенциал убывает до нуля и они
удаляются из сети. Теперь ясно, что во вспомогательной бескон-
турной сети длины / + 2 поток идет вдоль максимального мно-
жества путей длины / + 2 из 5 в / с попарно непересекающимися
множествами промежуточных вершин. Этому множеству есте-
ственным образом соответствует максимальное множество чере-
дующихся цепей длины / с попарно непересекающимися множе-
ствами вершин (под «максимальным» мы подразумеваем такое
множество, которое нельзя увеличить на дополнительную че-
редующуюся цепь длины / и на множество вершин, не содер-
жащее ни одной вершины прежних цепей).
Ниже детально описан алгоритм 4.10, носящий имя Хопк-
рофта — Карпа. В этом алгоритме вспомогательная бесконтур-
ная сеть, а точнее вспомогательный бескоитурный граф, по-
скольку пропускные способности всех ребер равны единице,
строится при помощи процедуры РОА. Чтобы объяснить ее дей-
ствие, удобно ввести в рассмотрение для данного двудольного
графа Н = <Х, У, Е) и паросочетания М в Н ориентированный
граф Нм посредством ориентации всех ребер е^М от У к X и
всех ребер е Е\М от X к У (пути в Нм от свободной вер-
шины в X до свободной вершины в У в точности соответствуют
чередующимся цепям относительно Л4). Процедура РОА сначала
строит дуги от источника 5 до всех свободных вершин х е X
(строки 6 4-10). Далее проводится поиск в ширину в графе Нм>
начиная от свободных вершин в X. При нахождении каждой сво-
бодной вершины у^У добавляем во вспомогательный бескон-
турный граф дугу <г/, I) (строки 14 4- 17), причем с момента до-
бавления первой такой дуги мы уже в процессе поиска не рас-
сматриваем вершин, находящихся на расстоянии, большем или
равном расстоянию от $ до / (см. условие в строке 20). Увели-
чение существующего паросочетания вдоль максимального мно-
жества кратчайших увеличивающих цепей с попарно различ-
ными множествами вершин реализуется процедурой ФАЗА. Она
ведет поиск в глубину во вспомогательном бесконтурном графе,
начиная с 5. Главный цикл в строке 40 напоминает нерекурсив-
ную процедуру поиска в глубину №01 (см. 2.2). Каждый раз,
когда в нашем процессе мы достигаем стока I (см. строку 50),
содержимым стека СТЕК, является последовательность вершин,
представляющая некоторую чередующуюся цепь (отметим, что
сток I не помещается в СТЕК, тем самым все время НО^
ВЫИ\Т\ = истина и, следовательно, / может посещаться много-
кратно). Цикл 52 выполняет модификацию массава СОЧЕТ,
соответствующего увеличению паросочетания вдоль такой цепи.
Отметим, что если во время выполнения нашей процедуры
некоторой вершине V е V приписывается значение НО-
ВЫИ\у] :=ложь, то эта процедура либо находит затем чере-
дующуюся цепь, проходящую через эту вершину, либо устанав-
ливает, что не существует ни одной цепи, проходящей через
эту вершину и не пересекающей ни одной из ранее найденных
цепей. Отсюда легко следует, что процедура ФАЗА находит
максимальное множество непересекающихся кратчайших чере-
дующихся цепей. Корректность всего алгоритма следует из ана-
лиза метода Диница, проведенного в предыдущем разделе.
Алгоритм 4.10. (Нахождение наибольшего паросочетания
методом Хопкрофта — Карпа.)
Данные: Двудольный граф Я = <Х, У, Е), представленный
списками инцидентности ЗАПИСЬ[х], х^Х,
Результаты: Наибольшее паросочетание, представленное мас-
сивом СОЧЕТ (СОЧЕТ [V] есть вершина, соче-
тающаяся с V или с нулем, если V — свободная
вершина).
1 ргоседиге РСА\
(♦построение вспомогательного бесконтурного графа; пере-
менные V, XV, X, У, СОЧЕТ, ЗАПИСЬ, ХЗАПИСЬ, 8,
I — глобальные *)
2 Ье&т
3 Тог /} до (* инициализация *)
4 Ьеб1п ДЛИНА [и] := оо; ХЗАПИСЬ [и] := 0
5 епд;
(* поместить свободные вершины х е X в очередь и в спи-
сок ХЗАПИСЬ [5] *)
б ОЧЕРЕДЬ-.= 0\ ХУ :={$}; ДЛИНА [$]:=0;
7 Гог х е X до
8 И СОЧЕТ [х] = 0 ТЬеп (* х — свободная *)
9 Ьеб>п ОЧЕРЕДЬ<= х\
ХЗАПИСЬ [5] := ХЗАПИСЬ [5] 0 {х}; ДЛИНА [х] := 1
10 епд;
(* поиск в ширину, начиная со свободных вершин в X *)
11 \уЫ1е ОЧЕРЕДЬЮ 0 до
12 Ье$1п и<= ОЧЕРЕДЬ', ХУ := ХУ Щи};
13 И и е У ТЬеп
14 1Г СОЧЕТ [и] = 0 ТЬеп (* и — свободная, добавить
дугу (и, I) *)
160
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Ьееш ХЗАПИСЬ [и] := ХЗАПИСЬ [и] 11 {/};
ДЛИНА [/] :=ДЛИНА [м] + 1
епд
еке (*СОЧЕТ\и\ 0*)
Ье^'п х:=СОЧЕТ\и\;
И ДЛИНА [/] — оо 1Ьеп (* добавить дугу (и, х) *)
Ьеет ОЧЕРЕДЬ^х;
ХЗАПИСЬ [и] := ХЗАПИСЬ [и] 0 (х);
ДЛИНА [х] = ДЛИНА [«] + 1
епд
епд
еке (* и е X *)
Тог у е ЗАПИСЬ [и] до
И ДЛИНА[и]<ДЛИНА[у] 1Ьеп
(* ДЛИНА[у] = ДЛИНА[и] + 1 или оо*)
Ье^т И ДЛИНА[//] = оо 1Неп ОЧЕРЕДЬ<=у;
(* у — новая *)
ХЗАПИСЬ [м] := ХЗАПИСЬ [и] 0 {у};
ДЛИНА [//] := ДЛИНА [и] + 1
епд
епд
епд; (* Р6А *)
ргоседиге ФАЗА;
(* увеличение существующего паросочетания вдоль макси-
мального множества путей из $ в / с попарно различ-
ными множествами промежуточных вершин во вспомо-
гательном бесконтурном графе; переменные XV, НА ЧАЛО,
ХЗАПИСЬ, СОЧЕТ, 5, / — глобальные*)
Ьее1п
Тог и^ХУ до (* инициализация *)
Ье&1п НОВЫЙ [м] := истина;
Р[и]:= НАЧАЛО[и\ (* НАЧАЛО [и] = указатель на
начало списка ХЗАПИСЬ [«]; Р[м] = указа-
тель на фактически анализируемый элемент
списка ХЗАПИСЬ [м] *)
епд;
(* поиск в глубину во вспомогательном бесконтурном
графе, начиная с источника $*)
СТЕК:=0; СТЕК^з; НОВЫЙ [$] := ложь;
мгНПе СТЕК 0 до (*главный цикл*)
Ье&1п и-.= 1ор (СТЕК); (*и = верхний элемент стека*)
(♦отыскание первой новой вершины в списке
ХЗАПИСЬ [и] *)
ИР[и] —п11 4Ьеп 6:=ложь е!зе 6;=по1
НОВЫИ(Р\и\\. верш];
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
уукПе Ь до
Ьедт Р [и] := Р [и]]', след',
ИР[и] = п‘|| !Ьеп 6:=ложь
еке Ь := по! НОВЫЙ [Р [и]|. верш]
епд;
И Р [и] =/= п П !Иеп (* найдена новая вершина*)
И Р [и]|. верш — I !Ьеп (* найдена чередующаяся
цепь *)
(♦увеличениесуществующего паросочетания вдоль
чередующейся цепи, хранящейся в стеке *)
чуЫ1е 1ор (СТЕК) в до
Ье&1п у с СТЕК; х<=СТЕК;
СО ЧЕТ [х]:—у, СОЧЕТ[у]'—х
епд
(* в стеке остался только источник 5 *)
е!зе (* Р [и]|. верш / *)
Ьедт V :== Р [ы]|. вериг, СТЕК<=о;
НОВЫЙ [о] :=ложь
епд
е!зе (*Р[и] = пП, т. е. в списке ХЗАПИСЬ[и] уже
нет новых вершин *)
и<=СТЕК (*удалить верхний элемент стека*)
епд
епд; (* ФАЗА *)
Ье&1п (* главная программа *)
Тог V е V до СО ЧЕТ [о] := 0; (* инициализация; паросо-
четание — пустое *)
РОЛ; (* построение вспомогательного бесконтурного
графа *)
гереа! ФАЗА; РОА
ип!11 по! XV [/]
епд
Большая эффективность алгоритма Хопкрофта — Карпа объ-
ясняется тем, что порядок числа фаз есть -у/п- Для доказатель-
ства ограниченности числа фаз нам будет необходима следую-
щая лемма.
Лемма 4.11. Пусть М и Й— два паросочетания в двудольном
графе Н = <Х, У, Е), и пусть |М| = г<5=|М|. Тогда сим-
метрическая разность М Ф Й содержит не менее в — г чередую-
щихся цепей относительно М с попарно различными множества-
ми вершин.
Доказательство. Рассмотрим граф Н* = <Х, У, М Ф Й) и
обозначим через С>, ..., Ср компоненты связности этого графа.
Каждая вершина графа Н* принадлежит не более чем одному
ребру из М\№ и не более чем одному ребру из М\М (так как
М и М — паросочетания). Отсюда следует, что каждая компо-
нента связности С{ имеет один из трех следующих видов:
(1) изолированная вершина;
(2) цикл четной длины с ребрами попеременно из М\№
и М\М;
(3) цепь с ребрами попеременно из М\М и М\Л1 (это не
обязательно чередующаяся цепь: оба ее конца могут принадле-
жать X или оба У).
Обозначим через Е/ множество ребер компоненты С[ и рас-
смотрим величину б/= |Е, П ЛЧ — | Е' А М |. Имеем б,е{—1,0,1},
причем б,= 1 тогда и только тогда, когда С/ — чередующаяся
цепь относительно М. Более того, б1 = 1 для не менее чем
5 — г указателей, так как
р р р р
1(|^плп-1^пм|)= Е|^плч - 1|^пм|=
1 = 1 1 = 1 1=1 I=1
= |ЛГ\М| —|Л4\ЛГ| = |ЛГ| —|Л1| = $ —г.
Этим доказательство леммы закончено.
Теперь мы можем приступить к доказательству существова-
ния объявленного ограничения на число фаз алгоритма Хоп-
крофта — Карпа.
Теорема 4.12. Число фаз алгоритма Хопкрофта— Карпа не
превышает 2 + 1» где 5 — наибольшая мощность паросоче-
тания в данном графе.
Доказательство. Обозначим через Ро, Р\, . ., Р$-\ последо-
вательные чередующиеся цепи, построенные алгоритмом, и оп-
ределим Мо = 0, М< = М[-\ Ф Р[_\ для 1 I 5. Согласно
алгоритму Р[ является чередующейся цепью относительно ЛГ,
и мы уже знаем, что | Ро| | Р\ | ... | Р$-\ | (см. лемму 4.4).
Число фаз — это не что иное, как количество различных чисел
в последовательности |Р0|, |^-1|. Обозначим г = [$ —
и пусть г* — такой наименьший индекс, что | | = | Рг |. Со-
гласно построению вспомогательного бесконтурного графа
Рг* — кратчайшая чередующаяся цепь относительно Мг* (фак-
тически Р[ — это кратчайшая чередующаяся цепь относительно
М[ для каждого /, но этот факт требует доказательства, см. за-
дачу 4.11). По лемме 4.11 существует по крайней мере
| М31 — | Мг* | = 5 — г*непересекающихся чередующихся цепей от-
носительно УИг*, следовательно, кратчайшая чередующаяся цепь
относительно Мг* содержит не более чем г*/(5 — г*) ребер паро-
сочетания Мг*.
Отсюда
|Рг| = |Рг-|<^-7+1<^-+1=24тп^ + 1 =
5 — Г 8 — Г | V 5 I
= ТТл - 1 <2 7* - 1 <2[Т^ + 1.
I <$|
Длина каждой цепи нечетная, а, следовательно, последова-
тельность |Р0|, •••, |Рг| содержит не более чем 1л/$1+1 раз-
личных чисел. Последовательность |Л+1|, ...» |Р$-1| может
содержать не более чем (5— 1) — (г + 1) + 1 = 5 — г— 1 =
= р\А$"1“~ 1<1лД] других чисел, что в сумме дает требуемое
ограничение 21.7$]+I.
Теперь легко оценить сложность всего алгоритма 4.10. Как
поиск в ширину в процедуре РОА, так и поиск в глубину в про-
цедуре ФАЗА требуют 0(ги4-я) шагов, что при числе фаз
порядка д/пДает общую сложность О ((/и + п) п) или, если
использовать только число вершин в качестве размерности за-
дачи, О(м5/2).
Стоит отметить, что известен алгоритм построения наиболь-
шего паросочетания в произвольном необязательно двудольном
графе со сложностью О(п5/2) (см. [19]). Однако этот алгоритм
несравненно более сложный. Алгоритм для двудольного графа,
отличный от представленного здесь, предложил Галил в [26].
4.4. Системы различных представителей
Пусть <А1, ..., Ап) — произвольная последовательность мно-
жеств (необязательно непересекающихся и необязательно раз-
личных). Системой различных представителей для <АЬ ..., Ап)
будем называть такую произвольную последовательность
<01, ..., 0л>, что 0/ е А/, 1 I п, и 0/ У= 0/ для I =# /. Мы бу-
дем говорить, что в такой системе различных представителей
элемент 0/ представляет множество А/. Проблема существова-
ния и построения системы различных представителей известна
во многих неформальных постановках. Одна из них — это так
называемая «задача о комиссиях». Имеется п комиссий, причем
А/ — множество членов 1-й комиссии. Нужно в каждой комиссии
выбрать председателя так, чтобы ни один человек не был пред-
седателем более чем в одной комиссии.
Нетрудно заметить, что задача о комиссиях сводится к част-
ному случаю задачи о супружеских парах. Действительно, соз-
дадим множества
х=д,и...ил„={х1>.... хт}, (4.14)
У = {Уь ...» Уп) (4.15)
(элементы , хт, у\, ..., уп попарно различны) и
Е = {{х1> У(}'- I Л 1 < / < П Д х1 €= Д7}. (4.16)
Очевидно, что каждая система различных представителей
<Дь ...» Оп> однозначно соответствует паросочетанию мощности
п в двудольном графе Я = <Х, У, Е>, а именно паросочетанию
{{01, У\}...{ап,уп}}.
Принимая во внимание тот факт, что граф Н имеет т-\- п,
п
вершин и ЕМ/1 ребер, получаем
Следствие 4.13. Для данной последовательности множеств
<Д1, ..., Дл> можно найти систему различных представителей
или установить, что такой системы не существует, за время
о(уЯ1|Л/|).
Доказательство. Число фаз в алгоритме Хопкрофта — Кар-
па, примененном к графу Н, не превышает 2[д/л] + 1 (см. тео-
рему 4.12). Отсюда число шагов алгоритма имеет порядок
+ Х1Д/1))- Можно предполагать, что все множе-
ства Д/ непустые, в противном случае очевидно, что системы
различных представителей не существует. При таком предпо-
п п
ложении п + У, I Д/ | 2 У, \А, |, что дает требуемую оценку
/=1 /=1
сложности алгоритма.
Докажем теперь классическую теорему Ф. Холла [30], даю-
щую необходимое и достаточное условие существования си-
стемы различных представителей для данной последовательно-
сти множеств.
Теорема 4.14. Система различных представителей для по-
следовательности <Д1, ..., Дл> существует тогда и только тогда,
когда
| 0 Ду|>|/| для каждого /^{1, ..., п}. (4.17)
Доказательство. Если существует система различных пред-
ставителей <аь ..., ал>, то для каждого ] имеем
Предположим теперь, что для <ДЬ ..., Дл> не существует си-
стемы различных представителей, и рассмотрим наибольшее па-
росочетание М в графе /7=<Х, У, Е), соответствующем после-
довательности <Дь ..., Ап) (см. формулы (4.14), (4.15), (4.16)).
Очевидно, что |М| и, а следовательно, в У существует сво-
бодная вершина, допустим 60. Обозначим через Хо множество
тех вершин х^Х, до которых существует «частичная чередую-
щаяся цепь» из йо вида
6о, «1, ак,
где к 1, ак = х, {а/, Ь^} е М для 1 I к — 1 и {&/-1, а^} <=
^.Е\М для 1^/^й. Очевидно, что Хо не содержит свобод-
ных вершин, поскольку такая вершина соответствовала бы че-
редующейся цепи вопреки предположению, что М — наибольшее
паросочетание. Пусть Уо будет множеством вершин, сочетаемых
посредством М с вершинами из Хо. Обозначим ] = {/: 1^/^м
Аг/У е УоО {60}}. Нетрудно заметить, что
и а,=х0
/е/
и, следовательно,
|ДЛ/| = |ХО1 = |УО1 = 1Л-1<1Н
т. е. условие (4.17) не выполняется.
Очевидно, что теорема Холла не имеет большого значения
с алгоритмической точки зрения, так как проверка условия
(4.17) требует рассмотрения всех 2п возможных множеств
Докажем еще одну теорему, связанную с паросочетаниями
в двудольном графе. Назовем вершинным покрытием в графе
О = <1/, Е) такое произвольное множество Р V, что каждое
ребро е^Е инцидентно с некоторой вершиной из множества Р.
Отметим, что Р является вершинным покрытием тогда и только
тогда, когда У\Р есть независимое множество вершин, т. е.
множество вершин, в котором никакие две не связаны ребром.
В дальнейшем нас будут интересовать наименьшие по мощности
вершинные покрытия в двудольных графах.
Пусть М — наибольшее паросочетание в двудольном графе
Н = <Х, У, Е), и пусть А — множество вершин а е ХО У, до-
стижимых из свободных вершин в X при помощи «частичных
чередующихся цепей», определенных аналогично тому, как это
сделано в доказательстве теоремы Холла.
Лемма 4.15. Если граф Н не содержит изолированных вер-
шин, то Р = (Х\Л) 0 (У П А) является минимальным вершин-
ным покрытием, а М = (X А А)1)(У\А)— максимальным неза-
висимым множеством вершин,
Доказательство. Сначала покажем, что Р является вершин-
ным покрытием. Предположим, что некоторое ребро {х, у} Е,
х^ X, у У, не будет инцидентным ни с одной из вершин мно-
жества Р. Это означает, что х^А и у ф. А. Включение
{х, у} еМне может иметь места, ибо в таком случае вершина х
может быть достижима только с помощью цепи, проходящей
через у, что вызвало бы у^А. Однако и ситуация, в которой
{х, у}^Е\М, также невозможна, так как цепь, достигающую
х, можно было бы увеличить на ребро {х, у}, что снова вызы-
вало бы у^А. Полученное противоречие доказывает, что Р
является вершинным покрытием. Отметим, что ни одна вершина
в Р не является свободной. Для вершин из Х\4 это вытекает
непосредственно из определения множества Д, а для вершин
из У П А из того, что свободная вершина в У Г) А соответство-
вала бы чередующейся цепи относительно М вопреки нашему
предположению о максимальности |Л4|. Подобным же образом
доказываем, что не более одной вершины произвольного ребра
{х, у}^М принадлежит множеству Р\ если у^ У А 4, то хеЛ
и тем самым х^Р. Отсюда следует, что | Р | | М |. Однако
каждое вершинное покрытие по определению должно содержать
не менее одной вершины каждого ребра, а для ребер паросоче-
тания очевидно, что эти вершины попарно различны. Следова-
тельно, всегда должно выполняться |Р|^|Л4|, что доказывает
минимальность нашего вершинного покрытия и равенство |Р| =
= |Л4|. Вторая часть леммы вытекает из первой в силу наших
предыдущих замечаний и из того, что М = (X А У)\Р.
Отметим следствие из приведенного выше доказательства;
заметим, что изолированные вершины не оказывают никакого
влияния ни на паросочетания, ни на вершинные покрытия.
Следствие 4.16. В произвольном двудольном графе мини-
мальная мощность вершинного покрытия равна максимальной
мощности паросочетания.
Следует дать здесь другую формулировку, эквивалентную
приведенной выше, — формулировку в терминах 0-1-матриц.
Под линией такой матрицы мы будем понимать ее строку или
столбец. Теорема, приводимая ниже, часто называется также
«венгерской теоремой».
Теорема 4.17 (Кениг и Эгервари). Для произвольной 0-1-мат-
рицы максимальная мощность множества (появлений) единиц,
из которых никакие две не лежат на одной линии, равна мини-
мальному числу линий, которыми можно покрыть все единицы.
Доказательство. Для данной 0-1-матрицы А = [а//] с п стро-
ками и пг столбцами построим двудольный граф /7 = <Х, У, Е),
где X {%1, ..., хп}, У = {</ь ..., ут} и
Е={{х^ у^}: 1</<лД 1^/Ч^Л и/;.= 1;.
Легко отметить, что множества единиц в А, никакие две из
которых не лежат на одной линии, в точности соответствуют
паросочетанию в /7, а каждое множество линий в А, покрываю-
щих все единицы, представляет вершинное покрытие в Н. Сле-
довательно, наша теорема является просто другой формули-
ровкой следствия 4.16.
На рис. 4.5 представлен двудольный граф с максимальным
паросочетанием и минимальным вершинным покрытием, а также
представлена соответствующая 0-1-матрица, иллюстрирующая
венгерскую теорему.
Рис. 4.5. Иллюстрация венгерской теоремы.
Отметим, что множество Д, появляющееся в лемме 4.15»
можно найти за время О(|ХЦ-| У| + |7?|), используя поиск в
глубину (или в ширину). Если мы воспользуемся алгоритмом
Хопкрофта — Карпа и заметим, что каждую изолированную вер-
шину можно удалить из произвольного вершинного покрытия и
можно добавить к каждому независимому множеству вершин»
то получим следствие:
Следствие 4.18. Как, минимальное вершинное покрытие, так
и максимальное независимое множество вершин в произвольном
двудольном графе Н = (X, У, Е> могут быть найдены за время
О ((/и + п) 'у/п)* где п = | X 0 У | и пг = | Е |.
Следует отметить, что для задач, приведенных выше, не из-
вестен ни один полиномиальный алгоритм для случая пронз
вольных, не обязательно двудольных графов.
В заключение этого параграфа займемся задачей существо-
вания общей системы различных представителей для двух по-
следовательностей множеств <Л1, Ап) и <ВЬ Вп). Рас-
смотрение такой системы как просто системы различных пред-
ставителей как для первой, так и для второй последовательно-
сти не дает ничего интересного: ситуация сводится просто к рас-
смотрению последовательности <Л Г) Вь ..., Аг А Вп). Поэтому
мы определим общую систему различных представителей для
наших последовательностей как произвольную последователь-
ность ап), обладающую тем свойством, что существует
перестановка а множества {1, .... п), такая что (щ, ап)
является системой различных представителей для <Д1, Ап)
и для Ва(л)>- Задача существования и построения
такой системы легко сводится (см. [23]) к построению макси-
мального нуль-единичного потока тем же способом, что и для
нахождения паросочетания. Соответствующая сеть имеет мно-
жество вершин
V = {5,1} II {*1, .... х„}и{и(..ит} II {»!, .... «т}11{г/1,
где Д11) ... ОАп 11В1 0 ... |_| = {г\, ..., гт}. Вершина х,- со-
ответствует множеству Д/, вершина у/ — множеству В/, а вер-
шина и/, так же как и вершина о/,— элементу 2/. Множество
дуг сети определяется следующим образом:
Е = {<5, Х;>: 1 </ < п} и {<хь щ): 1 </< п Д 1 Д е
и{<ир Цу): 1 </<"011
и 1 </<™л 1 </<п д во
ЩО/р/):!</<"},
причем все дуги имеют пропускную способность, равную еди-
нице. Предоставляем читателю доказательство того, что общая
система различных представителей существует тогда и только
тогда, когда в описанной выше сети существует поток величины
п, а также уточнение деталей алгоритма нахождения такой си-
Л,| + | В, |))
стемы со сложностью
(см. задачу 4.19).
Очень прост случай, когда как <Д1, .Дл>, так и {В\, ...
..., Вп) определяет разбиение некоторого множества на блоки
одинаковой мощности.
Теорема 4.19. Пусть А\ [] ... [] Ап = [] ... 0 Вп = X, | А | =
= |В/| = й для 1</<м и | X | = пк. Тогда существует к об-
щих систем различных представителей, которые в сумме исчер-
пывают все элементы множества X.
Доказательство. Построим двудольный граф /7 = <Х, У,
где X = {л:,, ...,хп},У= {у\..уп},
^ ={{*>•> У/}- 1 /<пЛ ЛЙЗ/ =/= 0}-
Покажем, что в графе Н существует паросочетание мощности
п. Действительно, для произвольного 7^{1, ..., п} сумма
0 содержит в точности |/|/г элементов и в результате пе-
/е ]
ресекается по крайней мере с |7| из множеств ..., Вп. Сле-
довательно, существование заданного паросочетания вытекает
из теоремы Холла (см. теорему 4.14). Пусть наше паросочета-
ние сочетает х, с у0(/), 1 I п. Множества С/ = Л/ П
1 непусты и не пересекаются, а следовательно, выби-
рая произвольные элементы Л/бС, 1 I м, получаем об-
щую систему различных представителей <аь ..., ап}. Удалив
элементы а/, 1 I п9 из множеств Дх и В/, 1 I п, полу-
чаем ситуацию, идентичную первоначальной, с той разницей,
что мощность всех множеств уменьшена до к—1. Повторив
приведенное выше построение к раз, получаем к систем раз-
личных представителей, о которых речь идет в теореме.
Покажем теперь применение этой теоремы к теории комму-
тационных сетей, используемых в телефонной связи. Предполо-
жим, что даны два множества «абонентов» X и У, и пусть
|Х| = |У| = ЛЛ Наша задача — составить проект установки, со-
стоящей из одиночных переключателей, которая могла бы реа-
лизовать систему связей, определенную взаимно однозначным
отображением ср: Х->У. Такую установку мы будем называть
перестраиваемой сетью размерности МХМ. Предположим, что
каждый переключатель может находиться в одном из двух со-
стояний: замкнут и разомкнут. Самым простым решением, тре-
бующим однако № переключателей, является использование
отдельного переключателя между каждой парой абонентов
<%,//>еХХУ- Реализация отображения <р основывается на
замыкании переключателей для пар <х, ср(х)>, х^Х, при раз-
мыкании всех остальных. Такую установку будем называть
коммутатором размерности
Отметим, что каждая перестраиваемая сеть может реализо-
вывать все ЛИ (взаимно однозначных) отображений X на У,
следовательно, она должна иметь не менее чем ЛИ возможных
состояний. Поскольку состояние определяется комбинацией
частных (с двумя состояниями) переключателей, то число пере-
ключателей должно быть не менее чем 1о^ У! = Й(ЛИо^М).
Далее будет показано, что существует перестраиваемая сеть,
содержащая О(ЛПо^У) переключателей.
Предположим, что М = пк, где п и к — целые числа, боль-
шие единицы. Трехсекционную сеть Клоса (см. [4], [7], [50])
типа <м, к} мы строим из трех секций: первой, состоящей из п
коммутаторов размерности &Х^, второй, состоящей из к ком-
мутаторов размерности пХ«, и третьей, состоящей, как и пер-
вая, из п коммутаторов размерности к X к. Эти секции соеди-
нены между собой следующим образом: /-й выход /-го комму-
татора первой секции соединен постоянно с /-м входом ^’-го ком-
мутатора второй секции, а /-й вход /-го коммутатора третьей
секции соединен с /-м выходом г-го коммутатора второй секции
Секция У Секция 2 Се к ц ия 3
Рис. 4.6. Трехсекционная сеть Кдоса типа (3, 2).
для 1 I п, 1 к. Трехсекционная сеть Клоса типа
<3, 2> показана на рис. 4.6.
Теорема 4.20 (Слепян [62], Дигид [10]). Трехсекционная
сеть Клоса является перестраиваемой сетью.
Доказательство. Пусть ср — произвольное взаимно однознач-
ное отображение X на У. Обозначим через множество входов
/-го коммутатора первой секции, через — множество выхо-
дов /-го коммутатора третьей секции и
= {х е X: ср (х) е СД.
Очевидно, что множества Дь ..., Ап, как и множества
61, ..., Вл, определяют два разбиения множества X на блоки
мощностью к каждый. В силу теоремы 4.19 множество X можно
представить в виде прямой суммы Л' = Л’1Ц| ... Щ Хк, где каж-
дое из множеств X/ является множеством элементов некоторой
общей системы различных представителей для <Д1, ...» Д«>
и <Вь ..., Вл>. Отметим, что для /=1, ...» к «абонентов» из
множества X/ мы можем соединить с соответствующими «або-
нентами» в У через /-й коммутатор центральной секции. Дей-
ствительно, пусть X/= {аь..., ал}, где и а/еВ^,
т. е. ф(а1)= Са(1) для и некоторой перестановки а
множества {1, п}. Коммутаторы первой секции, содержа-
щие ...» ап, как и коммутаторы третьей секции, содержащие
ф(Я1), <р(ал), попарно различны, а следовательно, для 1 =
= 1, п мы можем построить цепь, реализующую соедине-
ние с ср(аг), соединяя Я| с /-м выходом г-го коммутатора пер-
вой секции, затем 1-й вход с а(г)-м выходом /-го коммутатора
второй секции и, наконец, /-й вход а(г)-го коммутатора третьей
секции с ср (а,).
На рис. 4.6 жирной линией показано соединение, реализую-
щее следующее соответствие ср:
ф(*1) = */4. ф(^) = ^2, ф(*з) = */5.
ф(Х4) = 06. Ф (х5) = у3, ф(Х6) = Г/1
= {хн Х3> Х6}, Х2 = {Х2> ХА, Х5}).
Предположим теперь, что имеет вид 2р (если это не так,
увеличиваем ДО до ближайшей степени двойки, т. е. до 2Г1°еЛП).
Построим трехсекционную сеть Клоса типа <М/2, 2>. Если каж-
дый из двух коммутаторов средней секции мы заменим затем
трехсекционной сетью Клоса типа <М/4,2>, то очевидно, что
полученная сеть (с пятью секциями) останется перестраивае-
мой. Аналогичные действия мы можем продолжать до тех пор,
пока все коммутаторы не будут размерности 2X2. Нетрудно
заметить, что полученная перестраиваемая сеть состоит из
2р + 1 секций, каждая из которых включает М/2 коммутаторов
размерности 2X2. Следовательно, общее число переключате-
лей равно
(2р + 1) • (М/2) «4 = 2М(2р1) = 2Л^(21оеН+ 1) =
Другим применением теоремы 4.19 является задача состав-
ления расписания занятий. В простейшей наиболее идеализи-
рованной формулировке эта задача представлена некоторым
множеством занятий X мощности пк и двумя разбиениями X =
= 0 ..Жп и Х = 510 ••• и 5п, где 47,- — множество заня-
тий, проводимых /-м преподавателем, а 5/ — множество заня-
тий, проводимых в 1-й аудитории, причем предполагаем, что
I = |5*| = к, 1 п. Построение, проведенное в доказа-
тельстве теоремы 4.19, дает к общих систем различных предста-
вителей для последовательностей <1ГЬ ..., №п> и <51...5л>,
причем эти системы в сумме исчерпывают все множество заня-
тий X. Если, скажем, каждое занятие длится 1 час, то, проводя
занятия, определенные /’-й системой в течение гго часа, / =
= 1, ..., к, мы получаем расписание занятий, в котором все
занятия проводятся в течение к часов, причем все это время
заняты каждая аудитория и каждый преподаватель. На прак-
тике составление расписания занятий является более сложным,
потому что появляются дополнительные ограничения (часто
противоречивые), возникающие, например, из-за того, что неко-
торые учащиеся хотят быть слушателями многих курсов, кото-
рые тем самым не могут проходить одновременно.
4.5. Разложение на цепи
Семейство & подмножеств конечного множества X называ-
ется цепью, если для произвольных имеем А^В или
В^А. Другими словами, является цепью, если это семейство
можно представить как <&={С\, ..., Ск}, где к = |^| и С\ сз
сзС2сз ... сз Ск. В данном параграфе мы займемся разложе-
нием семейства &(Х) всех подмножеств множества X на мини-
мальное число цепей.
Пусть п = |X |. Цепь будем называть симметричной цепью
в ^(Х), если она имеет вид
Сьп/21-! с С\_п/2А-1+ 1 СЗ +
где 0</ <|п/2] и |СН = / для |п/2] — / < I <|п/21 + /.
Покажем теперь построение, которое из разбиения семей-
ства &(Х) на симметричные цепи строит разбиение семейства
^(ХЩа}) (а^Х) на симметричные цепи. Для этого каждую
симметричную цепь Д1 <з А2 сз ... сзДй в ^(Х), принадлежа-
щую нашему разбиению, заменим сначала следующими двумя
цепями в 5*(Х0{а}):
Ах сз Д2сз ... Ак, (4.18)
Ах II {а} сз Л2 Ц {а} сз ... сз Ак 0 {а}. (4.19)
Очевидно, что таким образом мы получаем некоторое раз-
биение семейства ^(ХЩа}) на цепи. Цепи (4.18) и (4.19)
не будут симметричными в ^(ХЩа}), но нетрудно заметить,
что их можно сделать такими, перенеся последнее множество
из второй цепи в первую:
сз Д2 сз ... сз Ак сз Ак II (а), (4.21)
Д1 0 {а} сз Д2 О {а} сз ... сз Ак_{ и {а). (4.21)
Если А=1, то вторая из приведенных выше цепей исчезает,
т. е. все подмножества, появляющиеся в (4.18) и (4.19), мы по-
мещаем в одну симметричную цепь.
Начиная с семейства &(0) = {0}, которое само является
симметричной цепью, и повторяя описанное выше построение
л раз, получаем разбиение семейства &(Х) на симметричные
цепи.
Антицепью в &(Х) будем называть такое произвольное се-
мейство з^^^(Х), что для произвольных Д=/=В,
имеем А^В и В& А. Примером антицепи является
семейство всех ^-элементных подмножеств множества X (0
<й^|Х|). Пусть &(Х) = (ё\и ... 0фр — произвольное раз-
биение семейства &(Х) на непересекающиеся цепи, и пусть
— произвольная антицепь в ^(Х). Ясно, что не более одного
множества Л попадает в каждую из цепей и что отсюда
вытекает Следовательно, имеем
Следствие 4.21. Мощность каждой антицепи в &>(Х) не пре-
вышает числа блоков в произвольном разбиении семейства
^(Х) на цепи.
Если бы нам удалось указать такую антицепь & в &*(Х)
и такое разбиение на цепи &(Х) = &1 0 ... 0^, при котором
|<я^| = р, то очевидно, что было бы максимальной антицепью
в ^(Х), а наше разбиение было бы разбиением семейства
^(Х) на минимальное число цепей. В сущности легко убе-
диться, что такие антицепь и разбиения существуют. Доста-
точно принять з^ = ^1п/2и(Х) (п=|Х|), а в качестве разбие-
ния рассмотреть произвольное разбиение семейства ^(Х) на
симметричные цепи, например разбиение, полученное примене-
нием описанного рекурсивного построения. Это следует из того,
что каждая симметричная цепь содержит в точности одно
[п/2_|-элементное множество. Поскольку цепи не пересека-
ются и покрывают ^(Х), то их должно быть в точности столько,
сколько имеется [п/2_|-элементных подмножеств. Вспомним,
что число ^-элементных подмножеств «-элементного множества
равно биномиальному коэффициенту (см. разд. 1.6), и упо-
рядочим полученные факты.
Теорема 4.22 (Шпернер [63]). Мощность произвольной ан*
тицепи в 0>(Х), \Х\=п, не превышает (и*2и), т. е. &1.П/2.1 (X) —
максимальная антицепь.
Теорема 4.23. Каждое разбиение семейства &*(Х) на сим-
метричные цепи состоит из (ь^) Цепе&> где п= |Х|, и явля-
ется разбиением семейства 0*(Х) на минимальное возможное
число цепей.
Опишем теперь детальную реализацию предложенного ре-
курсивного метода построения разбиения семейства &(Х) на
цепи. Примем Х={1, п} и представим каждую симметрич-
ную цепь в &(Х) записью, содержащей массив Р [ 1 ... п\
и переменные нач и конец, такие что
= {{Р [1], Р [2], Р[<]}: нач конец}.
Кроме того, такая запись содержит указатель след на запись,
представляющую следующую цепь разбиения.
Алгоритм 4.24. (Нахождение разбиения семейства всех под-
множеств множества {1, п} на симмет-
ричные цепи.)
Данные: и.
Результаты: Список записей, каждая из которых представляет
блок разбиения семейства ^({1, ...» п}) на сим-
метричные цепи (разб является указателем на на-
чало этого списка).
I Типс1оп РАЗБИЕНИЕ (й);
(* значением этой функции является указатель на начало
списка записей, каждая из которых представляет собой
симметричную цепь ^(Х), Х = {1, ..., к}\ все записи в
списке определяют разбиение семейства ^(Х) на сим-
метричные цепи *)
2 Ье&1п
3 И к = 0 1йеп (* построение разбиения семейства
^(0) = {0} на симметричные цепи —единст-
венной цепью является {0}*)
4 Ье&1п новый (ш); (* ю = указатель на запись, пред-
ставляющую цепь *)
5 до | до
6 Ье&1п нач:=0; конец := 0; след:=п11
7 епд
8 епд
9 е18е(*6>0*)
10 Ье&1п ю := РАЗБИЕНИЕ (к — 1);
н рр =
12 дуВПе рр ф П11 до
13 игИйрр^до
14 Ье&1п (* симметричная цепь Дез ... сз Аг,
представленная записью рр |, заменяется
двумя цепями: Д сз .. . сз Аг сз Аг 0 {к} и
А{ 0 {к} сз ... сз Дг_1 Ы {&}, причем вторая
опускается, если г=1, т. е. когда
рр |. нач = рр | . конец *)
15 послед := след;
16 И нач < конец 1Ьеп (* цепь длины г > 1 *)
17 Ье&1П (* добавить новую цепь Л| II {6} сз ...
... <= Аг-1 и {к} *)
18 новый (рп)] рП | . след := след] след'.= рп\
19 рп | . нач = нач-\-\] рп конец := конец;
20 рп | . Р [1] \=к]
21 Тог I := 2 То конец до рп |. Р [/] := Р [/ — 1]
22 епд;
(* добавить Лги{й} к цепи, представленной
записью рр | *)
23 конец := конец + 1; Р [конец] := /г;
24 рр := пслед
25 епд
26 епд;
27 РАЗБИЕНИЕ\=ы
28 епд; (* РАЗБИЕНИЕ *)
29 Ье&1п (* главная программа *)
30 разб:= РАЗБИЕНИЕ (п)
31 епд
Предоставляем читателю проверить, что число шагов, вы-
полняемых алгоритмом, имеет порядок суммы длин всех полу-
ченных цепей разбиения, т. е. О(2П). На рис. 4.7 показан спи-
Рис. 4.7. Список симметричных цепей, по-
строенных алгоритмом 4.24 для п = 5(«[»
предшествует Р [нач], а «]» следует за
Р[конец]; нач = 0 для первой цепи).
1 2 3 4 5 3
I 5 1 2 3 3
С 4 1 2 5 3
5 Г 4 1 3
Г 3 1 4 5 Л
5 С 3 1 3
4 Г 3 5 3
Г 2 3 4 5 3
5 С 2 3 ]
4 Г 2 5 3
сок симметричных цепей, полученных при помощи этого алго-
ритма для п = 5.
Отметим, что в каждой из записей списка, составленного
алгоритмом 4.24, элементы Р[/] для I > конец не определены.
Если их определить произвольным способом так, чтобы после-
довательность Р [ 1 ], ..., Р [л] была перестановкой, то мы по-
лучим список перестановок срьфг, ...» Ф™, лг = (1пп/^)> с очень
любопытным свойством. Для каждого подмножества А
е{1, ...» п} существует такая перестановка фг, что множество
первых | А | членов этой перестановки равно А (перестановку
мы трактуем здесь как последовательность длины п). Отметим,
что система меньшего числа перестановок с приведенным выше
свойством не может существовать, поскольку каждое из /п =
=(1п“2и)[п/2_|-элементных подмножеств должно появляться как
начальный участок в какой-либо перестановке.
Покажем теперь применение такой системы перестановок
для организации картотек, автором которой является Лум (см.
[47]). Для этого рассмотрим ситуацию, когда запись в некото-
рой картотеке описывается с помощью п атрибутов. Предполо-
жим, что /-й атрибут для каждой конкретной записи может
принимать одно из гц значений; для простоты обозначим эти
значения 1, ..., п,. Пусть /? будет множеством записей в на-
шей картотеке. Тогда каждая запись г описывается последова-
тельностью <Ш1(г), ..., шл(г)>, где о/Дг)— значение /-го атри-
бута для г (1 о/, (г) дъ). Мы можем рассортировать нашу
картотеку «лексикографически» многими способами, если при-
нять во внимание то, что понятие лексикографического порядка
предполагает некоторое упорядочение координат — от коорди-
нат, значения которых «изменяются медленно», до координат,
значения которых «изменяются быстрее всего». Точнее, для
произвольной перестановки ср множества {1, ..., п,} мы опре-
деляем порядок следующим образом:
(ар .... 6п)<=>(а1( .... «„> = (&!..Ьп)
или
существуют числа й, такие что аф(/) = 6ф(0
для 1 к и (&) <С &ф (&).
В методе Лума используется т = (1л"2и) копий картотек,
из которых /-я, обозначим ее сортируется в соответствии
с порядком на последовательностях <Ш1(г), ..., шл(г)>.
Предположим, что каждый запрос, направленный в картотеку,
имеет вид ф=<Х1, ...» хп), где каждый член х, является либо
некоторым значением /-го атрибута, 1 хг^ п/, либо х1 = *,
что означает, что запрос не налагает никаких условий на зна-
чение /-го атрибута. Ответ на запрос <хь ..., хл> обозначим
||<Хь ..., хл>|| и определим следующим образом:
||<Х1, ..., хл)||={г е/?:ш/(г) = х/ или шДг) = *для 1
Суть метода Лума состоит в том, что для произвольного
запроса существует такое /, что ответ состоит из отрезка по-
следовательных (относительно порядка записей в карто-
теке К/. Чтобы доказать это свойство, рассмотрим произволь-
ный запрос (?=<Х1, ..., хл>. Согласно основному свойству мно-
жества перестановок <рг.....ср™ среди них найдется такая пе-
рестановка ср/, которая переводит в начало С? все координаты хх-,
отличные от *, т. е. хф. (/)=/=* для и хф. (/) = * для
к < / п. Ясно, что в К/ ответ ||ф|| есть отрезок последователь-
ных записей, начинающийся с записи г, такой что
(^ф/0)(Г)» •••> ^>1 (Л) (Г)) = (1), •••» *фг‘(*)> •••, !,•••> 1),
и кончающийся такой записью г', что
(1) (г')> •, ^.{п)(г')} =
= ^Ф/(1), •••, (6), .........(п)^
(ситуация существенно не меняется, когда в нашей картотеке
нет записи г или г').
Если наши картотеки /С запоминаются на носителе инфор-
мации с линейной структурой, то тот факт, что все записи, ко-
торые мы хотим найти, составляют связный отрезок, значи-
тельно облегчает процесс поиска. И очевидно, что главным не-
удобством, особенно для больших л, является большое число
копий нашей картотеки, которые необходимо хранить в памяти.
В заключение данного раздела стоит отметить, что боль-
шинство рассмотренных нами теорем имело минимаксный ха-
рактер: в них говорилось, что минимум некоторой величины
равен максимуму некоторой другой величины. Примерами мо-
гут служить теорема о максимальном потоке и минимальном
разрезе, венгерская теорема и теоремы 4.22 и 4.23. Оказыва-
ется, что последний пример есть частный случай одной значи-
тельно более общей теоремы Дилворта (см. [12]), касающейся
частично упорядоченного конечного множества. Так же как и
для случая частично упорядоченного множества <^(Х),
для произвольного частично упорядоченного множества <Р,
цепь определяется как такое произвольное подмножество Ь<=:Р,
что х у или у х для произвольных х, у е Л, а антицепь
определяется как такое произвольное подмножество А Р, что
для произвольных х, у А
х^у=>х = у.
А это обещанная теорема Дилворта.
Теорема 4.25. Для произвольного конечного частично упоря-
доченного множества (Р, минимальное число цепей, кото-
рые в сумме покрывают Р, равно максимальной мощности ан-
тицепи.
Доказательство. Для доказательства воспользуемся индук-
цией относительно мощности множества Р. Если |Р|^1, то
очевидно, что теорема верна. Пусть | Р | > 1, Ь — произвольная
максимальная цепь (т. е. цепь, не являющаяся подмножеством
никакой большей цепи), и пусть пг — максимальная мощность
антицепи в <Р, ^>. Покажем, что наше множество Р можно
покрыть т цепями. Если максимальная мощность антицепи в
<Р\Г, равна т—1 (очевидно, что она не может быть
меньше т—1), то в силу индуктивного предположения суще-
ствует разбиение на цепи Р\Г = Г1и ... О Гт_ь а отсюда по-
лучаем требуемое разбиение Р = Ь\[} ... Ц| Ьт-\ IIР- Предпо-
ложим, что в <Р\Г, существует /и-элементная антицепь
А ={пь ..., ат}. Построим множества элементов, находя-
щихся «над» А:
О = {х е Р: х> а для некоторого а е Л}
и «под» А:
О ={х е Р: х < а цля некоторого а^А}.
Предположим, что Ь имеет вид 1\ < ... < 1к. Тогда Ь\ ф О,
ибо в противном случае цепь Ь можно было бы увеличить на
некоторый элемент а < /ь вопреки предположению
о максимальности Ь. Аналогичным образом доказывается, что
Следовательно, | С | < | Р |, | О | < | Р | и в силу индук-
тивного предположения, примененного к <с?, и <Г), ^С>,
существуют разбиения на цепи
о = 61 и ... и От и о = />! и ... и От.
После возможной перенумерации множеств цепей Оь ..., От
и Оь ..., От мы можем предполагать, что а/^О/АОь 1
I т. Но О II О = Р, поскольку существование элемента
&еР\(ОЫО) противоречило бы максимальности антицепи А*
Следовательно, получаем требуемое разбиение на цепи
р = ц и... и Гт,
полагая Г,= 0,1104-, 1 = Л............т.
4.6. Задачи
4.1. Доказать, что каждый поток / из 5 в / можно предста-
вить в виде суммы / = /1 + ••• + /ь к^т (т. е. /(е) =
= /1(е) + ... +/л(е) для каждой дуги е<=Е)у где
поток вдоль отдельного пути из 5 в /, I = 1, ..., к. Выве-
сти отсюда, что можно получить максимальный поток,
поочередно увеличивая поток вдоль соответственно вы-
бранных увеличивающих цепей со всеми согласованными
дугами, начав с нулевого потока. Построить сеть, в кото-
рой к = &(т) для каждого такого разбиения / = /1+ • ••
... + Лг-
4.2. Доказать, что если каждое увеличение потока происходит
вдоль кратчайшей увеличивающей цепи относительно су-
ществующего потока, то длины последовательных цепей
образуют неубывающую последовательность. (Следует от-
метить, что из этого свойства легко вытекает лемма 4.4,
однако обратное следование не является таким оче-
видным.)
4.3. Доказать, что если каждое увеличение потока происходит
вдоль кратчайшей увеличивающей цепи, то, начиная с
произвольного потока, мы получаем максимальный поток
с использованием не более чем тп/Ъ увеличивающих це-
пей (см. [17]).
4.4. Показать, что для сети с пропускной способностью каж-
дой дуги, равной нулю или единице, алгоритм Диница
можно реализовать за время О(п2/3/и) (см. [18]).
4.5. Показать, что если в сети с целочисленными пропускными
способностями потенциал каждой вершины, отличной от
5 и /, равен нулю или единице, то алгоритм Диница мо-
жет быть реализован за время О(п1/2ги) (см. [18]).
4.6. Рассмотреть сеть со многими выделенными источниками
51, ..., 5Р п стоками 1\, ..., и заданными продуктивно-
стями источников аь ..., аР^0и опросами стоков ...
..., Ьц 0, такими что а{ + ... + ар = Ь\ + ... + Ья.
Представить метод построения в такой сети потока /, для
которого 01^(5,) = а, для 1 р, В1уД//) = —для
1 и Г)1У/(у) = 0 для всех остальных вершин сети,
если такой поток существует. (Указание: добавить к сети
дополнительные дуги <5, 5/> с пропускными способностями
а[ для 1= 1, ..., р и дуги </>, /> с пропускными способно-
стями Ь] для / = 1, ...» У-)
4.7. Добавить к задаче о потоке в сети дополнительное огра-
ничение, состоящее в том, что для каждой вершины у,
отличной от 5 и /, количество потока, втекающего в о
и вытекающего из у, не может превышать пропускной
способности §(у) этой вершины. Как свести задачу, из-
мененную таким способом, к первоначальной задаче без
пропускных способностей вершин? (Указание: для каж-
дой вершины V добавить новую вершину у*, дугу <у,
с пропускной способностью &(с) и заменить каждую дугу
вида <у, и) на <у*, и).)
4.8. Пусть О — ориентированный граф, не содержащий дуги
<5, />. Доказать, что максимальное число путей в О из 5
в I с попарно различными промежуточными вершинами
(т. е. отличными от 5 и /) равно минимальному числу
промежуточных вершин, после удаления которых в графе
не найдется ни одного пути из $ в / (см. [52]). (Указа-
ние: рассмотреть О как сеть с пропускной способностью
каждой вершины, равной единице — ср. с предыдущей за-
дачей, — и воспользоваться теоремой о максимальном по-
токе и минимальном разрезе.)
4.9. Написать алгоритм нахождения дуг с таким свойством,
что увеличение пропускной способности дуги приводит
к увеличению потока. Всегда ли существует такая дуга?
(Указание: найти максимальный поток /, а затем множе-
ство А вершин, достижимых с помощью частичных увели-
чивающих цепей из 5, и множество вершин В, из которых
аналогичным образом можно достичь /. Требуемое мно-
жество— это (ЛХВ)рВ.)
4.10. Рассмотреть сеть, в которой каждой дуге е^Е припи-
сана, кроме пропускной способности, стоимость К(е) по-
сылки единицы потока через е. Определить стоимость уве-
личивающей цепи как сумму стоимостей согласованных
дуг минус сумму стоимостей несогласованных дуг этой
цепи. Доказать, что поток / величины имеет
стоимость, наименьшую из всех потоков величины ш, то-
гда и только тогда, когда не существует увеличивающего
цикла (замкнутой цепи) относительно / с отрицательной
стоимостью. Показать, что увеличение на 6 потока вели-
чины до наименьшей стоимости вдоль увеличивающей цепи
с наименьшей стоимостью приводит к потоку с наименьшей
стоимостью величины до + б.
4.11. Доказать, что если Р— кратчайшая чередующаяся цепь
относительно паросочетания М в двудольном графе, Р'—
кратчайшая чередующаяся цепь относительно М Ф Р, то
\Р'\^\Р\ + \Р(]Р'\ СМ. [33]).
4.12. Доказать, что если М и — паросочетания в двудольном
графе Я, то существует такое паросочетание /?, что вер-
шина графа Н будет свободной относительно Р тогда и
только тогда, когда она свободна относительно как М,
так и (см. [51], см. также лемму 4.11).
4.13. Двудольный граф Н =<Х, У, Е) называется выпуклым на
X, если множество X можно упорядочить в последователь-
ность хь ..., Хр так, чтобы для каждого у У множество
А(у) = {х^Х: х— у} образовывало отрезок вида {хР{У)у
Хр(У)+\у ..., Хщу)}. Подобным же образом определяем вы-
пуклость на У. Доказать, что если граф Н выпуклый на X,
то наибольшее паросочетание можно получить, просматри-
вая последовательность Хь ..., хр и сочетая вершину хх
с той из свободных еще вершин у е У, х — у, для которой
значение К(у) минимальное (или оставляя вершину X/
свободной, если такой вершины у не существует) (см.
[28]).
4.14. Показать, что наибольшее паросочетание в двудольном
графе Н =<Х, У, Р>, выпуклом на X (см. предыдущую
задачу), можно построить за время О(|X|-Ь | У11о&| У|) и
за время О (| X14~ I УI), если Н — выпуклый как на X, так
и на У. (Внимание: предполагаем, что граф представлен
массивами значений Р(у) и К (у), у^У\ здесь следует
отметить, что оценку О(|X|1 У11о^Г| У |) можно значи-
тельно улучшить, как это показано в работе [46], поль-
зуясь некоторой общей методикой, изложенной в работе
[67] и автором которой является Р. Тарьян.)
4.15. Привести пример графа (недвудольного), для которого
не выполнено свойство, выделенное в следствии 4.16.
4.16. Доказать следующую теорему, двойственную по отноше-
нию к венгерской теореме: для произвольной 0-1-матрицы
максимальное число единиц в линии равно минимальному
числу рассеянных множеств единиц, покрывающих все
единицы матрицы (множество единиц называется рассе-
янным, если никакие две единицы не лежат на одной ли-
нии). Сформулировать теорему в терминах паросочетаний
в двудольном графе.
4.17. Бистохастической матрицей называется матрица размер-
ности п\п с вещественными неотрицательными элемен-
тами, в которой сумма элементов в каждой строке и в
каждом столбце равна единице. Перестановочной матри-
цей называется произвольная бистохастическая 0-1-мат-
рица. Доказать, что каждую бистохастическую матрицу В
можно представить в виде комбинации В = 4- ...
... + где Р\, ..., Рк — перестановочные матрицы,
Ц1, ..., ц* > о и щ + ... +р*=1 (см. [6]).
4.18. Перманент матрицы Д=[а<7] размерности п)^п опреде-
ляется следующим образом:
рег А = 2 <21, а (1), ^2.о(2), •••» вп,(у(п),
где суммирование ведется по всем перестановкам а мно-
жества {1, ..., п}. Доказать, что перманент 0-1-матри-
цы А размерности п X и равен нулю тогда и только тогда,
когда А содержит нулевую подматрицу размерности рХг,
где р + г = п + 1 (см. [24]).
4.19. Уточнить детали алгоритма нахождения общей системы
различных представителей для последовательностей
<Аь ..., Ап) и <ВЬ ..., Вп) со сложностью
О (д/п 2(| Л/1 4“ I В/1)), приведенного в разд. 4.4 (см. за-
дачу 4.5).
4.20. Привести построение последовательности с элементами из
2
множества {1, ..., п} длины—2" с таким свойством.
что каждое подмножество ...» п} появляется в
этой последовательности как подпоследовательность из
| А | последовательных членов [43]. (Указание-, построить
(и^) перестановок множества {1, А}, 6=[п/2_|‘,
таких что каждое подмножество /<^{1......6} появля-
ется как конечный отрезок некоторой из этих последова-
тельностей, и Р = Г^/21, перестановок множества
{&4-1, •••» л}, таких что каждое подмножество
1, •••> п} появляется как начальный отрезок неко-
торой из этих перестановок. Далее следует соединить эти
перестановки соответствующим образом. Внимание-, в силу
формулы Стирлинга
5. Матроиды
5.1. Жадные алгоритмы решения
оптимизационных задач
Рассмотрим следующую матрицу с действительными неотри-
цательными коэффициентами:
А =
"7 5 1"
3 4 3
2 3 1
Займемся решением следующей оптимизационной задачи.
Задача 1. Найти такое подмножество элементов матрицы,
что
(а) в каждом столбце находится не более одного выбран-
ного элемента и
(б) сумма выбранных элементов является наибольшей из
возможных.
Попробуем решить эту задачу следующим образом: будем
выбирать элементы последовательно, причем каждый раз бу-
дем выбирать наибольший из элементов, которые мы можем
добавить, не нарушая условия (а). Будем действовать так
вплоть до момента, пока добавление произвольного элемента
не нарушит условия (а). Алгоритм такого типа мы будем на-
зывать жадным.
Для задачи 1 и матрицы А жадный алгоритм находит под-
множество
® 1'
3 4®
2 3 1
которое действительно дает наибольшую возможную сумму.
Нетрудно отметить, что с помощью жадного алгоритма пра-
вильно находится решение задачи 1 для произвольной веще-
ственной матрицы с неотрицательными элементами.
Рассмотрим несколько иную задачу.
Задача 2. Найти такое подмножество элементов матрицы,
что
(а) в каждом столбце и в каждой строке находится не бо-
лее одного выбранного элемента и
(б) сумма выбранных элементов является наибольшей из
возможных.
На этот раз применение жадного алгоритма к задаче 2 и
матрице А дает подмножество
5 Г
3 @3
_2 3 ф_
с суммой 12, что не является правильным решением, поскольку
подмножество
5 1
3 4(3)
_2 (3) 1.
имеет сумму 13. Следовательно, на втором шаге не следо-
вало бы быть жадным, мы выигрываем в конечном результате,
выбирая несколько меньший элемент (3 вместо 4).
Возникает вопрос: когда выгодно быть жадным? Сформули-
руем это более строго.
Мы будем рассматривать оптимизационные задачи следую-
щего типа.
Задача 3. Даны конечное множество Е, семейство его под-
множеств З^^^(Е) и функция ш: Е->/?+, где /?+ обозначает
множество вещественных неотрицательных чисел. Найти под-
множество 5е^с наибольшей суммой У пу(е).
ее 3
Как задача 1, так и задача 2 являются частными случаями
задачи 3. В обоих случаях Е есть множество позиций матрицы,
а ш ставит в соответствие позиции </, /> матрицы [аг/] число
Для задачи 1
3 каждый столбец содержит не более одной позиции
из множества 5,
а в случае задачи 2
3 3 фф- каждый столбец и каждая строка содержит не более
одной позиции из множества 5.
Теперь мы можем сформулировать наш вопрос следующим
образом: при каких условиях относительно семейства & жад-
ный алгоритм правильно решает задачу 3 для произвольной
функции ш?
Оказывается, что на этот вопрос можно найти простой от-
вет. А именно, достаточно, чтобы пара {Е,У} образовывала
так называемый матроид. Следующий раздел данной главы
посвящен этим важным комбинаторным объектам (читателя,
заинтересованного в более глубоком изучении теории матрои-
дов, отсылаем к [42], [72]).
5.2. Матроиды и их основные свойства
Матроиды были введены Уитни в работе [73] в совершенно
ином контексте, нежели жадные алгоритмы, а именно в иссле-
дованиях абстрактной теории линейной зависимости. Суще-
ствует много эквивалентных определений матроида. Для нас
наиболее удобным будет следующее определение:
Матроидом мы будем называть произвольную пару М =
=(Е,5?}, где Е — конечное множество, а У <=Ф(Е) — семей-
ство, удовлетворяющее условиям:
М1 если ЛеЗ и В А, то
М2 Для произвольных А, таких что |В| = |А|+1,
существует элемент е е В \ А, такой что А 0 {е} е
(Условие исключает вырожденный случай 5^ = 0.)
Множества семейства 3 мы будем называть независимыми
множествами, а остальные подмножества из Ф(Е)\27 — зави-
симыми множествами матроида М. В этом проявляется уже
упомянутая связь матроидов с теорией линейной зависимости:
аксиомы матроидов выбраны таким образом, чтобы они отра-
жали наиболее характерные свойства независимых множеств
линейного пространства, точнее говоря, независимых подмно-
жеств, содержащихся в некотором конечном подмножестве
этого пространства (вспомним, что подмножество {еь ..., еп}
линейного пространства называется независимым, если не су-
ществует набора скаляров м.....Кп, не всех равных нулю,
такого что + ... +^л = 0). В самом деле, очевидно, что
произвольное подмножество независимого множества линей-
ного пространства независимо. Если |В| = |А| + 1 для линейно
независимых подмножеств А, В линейного пространства, то А
порождает пространство размерности |А|, которое может со-
держать не более чем |А| элементов множества В. Следова-
тельно, существует элемент еей\А, не принадлежащий этому
подпространству. Множество АЩе} порождает подпространство
размерности | А | + I и, следовательно, является линейно неза*
висимым.
Будем говорить, что два матроида <Е, «7> и изо-
морфны, если существует взаимно однозначное отображение /
множества Е на множество Е', такое что тогда и только
тогда, когда Часто мы не будем делать различия
между изоморфными матроидами.
Для произвольного подмножества С Е мы будем изучать
его максимальные независимые подмножества, т. е. независи-
мые подмножества А С, обладающие таким свойством: не су-
ществует независимого подмножества В, такого что А <= В <= С.
Теорема 5.1. Пусть Е — конечное множество, 3 — семейство
его подмножеств, удовлетворяющих условию М1. При этих
предположениях М = <Е,ЗГ) является матроидом тогда и толь*
ко тогда, когда удовлетворяется условие
М3 Для произвольного подмножества С Е каждые два макси
мальных подмножества множества С имеют одинаковую
мощность.
Доказательство. Предположим, что М=(Е, З') является
матроидом и для некоторого С^Е существуют два максималь-
ных независимых подмножества А, В С, такие что | В | > | А |.
Выберем произвольное подмножество В'<=, В (независимое по
условию МП), такое что |В'| = |Д|4- 1. В силу М2 существует
такой элемент е е В'\Д С, что А 0 {?} 3 вопреки макси-
мальности множества А.
Напротив, предположим, что выполняются условия М1 и
М3. Выберем такие произвольные подмножества А,В^З\ что
| В | = | А | + 1, и обозначим С = А 0 В. Допустим, что не суще-
ствует такого элемента ееВ\Л, что ЛЩе}Е.7. Это означа-
ло бы, что А является максимальным независимым подмноже-
ством множества С. Расширяя В до максимального независи-
мого подмножества В* С, мы имели бы | А | < | В* | вопреки
условию М3. Следовательно, условия М1 и М3 влекут за собой
условие М2.
Из теоремы 5.1 следует, что условия М1 и М3 образуют
эквивалентную систему аксиом для матроидов.
Мощность максимального подмножества множества С^Е
называется рангом этого множества и обозначается через г (С):
г (С) = шах {| А |: А (= 3 А А С}.
Очевидно, что подмножество С Е является независимым
тогда и только тогда, когда г(С) = |С|. Каждое максимальное
независимое множество матроида А4=<Е, «7> будем называть
(по аналогии с линейными пространствами) базой этого мат-
роида, а ранг г(Е), являющийся аналогом размерности линей-
ного пространства, рангом матроида. Отметим важное след-
ствие теоремы 5.1.
Следствие 5.2. Каждые две базы матроида имеют одинако-
вое число элементов.
Отметим также, что каждое независимое множество С 3
можно расширить до базы В С; достаточно поочередно до-
бавлять в С новые элементы, присоединение которых не нару-
шает независимости, вплоть до момента, когда таких элемен-
тов больше не существует. Полученное множество будет мак-
симальным независимым множеством, а следовательно, базой.
Аналогично, произвольное независимое множество А^С мож-
но расширить до максимального независимого подмножества
множества С.
Отметим некоторые свойства рангов.
Теорема 5.3. Для произвольных А, В Е и еД е Е имеем
К1 0<г(А)<| А |,
К2 если А В, то г (А)^г (В),
КЗ г(ЛиВ) + г(АПЗ)<г(А) + г(В),
К4 г(Я)<г(ЛиИ)<г(Я)+ 1,
К5 если г (А 0 {е}) = г (А 0 {/}) = г(А), то г (А II {е, /}) = г (А).
Доказательство. Свойства К1 и К2 очевидны. Докажем КЗ.
Пусть {еь ..., ер}— максимальное независимое множество в
А Г) В. Расширим его до максимального независимого множества
{вь ...» ер, ...М-А, а затем до максимального незави-
симого множества {<?1, ..., ер, ё\, .^}^А0В.
Имеем р = г(Ар|В), р + ^ = г(А), р + г Р + д + г=г(А\) В),
а следовательно,
г(АиВ) + г(АПВ) = (р + р + г) + р =
= (р + ^) + (р + г)<г(А) + г(В).
Условие К4 очевидно. К5 вытекает из КЗ:
г (А) < г (А 0 {<?, /}) = г ((А 0 {е} О {/})) <
<г(Аи{е)) + г(АиЮ)-г((Аи{е})П(АиШ)) =
= г (А) + г (А) — г (А) = г (А). И
Продолжая аналогию с линейными пространствами, будем
говорить, что элемент е зависим от множества А, если
г (А и {е}) = г (А), и будем обозначать через зр(А) множество
всех элементов, зависимых от А:
(Д) = {<? е= Е: г (Л и {<?}) = г (Л)}.
Множество А = Е называется подпространством матроида,
если А = зр(А), т. е. если г (А |_){е}) = г(Д)Д- 1 для произволь-
ного е е В\Д.
Теорема 5.4. Для произвольных А, В е Е и еД е Е имеем
81 А<=зр(А),
82 если А В, то зр (Л) зр (В),
83 зр(зр(А)) = зр(А),
84 если }^зр(А) и } е зр (Д Ц {е}), то е <= $р(ДЫ {/}).
Доказательство. Условие 81 очевидно: если ееД, то г(Д0
11{е}) = г(Д), т. е. е^зр(А). Для доказательства 82 восполь-
зуемся КЗ. Предположим, что Лей и ее$р(Д). Тогда
г (В) < (В [Це}) = г ((Д 0 {е}) 0 В) <
< Г (Л и {е}) 4-г (В) - г (ДII (В л {е})) ==
= г(Д) + г(В)-г(Д) = г(В)
и, следовательно, е^зр(В).
Из условий 81 и 82 следует, что зр(А)^ зр(зр(А))\ Дока-
жем теперь противоположное включение. Для этого нам будет
необходимо равенство
г (зр (Д)) = г (Д). (5.1)
Чтобы доказать его, предположим, что $р(Д)\Д = (е1.....еД.
Из определения зр(А) имеем г(Д |_| {е<}) =/\(Д), 1= 1, .... к.
Предположим, что для некоторого I < к имеет место г (ДО
Щвь ..., е,}) = г(Д). Тогда из КЗ получаем
г (А Л {е,, ..., е1г е1+,}) = г ((Д 0 {е(.е,}) II (Д 0 {<?/+})) <
< Г (Д и {в!..е,})+г (Д 0 (в/+1))-г (Д) =
= г(Д) + г(Д)-г(Д) = г(Д).
Отсюда индукцией по I получаем требуемое равенство (5.1).
Доказательство включения зр(зр(А))^ зр(А) теперь просто.
Предполагая е^. зр(зр(А)), т. е. г($р(Д)й{е}) = г(зр(А)),
имеем г(Д) г(Д 11{е}) г(хр(Д)Л{е}) = г(«р(Д)) = г(Д), т. е.
е $р(А).
Наконец, свойство 84 вытекает из определения зависимости
элемента от множества: предположив (^зр(А) и }^зр(А\)
II {е}), имеем
г (Д) + 1 = г (Д и {/}) < г (А и (е, /}) = г (Д и {<?}) < г (Д) + 1,
а отсюда г (Д I) {/}) = г (ДII {<?, /}), т. е. е е зр (ДII {/)). В
Отметим, что из свойства 83 следует, что зр(А) является
подпространством матроида. Будем называть его подпростран-
ством, натянутым на множество А.
Последним важным понятием данного раздела является
понятие цикла. Циклом матроида мы будем называть каждое
минимальное зависимое множество, т. е. такое зависимое мно-
жество С, что С\{е} является независимым для произвольного
е<=С. Понятие цикла имеет особенно ясную интерпретацию
для случая графовых матроидов, о которых речь пойдет в
разд. 5.5.
Теорема 5.5. Для произвольных циклов С, 0 выполняются
условия'.
С1 Если С Ц, то С = й,
С2 Если С У= О и е е С Г) 0, то существует цикл
Г<=(С\]й)\{е}.
Доказательство. Условие С1 выражает просто свойство ми-
нимальности, содержащееся в определении цикла. Докажем
теперь С2. Множества С\{е} и 0\{е} независимые, а следо-
вательно, г(С\{е}) = |С|—1 и г (0\ {е}) = |О |—1. В силу
условия КЗ
г(СиО) + г(СЛО)<г(С) + г(О) = |С| + |Р|-2 =
= |С00| + 1СП 0 I-2. (5.2)
Множество Ср0 независимое, так как оно является собствен-
ным подмножеством обоих циклов. Отсюда г(СЛ0) = |СЛ0|
и неравенство (5.2) можно переписать как
г(Си0)<|Си0|-2. (5.3)
Предположим теперь, что не существует цикла Г, о котором
идет речь в условии С2. Тогда множество (С[]0)\ {е} незави-
симое, г((С 0 0)\ {е}) = | С 0 0|-1 и в результате г(СО0)^
|С 0 01—1 вопреки неравенству (5.3).
Отметим важное следствие из свойства С2.
Следствие 5.6. Если А — независимое множество, то для про-
извольного е^Е множество {е} содержит не более одного
цикла.
Доказательство. Если бы существовали два различных
цикла С, 0^ДО{е}, то очевидно, что мы имели бы е^С{}О,
и вследствие свойства С2 существовал бы цикл Г^(С11
О0)\{е}^4 вопреки предположению о независимости мно.-
жества А.
Свойства матроидов, рассмотренные выше, связаны с ли-»
нейно независимыми множествами векторов линейного про-
странства. Приведем два других примера матроидов.
Для произвольного конечного множества Е пара (/;)>,
очевидно, удовлетворяет условиям М1 и М2. Будем называть
ее свободным матроидом на множестве Е. В таком матроиде
каждое множество А^Е независимое, и в результате г(А) =
= |Л|.
Другой пример получаем, рассматривая произвольное раз-
биение л ={Р\.....Ок} множества Е и определяя
ЗГ={А<=Е-. |ЛП^|^ 1 для /=1, ...,&}.
Отметим, что если и | В | = | А | + 1, то должен су-
ществовать такой индекс /, что Д П А = 0, но О[ОВ = 0.
Элемент е^О[(]В можно «перенести» в Л и получить множе-
ство Л0{е}^«7. Это доказывает справедливость условия М2.
Матроид М = (Е, У), определенный таким образом, будем на-
зывать матроидом разбиений.
Более интересные примеры матроидов будут приведены
в разд. 5.4, 5.5 и 5.6.
5.3. Теорема Радо—Эдмондса
Вернемся к жадным алгоритмам, о которых шла речь в
первом разделе. Сформулируем сначала общую схему алгорит-
мов этого типа. Мы будем рассматривать конечное множество
Е, функцию ш: Е /?+ и семейство Значение
называется весом элемента е.
Вес подмножества А<=,Е определяется следующим образом:
ю(А) = 22
в е А
Алгоритм 5.7. (Жадный алгоритм.)
1 Ье^1п
2 упорядочить множество Е по убыванию весов так, чтобы
Е={е1............еп}, где да (е^ > да (е2) > ... >да(еп);
3 5:=0;
4 Тог » := 1 1о п йо
5 И$1|{е4}е=.7 И1епЗ:=51Ж)
6 епй
Теорема 5.8 (Радо, Эдмондс, см. [15} и [56}). Если М =
= (Е, ЗУ есть матроид, то множество 5, найденное жадным
алгоритмом, является независимым множеством с наибольшим
весом. Напротив, если М = (Е, ЗУ не является матроидом, то
существует такая функция XV: Е ->/?+, что 8 не будет незави-
симым множеством с наибольшим весом.
Доказательство. Предположим, что М = (Е, 3} является
матроидом, и пусть $={51, .... $4—множество, построенное
жадным алгоритмом, причем до (51) до (52) ... ^до(5*).
Рассмотрим произвольное независимое множество 7' = {/1, ...
...» /т}, где до(Л) XV (/2) ... Отметим сначала,
что должно выполняться т А, так как выбранное жадным
алгоритмом множество 5 является базой матроида: каждый
элемент е/ е 5, «отвергнутый» на некотором шаге алгоритма,
является зависимым от множества элементов, выбранных в
предыдущий раз, а следовательно, от целого множества 5. До-
кажем теперь, что XV (Т) XV (5), точнее, что для произвольного
1^т имеем до (6)^ до (5/). Предположим, что до(Л)>до($/),
и рассмотрим независимые множества
А = {5|, . . 5/-1},
В = {/ь //}.
Согласно условию М2 существует элемент //. ] /, такой что
множество {5ь ..., 5/-1, //} независимое. Имеем до(//)^
5? до (^)^ ДО ($0, следовательно, существует такой индекс р^
г, что до (51)^ ... до (5р-1) до(^) до (5Р) вопреки тому,
что 8Р — элемент с наибольшим весом, добавление которого к
{51, ..., 5р_1} не нарушает его независимости. Полученное про-
тиворечие доказывает, что до(^)^ до (5/), 1 т.
Предположим теперь, что М = <Е,«7> не является матрои-
дом. Если не выполняется условие М1, т. е. если существуют
такие множества Д, В<=Е. что АфЗ, то опре-
делим
(е) = | о
если ее Л,
если е Е \ А.
Легко увидеть, что множество А не содержится тогда во мно-
жестве 5, выбранном жадным алгоритмом. В результате
до(5) < до(В) = до(Д). Если же условие М1 выполняется, нс
не выполняется условие М2, то существуют независимые мно-
жества А, В, такие что |А | = А, |В| = А4“1> и для каждого
ееВ\Л множество А 0 {е} зависимое. Обозначим р = | А П В |
(очевидно, что р < А и пусть 0 < е < 1/(А — р)). Определим
1 + е, если ее Л,
ю(е) =
1, если еей \ Л,
О в остальных случаях.
Заметим, что при весах, определенных таким образом, жадный
алгоритм сначала выберет все элементы множества А. а затем
отбросит все элементы е е В\Л. В результате будет выбрано
множество 5 с весом, меньшим веса множества В:
иЦ5) = ш(Л) = й(1 +е) = (й —р)(1 +е) + р(1 +е)<
< (* - Р) ^-1;Р + Р (1+ 8) = (к + 1 - р) + р (1 + е) = ш (В).
Следует обратить внимание на один довольно удивительный
факт. Поскольку мы определили вес подмножества как сумму
весов его элементов, то могло бы казаться, что оптимальное
множество 5 будет существенным образом зависеть от числен-
ных значений весов отдельных элементов. Однако же эта за-
висимость очень слаба: множество 5 зависит только от упо-
рядочения весов отдельных элементов. В жадном алгоритме
после сортировки элементов веса совершенно перестают нас
интересовать.
Стоит отметить также, что в доказательстве теоремы 5.8 мы
показали, что множество 5 оптимальное в очень сильном смыс-
ле. У него не только максимальна сумма элементов, но также
в любом независимом множестве Т вес гго по величине эле-
мента не больше веса гго по величине элемента в 5. Этот
факт мы будем называть оптимальностью по Гейлу (см. [25]).
Таким образом, в матроиде нельзя выбрать независимое мно-
жество, состоящее из «меньшего числа больших по величине
(по весу) элементов».
Отметим также, что при обращении упорядочения элемен-
тов жадный алгоритм выберет множество 5, которое не только
имеет наименьший вес, по и 1-й по величине элемент (считая
от наименьшего) будет не больше гго по величине элемента
произвольной базы. Теперь мы можем посмотреть на примене-
ние жадного алгоритма к задаче 1 в начале этой главы с об-
щей точки зрения: мы имели там дело с матроидом разбиений,
порожденным разбиением позиций матрицы на столбцы.
Далее мы познакомимся с применением жадных алгорит-
мов к другим, менее банальным матроидам. Покажем также,
как в конкретных случаях эффективно проверять условие 5 0
появляющееся в строке 6 жадного алгоритма. Во
всех случаях мы получим оценку сложности алгоритма в виде
многочлена относительно размерности задачи, что отнюдь не
является типичной ситуацией для оптимизационных задач.
В большой степени эффективность жадных алгоритмов вызы-
вается тем, что элемент, один раз включенный в оптимальное
решение, остается в нем до конца. Здесь не бывает «проверки
всех возможностей», характерной для алгоритмов с возвратом
(см. п. 2.8), что обычно приводит к экспоненциальному росту
числа шагов при росте размерности задачи.
5.4. Матричные матроиды
Матричные матроиды отличаются от матроидов, определяе-
мых независимыми подмножествами линейного пространства,
только видом. Пусть {^ь —элементы некоторого ли-
нейного пространства размерности т, и пусть {Ь\, ..., Ьт}
базис этого пространства. Векторы VI, ..., Vп имеют однознач-
но определенное разложение относительно базиса ..., Ьт'.
^1 = а\\Ь\ + апЬ2 + . . . + ат\Ът>
= а}2Ьх + апЬ2 + .. • + с1т2Ьт,
Vп — ^\пР\ 4“ ®2п&2 4“ • • • 4“^тп^т>
Рассмотрим матрицу
ан а12 ... аЛп
«21 «22 • • • а2п
А = .
_ «/п1 «т2 • • • «тл-.
(5.4)
Ее столбцы, обозначим их е\, ..., еп, соответствуют векторам
С1, Vп, причем подмножество векторов линейно независимо
тогда и только тогда, когда соответствующее им множество
столбцов линейно независимо. Обратно, столбцы произвольной
матрицы А вида (5.4) можно трактовать как векторы некото-
рого т-мерного линейного пространства. Каждая такая матри-
ца определяет матроид М (А) =</:, «7>, где Е есть множество
ее столбцов, а тогда и только тогда, когда множество
столбцов В линейно независимо. Матроид, определенный таким
образом, будем называть матроидом матрицы А. Матроид на-
зывается матричным, если он является (изоморфен с) матрои-
дом некоторой матрицы.
Алгоритм 5.9. (Жадный алгоритм для матричного матрои-
да.)
Данные: Матрица А с т строками и п столбцами, столбцы
которой упорядочены по невозрастанию весов (вс-,
са неотрицательны).
Результаты: Независимое множество столбцов с наиболы
шей суммой весов (5 содержит номера этих
столбцов).
1 Ье&1п
2 3:=0;
3 Тог / := 1 То п до
4 Ьее1пг:=0;
5 Не (Л [/, у] = 0) апд (У < т) до I := I + 1;
6 ИЛ [У, у] 0 ТЬеп (* у-й столбец ненулевой *)
7 Ье?1п 5:=5 0{у};
8 Тог А := у 4- 1 То п до
9 Тог I := 1 То т до
Ю А [У, А] := А [У, А] - А [У, у] * А [У, А]/А [У, у)
11 епд (* А [У, А] = 0 для У + 1 А п *])
12 епд
13 епд
Процесс преобразования матрицы Л, реализуемый этим ал-
алгоритмом, — это не что иное, как известный из численного ана-
лиза метод исключения Гаусса. В каждой итерации цикла 3
алгоритм проверяет (строка 5), состоит ли у-й столбец из од-
них нулей. Если да (Л [У, у] = 0 в строке 6), то очевидно, что
у-й столбец не принадлежит ни к одному линейно независи-
мому множеству столбцов. Если нет (Л[У, у]=/=0 в строке 6),
то мы включаем у-й столбец в искомое множество линейно не-
зависимых столбцов и вычитаем для всех А > у из А-го столб-
ца у-й столбец, умноженный на Л [У, А]/Л [У, у]. Это не нарушает
линейной зависимости столбцов, но приводит к обращению в
нуль всех элементов У-й строки справа от Л [У, у] (легко увидеть,
что последующие итерации цикла 3 не меняют положения дел).
По окончании работы алгоритма множество 5 содержит но-
мера ненулевых столбцов. Эти столбцы линейно независимы,
так как после соответствующей перестановки строк они содер-
жат подматрицу размером 151X 151 с нулями выше главной
диагонали и ненулевыми элементами на диагонали.
Сложность алгоритма можно легко оценить, если заметить,
что доминирующей частью (О (пт) шагов) блока 4 являете;:
цикл 8. Этот блок выполняется п раз, что в сумме дает 0(п2т)
шагов.
Покажем теперь пример применения алгоритма 5.9, связан-
ный с планированием экспериментов. Вообще говоря, будем
рассматривать эксперименты, в которых некоторый объект од-
новременно подвергается действию многих независимых фак-
торов, причем можно количественно измерить суммарное изме-
нение объекта. Нашей задачей будет определение влияния от-
дельных факторов на изменение объекта. Примем линейную
модель, в которой изменение объекта выражается формулой
Ъ — 6*2*2 + ... 4" СтХт,
где Х[ есть интенсивность гго фактора, а ст — коэф-
фициенты, которые нужно определить. Проще всего было бы
совершить т экспериментов, подвергая объект в 1-м экспери-
менте действию только гго фактора с единичной интенсив-
ностью; тогда XI = 1, хк=0 что дает возможность
непосредственно определить с/. Однако такое решение часто
невозможно по чисто техническим причинам. Предположим, на-
пример, что мы наблюдаем влияние содержания различных
минералов в почве на рост урожая некоторой культуры, при-
чем мы имеем в своем распоряжении п (п,^ т) удобрений,
являющихся смесью этих минералов в строго определенных
пропорциях. Уравнения, соответствующие возможным экспери-
ментам, можно представить следующим образом:
4“ • • • 4" стат\ =
С1«12 + с2с122 + ... + стат2 = Ь2,
(5.5)
С&1п 4* ^2^2п 4“ • • • 4“ ^гАп ==
где обозначает количество Лго минерала в /-м эксперимен-
те (мы предполагаем использование стандартных количеств
удобрений и площадей культур). Рассмотрим матрицу А =
= [а<7]. Ее столбцы соответствуют экспериментам (удобре-
ниям), а строки — минералам. Каждое линейно независимое
множество из т столбцов определяет множество эксперимен-
тов, которые нужно провести, чтобы вычислить коэффициенты
Сь ..., ст из системы уравнений (5.5). Если упорядочить
столбцы по неубыванию стоимости соответствующих им экс-
периментов, то жадный алгоритм определит самую дешевую
систему экспериментов.
5.5. Графовые матроиды
Пусть О = <У, Е) — неориентированный граф. Определим
М(0)=<Е,5'>, где
3 = {А г Е: граф(У, Д) не содержит циклов}.
Теорема 5.10. является матроидом для произвольного
графа О.
Доказательство. Очевидно, что условие М.1 выполняется.
В силу теоремы 5.1 достаточно показать, что выполняется так-
же условие М3. И это действительно так, поскольку каждое
максимальное подмножество А е 3, содержащееся в мно^е-
стве В^Е, является не чем иным, как стягивающим лесом
графа <У, В) (см. разд. 2.4). Количество элементов каждого
такого множества А составляет, таким образом,
| V | — (число компонент связности графа (7, В)). И
Матроид М(6) будем называть матроидом графа О. Произ-
вольный матроид называется графовым, если он является (изо-
морфен) матроидом некоторого графа. Отметим, что циклы
матроида М(О)—это не что иное, как множества ребер эле-
ментарных циклов; это объясняет происхождение названия
«цикл» в случае произвольных матроидов. Оказывается, что
каждый графовый матроид М(О) можно трактовать как мат-
ричный матроид, соответствующий матрице инцидентности гра-
фа О, рассматриваемой как матрица с элементами из двух-
элементного поля 72={0, 1}. Сложение в таком поле выпол-
няется по модулю 2, а умножение — как обычное умножение
целых чисел:
+ 0 1
О 0 1
1 1 О
О
1
О 1
6~0
О 1
Вспомним, что столбцы матрицы инцидентности соответ-
ствуют ребрам, а строки — вершинам графа, причем столбец,
соответствующий ребру {и, у}, содержит единицы в строках,
соответствующих вершинам и и V, и нули в остальных пози-
циях.
Теорема 5.11. Пусть О = (У,Е) — произвольный граф и А —
его матрица инцидентности. Подмножество столбцов матрицы
А является линейно зависимым над полем 22 тогда и только
тогда, когда соответствующее ему подмножество ребер содер-
жит цикл.
Доказательство. Предположим, что множество С^Е яв-
ляется циклом, и рассмотрим соответствующее ему множество
столбцов матрицы А. Это множество содержит в каждой нену-
левой строке две единицы, следовательно, является линейно за-
висимым над полем /2; его сумма, вычисленная по модулю 2,
дает нулевой столбец.
Напротив, предположим, что некоторое непустое множество
столбцов матрицы А является линейно зависимым над /2. Это
означает, что оно содержит непустое множество столбцов с
суммой, являющейся нулевым столбцом (отметим, что в случае
поля /2 линейная комбинация с ненулевыми коэффициентами —
это просто сумма). Пусть В^Е — соответствующее ему мно-
жество ребер. (У, В) является тогда графом с четной степенью
каждой вершины. Этот граф содержит цикл, поскольку каждый
непустой граф без циклов содержит по крайней мере одну вер-
шину степени 1. И
В силу этой теоремы мы можем использовать алгоритм 5.9
для отыскания базы матроида М(О) с наименьшим весом —
другими словами, минимального стягивающего дерева (в об-
щем случае леса, т. е. графа, все компоненты связности кото-
рого являются деревьями). Сложность такого решения состав-
ляет О (т2п), где п = | V | и т = | Е |.
Существуют однако значительно более эффективные алго-
ритмы. Опишем один из них — алгоритм Краскала [40]. Сле-
дует отметить, что этот алгоритм сыграл большую роль в раз-
витии теории, описанной в данной главе; алгоритм 5.7 был
сформулирован как обобщение алгоритма Краскала с графо-
вого матроида на произвольные матроиды.
Алгоритм 5.12 (см. [40]).
Данные: Граф О = <У, Е} в виде списка ребер
упорядоченного по неубыванию весов.
Результаты: Минимальный стягивающий лес (5 содержит
множество его ребер).
1 Ье&ш
2 5:=0;
3 РАЗБ~{{и}\ V V}]
4 Гог I := 1 Го т йо
5 И е1 = {и, у}, где ие Л, уеВ, 4, Ве РАЗЕ, А =/= В ГЬеп
6 Ье^тЗ :=3 0 {е,};
7 РАЗЕ := (РАЗЕ \ {А, В}) I) {А I) В)
8 епй
9 епй
В этом алгоритме, являющемся вариантом жадного алгорит-
ма для матроида А4(О), мы строим стягивающий лес графа О,
шаг за шагом добавляя последовательно к 5 ребра, не вызываю-
щие замыкания цикла. РАЗЕ содержит разбиение множества И
на множества вершин компонент связности графа, определяе-
мого текущим содержанием множества 3. Ребро е», анализируе-
мое в строке 5, добавляем к 5 тогда и только тогда, когда оно
имеет оба конца в различных блоках разбиения РАЗЕ, в про-
тивном случае его добавление вызвало бы образование цикла.
После добавления е, к 5 следует заменить блоки А, Ве РАЗЕ,
содержащие концы ребер в/, их суммой А 0 В.
Сложность алгоритма Краскала существенным образом за-
висит от способа представления разбиения РАЗЕ и способа, ка,-
Хим выполняется слияние его блоков. Существуют очень эф-
фективные методы решения последней задачи (см. [67]). Для
наших целей достаточно следующего метода: каждый блок раз-
биения представляется ориентированным деревом, в котором из
каждой вершины существует путь до корня. Корень идентифи-
цирует данный блок. Такое дерево содержит также информа-
цию о своей высоте. Идентификация блока, содержащего дан-
ную вершину, происходит прохождением пути из этой вершины
4
РАЗИ = {{1,7, в), {г}, {4,5), {з, в}} РАЗБ = {{1, 4,5,7, в}, {г}, {з, б}}
Рис. 5.1. Слияние блоков {1, 7, 8} и {4, 5) разбиения РАЗ Б.
до корня. Слияние блоков Д, В происходит путем добавления
дуг от корня дерева, представляющего один блок, к корню де-
рева, представляющего другой блок (рис. 5.1). Если при слия-
нии добавленная дуга всегда идет от корня дерева с меньшей
Рис. 5.2. Минимальное стягивающее дерево, построенное алгоритмом Краскала.
(или равной) высотой, то в ходе алгоритма высота каждого
дерева не больше логарифма его вершин, а тем самым не боль-
ше 1о§п (см. задачу 5.13).
Пример минимального стягивающего дерева, построенного
алгоритмом Краскала, представлен на рис. 5.2 (в скобках даны
веса ребер).
5.6. Матроиды трансверсалей
Пусть ^ = (А[, ..., Ап)—семейство подмножеств (не обя-
зательно различных) некоторого конечного множества Е. Бу-
дем говорить, что множество 8 Е является частичной транс-
версалью семейства .2/, если существует такое инъективное ото-
бражение <р: 3-> {1, ..., л}, что для каждого
Это эквивалентно следующему утверждению: множество 5 =
= {еь ек} является частичной трансверсалью семейства <2/,
если для некоторой перестановки / множества {1, ..., к} и для
некоторой последовательности индексов 1</|< ... п
последовательность <ец1), ...» е^) является системой различ-
ных представителей для последовательности (Л/р А^ (см.
п. 4.4). Отметим, что для частичной трансверсали 3 семейства
(Ль ...» Лп) существует, вообще говоря, много различных
взаимно однозначных функций ср: 5—>-{1, ..., и}, удовлетво-
ряющих условию е <= Л(|(е), е 3.
Основным результатом данного раздела является следую-
щая теорема Эдмондса и Фалкерсона (см. [16]).
Теорема 5.13. Пусть ^ = (АЬ ..., Ап) — семейство подмно-
жеств конечного множества Е, и пусть 3 — семейство частич-
ных трансверсалей семейства Тогда №(<&)= (Е, У) являет-
ся матроидом.
Доказательство. Очевидно, что условие М1 выполняется.
Чтобы доказать выполнение условия М2, предположим, что
Л, В^З, |Л|= к, |В| = /?+1- Мы можем предполагать, что
Л ={Я1, ..., ак} и В ={&ь .... Ьк+\}> где а[ = 6/ для 1^4^
^г=|ЛрВ|. Если г = к (т. е. Л^В), то Л □ {Ьъ+\} е 3 и
условие М2 выполняется. Пусть г < к, и предположим, что
<Я1, ..., а*> является системой различных представителей для
(Л/р ...» Лх^, а <61, ..., Ьк+\) является системой различных
представителей для ^Л/1.....Л/й+1^ (индексы и, ..., 1к по-
парно различны, как и /1, ...» /\+1). Рассмотрим следующее
построение, которое либо находит такой элемент Ь е В\Л, что
Л [){Ь}^3\ либо заменяет последовательность (Л^, ..., Л*^
некоторой новой последовательностью, для которой <аь ..., ак)
также является системой различных представителей.
Построение
Выберем такой индекс р^й + 1, что ..., 1к). Если
можно так выбрать этот индекс, чтобы г + 1 р к + 1, то
последовательность <щ, ак, Ьр) является системой различ-
ных представителей для (А^, ..., +р). а из этого следует,
что Д 1){6р}е .7. В противном случае, т. е, когда 1 р г,
имеем ар = Ьр и последовательность .. , а*> является си-
стемой различных представителей для/Л1р А/р_1, А,р+1, ...
А‘к>
Рассмотрим подробнее эту последовательность. Если после-
довательности <Л, .. •, 1г) и </ь /г> совпадают на 7 < г
позициях, то последовательности <и, 1Р_\, ]р, /р+1, .1Г) и
</ь •••, !г) совпадают на #4-1 позициях, так как /р #= 1Р. По-
вторяя наше построение, мы либо находим требуемую частич-
ную трансверсаль А □{&}, Ь е В\Д либо приходим к ситуации,
когда <Л.....1г) = </ь ...» /г>. Однако в последнем случае
/Р ?={й, • • •, I*} Для некоторого р, г + 1 р А + । (ведь не
может быть {/г+1, ..., /7+1} {/г+ь .ц}- Выполнение нашего
построения еще раз приводит к нахождению такого элемента
ЬР<=В\А, что А Ц|{&р}е У.
Матроид называется матроидом трансверсалей се-
мейства «5^.
Опишем теперь жадный алгоритм для матроидов трансвер-
салей. Этот алгоритм является модификацией метода нахожде-
ния систем различных представителей (а точнее, наибольшего
паросочетания в двудольном графе), основанного на методике
чередующихся цепей, описанной в гл. 4. Вспомним, что семей-
ство (Ль ..., Ап) подмножеств множества Е = {е^ ет} мы
изображаем двудольным графом Н с вершинами и\, ит,
Уь ..., вп и ребрами вида {щ, у/}, где Каждой системе
различных представителей е^ последовательности
(А^, ..., (индексы /ь ..., /\ попарно различны) соответ-
ствует независимое множество ребер Л1={{и41, .., {«/*,
в графе И.
Алгоритм 5.14. (Жадный алгоритм для матроида трансвер-
салей.)
Данные: Семейство <&=(А[, А„) подмножеств множе-
ства Е = {^1......................ет}, представленное с помощью
двудольного графа 6. Элементы вь ..., ет заин-
дексированы в порядке невозрастания весов (веса
неотрицательные).
Результаты: частичная трансверсаль 5 с наибольшим весом
для семейства & (и паросочетание М графа Н,
определяющее функцию <р: п}> о
которой идет речь в определении частичной
трансверсали).
1 Ье§!п
2 5:=0; М = 0;
3 Тог I := 1 То пг до
4 II существует в О чередующаяся цепь Р относительно
М с началом в е1 Шеп
5 Ьее1п 5:=50 {е<}, М\=Р®М.
6 епд
7 епд
Очевидно, что сложность этого алгоритма зависит от метода
поиска чередующейся цепи Р (строки 4 и 5). Если мы исполь-
зуем метод поиска в глубину так, как это сделано в разд. 2.2,
то число шагов, необходимое для отыскания цепи, будет по-
(П X
Е1Л1р Тогда общая
/=1 /
/ п X
сложность алгоритма 5.14 будет О I т 2 I 1) •
\ 1 = 1 /
Приведем теперь две задачи из практики, которые можно
решать с помощью этого алгоритма.
Предположим, что некий предприниматель принял на рабо-
ту п человек, причем г-й сотрудник имеет квалификацию, позво-
ляющую выполнять любую работу из некоторого множества А<.
п
Обозначим ^1 Л/ = 7?={е1, ет} и предположим, что при-
1 = 1
быль предпринимателя от выполнения работы в/ составляет
ш (в/) и что каждый из принятых на работу может выполнять
не более одной работы. Нужно найти такое соответствие работ
и людей, могущих их выполнять, чтобы прибыль была наиболь-
шей. На языке матроидов задача заключается в нахождении
базиса с наибольшим весом матроида трансверсалей М(^),
где ^ = (А[, ..., Ап). Точнее, нужно не только найти частич-
ную трансверсаль 5 с наибольшим весом, но также и взаимно
однозначную функцию <р: 5->{1, п}, для которой е^А^е),
Именно это и делает алгоритм 5.14.
Стоит отметить здесь, что, так же как и во всех жадных
алгоритмах, представленных в данной главе, база с наимень-
шим (наибольшим) весом зависит только от упорядочения эле-
ментов вь ..., ет по неубыванию весов. Обозначим через в/
в/ тот факт, что до(е/) (ву) («работа в/ оплачивается не
меньше, чем работа е^). Мы знаем, что множество работ 5 =
= {яь ...» ак} (где ... а*) является оптимальным по
Гейлу, а следовательно, для каждого другого множества работ
7 = {Ь\, ..., Ь{) (где Ь\ ... ^6/), которое может быть вы-
полнено нанятыми на работу, имеем I к и а/ для 1
Второй пример касается нахождения оптимальной очеред-
ности выполнения работ. Предположим, что дано п работ еь ...
..., ет, причем выполнение каждой из них требует одного и
того же количества времени, скажем одного часа. Работы мы
выполняем по очереди, не прерывая ни одной начатой работы,
причем в каждый момент времени может выполняться не более
одной работы. Для каждого /, 1 I т, дан также срок &
выполнения работы в/ (отсчитываемый от нулевого момента)
и штраф <^(с\), который выплачивается за невыполнение зада-
ния в срок (предполагаем, что штраф не зависит от того, на
сколько часов был превышен срок). Нужно найти очередность
выполнения работ, минимизирующую сумму штрафов. Эту же
задачу мы можем сформулировать как нахождение выполни-
мого в срок множества работ с наибольшей суммой штрафов
(тут мы максимизируем сумму штрафов, «которых избежали»).
При этом нужно найти также очередность выполнения работ
из этого оптимального множества. Связь этой задачи с матрои-
дами трансверсалей следующая. Определим Е = {е\, ..., ет},
п = гпах с?/ и А/ ={е/ Е\ г// /} для \ I п. При таких
1 < I < т
обозначениях произвольная частичная трансверсаль 5 семей-
ства <я/=(Л1, ..., Ап) определяет выполнимое в срок множе-
ство работ, причем взаимно однозначная функция ср: 5-^{1, ...
..., и}, такая что ееА<((е), ее5, определяет для каждой ра-
боты е^8 время ф(е), в которое эта работа должна быть вы-
полнена. Следовательно, оптимальное решение 5 является ба-
зисом с наибольшим весом матроида трансверсалей М(б&) и
его можно найти, используя алгоритм 5.14.
5.7. Задачи
5.1. Доказать, что семейство <3^&*(Е) является базой неко-
торого (однозначно определенного семейством ^) матрои-
да тогда и только тогда, когда выполняется условие
В1 Для произвольных /?!, В2 $ и е I?! \ В2
существует I В2\ В{, такое что
(В{ \ {е})() {}}<=$.
5.2. Для следующих понятий, связанных с матроидами:
(а) семейство 3 независимых множеств матроида,
(б) семейство 3& без матроида,
(в) семейство циклов матроида,
(г) семейство подпространств матроида,
(д) функция ранга г,
(е) операция порождения подпространства 5р.
выразить каждое из них в терминах каждого из остав-
шихся.
5.3. Доказать, что семейство Ф^Я^Е) является семейством
циклов некоторого матроида тогда и только тогда, когда
удовлетворяются условия С1 и С2.
5.4. Доказать, что операция &>(Е)-*0>(Е) является опера-
цией порождения подпространства в некотором матроиде
тогда и только тогда, когда выполняются условия 81, 82,
83, 84.
5.5. Доказать, что функция г является функцией ранга в не-
котором матроиде тогда и только тогда, когда выполняют-
ся условия К1, К2, КЗ (или К1, К4, К5).
5.6. Доказать, что если элемент принадлежит каждой базе
матроида, то он не принадлежит ни одному циклу этого
матроида.
5.7, Проверить, что для произвольного конечного множества Е
и произвольного й ^|Е| пара М = (Е,&), где 3 =
= {А^Е: | А | к} является матроидом. Определить для
этого матроида понятия (а) — (е) из задачи 5.2.
5.8. Доказать, что в произвольном матроиде е^зр(А) тогда
и только тогда, когда существует цикл С, такой что
С\Л ={е}.
5.9. оказать, что если С\ и С2 — два произвольных различных
цикла матроида и } е С1\С2, то для каждого е С\ (]С2
найдется такой цикл С3, что / е С3 (С1 0 С2)\{е}.
5.10. Доказать, что если — семейство баз матроида М =
= (Е,3>, то &*={Е\В: В^&З}—семейство баз неко-
торого матроида Л4* (Л4* называется матроидом, двой-
ственным М). Доказать, что функция ранга двойственного
матроида выражается формулой г*(Л) = |Л |+г(Е\Л) —
-г(Е).
5.11. Доказать, что для произвольного матроида М = <Е, «7> и
произвольного множества 8^Е пара <8,«7'>, где «7' =
= {Ле<7: А ^8}, является матроидом. Всегда ли будет
матроидом <8, «7">, где «7" ={8 П А: А е «7}?
5.12. Применить алгоритм 5.11 к матрице
" 1 4 2 13 6“
28 4172
А~ —7 13 — 14 1 16
0 6 0 1 12 2
(столбцы упорядочены по неубыванию весов).
5.13. Доказать, что при описанной в разд. 5.5 реализации ал-
горитма Краскала высота дерева, представляющего про-
извольный блок В разбиения РАЗЕ, не превышает 1о&|В[.
5.14. Доказать, что каждый матроид разбиения является част-
ным случаем матроида трансверсалей.
5.15. Доказать, что если существует система различных пред-
ставителей для <Л1, ..., Дл> и <хь ..., Хк) является си-
стемой различных представителей для <Ль ..., ДЛ>
(Л<п), то существует элемент и перестановка (
множества (1............* + 1}, такая что (хц[}, хцк+и>
является системой различных представителей для <Дь ...
...»
Литература
1. АЬо А. V., НорсгоИ Л. Е., 1Л1тап Л. О. ТНс Оез^п апЛ Апа1уз1з о( Сот-
ри!ег А1$оп1Ьтз, АЛсНзоп-ХУезку, КсасНп^, МаззасЬизеИз 1974. [Русский
перевод: Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычис-
лительных алгоритмов. — М.: Мир, 1979.]
2. ВапасЬохезк! Ь., Кгесгтаг А. Е1етеп1у апаИгу а!доп1тд\у. ХУагзхахуа, ХУМТ
1981.
3. ВеПтап К. Е. Оп а гоиНп^ ргоЫет. (?иаг1. Арр1. МаШ. 1958, 16, з. 87—
90.
4. Вепез V. Е. МаШетаНса! ТЬеогу оГ СоппесНп^ Ые1\уогкз апд Те1ерЬопе
ТгаГПс. Ыс\у Уогк, АсаЛслнс Ргезз 1965.
5. Вез! М. К., Уап ЕтЛе Воаз Р., Ьепзка Н. XV. А зЬагрепсд уегзюп о( (Не
Аапдгеаа-КозепЬсг^ соп]сс1иге. ТссИп. Кер. 2ХУ 30/74, МаЖетаНзсЬ СепЬ
гит, Атз(егдат 1974.
6. В!гкЬоГГ 6. Тгез оЫегуасюпез зоЬге е! а1^еЬга Ипеа!. 11п1у. Мас. Тиси-
шап. Кеу. 8ег. А. 1946. 5, з. 147—151.
7. С1оз С. А з1ис!у о( попЫоскш^ зхуНсЫп^ пе1\уогкз. ВеП 8уз1етз ТесНп.
Л., 1953, 32, з. 406—424.
8. Ое ВгиЦп Й. 6. А сотЫпа1опа1 ргоЫет. 1пдадаНопез Ма1Ь., 1946, 8,
з. 461—467.
9. Оео Ы. Теопа &га(6\у 1 ]е] газ1оз\гата \у (есЬт’се 1 1пГогта!усе. ХУагзгахуа,
РХУМ 1980.
10. В|^и1д А. М. 81гис!ига! ргорегВез о! зхуИсЫпд пе!\уогкз. ТесЬп. Кер. ВТЬ-
7, Вгохуп Ишу., РгоуИепсе, К1 1959.
11. О^кзка Е. XV. А по(е оп 1\уо ргоЫетз т соппехюп хуЦк ^гарЬз. Митег.
Ма111., 1959, 1, з. 269—271.
12. ОПхуогШ К. Р. А десотрозШоп (Ьеогет (ог рагНаПу огдегед зе1з. Апп
МаШ., 1950, 51, а. 161 — 166.
13. Диниц Е. А. Алгоритм решения задачи о максимальном потоке в сети со
степенной оценкой. Докл. Академии наук СССР, Серия Маг., Физ., 1970,
194, 4, с. 754—757.
14. ОискхуогЖ К., 81сЛтап Г. Т1пНппа1о$1а, ог 1Ье Аг! оГ пп^ш^. Кт^зшеаЛ
Керпп1з, Ва111 1970 (впервые издано анонимно в Лондоне в 1668 г).
15. ЕЛтопЛз Л. Ма1го1дз апй 1Ье &гесс!у а1гогШ1тз. Ма!Ь. Рго&гаттт^, 1971,
1, з. 127—136.
16. ЕЛтопЛз Л., Ри1кегзоп В. К. Тгапзуегза1з апд такой! рагИИоп. Л. Кез.
ЫВ8, 1965, 69В, з. 147—153,
17. ЕЛтопЛз Л., Кагр К. М. ТЬеогеИса! 1тргоуетеп1з ж а^огИЬгтс еИ1с1епсу
(ог пе1хуогк Поху ргоЫетз. Л. АСМ, 1972, 19, з. 248—264.
18. Еуеп 8. ОгарЬ а^огПНтз. Ро(отас, МО, Сотри!ег 8с1епсе Ргезз 1979.
19. Еуеп 8., Капу О. Ап О(п2-5) а1^огП11т (ог тах!тит та!сЫп^ т депега!
^гарЬз. Ргос. 16111 Аппиа! 8утр. оп ЕоипдаНопз о( Сотри1ег 8с1епсе,
1ЕЕЕ, 1975, з. 100—112.
20. Е1оуд К. XV. А1&огШ1п 97: 8Ьог!ез( ра1Ь. Сотт. АСМ. 1962, 5, з. 345.
21. Г1оуд К. XV. А1&оп111т 245: 1геезог1 3. Сотт. АСМ, 1964, 7, з. 701.
22. Еогд Ь. К. Ме1\уогк Поау 1Ьеогу. ТЬе Капд Согр., Р-923, Аи&из! 1956.
23. Рогд Ь. К., Ри!кегзоп О. К. Рггер1у\уу \у з!ес1ас11. ХУагзгахуа, РХУМ 1969.
(Роге! Ь. К., Ри1кегзоп О. К. Р1о\уз т пе1\уогкз, Рппсе!оп 1Лшу. Ргезз,
Рг1псе(оп, 14. Л., 1962.) [Русский перевод: Форд Л. Р., Фалкерсон Д. Р«
Потоки в сетях. — М.: Мир, 1966.]
24 ЕгоЬет'из О. ОЬег МаГпгеп аиз тсМ пе^аШеп Е1етеп1еп. $КгЬ. Ргеизз.
Асад. АМ133., 1917, з. 274—277.
25. Оа1е В. ОрМта! азз1^птеп1з т ап огдегес! зе(: ап аррИсаНоп оГ та1го!д
(Неогу. Л. СотЫпаГопа! Ткеогу, 1968, 4, з. 176—180.
26. ОаШ 2. А пе\у а1^огШ1т Тог Гке тах1гпа1 Г1о\у ргоЫет. Ргос. 19Гк 1ЕЕЕ
8утр. оп ЕоипдаНопз о! СотриГег 8с!епсе, Апп АгЬог, М1, ОсГоЬег 1978,
з. 231—245.
27. Оауеу М., Локпзоп В. 8. СотриГегз апд ТпГгасГаЫШу. А (лшПе (о 1ке
Ткеогу оГ НР-Сотр1еГепезз. 8ап Егапшзсо, СА, АМ. Н. Егеетап апс! Со.,
1979. [Русский перевод: Гэри М., Джонсон Д. Вычислительные машины и
труднорешаемые задачи. — М.: Мир, 1982.]
28. О1оуег Е. Махппшп та!сЫп^ т сопуех ЫрагШе §гарк. №\уа! Кез. Ео&1з1.
циаг!., 1967, 14, з. 313—316.
29. Синтез Ьоок оГ \уог1д гесогдз. №\у Уогк, 81ег1т^ 1972.
39. На11 РН. Оп гергезепГаШез оГ зиЬзсГз. Л. Еопдоп МаГк. 8ос., 1935, 10,
з. 26—30.
31. Нагагу Е. Огарк Ткеогу. Кеад!п^, МА, Адд13оп-\Мез1еу 1969. [Русский пе-
ревод: Харари Ф. Теория графов. — М.: Мир, 1973.]
32. Неар В. К. РегтиГаНопз Ьу тГегскап^ез. Сотр. Л., 1963, 6, з. 293—294.
33. НорсгоП Л., Кагр К. М. Ап п5/2 а1^огНкт Гог тахГтит Ма1сЫп$з т Ы-
рагШе ^гаркз. 81АМ Л. Сотри!., 1973, 2, з. 225—231.
31. НогоиШг Е., 8акт 8. ЕипдатепГа1з оГ Ва1а 81гис(игез, РоГотас, МВ,
СотриГег 8с1епсе Ргезз 1976.
35. НогохуПг Е., 8акт 8. ЕипдатепГа1з о! СотриГег А1§опГктз. РоГотас, МВ,
СотриГег 8с!епсе Ргезз 1978.
36. 1^1е\\'зк1 М., Вадеу Л., МаГ\ут 8. Разса!. Л$гук \угогсо\уу. Разса! 6000.
АМагзгахуа, АМЫТ 1979.
37. Локпзоп В. В. ЕГПЫепГ аГ^опГЬтз Гог зкогГез! раГкз т зрагзе пеГи'огкз. Л.
АСМ, 1977, 24, з. 1 — 13.
38. Локпзоп 8. М. ОепегаНоп о! регтиГаПопз Ьу ад]асепГ ГгапзрозИюпз. МаГк.
Сотр., 1963, 17, з. 282—285.
39. Кауе К. А. Огсу соде Гог зсГ рагШюпз. ТпГогтаИоп Ргосеззп-щ Ее!Г., 1976,
5, з. 171—173.
40. Кгизка! Л. В. Оп Гке зкогГез! зраптп^ зиЬ^гарк оГ а &гарк апд Гке 1га-
уеШп§ за1езтап ргоЫет. Ргос. Атег. МаГк. 8ос., 1956, 7, з. 48—49.
41. Кигакпузк! К. Каскипек гдгтсгкохуу 1 са!ко\уу. Еипкс]е )едпе] ггтеппе].
АМуд. V. АМагзахуа, Р^ 1971.
42. Еаху1ег Е. Ь. СотЫпаГоп'а! ОрНппхаНоп: КеГхуогкз апд МаГплдз. Ые\у
Уогк, НоИ, Ктекаг! апд АМтзГоп 1976.
43. Ырзк! АМ. Оп зГгт^з сопГаттдг а!1 зиЬзеГз аз зиЬзГпп&з. В1зсгеГе МаГк.,
1978, 21, з. 253—259.
44. Ырзк! АМ. Моге оп регтиГаНоп ^епегаНоп теГкодз. СотриГт^, 1979, 23,
з. 357—365.
45. Ырзк1 АМ., РгерагаГа Е. Р. УеГ апоГкег регтиГаНоп зедиепсе. Тескп. Кер.
АСТ-10, СоогдтаГед 8с1елсе ЬаЬ., Ош'у. оГ ПНшлз, ОсГоЬег 1978.
46. Ырзкт АМ., РгерагаТа Е. Р. ЕГГкпеп! а^огПктз Гог Гтдт^ тах1’тит та!-
сЫп^з 1п сопуех ЫрагШе ^гаркз апд ге!а1ед ргоЫетз. АсГа ГпГогтаНса,
1981, 15, з. 329—346.
47. Ьит V. У. Ми1На(1пЬи1е геГпеуа! \уПЬ сотЫпед тдехез. Сотт. АСМ,
1970, 13, з. 660—665.
48. Матока V. М-, Китаг Р. М., Макезкиап 8. Ы. Ап О(|Е|3) а1^огШпп Гог
Ппдгпе тахГтит Потуз т пе1\уогкз. 1пГогтаНоп Ргосеззтя ЕеШ, 1978, 7,
з. 277—278.
49. Магек АМ., ОпузгИеипсг Л. Е1етеп1у 1о^1к1 1 Гкеогп тпо^озс! \у гадатаск.
АМуд. 2, АМагзхаууа, РАМЫ 1975.
50. Маззоп (1. М., С!п^Ьег О. С., Пакапшга 8. А затр!ег о! сксиП зуНсЫп^
пе(\уогкз. Сотри(ег, Липе 1979, з. 32—48.
51. Мепде1зоЬп К 8„ Би!та^е А. Ь. 8оте ^епсгаИгаНопз оГ (Ье ргоЫет о!
д18Нпс( гергезеп(аНуез. Сапад. Л. Ма(Ь., 1958, 10, з. 230—241.
52. Меп^ег К. Хиг аП&ететеп КигуепЖеопе. Рипд. Ма(Ь., 1927, 10, з. 96—115.
53. Мипго I. ЕШс!еп( де(егт!паНоп о( (Ье 1гапзШуе с!озиге о! а диес(ед
^гарЬ, 1п(огтаНоп Ргосеззт^ Ье(Ь, 1971, 1, з. 56—58.
54. МЦепЬШз А., XVIII Н. 8. СотЬта(опа1 А1^оп(Ьтз. Неу Уогк, Асадсгтпс
Ргезз 1975.
55. Рап V. Ла. Р!е!д ех(епзюп апд (гШпеаг а^ге&аНп^, ипШп^ апд сапсе-
Пп^ Гог (Ье ассе!ега(1’оп о! та(пх тиШрКсаНоп. Ргос. 20(Ь Аппиа! 8утр.
оп РоипдаНопз о! Сотри(ег 8с!епсе, Ос(оЬег 29—31, 1979, 8ап Лиап, Риег-
(о К1*со, з. 28—38.
56. Кадо К. Мо1е оп тдерепдепсе (ипсНоп. Ргос. Ьопдоп Ма(Ь. 8ос., 1957, 7,
з. 337—343.
57. Казюуа Н. №з(рр до та(ета(ук1 узрдкгезпе]. ХУагзгауа, Р\УМ, 1968.
58. Кет^о!д Е. X., Яеуег&еН Л., Бео Я СотЬта(опа1 А1&огП11т8. ТЬеогу апд
РгасИсе. Еп^1еуоод СНИз, К. Л., РгепНсе На!! 1977. [Русский перевод:
Рейнголд Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы. Теория и
практика. — М.: Мир, 1980.1
59. К1’уез( К. Ь., УшИетт Л. А ^епегаНгаЬ’оп апд ргооГ о! (Ье Аапдгеаа-Ко-
зепЬег^ соп]ес(иге. Ргос. 7111 Аппиа! АСМ 8утр. оп (Неогу оГ СотриИп^,
Мау 5—7, 1975. А1Ьидиегдие, ИМ, з. 6—11.
60. 8ед^еу!ск К. Регти(аНоп ^епегаНоп теИюдз. Сотр. 8игуеуз, 1977, 9.
з. 137—164 (см. также 8игуеуогз’ Рогит, з. 315—317).
61. 8езЬи 8., Кесд М. В. Ыпеаг рГарЬз апд е1сс(пса! пе(уогкз. Кеад!п^, Ма,
Адд18оп-АМез1еу 1961. [Русский перевод: Сешу С., Рид М. Б. Линейные
графы и электрические цепи. — М.: Высшая школа, 1971.]
62. 81ср1ап В. Туо (Ьеогстз оп а рагНси1аг сгоззЬаг зуПскт^ пе(уогк. (Не-
опубликованная статья, 1952).
63. 8регпег Е. Е1п 8а(г йЬег Ь’пкгшсп^еп е!пег епдКсИеп Меп&е. Ма(Ь. 2.,
1928, 27, з. 544—548.
64. 8(газзеп V. 6аиз51ап сПттаНоп !з по( орНта!. Митег. Ма(Ь., 1969, 13,
з. 354—356.
65. 8уз1о М. М., Вг!к1е\У1’с2 Л. СотриШюпа! схрепспсс уПЬ зотс (гапзШус
с!озиге а1&оп(Ьтз. СотриНпдг, 1975, 15, з. 33—39.
66. Таг]ап К. Е. Бер(Ь Бгз( зсагсЬ апд Ппеаг етгарк а^огПЬтз. 81АМ Л. Сот-
ри(., 1972, 1, з. 146—160.
67. Тафп К. Е. Оп (Не еИкяепсу оГ а ^оод Ьи( по( Ппеаг зе( тегеппд а1ео-
гИЬтз. Л, АСМ, 1975, 22, з. 215—225.
68. ТгоКег Н. Р. Регт (А1^оп(Ьт 115), Сотт. АСМ, 1962, 5, 8. 434—435.
69. Ти((е XV. Т. 1п(годисНоп (о (Не ТЬеогу о( Ма(го!д?. №у Уогк, Атепсап
Е1зе\чсг 1970.
70. ХУагзЬаП 8. А (Ьеогет оп Воо1еап та(псез. Л. АСМ, 1962, 9, з. 11 —12.
71. ХУеПз М. В. СепегаИоп оГ регти(а1!опз Ьу (гапзрозШоп. Ма(Ь. Сото.. 1961.
15,3.192—195.
72. \Уе1ак Б. Л. А. Ма(го!д ТЬеогу. Ьопдоп, АсадепНс Ргезз 1976.
73. ХУЬИпеу Н. Оп (Ье аЬз(гас( ргорегНез оГ Нпсаг тдерепдепсе. Атег. Л.
Ма(Ь., 1935, 57, з. 509—533.
74. ХУПзоп XV. С. СЬап&е пп$т$. Ьопдоп, РаЬег 1965.
75. Мг(11 К. \Уз(ер до рго^гатохгата 8у8(ета(усгпе^о. ХУагзга\уа, ШМТ 1978.
(Мг(Ь № 8уз(етаНс рго&гаттт^. Ап т(годис(юп. — РгспНсе На11, 1пс.,
1973.) [Русский перевод: Вирт Н. Систематическое программирование. Вве-
дение.—М.: Мир, 1977.]
76. Мг(Ь Ы. А1^огу(ту + з(гис(игу дапусЬ = рго^гату, ХУагзхауа, ХУНТ 1980.
(\У1*г(Ь Я А!^оп1Ьп18 + да(а з(гис(игез = рго^гатз. РгепНсе На11, 1пс.,
1976.) [Русский перевод: Вирт Н. Алгоритмы + Структуры данных = Про-
граммы.—М.: Мир, 1985.]
Указатель
Алгоритм 13
— генерирования всех перестановок
28, 31
-----всех подмножеств й-элемсит-
ного множества 35
----- всех последовательностей 26
-----всех разбиений множества 57
----всех й-элементных подмножеств
множества 45
— Дейкстры 124
— Диница 142, 145, 147
•----для матричного матроида 193
•----для матроида трансверсалей
200
— жадный 183, 190
— Краскала 197
— нахождения всех гамильтоновых
циклов 112
----- всех разбиений числа 63
-----кратчайшего пути 120
----- расстояний от источника до
всех вершин в бесконтурном гра-
фе 129
-----множества фундаментальных
циклов 100
-----стягивающего дерева методом
поиска в глубину 95
,---------методом поиска в шири-
ну 97
— нахождения разбиения семейства
всех подмножеств множества
на симметричные цепи 174
----- эйлерового цикла 107
— нумерации вершин бесконтурного
графа 127
— определения знака перестановки
23
— построения максимального потока
в сети 152
— с возвратом 108
— Уоршалла 133
— Флойда 132
— Хопкрофта — Карпа 159
Антицепь 173
База матроида 187
Беллман Р. Е. 122
Бинарный код Грея порядка п 35
Блок графа 102
— разбиения 48
Вектор инверсивный 77
Величина потока 136
Вершина графа 11
— изолированная 11
— отец 96
— потомок 96
— свободная 154
— сын 96
Вес дуги 119
— элемента матроида 190
Ветвь 94
Гамильтон В. Р. 34, 38, 47, 109
Гейл Д. 192
Генерирование множества перестано-
вок 24
— подмножеств множества 35
------- с повторениями 38
---й-элементных 45
— разбиений числа 63
Граница верхняя 49
— нижняя 49
Граф бесконтурный 127, 129
— выпуклый 180
двудольный 117, 154
— двусвязный 101
— неориентированный 10
— ориентированный 11
— связный 96
— сильно связный 117
Графы изоморфные 12
Группа перестановок степени п 19
— симметрическая степени п, 19
Двоичный л-мерный куб 37
Де Брейн Н. Д. 117
Дейкстра Э. В. 124
Дерево 94
— бинарное 70
— стягивающее графа 94
Деревья изоморфные 70
Джонсон С. М. 30
Диаграмма Феррерса 60
Дилворт Р. П. 177
Диниц Е. А. 142, 147
Длина пути 12, 119
— сети 142
— увеличивающей цепи 138
Дуга 11
Задача ЫР-полная 109
Закон Кирхгофа 100
Замыкание отношения транзитивное
133
Знак перестановки 21
Измельчение разбиения 48
Инволюция 77
Инверсия 75
Источник 136
Карп Р. М. 159
Кениг Д. 166
Класс эквивалентности 48
Клика 118
Клос С. 169
Комбинация без повторений 40
Коммутатор размерности /V X А/ 169
Компонента двусвязности 102
— связности 12
— сильной связности 117
Конец пути 12
Контур 12
Корень дерева 70
-----стягивающего 96
Коэффициент биномиальны!' 39
Краскал Д. В. 197
Кратность элемента 37
Лес стягивающий 97
Линия матрицы 166
Матрица бистохастическая 181
— инциденций 84
— перестановочная 181
— смежности 85
— соседства ребер 114
Матроид 185
— графа 196
— графовый 196
— двойственный 203
— матричный 193
— ранг 187
— свободный 190
— трансверсалей 200
Матроиды изоморфные 186
Метод Лума 176
— увеличивающих цепей 138
— Флойда 132
— Форда — Беллмана 122
Множество матроида зависимое 185
----- независимое 185
— с повторениями 37
— частично упорядоченное 10
Мост графа 117
Мощность множества 9
Начало пути 12
Область левая 9
— правая 9
Оптимальность по Гейлу 192
Отец вершины 96
Отношение 9
— антисимметричное 10
— бинарное 9, 132
- - — транзитивное замыкание 133
— рефлексивное 10
— симметричное 10
— эквивалентности 10
Очередь 13
Палиндром 76
Пара упорядоченная 9
Паросочетание 154
Паскаль 12
Перестановка 16
— нечетная 21
— обратная 19
— тождественная 19
— четная 21
Перманент матрицы 181
Петля 84
Подграф 12
Подмножество 9, 34
— собственное 9
— Л-элементное 39
Подпространство матроида 188
натянутое па множество 189
Поиск в глубину 89
— в ширину 92
Покрытие вершинное 165
Порядок антилексикографический 25
— лексикографический 25
— частичный 10
Потенциал вершины сети 147
Поток 136
— максимальный 136
— псевдомаксимальный 144
Потомок вершины 96
Принцип включения — исключения 72
Произведение декартово 9
— Коши рядов 64
Пропускная способность вершины
179
--- дуги 136
• — — разреза 138
Псевдоцикл 98
Путь в графе 11
— гамильтонов 34, 38, 47, 109
— длина 12
— конец 12
— критический 130
— начало 12
— эйлеров 106
Радо 190
Разбиение множества 48
— числа 60
----самосопряженное 82
----сопряженное 60
Разложение на циклы 20
Размещение объектов по ящикам
упорядоченное 16
Разность симметрическая 98
Разрез сети 137
----минимальный 138
Ранг матроида 187
Расстояние 119
Ребро графа 11
Решетка 49
Ряд Маклорена 65
— формальный 64
Секция коммутатора 170
Сеть 136
— перестраиваемая размерности
169
— трехсекционная Клоса 169
— СРМ 129
— РЕРТ 129
Система различных представителей
163
-------общая 168
Сложение рядов 64
Сложность временная 14
— вычислительная 13
— по памяти 14
Список инцидентности 87
Стек 13
Степень вершины 11
Сток 136
Суперпозиция перестановок 18
Сын вершины 96
Теорема венгерская 166
— Дилворта 177
— Радо—Эдмондса 190
— Холла 164
Тождество Коши 41
Точка сочленения 101
Транзитивное замыкание отношения
133
Трансверсаль частичная 199
Транспозиция 21
Треугольник Паскаля 41, 51
Троттер X. Ф. 30
Увеличивающая цепь 138
--- длина 138
Уоршалл С. 131, 133
Феррерс Н. Л1. 60
Флойд Р. В. 131
Форд Л. Р. 122, 138
Фундаментальное множество циклов
98
Функция 10
— взаимно однозначная 10
— на 10
— производящая 64
--- экспоненциальная 82
ядро 53
Холл Ф. 164
Хопкрофт Дж. 156
Хорда 94
Цепь 172
— симметричная 172
— чередующаяся 156
Цикл 12, 98
— Де Брейна порядка п 117
— гамильтонов 109
— матроида 189
— разложения перестановки 20
— эйлеров 106
— элементарный 12
Число Белла 52
— Каталана 72
— Стирлинга второго рода 50
---первого рода 54
— Фибоначчи 69
Шаг алгоритма 13
Эгервари Э. 166
Эдмондс Дж. 142, 190
Экспоненциальная производящая
функция 82
Элемент зависимый от множества
187
Ядро функции 53
Оглавление
Предисловие редактора перевода .................................... 5
От автора...........................................................7
1. Введение в комбинаторику..................................... 9
1.1. Основные понятия.............................................. 9
1.2. Функции и размещения..........................................14
1.3. Перестановки: разложение на циклы, знак перестановки......17
1.4. Генерирование перестановок....................................24
1.5. Подмножества множества, множества с повторениями, генерирова-
ние подмножеств множества..........................................34
1.6. ^-элементные подмножества, биномиальные коэффициенты .... 39
1.7. Генерирование ^-элементных подмножеств........................45
1.8. Разбиения множества...........................................48
1.9. Числа Стирлинга второго и первого рода........................50
1.10. Генерирование разбиений множества............................55
1.11. Разбиения чисел..............................................50
1.12. Производящие функции.........................................64
1,13. Принцип включения и исключения...............................72
1.14. Задачи ......................................................76
2. Алгоритмы на графах............................................84
2.1. Машинное представление графов.................................84
2.2. Поиск в глубину в графе.......................................88
2.3. Поиск в ширину в графе........................................92
2.4. Стягивающие деревья (каркасы).................................94
2.5. Отыскание фундаментального множества циклов в графе...........98
2.6. Нахождение компонент двусвязности ...................101
2.7. Эйлеровы пути................................................106
2 8. Алгоритмы с возвратом......................................108
2.9. Задачи.......................................................114
3. Нахождение кратчайших путей в графе ..........................119
3.1. Начальные понятия............................................119
3.2. Кратчайшие пути от фиксированной вершины.....................121
3.3. Случай неотрицательных весов — алгоритм Дейкстры.............124
3.4. Пути в бесконтурном графе.......................127
3.5. Кратчайшие пути между всеми парами вершин, транзитивное замы-
кание отношения...................................................130
3.6. Задачи.......................................................134
4. Потоки в сетях и родственные задачи...........................136
4.1. Максимальный поток в сети....................................136
4.2. Алгоритм построения максимального потока.....................141
4.3. Наибольшие паросочетания в двудольных графах.................154
4.4. Системы различных представителей.............................163
4.5. Разложение на цепи...........................................172
4.6. Задачи.......................................................178
5. Матроиды..................................................... 183
5.1. Жадные алгоритмы решения оптимизационных задач...............183
5.2. Матроиды и их основные свойства .............................185
5.3. Теорема Радо — Эдмондса......................................190
5.4. Матричные матроиды...........................................193
5.5. Графовые матроиды............................................195
5.6. Матроиды трансверсалей.......................................199
5.7. Задачи ,.....................................................202
Литература........................................................205
Указатель ....................................................... 203
Уважаемый читатель!
Ваши замечания о содержании книги,
ее оформлении, качестве перевода и другие
просим присылать по адресу: 129820, Моск-
ва, И-110, ГСП, 1-й Рижский пер., д. 2, из-
дательство «Мир».
Учебное издание
Витольд Липский
КОМБИНАТОРИКА ДЛЯ ПРОГРАММИСТОВ
Ст. научн. редактор Бряндинская А. А.
Мл. научн. редактор Королева Л. А.
Художник Грехов В. А.
Художественный редактор Шаповалов В. И.
Технический редактор Прохорова Е. Н.
Корректор Л. Д. Панова
И Б № 5417
Сдано в набор 12.02.87. Подписано к печати 30.09.87. Формат 60X90/16. Бумага книжно-жур-
нальная сыкт. Печать высокая. Гарнитура литературная. Объем 6,75 бум. л. Уел. печ. л. 13,50.
Усл. кр.-отт. 1X76. Уч.-изд. л. 12,32. Изд. № 1/5212. Тираж 45 000 экз. Зак. 524. Цена 90 коп.
ИЗДАТЕЛЬСТВО «МИР» 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2
Ленинградская типография № 2 головное предприятие ордена Трудового Красного Зна-
мени Ленинградского объединения «Техническая книга» нм. Евгении Соколовой Союз-
полиграфпрома при Государственном комитете СССР по делам издательств, полиграфии
и книжной торговли. 198052, г. Ленинград, Л-52, Измайловский проспект, 29.
ИЗДАТЕЛЬСТВО «МИР» ПРЕДЛАГАЕТ СЛЕДУЮЩИЕ КНИГИ
ПО ПРОГРАММИРОВАНИЮ И ПРИКЛАДНОЙ МАТЕМАТИКЕ
Блейхут Р. Теория и практика кодов, контролирующих ошиб-
ки. Пер. с англ. 1986, 2 р. 60 к.
Валях И. Последовательно-параллельные вычисления. Пер.
с англ. 1985. 2 р. 30 к.
Гилман Л., Роуз А. Курс АПЛ. Диалоговый подход. Пер. с
англ. 1979. 2 р. 10 к.
Гренандер У. Лекции по теории образов. Пер. с англ. В 3-х
томах. Т. 1. Синтез образов 1979. 1 р. 80 к. Т. 2. Анализ образов.
1981. 2 р. 30 к. Т. 3. Регулярные структуры. 1983. 2 р. 90 к.
Джоунс У., Трон У. Непрерывные дроби. Аналитическая тео-
рия и приложения. Пер. с англ. 1985. 3 р. 60 к.
Зайлер Э. Калибровочные теории связи с конструктивной
квантовой теорией поля. Пер. с англ. 1985. 1 р. 90 к.
Системы параллельной обработки. Под редакцией Д. Ивенса.
Пер. с англ. 1985. 1 р. 90 к.
Феррари Д. Оценка производительности вычислительных си-
стем. Пер. с англ. 1981. 3 р. 40 к.
Шоу А. Логическое проектирование операционных систем.
Пер. с англ. 1981. 1 р. 70 к.
Чисар И., Кёрнер Я. Теория информации: теоремы кодирова-
ния для дискретных систем без памяти. Пер. с англ. 1985. 3 р.
Эти книги Вы можете приобрести в магазинах книготоргов,
распространяющих научно-техническую литературу. Если в бли-
жайшем от Вас магазине их не окажется, заказ можно напра-
вить по адресу:
121019 Москва, просп. Калинина, 26, п/я 42, магазин № 200
«Московский Дом книги»;
103050 Москва, ул. Петровка, 15, магазин № 8 «Техническая
книга»;
117334 Москва, Ленинский проспект, 40, магазин № 115,
«Дом научно-технической книги»;
191040 Ленинград, Пушкинская ул., 2, магазин № 5 «Техни-
ческая книга».
Книги будут высланы наложенным платежом (без задатка).
90 коп.
В книге представлены некоторые разделы ком
бинаторики, причем особое внимание уделено
конструктивному алгоритмическому подходу —
рядом с обсуждаемыми комбинаторными проб -
лемами, как правило, приводятся алгоритмы их
решения вместе с анализом их вычислительной
сложности Эти алгоритмы представляют собой
сжатые варианты программ, написанных на язы-
ке Паскаль..
Из предисловия автора