
- •1. Множества и бинарные отношения
- •Множества
- •Определения и примеры
- •1.1.1 Множество
- •Операции над множествами
- •Элементы комбинаторики
- •Бинарные отношения
- •Определения и примеры
- •2.1.2 Отображения
- •Операции над отношениями
- •Выполнение операций над отношениями
- •Свойства отношений
- •Эквивалентность и толерантность
- •2.4.1 Эквивалентность
- •2.4.3 Толерантность
- •2.4.6 Задача о наименьшем покрытии (ЗНП)
- •Алгоритм решения ЗНР
- •Отношения порядка
- •Строгий порядок
- •Свойства строгого порядка
- •Некоторые свойства дерева
- •Анализ отношений порядка
- •2.5.8 Решетки
- •2.5.10 Решетка
- •2.5.11 Булева решетка
- •Нормированные булевы решетки
- •Модели нормированной булевой решетки
- •Булевы функции (БФ)
- •Определения и примеры
- •Равенство булевых функций
- •3.3.1 СДНФ
- •3.3.3 СКНФ
- •3.3.5 Представление формул в СДНФ и СКНФ
- •Минимизация булевых функций
- •3.4.1 Импликанта
- •Полные системы булевых функций
- •2. Математическая логика
- •Логика высказываний
- •Основные понятия
- •4.1.7 Логическое следствие
- •4.1.8 Теоремы о логическом следствии
- •Логика предикатов
- •5.0.13 Связанные и свободные переменные
- •Предваренная нормальная форма
- •Стандартная нормальная форма
- •Подстановки и унификация
- •Метод резолюций для логики первого порядка
- •Исчисление высказываний
- •3. Графы
- •Определения и примеры
- •Определения графа
- •Части графа
- •Изоморфизм графов
- •Задание графов с помощью матриц
- •Матрица инциденций
- •Матрица соседства вершин
- •Матрица смежности
- •Типы графов
- •Обыкновенные графы
- •Графы Бержа
- •Помеченные и взвешенные графы
- •Другие способы задания графа
- •Связность графов
- •Маршруты, цепи, циклы
- •Число маршрутов
- •Компоненты связности
- •Нахождение компонент и бикомпонент
- •Кратчайшие цепи
- •Алгоритм Форда
- •Алгоритм Дейкстры
- •Обходы графа
- •Поиск в глубину на графе
- •Поиск в ширину на графе
- •Эйлеровы цепи и циклы
- •Эйлеровы пути
- •Гамильтоновы цепи и циклы
- •Цикломатика графов
- •Цикломатическое число
- •Деревья
- •Свойства дерева
- •Каркасы
- •Алгоритм нахождения каркаса графа.
- •Кратчайший каркас графа.
- •Алгоритм Прима.
- •Теорема о хорде каркаса.
- •Число каркасов графа.
- •Разрезы
- •Пространства суграфов
- •Пространство циклов
- •Пространство разрезов.
- •Потоки в сетях
- •Задача о максимальном потоке
- •Постановка задачи
- •Экстремальные части графа
- •Основные понятия
- •Покрытия
- •Задача о наименьшем покрытии
- •Паросочетания
- •Раскраска вершин графа
- •Хроматическое число
- •Оценки хроматического числа
- •Точные алгоритмы раскраски вершин
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 |
|
´´3´ st |
|||
|
10, 7 |
|
Q |
QQs |
|
|
?¡ 3, 3 |
@ |
|
|
|
´ |
|
|||
|
|
|
|
|
|
@R |
|
|
´10, 5 |
|||||||
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
¡ |
|
- |
|
´ |
|
|
|
||
|
|
|
|
|
|
cs |
|
|
|
ds |
|
|
|
J