Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii-DM-Logika-Grafy.pdf
Скачиваний:
93
Добавлен:
30.05.2015
Размер:
1.71 Mб
Скачать

266

Глава 9. Потоки в сетях

 

 

Глава 9

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

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

9.1.1 Постановка задачи

(Транспортной) сетью называется связный ориентированный униграф без петель, удовлетворяющий следующим условиям:

1.Существует только одна вершина с нулевой степенью захода. Эта вершина называется источником и обозначается s.

2.Существует только одна вершина с нулевой степенью исхода. Эта вершина называется стоком и обозначается t.

3.Каждой дуге u = (xi; xj) сопоставляется некоторое неотрицательное число – пропускная способность дуги. Это число обозначается c(u), или c(xi; xj), или просто cij. Если не существует ребра u, ори-

ентированного из xi в xj, то cij = 0.

Потоком f в сети называется функция, сопоставляющая каждому ребру u = (xi; xj) неотрицательное число fij = f(xi; xj) так, что

1. fij

· cij.

 

 

 

 

8

 

 

 

 

 

 

 

 

 

v;

 

2

 

 

2

¡

 

 

>

 

 

 

 

 

 

 

<

0;

2.

P

fij

P

1

fki =

>

 

 

 

 

>

v;

 

xj ¡xi

 

¡ xk ¡ xi

 

>

 

 

 

 

> ¡

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

:

 

xi = s; xi = t; xi 6= s; t:

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

267

 

 

 

Условие 1 – это ограничение по пропускной способности; оно требует, чтобы величина потока по дуге не превышала ее пропускной способности.

Условие 2 – это условие сохранения потока. Для вершин, отличных от s и t, поток, втекающий в вершину, равен потоку, вытекающему из вершины.

В вершинах s и t: из s вытекает поток величины v; в t втекает

поток величины v;

 

v =

x

¡s

fsx =

x ¡¡1t

fxt – величина потока.

 

 

2

 

2P

 

 

P

 

 

Задача заключается в нахождении такого множества потоков по дугам, чтобы при заданных пропускных способностях величина потока v была максимальной.

 

 

 

 

 

¹

Некоторый разрез сети будем обозначать парой (S; S).

¹

 

 

 

¹

¹

Здесь S [ S = X; S \ S = ?, S и S – множества вершин, которые

 

 

 

 

 

¹

разделены разрезом. Будем говорить, что разрез (S; S) разделяет

 

 

 

 

 

¹

источник s и сток t, если s 2 S, a t 2 S. Такой разрез назовем

s ¡ t-разрезом.

 

 

 

Величина разреза, или просто разрез (пропускная способность)

определяется как

 

 

 

¹

 

 

 

cij.

 

c(S; S) =

 

 

 

 

x

 

S;x

¹

 

 

S

 

 

i2 Pj2

 

 

¹

Сумму потоков на дугах, ориентированных из S в S обозначим

и определим как

 

 

 

¹

 

 

 

fij.

 

f(S; S) =

 

 

 

 

x

S;x

 

¹

 

 

S

 

 

 

i2 Pj2

 

 

9.1.2Теорема о максимальном потоке и минимальном разрезе

¹

Лемма 4 Пусть f – поток из s в t в сети. Если (S; S) – разрез, разделяющий s и t, то

¹¹

v = f(S; S) ¡ f(S; S)

До к а з а т е л ь с т в о . Из определения потока f(s; X) ¡ f(X; s) = v,

f(x; X) ¡ f(X; x) = 0; x 6= s; t, f(t; X) ¡ f(X; t) = ¡v.

268 Глава 9. Потоки в сетях

Просуммируем теперь все потоки по x 2 S (помня при этом, что

¹

s 2 S; t 2 S).

v = P [f(x; X) ¡ f(X; x)] = f(S; X) ¡ f(X; S).

x2S

¹

Так как S [ S = X, имеем

¹ ¹

f(S; S [ S) ¡ f(S [ S; S) =

¹¹

=f(S; S) + f(S; S) ¡ f(S; S) ¡ f(S; S) =

¹¹

=f(S; S) ¡ f(S; S). £

 

¹

 

 

 

Следствие 1. v 6 c(S; S).

 

 

 

Д о к а з а т е л ь с т в о . Так как fij > 0, то

 

¹

¹

¹

¹

 

v = f(S; S) ¡ f(S; S) 6 f(S; S) 6 c(S; S). £

¹

Заметим,что равенство может быть достигнуто, когда f(S; S) = 0;

 

¹

¹

 

 

тогда и v = f(S; S) = c(S; S).

 

 

Назовем:

дуга (xi; xj) насыщенная,если fij = cij; дуга (xi; xj) ненасыщенная, если fij < cij; дуга (xi; xj) положительная, если fij > 0;

 

 

дуга (xi; xj) нулевая, если fij = 0.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¹

¹

 

 

 

 

 

 

 

 

Другими словами, v = f(S; S) = c(S; S) тогда и только тогда,

 

 

 

 

 

¹

 

 

 

 

 

 

¹

 

 

 

когда дуги из S в S являются насыщенными, а дуги из S в S

нулевыми.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s-t-разрез называется минимальным, если не существует дру-

гого такого разреза (S0; S¹0), что c(S0; S¹0) < c(S; S¹).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¹

 

 

 

 

 

¹

 

Следствие 2. Пусть f – поток, (S; S) – такой s-t-разрез, что f(S; S) =

 

 

¹

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c(S; S).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¹

 

 

 

 

 

 

¹

 

 

 

 

 

 

Тогда f(S; S) – максимальный поток, а (S; S) – минимальный разрез

 

 

 

¹

 

 

 

 

 

 

 

 

 

 

 

 

 

(т.е. c(S; S) минимальный).

 

 

 

 

 

 

 

 

 

 

Д о к а з а т е л ь с т в о .

Пусть f? – максимальный поток, а

(S

?

¹?

) – минимальный разрез. Из следствия 1 f(S

?

¹?

) = c(S

?

¹?

).

 

; S

 

; S

 

; S

Поэтому

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¹

?

¹?

) · c(S

?

¹?

¹

 

 

 

 

 

 

 

 

 

f(S; S) · f(S

 

; S

 

; S

) · c(S; S)

 

 

 

 

 

 

 

 

 

 

 

 

 

¹

 

 

¹

 

 

 

 

 

 

 

По предположению, f(S; S) = c(S; S), следовательно,

 

 

 

 

 

 

 

¹

?

¹?

) = c(S

?

¹?

¹

 

 

 

 

 

 

 

 

 

f(S; S) = f(S

 

; S

 

; S

) = c(S; S)

 

 

 

 

 

 

 

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

269

 

 

 

 

¹

¹

– мини-

Таким образом, f(S; S)

– максимальный поток, а c(S; S)

мальный разрез. £ В общем-то мы уже доказали, что величина максимального по-

тока равна минимальному разрезу, но мы еще и покажем как найти такой разрез. Классическое конструктивное доказательство принадлежит Форду и Фалкерсону (книга: Л.Форд, Д.Фалкерсон. Потоки в сетях. – М.,Мир, 1966. – 276 с.).

Теорема 9.1 (Форда – Фалкерсона) (о максимальном потоке и минимальном разрезе).

Для любой сети максимальная величина потока из s в t равна минимальной пропускной способности разреза, разделяющего s и t.

Д о к а з а т е л ь с т в о . В силу леммы и следствий доста-

 

¹

точно показать, что существуют такие поток f и разрез (S; S), для

которых

 

¹

¹

f(S; S) = c(S; S).

Считаем, что поток максимальный (очевидно, что таковой су-

 

¹

ществует). Найдем такой разрез (S; S),что

¹

¹

f(S; S) = c(S; S)

и

¹

f(S; S) = 0.

Итак, пусть f – максимальный поток. Определим S рекуррентно следующим образом:

² включаем s в S: s 2 S;

² если x 2 S и f(x; y) < c(x; y), то включаем y в S: y 2 S;

² если x 2 S и f(x; y) > 0, то включаем y в S: y 2 S.

Процесс включения вершин в S продолжается до тех пор, пока множество S нельзя будет расширить дальше.

Покажем, что при таком способе включения вершин в множе-

¹

ство S, вершина t в S не попадет, т.е. t 2 S.

Допустим, что это не так ( т.е. t можно включить в S). Тогда из определения S следует, что существует цепь из s в t (это не обязательно ориентированная цепь )

s = x1; x2; : : : ; xl = t,

такая, что для прямых дуг (xi; xi+1)

270

Глава 9. Потоки в сетях

 

 

f(xi; xi+1) < c(xi; xi+1),

а для всех обратных дуг (xi+1; xi) > 0.

min [c(x ; x

 

)

¡

f(x

; x

 

)]

Пусть ±1 = xi;xi+1

i

i+1

 

i

 

i+1

 

(минимум по всем прямым дугам цепи);

±2 = min [f(xi+1; xi)]

xi+1;xi

(минимум по всем обратным дугам цепи);

± = min [±1; ±2].

Изменим теперь поток цепи следующим образом: увеличим поток на всех прямых дугах на величину ±, а на всех обратных дугах уменьшим поток на величину ±.

В результате получится новый допустимый поток, имеющий величину v+±. Добавление ± не приводит к превышению пропускной способности ни по одной дуге, а вычитание не приводит к отрицательным потокам на обратных дугах (по способу выбора ±).

Итак, поток стал v + ±. Но это значит, что поток не был макси-

¹

мальным, и, значит, t 2 S.

¹

Таким образом, (S; S) есть разрез, разделяющий s и t. Кроме того,

f(xj; xi) = 0

 

=

2

 

2

 

f(xi; xj) = c(xi; xj)

9xi

 

S; xj

 

S¹.

Поэтому

 

;

 

 

 

 

 

 

 

 

 

 

¹

¹

 

 

 

 

 

f(S; S) = c(S; S),

 

 

 

 

 

¹

f(S; S) = 0. £

9.1.3 Алгоритм Форда – Фалкерсона

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

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

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

271

 

 

 

нее увеличивается. Затем все метки стираются и вновь полученный поток используется в качестве исходного при новой расстановке меток. Алгоритм заканчивает работу, когда нельзя найти ни одну дополняющую цепь.

Расстановка меток. Вершина может находиться в одном из трех состояний:

²вершина помечена и просмотрена (т.е. вершина имеет метку и все смежные с ней вершины “обработаны”);

²вершина помечена, но не просмотрена (т.е. вершина имеет метку, но смежные с ней вершины не “обработаны”);

²вершина не помечена.

Метка некоторой вершины x имеет вид L(x) = [§y; ±(x)]. Часть метки +y означает, что поток может быть увеличен вдоль дуги (x; y). Часть метки ¡y означает, что поток может быть уменьшен вдоль дуги (y; x). В обоих случаях ±(x) показывает максимальную величину, на которую можно увеличить поток от s к x вдоль дополняющей цепи.

Сначала все вершины не имеют меток.

Описание алгоритма.

Шаг 0. Инициализация.

Положим все дуговые потоки равными нулю: fij := 0.

Шаг 1. Назначить вершине s метку L(s) := [+s; ±(s) = 1]. Теперь вершина s помечена, но не просмотрена. Все остальные вершины не помечены.

Шаг 2. Выбрать некоторую помеченную, но не просмотренную вершину xi; пусть ее метка будет [§xk; ±(xi)].

1. Каждой непомеченной вершине xj, смежной с xi (xj 2 ¡xi), для которой fij < cij назначить метку [+xi; ±(xj)], где

±(xj) = min[±(xi); cij ¡ fij].

2. Каждой непомеченной вершине xj 2 ¡¡1xi, для которой fji > 0 назначить метку [¡xi; ±(xj)], где

±(xj) = min[±(xi); fji].

272

Глава 9. Потоки в сетях

 

 

Теперь вершина xi помечена и просмотрена, а вершина xj, метка которой назначена в пунктах 1 или 2, помечена, но не просмотрена. Каким либо образом отмечается, что вершина xi просмотрена.

Шаг 3. Проверка.

Если на шаге 2 какая-либо вершина помечена, то: если помечена вершина t, то на Шаг 4;

если помечена любая другая вершина, то на Шаг 2.

Если на Шаге 2 нельзя назначить никаких меток, то алгоритм заканчивает работу с некоторым максимальным потоком. При этом множество помеченных вершин – это S, а множество непомечен-

¹ ¹

ных вершин – множество S, и (S; S) – минимальный разрез.

Шаг 4. Выбрать вершину x = t; на Шаг 5.

Шаг 5. Увеличение потока.

1.Если метка вершины x имеет вид [+z; ±(x)], то изменить поток вдоль дуги (z; x) с f(z; x) на f(z; x) + ±(t).

2.Если метка вершины x имеет вид [¡z; ±(x)], то изменить поток вдоль дуги (x; z) с f(x; z) на f(x; z) ¡ ±(t).

Шаг 6. Если z = s, то стереть все метки и вернуться к Шагу 1. При этом используется уже увеличенный поток, найденный на Шаге 5.

Если z 6= s, то положить x = z; на Шаг 5.

Пример 9.1. На рисунке приведен пример сети; числа на дугах обозначают их пропускные способности и начальные потоки.

 

 

 

 

 

 

a

2, 0

-

b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

´´3

 

@s

 

 

 

¡ ¡ µ

Q

 

 

 

6, 0

´

 

2, 0

 

s6Q 6, 0

 

´´´

 

 

 

 

 

@

¡

 

 

 

Q

QQQs

s

 

 

 

 

 

 

 

@¡ 2, 0

 

 

 

 

 

sQQQ

Q

2, 0

 

 

 

¡¡ @@

 

 

5, 0

´´´3 st

 

10, 0

 

QQs

 

 

?¡ 3, 0

@

 

 

 

´

 

 

 

 

 

 

 

@R

 

 

´10, 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¡

 

-

 

´

 

 

 

 

 

 

 

 

cs

 

 

 

ds

 

 

Матрица пропускных способностей имеет следующий вид:

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

 

273

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

s

a

b

c

d

t

 

 

 

 

 

 

 

 

 

 

 

 

s

0

6

0

10

0

0

 

 

 

a

0

0

2

2

2

0

 

 

C =

b

0

0

0

0

0

6

 

 

 

c

0

0

4

0

3

0

 

 

 

d

0

0

5

0

0

10

 

 

 

t

0

0

0

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

Сначала потоки по всем дугам полагаем равными 0. Расстановка меток по вершинам.

 

s

a

b

c

d

t

 

 

 

 

 

 

 

1

+s; 1

+s; 6

+a; 2

+s; 10

+a; 2

+b; 2

2

+s; 1

+s; 4

+c; 4

+s; 10

+a; 2

+b; 4

3

+s; 1

+s; 4

+d; 3

+s; 6

+c; 3

+d; 3

4

+s; 1

+s; 2

+d; 2

+s; 3

+a; 2

+d; 2

5

+s; 1

+s; 2

 

+s; 3

 

 

Примечания. 1.Увеличиваем поток по дугам (b; t); (a; b); (s; a) на 2, стираем метки и начинаем новую разметку с учетом увеличившегося потока f(s; a) = 2, f(a; b) = 2; f(b; t) = 2. Потоки по остальным дугам – нулевые.

2. Увеличиваем поток по дугам (b; t); (c; b); (s; c) на 4, стираем метки и начинаем новую разметку с учетом увеличившегося потока:

f(s; c) = 4; f(c; b) = 4; f(b; t) = 6.

3. Увеличиваем поток по дугам (d; t); (c; d); (s; c) на 3, стираем метки и начинаем новую разметку с учетом увеличившегося потока:

f(s; c) = 7; f(c; d) = 3; f(d; t) = 3.

4.Увеличиваем поток по дугам (d; t); (a; d); (s; a) на 2, стираем метки и начинаем новую разметку с учетом увеличившегося потока: f(s; a) = 4; f(a; d) = 2; f(d; t) = 5.

5. Другие вершины пометить не удается. Конец разметки.

¹ ¹

S = fs; a; cg; S = fb; d; tg; (S; S) = (a; b); (a; d); (c; b); (c; d).

¹

v = c(S; S) = 11.

Сеть с распределенными по дугам потоками изображена на рисунке.

274

 

 

 

 

 

 

 

 

 

Глава 9.

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

2, 2

-

b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6, 4

 

 

´´3

 

@s

2, 2

¡µ¡

 

 

s6Q 6, 6

 

´´´

´

 

 

 

 

 

@

¡

 

 

Q

Q

QQQs

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

 

 

 

 

 

 

 

@¡4, 4

 

 

 

 

 

 

sQQQ

 

 

2, 0

 

 

 

¡¡ @@

 

 

5, 0

 

´´st

 

10, 7

 

Q

QQs

 

 

?¡ 3, 3

@

 

 

 

´

 

 

 

 

 

 

 

@R

 

 

´10, 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¡

 

-

 

´

 

 

 

 

 

 

 

 

 

cs

 

 

 

ds

 

 

 

J

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]