Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Поток минимальной стоимости и труднорешаемые задачи. Учебно-методическое пособие
.pdf
1.2. Построение максимального потока 21
Рис. 1.7. Количество итераций увеличения потока
минимум на 1, и, значит, максимальный поток точно будет построен после не более чем
c(s, v) итераций.
v∈V
Отсюда следует, что если все пропускные способности суть
рациональные числа, то максимальный поток тоже будет построен, поскольку справедливо следующее утверждение.
Утверждение. Если f — поток, то αf — тоже поток для
любого α :0 α 1.
Справедливость этого утверждения легко следует из опре-
деления потока.
Только в 1972 г. алгоритм Форда — Фалкерсона был обос-
нован.
Теорема 1.4 (Эдмондс — Карп, 1972). Если на каждой итерации алгоритма Форда — Фалкерсона выбирать кратчайшую
по числу ребер f -дополняющую (s, t)-цепь p, то построение
максимального потока потребует не более чем
m(n+2)
ите-
2
раций.
Мы не будем здесь приводить достаточно сложное и длин-
ное доказательство, желающие могут посмотреть его в [1].
Итак, для поиска f-дополняющей (s, t)-цепи p есть только
один метод, а именно — поиск в ширину. Поиск в глубину не годится, так как он не обеспечивает минимальности количества
ребер в найденном пути.

22 Глава 1. Потоки в сетях
Будем считать, что перед входом в очередную итерацию
увеличения текущего потока выполняются равенства
h(v)=+∞ для всех v ∈ V .
Число h(v) играет двойную роль: если h(v)=+∞, то это
будет означать, что вершина v еще не помечена, а если h(v) —
число, то это означает, что вершина v помечена и до нее существует цепь p из s такая, что h(p)=h(v).
Опишем правила поиска. Их три:
• с чего начать (начало);
• как двигаться (движение);
• чем закончить (окончание).
Начало. Вершина s. Считаем, что s помечена, положим,
что h(s)=+∞.
Движение. Пусть v помечена, а w не помечена, и вершины
v и w соединены ребром. Надо различать, по какому именно
ребру — прямому или обратному, помечаем эту вершину w.
По прямому ребру. Помечаем w из v, если f(v, w) <c(v, w),
присвоив метку h(w)=min
По обратному ребру. Если значение f (w,v) > 0, полагаем
{h(v),c(v, w) − f (v, w)}.
h(w)=min{h(v),f(w, v )}.
Тот факт, что w помечена из v, обозначим через
ПРЕД[w]=v. Если помечивание произошло по прямому реб-
ру (v, w), то запишем, что СПСБ[w]=1, а если по обратному
(т. е. (w, v)) — то СПСБ[w]=−1.
Окончание. Как только вершина t получит числовую мет-
ку, т.е. h(t) < +∞, что говорит о том, что f -дополняющая
(s, t)-цепь p найдена, она легко восстанавливается с помощью
массива ПРЕД и h(p)=h
Либо ни одной новой вершины пометить нельзя, что озна-
чает, что f-дополняющей (s, t)-цепи не существует.
После сделанных уточнений не сложно прописать реализа-
цию алгоритма Форда — Фалкерсона.
(t).

1.3. Некоторые другие задачи о потоках в сетях 23
Теорема 1.5. Алгоритм Форда — Фалкерсона имеет слож-
2
ность O(m
n).
Всего итераций по теореме Эдмондса — Карпа будет по-
рядка mn, сложность одной итерации (а это поиск в ширину) —
O(m + n), но чтобы избежать вырожденных случаев, считаем,
что m n − 1 (для дерева m = n − 1). Отсюда получаем сложность алгоритма.
В заключение отметим, что сегодня известны алгоритмы
3
построения максимального потока со сложностью O(n
). Один
из таких алгоритмов изложен в [2].
1.3. Некоторые другие задачи о потоках
в сетях
1.3.1. Поток в сети со многими источниками
и стоками
Задана сеть G =(V, E,c), в которой выделены два подмно-
жества множества вершин: S = {s
вершины, из которых ребра только выходят, T = {t
стоки, т. е. вершины, в которые ребра только входят; функция
пропускных способностей — неотрицательна.
Потоком в сети G называется функция на ребрах, удовле-
творяющая условию ограничения по пропускной способности
ребра и сохраняющая поток на всех вершинах, кроме источников и стоков.
Величиной потока называется число
,...,sk} — источники, т.е.
1
,...,tl} —
1
k
f(si+).
i=1
Задача. В заданной сети со многими источниками и стоками найти максимальный поток.
Метод. Сведение к стандартной задаче в подходяще построенной сети.

24 Глава 1. Потоки в сетях
∗
Построим новую сеть G
∗
= V ∪{s∗}∪{t∗},
V
∗
= E ∪{(s∗,si):si∈ S}∪{(tj,t∗):tj∈ T },
E
=(V∗,E∗,c∗),где
т. е. добавим в сеть две новых вершины: новый источник и новый сток, и соединим новый источник с каждым старым,
а из каждого старого стока проведем ребро в новый сток.
∗
Осталось определить функцию c
. На всех старых ребрах
(т. е. входящих в E) оставим старое значение функции c, по-
∗(s∗
ложим c
в сети G
,si)=c∗(tj,t∗)=+∞. Тогда максимальный поток
∗
=(V∗,E∗,c∗) однозначно определит поток в сети
со многими источниками и стоками.
1.3.2. Поток в мультиграфе
Напомним, что граф называется мультиграфом, если неко-
торые вершины соединены более чем одним ребром, неориентированным или ориентированным — зависит от типа рассматриваемого графа.
Пусть G =(V,E, c) — мультисеть. Понятие потока в сети
не зависит от того, сколько ребер ведут из данной вершины.
Задача. В заданной мультисети найти максимальный поток.
Метод. Сведение к стандартной задаче в подходяще построенной сети.
Достаточно просто для каждой пары вершин, в которой
вершины v и w соединены более чем одним ребром, построить новую сеть, в которой каждая такая пара соединена одним
ребром пропускной способностью, равной сумме всех пропускных способностей ребер, ведущих из v в w .
Тогда максимальный поток в новой сети однозначно определит максимальный поток в исходной сети.

1.3. Некоторые другие задачи о потоках в сетях 25
1.3.3. Поток в сети с ограничениями
на пропускную способность
вершин и ребер
Задана сеть с двумя функциями G =(V, E, c, d);гдеc —
пропускная способность ребер, a d — пропускная способность
вершин. Допустимым потоком в такой сети называется функция f : E → R, являющаяся потоком (т.е. выполняются условия 1) и 2) потока) и удовлетворяющая еще одному условию:
3) для любой вершины v (v = s, t) поток, проходящий через эту вершину, не превосходит d(v),т.е.f(v) d(v), для
v ∈{s, t} : f(v)=f(s+) = f (t−).
Задача. В заданной сети с ограничениями на пропускные способности вершин и ребер найти максимальный допустимый
поток.
Метод. Сведение к стандартной задаче в подходяще построенной сети.
Каждую вершину v, кроме s и t, разобьем на две: v− и v+.
Будем считать, что ребра, входящие в вершину v, входят в v−,
а выходящие из вершины v — выходят из v+. Между v− и v+
проведем одно дополнительное ребро из v− в v
способностью d(v).
Изобразим сказанное на рис. 1.8.
+ пропускной
a
b
Рис. 1.8. Сеть для задачи о потоке с ограничением на
пропускную способность вершин: a — было; b — стало
Легко видеть, что максимальный поток в новой сети
∗
=(V∗,E∗,c∗) однозначно определяет максимальный допу-
G
стимый поток в исходной сети.

26 Глава 1. Потоки в сетях
1.3.4. Поток заданной величины
Задача. Для заданных сети G =(V, E,c) и числа k найти
поток в сети G величины k.
Поскольку эта задача является промежуточной для более
важной задачи, которую сформулируем позже, то здесь приведем три возможных решения поставленной задачи.
Решение 1
Метод. Сведение к стандартной задаче в подходяще постро-
енной сети.
∗
Добавим в заданную сеть G одну новую вершину s
∗
ребро (s
∗
G
,s) пропускной способностью k. Новую сеть обозначим
.
Algorithm 2: Построение потока заданной величины
1 В сети G
2 if f
3 ответ «нет»;
4 else
5 взять в качестве f сужение f
6 /* т. е. игнорировать f
7 end
8 Вывести f.
∗
построить максимальный поток f∗;
∗
<kthen
∗(s∗
,s) */
∗
на G;
и новое
Ясно, что величина потока f в точности равна k.

1.3. Некоторые другие задачи о потоках в сетях 27
Решение 2
Algorithm 3: Построение потока заданной величины
1 В исходной сети G построить максимальный поток f ;
2 if f
3 ответ «нет»;
4 else
5 для каждого ребра e положить
6 end
7 Вывести f
∗
<kthen
∗
(e)=(k/f) · f (e).
f
∗
.
Легко видеть корректность приведенного алгоритма в силу
утверждения, сформулированного ранее.
Однако этот метод имеет существенный недостаток, а именно: если веса всех ребер суть целые числа, то максимальный
поток f, построенный алгоритмом Форда — Фалкерсона, также на каждом ребре представляет собой целое число, однако
∗
при переходе к потоку f
целочисленность может потеряться.
Решение 3
Метод. В стандартном алгоритме Форда — Фалкерсона от-
слеживать величину, на которую увеличивается текущий поток. Детали в приводимом ниже алгоритме.

28 Глава 1. Потоки в сетях
Algorithm 4: Построение потока заданной величины
1 Начать с нулевого потока, т. е. положить f(e)=0для
каждого ребра e;
2 Искать f -дополняющую (s, t)-цепь p;
3 if такая цепь p построена then
4 if h(p)+f <kthen
5 f(e):=f (e)+sgn
6 else
7 f(e):=f (e)+sgn
8 СТОП. Вывести f
9 end
10 else
11 СТОП. Вывести ответ «нет».
12 end
(e) · h(p) и перейти на шаг 2;
p
(e)(k −f);
p
В комментариях нуждается только шаг 7. Действительно,
перед той итерацией, когда величина нового пока превзойдет
заданное число k, величина текущего потока строго меньше k,
поэтому число f +h(p) <k, в частности, k −f > 0, значит
увеличивать текущий поток на это число можно. Далее, величина нового потока увеличится на число k−f и в результате
станет в точности равна k.
1.3.5. Поток в сети с ограничениями снизу
Задана сеть G =(V, E,c, d);гдеc — пропускная способ-
ность ребер (ограничивающая поток сверху), d — ограничение
снизу потока на каждом ребре. Обе функции неотрицательны:
0 d(e) c(e) для каждого ребра e.
Поток f называется допустимым, если на каждом ребре e
выполняются условия 0 d(e) f (e) c(e).
Задача. В заданной сети с ограничениями на пропускные способности сверху и снизу найти допустимый поток (не обязательно максимальный).

1.3. Некоторые другие задачи о потоках в сетях 29
Метод. Сведение к стандартной задаче в подходяще построенной сети.
∗
Опишем построение новой сети G
=(V∗,E∗,c∗). Заметим,
что новая сеть будет мультисетью, т. е. между некоторыми вершинами имеется более одного ребра.
∗
Положим V
= V ∪{s∗}∪{t∗} (т. е. добавляются новые
источник и сток). Каждое ребро e = vw ∈ E такое, что d(e) > 0
порождает два ребра:
∗
• (v, t
• (s
) — т. е. из вершины, из которой исходит ребро e,
∗
проводится ребро в новый сток t
∗
,w) — т.е. проводится ребро из нового источника s
;
в вершину, в которую входит ребро e; старое ребро e оста-
∗
ется в сети G
.
Добавляется еще одно ребро из старого стока в старый источник (t, s).
Итак,
∗
= {(v, t∗), (s∗,w):vw ∈ E, d(v, w) > 0}∪E ∪{(t, s)}.
E
∗
Пропускные способности ребер определим следующим образом:
⎧
∗
⎪
c
(v, w)=c(v, w) − d(v, w), ∀(v, w) ∈ V : d(v, w) > 0;
⎨
∗
(v, t∗)=c(w, s∗)=d(v, w), ∀(v, w) ∈ V : d(v, w) > 0;
c
⎪
⎩
∗
(t, s)=+∞.
c
На рис. 1.9 проставлены пропускные способности добавляемых ребер, при этом d
и cw—от(v, w).
а d
w
и cu— значения, взятые от ребра (v, u);
u
Теорема 1.6. Допустимый поток в сети G существует то-
гда и только тогда, когда величина максимального потока
∗
в сети G
равна
vw∈E
d(v, w).

30 Глава 1. Потоки в сетях
a
b
Рис. 1.9. Сеть для задачи о допустимом потоке:
a — исходная сеть G; b — новая сеть G
∗
Пусть f∗— максимальный поток в G∗, величина которого
равна
d(v, w).
vw∈E
∗
Отметим, что все ребра, выходящие из s
∗
дящие в t
, забиты полностью. Для каждого ребра vw из G
, и все ребра, вхо-
положим
∗
f(v, w)=f
(v, w)+d(v, w).
Покажем, что f — допустимый поток в G. Проверим оба
условия потока.
Ограничение по пропускной способности.Пустьe произ-
вольно из E, тогда:
∗
f(v, w)=f
(v, w)+d(v, w) c∗(v, w)+d(v, w)
(c(v, w) − d(v, w)) + d(v, w)=c(v, w)
∗
и f (v,w) d(v, w), так как f
— поток в G∗.
Сохранение потока в вершинах. Пусть v — произвольная
вершина и v = s, t. Тогда для любого ребра, исходящего из v
и ведущего в w, произошло просто переключение величины по-
∗
тока с ребра (w, t
) на ребро (v, w). Значит, поток, выходящий
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
