Опубликован: 05.01.2015 | Доступ: свободный | Студентов: 2178 / 0 | Длительность: 63:16:00
Лекция 22:

Потоки в сетях

< Лекция 21 || Лекция 22: 123456789101112

Сведения к вычислению максимального потока

В этом разделе мы рассмотрим ряд задач, сводящихся к задаче вычислении максимального потока, и покажем, что алгоритмы из разделов 22.2 и 22.3 важны в более широком контексте. Мы можем снимать различные ограничения на сети и решать другие сетевые задачи, мы можем решать другие задачи обработки сетей и графов, и мы можем решать задачи, которые не относятся к сетевым. В этом разделе будут рассмотрены примеры такого использования - вычисление максимального потока в качестве общей модели решения задачи.

Мы также изучим взаимосвязь между вычислением максимального потока и более сложными задачами, чтобы сформировать контекст для рассмотрения этих задач в дальнейшем. В частности, задача о максимальном потоке представляет собой специальный случай задачи отыскания потока минимальной стоимости, о которой пойдет речь в разделах 22.5 и 22.6. Кроме того, мы покажем, как формулировать задачи вычисления максимального потока в виде задач линейного программирования, которые мы будем рассматривать в части 8. Задача отыскания потока минимальной стоимости и линейное программирование представляют собой более общие модели решения задач, чем модель максимального потока. И хотя обычно решение задач о максимальном потоке с помощью специальных алгоритмов, описанных в разделах 22.2 и 22.3, менее трудоемко, чем с помощью алгоритмов для решения более общих задач, важно знать о взаимосвязи между моделями решения задач при переходе к более сложным моделям.

Мы будем употреблять термин стандартная задача о максимальном потоке (standard maxflow problem) для версии задачи, которую мы изучали до сих пор (максимальный поток в st-сетях с ограниченной пропускной способностью ребер). Этот термин будет применяться исключительно для облегчения ссылок в данном разделе. Вначале мы рассмотрим сведения, на примере которых убедимся, что ограничения в стандартной задаче о максимальном потоке несущественны, т.к. к стандартной задаче сводятся или эквивалентны несколько других задач о потоках. Любую из эквивалентных задач можно принять в качестве " стандартной " задачи. Простым примером такой задачи, который уже упоминался как следствие из леммы 22.1, является задача отыскания циркуляции в сетях, позволяющая получить максимальный поток в заданном ребре. Затем мы рассмотрим другие способы постановки задачи, в каждом случае отмечая их связь со стандартной задачей.

Максимальный поток в сетях общего вида. Нужно найти поток в сети, который максимизирует суммарный отток из ее истоков (и, следовательно, приток в ее стоки). По соглашению, в сети, в которой нет истоков и/или стоков, поток считается нулевым.

Лемма 22.14. Задача о максимальном потоке в сетях общего вида эквивалентна задаче о максимальном потоке в st-сетях.

Доказательство. Ясно, что алгоритм вычисления максимального потока для сетей общего вида будет работать и на st-сетях, поэтому нужно лишь проверить, что общая задача сводится к задаче об st-сетях. Для этого сначала найдем истоки и стоки (пользуясь, например, методом для инициализации очереди из программы 19.8) и завершим работу с кодом возврата 0, если нет ни того, ни другого. Затем добавим фиктивную вершину-исток s и ребра из нее во все истоки сети (пропускная способность каждого такого ребра равна оттоку из его конечной вершины), а также фиктивную вершину-сток t и ребра из каждого стока сети в нее (пропускная способность каждого такого ребра равна оттоку его начальной вершины). Это сведение показано на рис. 22.31. Любой максимальный поток в st-сети непосредственно соответствует максимальному потоку в исходной сети. $\blacksquare$

 Сведение задачи с несколькими истоками и стоками

Рис. 22.31. Сведение задачи с несколькими истоками и стоками

В верхней сети имеются три истока (0, 1 и 2) и два стока (5 и 6). Чтобы найти поток, который максимизирует суммарный поток из истоков и в стоки, мы вычисляем максимальный поток в st-сети, представленной внизу. Это копия исходной сети, в которую добавлены исток 7 и сток 8. Из вершины 7 в каждый исходный исток проводим ребро, пропускная способность которого равна суммарной пропускной способности ребер, исходящих из этого истока. А в вершину 8 ведут ребра из каждого исходного стока сети, пропускная способность которых равна суммарной пропускной способности ребер, входящих в стоки исходной сети.

Ограничения на пропускную способность вершин. Пусть задана некоторая транспортная сеть, и необходимо вычислить максимальный поток, удовлетворяющий дополнительным ограничениям: поток через каждую вершину не должен превышать некоторую фиксированную пропускную способность.

Лемма 22.15. Задача вычисления максимального потока в транспортной сети с ограничениями на пропускную способность вершин эквивалентна стандартной задаче о максимальном потоке.

Доказательство. Здесь также можно воспользоваться любым алгоритмом, который решает задачу с ограничениями на пропускные способности, для решения стандартной задачи (установив пропускную способность в каждой вершине больше, чем ее приток или ее отток), поэтому достаточно доказать сводимость к стандартной задаче. Для заданной транспортной сети с ограниченными пропускными способностями построим стандартную транспортную сеть с двумя вершинами u и u* , соответствующими каждой исходной вершине u. При этом все ребра, входящие в исходную вершину, идут в u, все исходящие ребра выходят из u* , а пропускная способность ребра u-u* равна пропускной способности исходной вершины. Это построение показано на рис. 22.32. Потоки в ребрах вида u*-v при любом максимальном потоке в преобразованной сети дают максимальный поток в исходной сети, который должен удовлетворять ограничениям на пропускную способность вершин из-за наличия ребер вида u-u*. $\blacksquare$

 Удаление пропускных способностей вершин

Рис. 22.32. Удаление пропускных способностей вершин

Чтобы решить задачу вычисления максимального потока в сети, показанной вверху, и чтобы поток через каждую вершину не превосходил пропускной способности, заданной в массиве capV, индексированном именами вершин, мы строим стандартную сеть, показанную внизу. Для каждого ребра u-v соединяем новую вершину u* (где u* означает v+V) с каждой вершиной u, добавляем ребро, пропускная способность которого равна пропускной способности вершины u, и включаем ребро u*-v. Пары u-u* обведены овалами. Любой поток в нижней сети непосредственно соответствует потоку в верхней сети, который удовлетворяет ограничениям на пропускные способности вершин.

Допуская наличие нескольких стоков и истоков или накладывая ограничения на пропускные способности, мы вроде бы обобщаем задачу о максимальном потоке; однако смысл лемм 22.14 и 22.15 в том, что эти задачи нисколько не сложнее стандартной задачи. Теперь рассмотрим версию задачи, которая поначалу кажется более легкой для решения.

Ациклические сети. Нужно найти максимальный поток в ациклической сети. Осложняет ли наличие циклов в транспортной сети задачу вычисления максимального потока?

Мы уже сталкивались со многими примерами задач обработки орграфов, которые существенно усложняются при наличии в орграфах циклов. Пожалуй, самый наглядный из них - задача вычисления кратчайших путей во взвешенных орграфах, когда веса ребер могут принимать отрицательные значения (см. "Кратчайшие пути" ) - которая легко решается за линейное время при отсутствии циклов и NP-трудна, если циклы допускаются. Как ни странно, задача о максимальном потоке в ациклических сетях не становится проще.

Лемма 22.16. Задача вычисления максимального потока в ациклических сетях эквивалентна стандартной задаче о максимальном потоке.

Доказательство. Здесь также достаточно показать, что стандартная задача сводится к ациклической задаче. Для любой исходной сети с V вершинами и E ребрами построим сеть с 2V + 2 вершинами и E + 3V ребрами, которая не только не содержит циклов, но и обладает простой структурой.

Пусть u* означает u + V. Построим двудольный граф, в котором каждой вершине u исходной сети сответ-ствуют две вершины u и u* , а каждому ребру u-v исходной сети соответствует ребро u-v* с такой же пропускной способностью. Затем добавим в этот двудольный граф исток s и сток t, а для каждой вершины u исходного графа - ребро s-u и ребро u*-t , пропускная способность каждого из которых равна суммарной пропускной способности ребер, исходящих из вершины u в исходной сети. Кроме того, добавим ребра из u в u* с пропускной способностью X + 1, где X - суммарная пропускная способность ребер исходной сети. Это построение показано на рис. 22.33.

Чтобы показать, что любой максимальный поток в исходной сети соответствует максимальному потоку в преобразованной сети, рассмотрим вместо потоков сечения. Для любого заданого st-сечения размера с в исходной сети мы покажем, как построить st-сечение размера c + X в преобразованной сети. А для любого заданного минимального сечения размера c + X в преобразованной сети мы покажем, как построить st-сечение размера с в исходной сети. Таким образом, если задано минимальное сечение в преобразованной сети, то соответствующее ему сечение в преобразованной сети также является минимальным. Более того, наше построение дает поток, величина которого равна пропускной способности минимального сечения, т.е. это максимальный поток.

Для любого заданного сечения исходной сети, которое отделяет исток от стока, пусть S - множество вершин истока, а T - множество вершин стока. Построим сечение преобразованной сети, помещая вершины из S в множество, содержащее вершину s, вершины из T - в множество, содержащее вершину t, и помещая для всех u вершины u и u* в одну и ту же часть сечения, как показано на рис. 22.33. Для каждой вершины u в множестве ребер сечения содержится либо s-u , либо u*-t , а u-v* содержится во множестве ребер сечения тогда и только тогда, когда ребро u-v содержится в множестве ребер сечения исходной сети. Следовательно, общая пропускная способность сечения равна пропускной способности сечения в исходной сети плюс Х.

Пусть задано любое минимальное st-сечение преобразованной сети, и пусть S* есть множество вершины s, а T* - множество вершины t. Нам нужно построить сечение с той же пропускной способностью, и чтобы вершины u и u* входили в одно и то же множество для всех u - тогда соответствие из предыдущего абзаца даст сечение в исходной сети, что и завершит доказательство. Во-первых, если u содержится в S* , а t содержится в T* , то u-u* должно быть перекрестным ребром, но это невозможно: u-u* не может принадлежать никакому минимальному сечению, поскольку сечение, состоящее из всех ребер, которые соответствуют ребрам исходного графа, имеет меньшую стоимость. Во-вторых, если u содержится в T* , а u* содержится в S* , то s-u должно принадлежать этому сечению, т.к. это единственное ребро, соединяющее s и u. Но мы можем построить сечение той же стоимости, заменив все ребра, направленные из u, на s-u и переместив u в S* .

Если в преобразованной сети задан какой-либо поток величины с + X, то мы просто помещаем в каждое соответствующее ребро исходной сети поток величины с. Преобразование сечения, описанное в предыдущем абзаце, не влияет на это, т.к. оно работает с ребрами, в которых поток равен нулю. $\blacksquare$

 Сведение к ациклической сети

Рис. 22.33. Сведение к ациклической сети

Каждая вершина u верхней сети соответствует двум вершинам u и u* (где u* означает u+V) нижней сети, а каждое ребро u-v верхней сети соответствует ребру u-v* нижней сети. Кроме того, в нижней сети имеются ребра u-u* без пропускных способностей, источник s с ребрами, ведущими в каждую вершину, не отмеченную звездочкой, и сток t, в который ведут ребра из каждой вершины, помеченной звездочкой. Серые и белые вершины (и ребра, соединяющие серые вершины с белыми) иллюстрируют прямую взаимосвязь сечений в обеих сетях (см. текст).

В результате такого сведения мы получаем не только ациклическую сеть, но и простую двудольную структуру. Данное сведение означает, что эти сети с более простой структурой при желании можно принять в качестве стандартных вместо сетей общего вида. Может показаться, что такая специальная структура позволяет создать более быстрые алгоритмы вычисления максимального потока. Однако описанное сведение показывает, что любой алгоритм, разработанный для таких специальных ациклических сетей, можно использовать для решения задач о максимальном потоке в сетях общего вида ценой небольших дополнительных затрат. Вообще-то классические алгоритмы вычисления максимального потока используют гибкость общей сетевой модели: оба рассмотренных нами подхода - алгоритм расширения путей и проталкивания напора - используют концепцию остаточной сети, предусматривающий добавление циклов в сеть. Когда приходится решать задачу о максимальном потоке в ациклической сети, для ее решения обычно используется стандартный алгоритм, ориентированный на сети общего вида.

Довольно сложное построение в лемме 22.16 показывает, что доказательства сводимости требуют особого внимания и даже изобретательности. Такие доказательства важны потому, что не все версии задачи о максимальном потоке эквивалентны стандартной задаче, а нам нужно знать пределы применимости наших алгоритмов. Математики продолжают исследования в этой области, т.к. сведения различных практических задач не всегда известны, как показывают следующий пример.

Максимальный поток в неориентированных сетях. Неориентированная транспортная сеть - это взвешенный граф с целочисленными весами ребер, которые интерпретируются как пропускные способности. Циркуляция в таких сетях - это назначение весов и

направлений ребрам, которое удовлетворяет условию: поток в каждом ребре не превышает его пропускную способность, а суммарный поток в каждую вершину равен суммарному потоку из этой вершины. Задача о неориентированном максимальном потоке ( рис. 22.34) состоит в том, чтобы найти циркуляцию, которая максимизирует поток в заданном направлении в заданном ребре (т.е. из некоторой заданной вершины s в другую заданную вершину t). Пожалуй, эта задача более естественно, чем стандартная задача, соответствует модели трубопровода для перекачки жидкостей: она позволяет протекать жидкости по трубам в обоих направлениях.

 Сведение задачи о неориентированных сетях

Рис. 22.34. Сведение задачи о неориентированных сетях

Чтобы решить задачу о максимальном потоке в неориентированной сети, ее можно рассматривать как ориентированную сеть с ребрами в обоих направлениях. Обратите внимание, что каждому ребру неориентированной сети соответствует четыре ребра в соответствующей ей остаточной сети.

Лемма 22.17. Задача о максимальном потоке для неориентированных st-сетей сводится к задаче о максимальном потоке для st-сетей.

Доказательство. Пусть дана неориентированная сеть. Построим ориентированную сеть с теми же вершинами, в которой каждому ребру исходной сети соответствуют два разнонаправленных ребра с пропускными способностями, равными пропускной способности неориентированного ребра. Понятно, что любой поток в исходной сети соответствует потоку такой же мощности, что и в преобразованной сети. Обратное также верно: если в неориентированной сети через ребро u-v протекает поток f, а через ребро v-u протекает поток g, то если $f\geq g$, можно поместить поток величины f- g в ребро u-v ориентированной сети, а в противном случае поместить поток величины g -f в ребро v-u. Следовательно, любой максимальный поток в ориентированной сети является максимальным потоком в неориентированной сети: это построение дает поток, а любой поток большей величины в ориентированной сети будет соответствовать некоторому потоку большей величины в неориентированной сети; однако такого потока не существует. $\blacksquare$

Это доказательство не утверждает, что задача о максимальном потоке в неориентированной сети эквивалентна стандартной задаче. То есть не исключено, что вычисление максимальных потоков в неориентированных сетях может иметь меньшую трудоемкость, чем вычисление максимальных потоков в стандартных сетях (см. упражнение 22.81).

Итак, мы можем обрабатывать сети с несколькими стоками и истоками, неориентированные сети, сети с ограниченными пропускными способностями вершин и многие другие виды сетей (см., например, упражнение 22.79), используя алгоритмы вычисления максимального потока для st-сетей, рассмотренные в двух предыдущих разделах. Более того, лемма 22.16 утверждает, что все эти задачи можно решить даже при помощи алгоритма, который работает только на ациклических сетях.

Теперь мы рассмотрим задачу, которая не является задачей именно о максимальном потоке, но ее можно свести к задаче о максимальном потоке и решить с помощью алгоритмов вычисления максимального потока. Это один из способов формализовать базовую версию задачи распределения товаров, которая была описана в начале данной главы.

Допустимый поток. Предположим, что каждой вершине транспортной сети присвоен вес, который можно рассматривать как предложение (если он положителен) или как спрос (если отрицателен), а сумма весов всех вершин сети равна нулю. Будем считать поток допустимым (feasible), если разность между притоком и оттоком каждой вершины равна весу этой вершины (предложению, если разность положительна, и спросу, если отрицательна). Пусть дана такая сеть, и нужно определить, возможны ли допустимые потоки. На рис. 22.35 рис. 22.35 приведен пример задачи о допустимом потоке.

Вершины с предложением соответствуют складам в задаче о распределении товаров, вершины со спросом соответствуют розничным торговым точкам, а ребра соответствуют дорогам на маршрутах грузоперевозок. Задача о допустимом потоке отвечает на следующий основной вопрос: можно ли найти такой способ доставки товаров, при котором везде предложение соответствует спросу.

Лемма 22.18. Задача о допустимом потоке сводится к задаче о максимальном потоке.

Доказательство. Пусть поставлена задача о допустимом потоке. Построим сеть с теми же вершинами и ребрами, но без весов у вершин. Вместо этого добавим вершину истока s, ребра из которой ведут в каждую вершину предложения с весом, равным предложению соответствующей вершины, и добавим вершину стока t, в которую ведет ребро из каждой вершины со спросом (так что вес такого ребра положителен). Решим задачу о максимальном потоке на этой сети. В исходной сети имеется допустимый поток тогда и только тогда, когда все ребра, исходящие из истока, и все ребра, ведущие в сток, заполнены при таком потоке до их пропускных способностей. На рис. 22.36 приведен пример такого сведения. $\blacksquare$

 Допустимый поток

Рис. 22.35. Допустимый поток

В задаче о допустимом потоке в дополнение к пропускным способностям ребер заданы величины предложения и спроса. Необходимо найти такой поток, при котором отток равен сумме поставки и притока в вершинах предложения, и приток равен сумме оттока и спроса в вершинах спроса. Слева представлена задача о допустимом потоке, а правее - три ее решения.

Разработка классов, которые реализуют сведения рассмотренного выше вида, может оказаться сложной задачей для программистов - главным образом потому, что обрабатываемые объекты представлены сложными структурами данных. Нужно ли строить новую сеть, чтобы свести еще одну задачу к стандартной задаче о максимальном потоке? Некоторые из задач требуют для своего решения дополнительных данных - таких как пропускные способности вершин или предложение или спрос - поэтому построение стандартной сети без этих данных может оказаться оправданным. Использование указателей на ребра играет здесь важную роль: если скопировать ребра сети, а затем вычислить максимальный поток, то что потом делать с результатом? Перенос вычисленного потока (вес каждого ребра) из одной сети в другую, когда обе сети представлены списками смежности - отнюдь не тривиальное действие. Когда используются указатели на ребра, новая сеть содержит копии указателей, а не ребер, что позволяет переслать значения потоков непосредственно в сеть клиента. Программа 22.6 представляет собой реализацию, которая демонстрирует некоторые из этих моментов в классе для решения задач поиска подходящего потока с помощью сведения согласно лемме 22.16.

 Сведение задачи о допустимом потоке

Рис. 22.36. Сведение задачи о допустимом потоке

Это стандартная сеть, построенная для задачи о допустимом потоке с рис. 22.35 с помощью добавления ребер из нового истока в вершины с предложением (пропускные способности каждого такого ребра равны величине предложения) и ребер в новый сток из вершин со спросом (пропускные способности каждого такого ребра равны величине спроса). В сети на рис. 22.35 допустимый поток имеется тогда и только тогда, когда в этой сети имеется поток (максимальный поток), который заполняет все ребра, исходящие из стока, и все ребра, входящие в исток.

Каноническим примером задачи о потоках, которую невозможно решить с помощью модели максимального потока, и которая будет рассмотрена в разделах 22.5 и 22.6, является расширение задачи о допустимом потоке. Добавим второе множество весов ребер, которые будут интерпретироваться как стоимости, определим через них стоимости потоков и поставим задачу найти допустимый поток минимальной стоимости. Эта модель формализует общую задачу распределения товаров. Мы хотим не только знать, можно ли транспортировать товары, но и какова минимальная стоимость развозки.

Все задачи, рассмотренные в данном разделе, имеют одну и ту же цель (вычисление потоков в транспортной сети), поэтому не удивительно, что мы можем решать их с помощью модели, предназначенной для решения задач транспортной сети. Как утверждает теорема о максимальном потоке и минимальном сечении, алгоритмы вычисления максимального потока позволяют решать задачи обработки графов, которые с виду имеют мало общего с потоками. Теперь мы обратимся к примерам такого рода.

Двудольное сопоставление с максимальной мощностью. Пусть задан двудольный граф. Нужно найти такое множество ребер максимальной мощности, что каждая вершина соединена не более чем с одной другой вершиной.

Для краткости мы будем далее называть эту задачу просто задачей двудольного сопоставления (bipartite matching), кроме случаев, в которых нужно отличить ее от других подобных задач. Она формализует задачу трудоустройства, которая была упомянута в начале данной главы. Вершины соответствуют соискателям и работодателям, а ребра - отношению " взаимной заинтересованности в трудоустройстве". Решение задачи двудольного сопоставления приводит к максимально возможному трудоустройству. На рис. 22.37 показан двудольный граф, моделирующий задачу с рис. 22.3.

Без графов очень трудно искать прямое решение задачи о двудольном сопоставлении. Например, эта задача сводится к следующей комбинаторной головоломке: " найти максимальное подмножество из множества пар целых чисел (взятых из непересекающихся множеств), чтобы ни в одной паре не было одинаковых чисел " . Пример, приведенный на рис. 22.37, соответствует решению этой головоломки для пар 0-6, 0-7, 0-8, 1-6 и т.д. Эта задача на первый взгляд кажется простой, однако, как видно на примере задачи поиска гамильтонова пути из "Виды графов и их свойства" (и многих других задач), какой-либо примитивный систематический перебор пар до возникновения противоречия может потребовать экспоненциального времени. То есть существует слишком много подмножеств пар, чтобы можно было проверить все варианты; решение этой задачи должно быть достаточно разумным, чтобы использовать лишь немногие из них. Решение головоломок сопоставления вроде только что описанной или разработка алгоритмов, которые способны эффективно решать любую такую головоломку - очень непростые задачи, позволяющие продемонстрировать возможности и пользу модели сетевых потоков, которая предоставляет разумный способ построения двудольного сопоставления.

Программа 22.6. Решение задачи о допустимом потоке сведением к задаче о максимальном потоке

Данный класс решает задачу о допустимом потоке с помощью сведения ее к задаче о максимальном потоке, используя построение, представленное на рис. 22.36. Конструктор принимает в качестве аргументов сеть и вектор sd, индексированный именами вершин. Если значение sd[i] положительно, то оно представляет предложение в вершине i, а если отрицательно, то спрос.

Как показано на рис. 22.36, конструктор строит новый граф с теми же ребрами, но с двумя дополнительными вершинами s и t. Ребра из s ведут в узлы с предложением, а ребра из вершин со спросом ведут в вершину t. Затем он находит максимальный поток и проверяет, заполнены ли все дополнительные ребра до их пропускных способностей.

  #include "MAXFLOW.cc"
  template <class Graph, class Edge>
  class FEASIBLE
 { const Graph &G;
   void freeedges(const Graph &F, int v)
  { typename Graph::adjIterator A(F, v);
    for (EDGE* e = A.beg(); !A.end(); e = A.nxt())
   delete e;
  }
 public:
   FEASIBLE(const Graph &G, vector<int> sd) : G(G)
  { Graph F(G.V()+2);
    for (int v = 0; v < G.V(); v++)
   { typename Graph::adjIterator A(G, v);
     for (EDGE* e = A.beg(); !A.end(); e = A.nxt())
    F.insert(e);
   }
    int s = G.V(), t = G.V()+1;
    for (int i = 0; i < G.V(); i++)
   if (sd[i] >= 0)
     F.insert(new EDGE(s, i, sd[i]));
   else
     F.insert(new EDGE(i, t, -sd[i]));
    MAXFLOW<Graph, Edge>(F, s, t);
    freeedges(F, s); freeedges(F, t);
  }
 } ;
   
 Двудольное сопоставление

Рис. 22.37. Двудольное сопоставление

Этот пример задачи двудольного сопоставления служит формальным представлением задачи трудоустройства с рис. 22.3. Отыскание наилучшего способа, позволяющего студентам получить рабочие места, эквивалентно выявлению в этом двудольном графе максимального количества ребер с не связанными между собой вершинами.

Лемма 22.19. Задача о двудольном сопоставлении сводится к задаче о максимальном потоке.

Доказательство. Для заданной задачи двудольного сопоставления построим экземпляр задачи о максимальном потоке: проведем все ребра из одного множества в другое, добавим исток, из которого ребра ведут во все элементы одного множества, и сток, в который ведут ребра из элементов другого множества. Чтобы преобразовать полученный орграф в сеть, назначим каждому ребру пропускную способность, равную 1. Это построение показано на рис. 22.38.

Теперь любое решение задачи о максимальном потоке для этой сети дает решение соответствующей задачи о двудольном сопоставлении. Сопоставление в точности соответствует тем ребрам, соединяющим вершины обоих множеств, которые заполнены до пропускной способности алгоритмом вычисления максимального потока. Во-первых, сетевой поток всегда дает допустимое сопоставление: поскольку у каждой вершины имеется входящее (из истока) или исходящее (в сток) ребро с единичной пропускной способностью, то через каждую вершину может пройти только единица потока - откуда, в свою очередь, следует, что каждая вершина может быть включена только в одно сопоставление. Во-вторых, ни одно сопоставление не может иметь больше ребер, поскольку любое такое сопоставление может непосредственно привести к потоку, большему того, который получен алгоритмом вычисления максимального потока. $\blacksquare$

Например, на рис. 22.38 алгоритм вычисления максимального потока с использованием расширяющих путей может использовать пути s-0-6-t, s-1-7-t, s-2-8-t, s-4-9-t, s-5-10-t и s-3-6-0-7-1-11-t для вычисления сопоставления 0-7, 1-11, 2-8, 3-6, 4-9 и 5-10. Следовательно, существует способ трудоустройства всех студентов в задаче, показанной на рис. 22.3.

 Сведение задачи о двудольном сопоставлении

Рис. 22.38. Сведение задачи о двудольном сопоставлении

Чтобы найти максимальное сопоставление в двудольном графе (вверху) мы строим st-сеть (внизу), направляем все ребра из верхнего ряда в нижний ряд, добавляем новый исток с ребрами в каждую вершину верхнего ряда, добавляем новый сток, в который ведут ребра из каждой вершины нижнего ряда, и назначаем всем ребрам единичную пропускную способность. При любом потоке можно заполнить не более одного ребра из всех ребер, исходящих из каждой вершины верхнего ряда, а также не более одного ребра из всех ребер, входящих в каждую вершину нижнего ряда, поэтому решение задачи о максимальном потоке для этой сети дает максимальное сопоставление для двудольных графов.

< Лекция 21 || Лекция 22: 123456789101112
Бактыгуль Асаинова
Бактыгуль Асаинова

Здравствуйте прошла курсы на тему Алгоритмы С++. Но не пришел сертификат и не доступен.Где и как можно его скаачат?

Александра Боброва
Александра Боброва

Я прошла все лекции на 100%.

Но в https://www.intuit.ru/intuituser/study/diplomas ничего нет.

Что делать? Как получить сертификат?