88 5. Задача о максимальном потоке
Таким образом, произвольная дуга e может быть узким местом в
прямом направлении не более чем (n+2)/4 раз. Аналогично, она может
быть узким местом в обратном направлении не более чем (n + 2)/4 раз.
Поэтому каждая дуга сети может являться узким местом не более чем
(n + 2)/2 раз. Следовательно, общее число увеличений потока, равное
числу итераций, не превосходит m(n + 2)/2.
Перейдем к формальному описанию алгоритма Форда-Фалкерсона,
в котором ищутся кратчайшие по числу дуг f-дополняющие (s, t)-цепи.
Метод, необходимый для построения именно кратчайшей f-дополняю-
щей (s, t)-цепи, нами уже разработан: это поиск в ширину. Разумеется,
в станда ртную схему поиска в ширину необходимо внести изменения,
обусловленные спецификой данной задачи.
Поскольку ищется некоторая (s, t)-цепь, то дерево поиска должно
иметь в качестве корневой вершины источник s. Естественно считать,
что дерево поиска содержит только те вершины сети G, через кото-
рые может проходить та или иная f-дополняющая цепь. Такие вер-
шины будем считать помеченными. Осталось сформулировать прави-
ла помечивания. Введем массив h[v]. Будем считать, что h[v] = ∞,
если вершина v не помечена. Как только вершина v становится поме-
ченной, то h[v] < ∞. Более того, это будет означать, что существует
f-ненасыщенная (s, v)-цепь P , для которой 0 < h(P ) = h[v]. Вершина,
из которой помечена вершина v, будет обозначаться через P revious[v].
При каких условиях из уже помеченной вершины w можно пометить
вершину v? Это зависит от типа дуги, соединяющей w и v (в сети могут
одновременно присутствовать, как дуга wv, так и дуга vw). Пусть дуга
wv ∈ E. Пометить v из w можно, если выполняется условие c(w, v) −
f(w, v) > 0. В таком случае переход от w к v совершается по прямой
дуге и метка вершины v определяется по формуле
h[v] = min(h[w], c(w, v) − f(w, v)).
Если в сети имеется дуга вида vw, т. е. обратная дуга, то помечивание
возможно, если f(v, w) > 0. В этом случае метка вершины v определя-
ется равенством
h[v] = min(h[w], f(v, w)).
Если в сети имеются обе дуги vw, wv и возможно помечивание с
использованием как той, так и другой дуги, то используем любую из
них. Для того, чтобы различать, с помощью какой именно дуги, пря-
мой или обратной, помечена вершина v, введем массив choice[v], считая