Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3534 / 125 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 16:

Потоки

< Лекция 15 || Лекция 16: 1234

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

При внимательном рассмотрении рисунка 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.

< Лекция 15 || Лекция 16: 1234
Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?

Александр Лаврентьев
Александр Лаврентьев

много инструкций вида if - then - else

Например Procedure DFS(a) опишите каким образом следует понимать вложенность инструкций. Как в языке С ? 

т.е. следующее 

if (...) then (...)

if (...) then (...)

else(...)

 

раскрывается как 

if (...) then (...)

if (...) then (...)

         else(...)

или так :

if (...) then

 {  (...)

     if (...) then (...)

              else(...)

}

обьясните пожалуйста.

 

 

Асмик Гаряка
Асмик Гаряка
Армения, Ереван
Ольга Чернышева
Ольга Чернышева
Россия