Графы и алгоритмы

Потоки

Разбить на страницы
Показывать лекцию целиком

Задача о максимальном потоке

В этой лекции будем рассматривать ориентированные графы без петель и кратных ребер. Для вершины $$x$$ множество всех входящих в нее ребер обозначается через $$E^{+}(x)$$, а множество выходящих - через $$E^{-}(x)$$. Сетью называется орграф, в котором:

  • каждому ребру $$e$$ приписано положительное число $$c(e)$$, называемое пропускной способностью ребра ;
  • выделены две вершины $$s$$ и $$t$$, называемые соответственно источником и стоком, при этом $$E^{+} (s)=E^{-}(t)=\varnothing$$.
  • Вершины сети, отличные от источника и стока, будем называть внутренними.

    Пусть задана сеть $$N$$ с множеством вершин $$V$$ и множеством ребер $$E$$. Функция $$f$$ с вещественными значениями, определенная на $$E$$, называется потоком в сети $$N$$, если она удовлетворяет следующим условиям:

  • (1) $$0\le f(e)\le c(e)$$ для каждого ребра $$e$$ ;
  • (2) $$\suml_{e\in E^{+}_{} (x)}f(e) =\suml_{e\in E^{-}_{} (x)}f(e)$$ для каждой внутренней вершины $$x$$.
  • На рис. 16.1 показан пример сети и потока в ней. Число, вписанное в примыкающий к ребру квадрат, представляет пропускную способность, а другое число, написанное около ребра, - величину потока.

    (рис 16.1)

    Условие (2), называемое условием сохранения потока, иногда удобно представлять в несколько иной форме. Пусть $$f$$ - любая числовая функция, определенная на ребрах сети. Дивергенцией функции $$f$$ в вершине $$x$$ называется величина

    $$\mathop{\rm div}\nolimits_{f} (x)=\sum_{e\in E^{-} (x)}f(e) -\sum _{e\in E^{+} (x)}f(e).$$

    Заметим, что для любой такой функции $$f$$ имеет место равенство

    $$\suml_{x\in V}\mathop{\rm div}\nolimits_{f} (x) =0,$$

    так как каждое ребро является входящим для одной вершины и выходящим для другой, и, следовательно, каждое ребро $$e$$ в этой сумме представлено двумя слагаемыми: $$f(e)$$ и $$-f(e)$$.

    Условие сохранения означает, что дивергенция потока в каждой внутренней вершине должна быть равна $$0$$. Поэтому из равенства (1) следует, что для потока $$f$$

    $$\mathop{\rm div}\nolimits_{f} (s)+ \mathop{\rm div}\nolimits_{f}(t)=\suml_{e\in E^{-} (s)}f(e)-\suml_{e\in E^{+} (t)}f(e) =0.$$

    Величина

    $$M(f)=\mathop{\rm div}\nolimits_{f} (s)=\suml_{e\in E^{-}(s)}f(e)$$

    называется величиной потока. В примере на рис. 16.1 $$M(f)=4$$. Задача о максимальном потоке состоит в том, чтобы для данной сети найти поток наибольшей величины.

    Введем некоторые вспомогательные понятия и установим два полезных соотношения. Пусть $$X\subseteq V$$, $$\overline{X}=V-X$$. Множество всех ребер, у которых начальная вершина принадлежит $$X$$, а концевая - $$\overline{X}$$, обозначим через $$(X,\overline{X})$$. Пропускной способностью множества $$(X,\overline{X})$$ называется сумма пропускных способностей всех его ребер, она обозначается через $$c(X)$$. Если $$f$$ - поток, то для каждого множества $$X\subseteq V$$ можно определить величину $$f(X)=\suml_{e\in (X,\bar{X})}f(e)$$. Очевидно, для любого множества $$X$$ и любого потока $$f$$ выполняется неравенство $$f(X)\le c(X)$$. Множество $$(X,\overline{X})$$ называется разрезом, если $$s\in X$$, $$t\in \overline{X}$$.

    Лемма 1. Для любого потока $$f$$ и любого разреза $$(X,\overline{X})$$ выполняется равенство $$M(f)=f(X)-f(\overline{X})$$.

    Доказательство. Рассмотрим величину $$S=\suml_{x\in X}\mathop{\rm div}\nolimits_{f} (x)$$. Так как дивергенция во внутренних вершинах равна нулю, то эта сумма равна дивергенции источника, то есть величине потока $$M(f)$$. С другой стороны, рассмотрим вклад, вносимый в эту сумму некоторым ребром $$e=(x,y)$$. Он зависит от того, в каком отношении к множеству $$X$$ находится это ребро:

  • если $$e\in (X,\overline{X})$$, то в сумму $$S$$ входит слагаемое $$\mathop{\rm div}\nolimits_{f}(x)$$, которое, в свою очередь, является суммой и содержит слагаемое $$f(e)$$ со знаком плюс; это единственное в данном случае вхождение $$f(e)$$ в $$S$$, так что вклад ребра $$e$$ равен $$f(e)$$ ;
  • если $$e\in (\overline{X},X)$$, то в $$S$$ входит слагаемое $$\mathop{\rm div}\nolimits_{f} (y)$$, которое, в свою очередь, содержит слагаемое $$f(e)$$ со знаком минус; вклад ребра $$e$$ в этом случае равен $$-f(e)$$ ;
  • если ребро соединяет две вершины из $$X$$, то в сумме $$S$$ присутствуют оба слагаемых $$f(e)$$ и $$-f(e)$$ и суммарный вклад такого ребра равен нулю;
  • ребро, соединяющее две вершины из $$\overline{X}$$, в сумме $$S$$ вообще не представлено.
  • Отсюда следует, что $$S=\suml_{e\in (X,\overline{X})}f(e) - \suml_{e\in (\overline{X},X)}f(e) =f(X)-f(\overline{X})$$.

    Лемма 2. Для любого потока $$f$$ и любого разреза $$(X,\overline{X})$$ имеет место неравенство $$M(f)\le c(X)$$.

    Доказательство. Это следует из леммы 1 и неравенств $$f(X)\le c(X)$$, $$f(\overline{X})\ge 0$$.

    Метод увеличивающих путей

    При внимательном рассмотрении рисунка 16.1 можно обнаружить, что представленный на нем поток не является максимальным, так как существует ориентированный путь $$s,a,b,t$$, на каждом ребре которого поток можно увеличить на 1. Иногда поток можно увеличить и при отсутствии таких "недогруженных" путей из источника в сток. Рассмотрим пример сети и потока на рис. 16.2 слева. Среди ребер, выходящих из источника, только на ребре $$(s,a)$$ можно было бы увеличить поток на 1. Но тогда нарушится условие сохранения потока в вершине $$a$$, а дальше эту дополнительную единицу потока передать нельзя, так как ребро $$(a,t)$$ полностью загружено. Можно, однако, заметить, что в вершину $$a$$ входит еще ребро $$(b,a)$$ с положительным потоком на нем. Если одновременно увеличить поток на ребре $$(s,a)$$ и уменьшить на ребре $$(b,a)$$ на 1, то условие сохранения в вершине $$a$$ останется выполненным. Но теперь будет нарушено условие сохранения в вершине $$b$$. Это легко исправить, уменьшив на 1 поток на ребре $$(c,b)$$. В результате возникает нарушение в вершине $$c$$, но и оно будет устранено, если мы увеличим на 1 поток на ребре $$(c,t)$$. После этого условие сохранения будет выполнено во всех внутренних вершинах, а величина потока увеличится на 1. Новый поток показан на рисунке 16.2.

    (рис 16.2)

    В этом примере, как и в предыдущем, удалось найти путь $$s,a,b,c,t$$ (выделен на рисунке), вдоль которого можно направить дополнительный поток. Отличие в том, что этот путь не ориентированный - при движении вдоль него от источника к стоку некоторые ребра проходятся в направлении ориентации (прямые), другие против ориентации (обратные). При этом все прямые ребра пути недогружены, то есть поток на каждом из них не достигает пропускной способности, а на каждом из обратных ребер имеется положительный поток. Благодаря этому можно увеличить поток на всех прямых ребрах пути и уменьшить на всех обратных на одну и ту же величину. В результате условие сохранения потока во внутренних вершинах по-прежнему выполняется, а величина потока увеличивается.

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

    Допустим, имеется сеть $$N$$ и в ней поток $$f$$. Пусть $$x_{1},e_{1},x_{2},e_{2} \ldots$$ $$e_{k-1},x_{k}$$ - неориентированный путь в сети. Ребро $$e_{i}$$ назовем прямым ребром этого пути, если $$e_{i} =(x_{i},x_{i+1})$$, и обратным, если $$e_{i} =(x_{i+1},x_{i})$$. Путь назовем подходящим относительно потока $$f$$, если для каждого прямого ребра f(ei)< c(ei), а для каждого обратного $$f(e_{i} )>0$$. Таким образом, на каждом прямом ребре подходящего пути поток можно увеличить, а на каждом обратном - уменьшить. Увеличивающий путь - это подходящий путь из источника в сток.

    Лемма 3. Если относительно потока $$f$$ имеется увеличивающий путь, то этот поток не максимален.

    Доказательство. Пусть $$P$$ - увеличивающий путь для потока $$f$$, $$A$$ - множество всех прямых, $$B$$ - множество всех обратных ребер этого пути. Положим,

    $$\delta _{1} =\min_{e\in A} (c(e)-f(e)),\\ \delta _{2} =\min_{e\in B} f(e)$$.

    Тогда на каждом прямом ребре пути можно увеличить поток на величину $$\delta_{1}$$, а на каждом обратном - уменьшить на величину $$\delta_{2}$$. Возьмем $$\delta =\min \{\delta_{1},\delta_{2}\}$$

    и определим на ребрах сети новую функцию $$f'$$:

    $$f'(e)=\left\{\begin{aligned} f(e)+\delta, \text{если } e \text{ прямое}, \\ f(e)-\delta, \text{если } e \text{ обратное},\\ f(e), \text{если } e \text{ не принадлежит пути } P. \end{aligned}\right$$.

    Легко видеть, что условия (1) и (2) для функции $$f'$$ выполняются, так что эта функция является потоком. Вместе с тем, очевидно, $${M(f'){=}M(f){+}\delta}$$, причем $$\delta >0$$.

    Теорема 1. Поток максимален тогда и только тогда, когда относительно него нет увеличивающего пути. Максимальная величина потока равна минимальной пропускной способности разреза данной сети.

    Доказательство. Если поток максимален, то из леммы 3 следует, что увеличивающего пути нет. Обратно, пусть $$f$$ - поток, относительно которого нет увеличивающего пути. Покажем, что этот поток максимален. Для этого рассмотрим множество $$X$$, состоящее из всех вершин сети, достижимых подходящими путями из вершины $$s$$, $$\overline{X}=V-X$$. Так как увеличивающих путей нет, то $$t\in \overline{X}$$, так что $$(X,\overline{X})$$ - разрез. Пусть $$e=(x,y)$$ - ребро этого разреза. Вершина $$x$$ достижима из $$s$$ подходящим путем, а вершина $$y$$ недостижима. Тогда $$f(e)=c(e)$$, так как иначе к подходящему пути, ведущему из $$s$$ в $$x$$, можно было бы добавить ребро $$e$$ и вершину $$y$$, и получился бы подходящий путь из $$s$$ в $$y$$. Итак, на каждом ребре разреза $$(X,\overline{X})$$ поток равен пропускной способности, следовательно, $$f(X)=c(X)$$. Аналогично, рассматривая ребра из множества $$(\overline{X},X)$$, убеждаемся, что поток на каждом таком ребре равен 0, в противном случае опять можно было бы продолжить некоторый подходящий путь до вершины из $$\overline{X}$$. Следовательно, $$f(\overline{X})=0$$. Применяя лемму 1, получаем

    $$M(f)=f(X)-f(\bar{X})=c(X)$$.

    По лемме 2, величина любого потока не превосходит пропускной способности любого разреза. Значит, $$f$$ - максимальный поток, а $$(X,\overline{X})$$ - разрез с минимальной пропускной способностью.

    Многие известные алгоритмы построения максимального потока основаны на этой теореме и различаются, в частности, стратегией поиска увеличивающих путей. Первый алгоритм, для которого была получена верхняя оценка трудоемкости, предложили Эдмондс и Карп в 1972 г. В этом алгоритме всегда ищется кратчайший (по числу ребер) увеличивающий путь. Удобно этот поиск вести не на исходной сети $$N$$, а на остаточной сети $$R$$, которая при заданном на сети $$N$$ потоке $$f$$ определяется следующим образом. Множество вершин, источник и сток у остаточной сети те же, что у исходной. Пусть $$e$$ - ребро исходной сети. Тогда

  • если f(e)< c(e), то ребро $$e$$ включается в сеть $$R$$ и ему в этой сети присваивается пропускная способность $$c'(e)=c(e)-f(e)$$ ;
  • если $$f(e)>0$$, то к сети $$R$$ добавляется ребро противоположного направления $$\bar{e}$$ с пропускной способностью $$c'(\bar{e})=f(e)$$.
  • Легко видеть, что увеличивающие пути в исходной сети находятся во взаимно однозначном соответствии с ориентированными путями из источника в сток в остаточной сети. В алгоритме Эдмондса--Карпа нужно в остаточной сети искать кратчайший ориентированный путь из $$s$$ в $$t$$. Это можно сделать за линейное время с помощью поиска в ширину. Если увеличивающий путь обнаружен, поток увеличивается, как описано в доказательстве леммы 3, для нового потока строится остаточная сеть и т.д., пока не будет построен поток, относительно которого нет увеличивающего пути (в остаточной сети нет ориентированного пути из источника в сток. Общая оценка трудоемкости алгоритма Эдмондса--Карпа $$O(m^{2} n)$$. В настоящее время известны и более быстрые алгоритмы для задачи о максимальном потоке.

    Страницы:

    Задача о максимальном потоке

    В этой лекции будем рассматривать ориентированные графы без петель и кратных ребер. Для вершины $$x$$ множество всех входящих в нее ребер обозначается через $$E^{+}(x)$$, а множество выходящих - через $$E^{-}(x)$$. Сетью называется орграф, в котором:

  • каждому ребру $$e$$ приписано положительное число $$c(e)$$, называемое пропускной способностью ребра ;
  • выделены две вершины $$s$$ и $$t$$, называемые соответственно источником и стоком, при этом $$E^{+} (s)=E^{-}(t)=\varnothing$$.
  • Вершины сети, отличные от источника и стока, будем называть внутренними.

    Пусть задана сеть $$N$$ с множеством вершин $$V$$ и множеством ребер $$E$$. Функция $$f$$ с вещественными значениями, определенная на $$E$$, называется потоком в сети $$N$$, если она удовлетворяет следующим условиям:

  • (1) $$0\le f(e)\le c(e)$$ для каждого ребра $$e$$ ;
  • (2) $$\suml_{e\in E^{+}_{} (x)}f(e) =\suml_{e\in E^{-}_{} (x)}f(e)$$ для каждой внутренней вершины $$x$$.
  • На рис. 16.1 показан пример сети и потока в ней. Число, вписанное в примыкающий к ребру квадрат, представляет пропускную способность, а другое число, написанное около ребра, - величину потока.

    (рис 16.1)

    Условие (2), называемое условием сохранения потока, иногда удобно представлять в несколько иной форме. Пусть $$f$$ - любая числовая функция, определенная на ребрах сети. Дивергенцией функции $$f$$ в вершине $$x$$ называется величина

    $$\mathop{\rm div}\nolimits_{f} (x)=\sum_{e\in E^{-} (x)}f(e) -\sum _{e\in E^{+} (x)}f(e).$$

    Заметим, что для любой такой функции $$f$$ имеет место равенство

    $$\suml_{x\in V}\mathop{\rm div}\nolimits_{f} (x) =0,$$

    так как каждое ребро является входящим для одной вершины и выходящим для другой, и, следовательно, каждое ребро $$e$$ в этой сумме представлено двумя слагаемыми: $$f(e)$$ и $$-f(e)$$.

    Условие сохранения означает, что дивергенция потока в каждой внутренней вершине должна быть равна $$0$$. Поэтому из равенства (1) следует, что для потока $$f$$

    $$\mathop{\rm div}\nolimits_{f} (s)+ \mathop{\rm div}\nolimits_{f}(t)=\suml_{e\in E^{-} (s)}f(e)-\suml_{e\in E^{+} (t)}f(e) =0.$$

    Величина

    $$M(f)=\mathop{\rm div}\nolimits_{f} (s)=\suml_{e\in E^{-}(s)}f(e)$$

    называется величиной потока. В примере на рис. 16.1 $$M(f)=4$$. Задача о максимальном потоке состоит в том, чтобы для данной сети найти поток наибольшей величины.

    Введем некоторые вспомогательные понятия и установим два полезных соотношения. Пусть $$X\subseteq V$$, $$\overline{X}=V-X$$. Множество всех ребер, у которых начальная вершина принадлежит $$X$$, а концевая - $$\overline{X}$$, обозначим через $$(X,\overline{X})$$. Пропускной способностью множества $$(X,\overline{X})$$ называется сумма пропускных способностей всех его ребер, она обозначается через $$c(X)$$. Если $$f$$ - поток, то для каждого множества $$X\subseteq V$$ можно определить величину $$f(X)=\suml_{e\in (X,\bar{X})}f(e)$$. Очевидно, для любого множества $$X$$ и любого потока $$f$$ выполняется неравенство $$f(X)\le c(X)$$. Множество $$(X,\overline{X})$$ называется разрезом, если $$s\in X$$, $$t\in \overline{X}$$.

    Лемма 1. Для любого потока $$f$$ и любого разреза $$(X,\overline{X})$$ выполняется равенство $$M(f)=f(X)-f(\overline{X})$$.

    Доказательство. Рассмотрим величину $$S=\suml_{x\in X}\mathop{\rm div}\nolimits_{f} (x)$$. Так как дивергенция во внутренних вершинах равна нулю, то эта сумма равна дивергенции источника, то есть величине потока $$M(f)$$. С другой стороны, рассмотрим вклад, вносимый в эту сумму некоторым ребром $$e=(x,y)$$. Он зависит от того, в каком отношении к множеству $$X$$ находится это ребро:

  • если $$e\in (X,\overline{X})$$, то в сумму $$S$$ входит слагаемое $$\mathop{\rm div}\nolimits_{f}(x)$$, которое, в свою очередь, является суммой и содержит слагаемое $$f(e)$$ со знаком плюс; это единственное в данном случае вхождение $$f(e)$$ в $$S$$, так что вклад ребра $$e$$ равен $$f(e)$$ ;
  • если $$e\in (\overline{X},X)$$, то в $$S$$ входит слагаемое $$\mathop{\rm div}\nolimits_{f} (y)$$, которое, в свою очередь, содержит слагаемое $$f(e)$$ со знаком минус; вклад ребра $$e$$ в этом случае равен $$-f(e)$$ ;
  • если ребро соединяет две вершины из $$X$$, то в сумме $$S$$ присутствуют оба слагаемых $$f(e)$$ и $$-f(e)$$ и суммарный вклад такого ребра равен нулю;
  • ребро, соединяющее две вершины из $$\overline{X}$$, в сумме $$S$$ вообще не представлено.
  • Отсюда следует, что $$S=\suml_{e\in (X,\overline{X})}f(e) - \suml_{e\in (\overline{X},X)}f(e) =f(X)-f(\overline{X})$$.

    Лемма 2. Для любого потока $$f$$ и любого разреза $$(X,\overline{X})$$ имеет место неравенство $$M(f)\le c(X)$$.

    Доказательство. Это следует из леммы 1 и неравенств $$f(X)\le c(X)$$, $$f(\overline{X})\ge 0$$.

    Метод увеличивающих путей

    При внимательном рассмотрении рисунка 16.1 можно обнаружить, что представленный на нем поток не является максимальным, так как существует ориентированный путь $$s,a,b,t$$, на каждом ребре которого поток можно увеличить на 1. Иногда поток можно увеличить и при отсутствии таких "недогруженных" путей из источника в сток. Рассмотрим пример сети и потока на рис. 16.2 слева. Среди ребер, выходящих из источника, только на ребре $$(s,a)$$ можно было бы увеличить поток на 1. Но тогда нарушится условие сохранения потока в вершине $$a$$, а дальше эту дополнительную единицу потока передать нельзя, так как ребро $$(a,t)$$ полностью загружено. Можно, однако, заметить, что в вершину $$a$$ входит еще ребро $$(b,a)$$ с положительным потоком на нем. Если одновременно увеличить поток на ребре $$(s,a)$$ и уменьшить на ребре $$(b,a)$$ на 1, то условие сохранения в вершине $$a$$ останется выполненным. Но теперь будет нарушено условие сохранения в вершине $$b$$. Это легко исправить, уменьшив на 1 поток на ребре $$(c,b)$$. В результате возникает нарушение в вершине $$c$$, но и оно будет устранено, если мы увеличим на 1 поток на ребре $$(c,t)$$. После этого условие сохранения будет выполнено во всех внутренних вершинах, а величина потока увеличится на 1. Новый поток показан на рисунке 16.2.

    (рис 16.2)

    В этом примере, как и в предыдущем, удалось найти путь $$s,a,b,c,t$$ (выделен на рисунке), вдоль которого можно направить дополнительный поток. Отличие в том, что этот путь не ориентированный - при движении вдоль него от источника к стоку некоторые ребра проходятся в направлении ориентации (прямые), другие против ориентации (обратные). При этом все прямые ребра пути недогружены, то есть поток на каждом из них не достигает пропускной способности, а на каждом из обратных ребер имеется положительный поток. Благодаря этому можно увеличить поток на всех прямых ребрах пути и уменьшить на всех обратных на одну и ту же величину. В результате условие сохранения потока во внутренних вершинах по-прежнему выполняется, а величина потока увеличивается.

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

    Допустим, имеется сеть $$N$$ и в ней поток $$f$$. Пусть $$x_{1},e_{1},x_{2},e_{2} \ldots$$ $$e_{k-1},x_{k}$$ - неориентированный путь в сети. Ребро $$e_{i}$$ назовем прямым ребром этого пути, если $$e_{i} =(x_{i},x_{i+1})$$, и обратным, если $$e_{i} =(x_{i+1},x_{i})$$. Путь назовем подходящим относительно потока $$f$$, если для каждого прямого ребра f(ei)< c(ei), а для каждого обратного $$f(e_{i} )>0$$. Таким образом, на каждом прямом ребре подходящего пути поток можно увеличить, а на каждом обратном - уменьшить. Увеличивающий путь - это подходящий путь из источника в сток.

    Лемма 3. Если относительно потока $$f$$ имеется увеличивающий путь, то этот поток не максимален.

    Доказательство. Пусть $$P$$ - увеличивающий путь для потока $$f$$, $$A$$ - множество всех прямых, $$B$$ - множество всех обратных ребер этого пути. Положим,

    $$\delta _{1} =\min_{e\in A} (c(e)-f(e)),\\ \delta _{2} =\min_{e\in B} f(e)$$.

    Тогда на каждом прямом ребре пути можно увеличить поток на величину $$\delta_{1}$$, а на каждом обратном - уменьшить на величину $$\delta_{2}$$. Возьмем $$\delta =\min \{\delta_{1},\delta_{2}\}$$

    и определим на ребрах сети новую функцию $$f'$$:

    $$f'(e)=\left\{\begin{aligned} f(e)+\delta, \text{если } e \text{ прямое}, \\ f(e)-\delta, \text{если } e \text{ обратное},\\ f(e), \text{если } e \text{ не принадлежит пути } P. \end{aligned}\right$$.

    Легко видеть, что условия (1) и (2) для функции $$f'$$ выполняются, так что эта функция является потоком. Вместе с тем, очевидно, $${M(f'){=}M(f){+}\delta}$$, причем $$\delta >0$$.

    Теорема 1. Поток максимален тогда и только тогда, когда относительно него нет увеличивающего пути. Максимальная величина потока равна минимальной пропускной способности разреза данной сети.

    Доказательство. Если поток максимален, то из леммы 3 следует, что увеличивающего пути нет. Обратно, пусть $$f$$ - поток, относительно которого нет увеличивающего пути. Покажем, что этот поток максимален. Для этого рассмотрим множество $$X$$, состоящее из всех вершин сети, достижимых подходящими путями из вершины $$s$$, $$\overline{X}=V-X$$. Так как увеличивающих путей нет, то $$t\in \overline{X}$$, так что $$(X,\overline{X})$$ - разрез. Пусть $$e=(x,y)$$ - ребро этого разреза. Вершина $$x$$ достижима из $$s$$ подходящим путем, а вершина $$y$$ недостижима. Тогда $$f(e)=c(e)$$, так как иначе к подходящему пути, ведущему из $$s$$ в $$x$$, можно было бы добавить ребро $$e$$ и вершину $$y$$, и получился бы подходящий путь из $$s$$ в $$y$$. Итак, на каждом ребре разреза $$(X,\overline{X})$$ поток равен пропускной способности, следовательно, $$f(X)=c(X)$$. Аналогично, рассматривая ребра из множества $$(\overline{X},X)$$, убеждаемся, что поток на каждом таком ребре равен 0, в противном случае опять можно было бы продолжить некоторый подходящий путь до вершины из $$\overline{X}$$. Следовательно, $$f(\overline{X})=0$$. Применяя лемму 1, получаем

    $$M(f)=f(X)-f(\bar{X})=c(X)$$.

    По лемме 2, величина любого потока не превосходит пропускной способности любого разреза. Значит, $$f$$ - максимальный поток, а $$(X,\overline{X})$$ - разрез с минимальной пропускной способностью.

    Многие известные алгоритмы построения максимального потока основаны на этой теореме и различаются, в частности, стратегией поиска увеличивающих путей. Первый алгоритм, для которого была получена верхняя оценка трудоемкости, предложили Эдмондс и Карп в 1972 г. В этом алгоритме всегда ищется кратчайший (по числу ребер) увеличивающий путь. Удобно этот поиск вести не на исходной сети $$N$$, а на остаточной сети $$R$$, которая при заданном на сети $$N$$ потоке $$f$$ определяется следующим образом. Множество вершин, источник и сток у остаточной сети те же, что у исходной. Пусть $$e$$ - ребро исходной сети. Тогда

  • если f(e)< c(e), то ребро $$e$$ включается в сеть $$R$$ и ему в этой сети присваивается пропускная способность $$c'(e)=c(e)-f(e)$$ ;
  • если $$f(e)>0$$, то к сети $$R$$ добавляется ребро противоположного направления $$\bar{e}$$ с пропускной способностью $$c'(\bar{e})=f(e)$$.
  • Легко видеть, что увеличивающие пути в исходной сети находятся во взаимно однозначном соответствии с ориентированными путями из источника в сток в остаточной сети. В алгоритме Эдмондса--Карпа нужно в остаточной сети искать кратчайший ориентированный путь из $$s$$ в $$t$$. Это можно сделать за линейное время с помощью поиска в ширину. Если увеличивающий путь обнаружен, поток увеличивается, как описано в доказательстве леммы 3, для нового потока строится остаточная сеть и т.д., пока не будет построен поток, относительно которого нет увеличивающего пути (в остаточной сети нет ориентированного пути из источника в сток. Общая оценка трудоемкости алгоритма Эдмондса--Карпа $$O(m^{2} n)$$. В настоящее время известны и более быстрые алгоритмы для задачи о максимальном потоке.

    Вернуться к учебному плану