Шаг 66.
Алгоритмы.
Анализ метода Форда-Фалкерсона

    На этом шаге рассмотрим анализ метода Форда-Фалкерсона.

    Представим на рисунках пошаговое выполнение алгоритма Форда-Фалкерсона. На рис. 1 представлены последовательные итерации цикла while, слева в каждой части показана остаточная сеть Gf из строки 3 алгоритма с выделенным увеличивающим путем p, справа показан новый поток f, который является результатом увеличения f на fp.


Рис.1. Работа базового алгоритма Форда-Фалкерсона

    Строки 1 и 2 алгоритма инициируют поток f значением 0.

1  for каждого ребра (u, v) ∈ G.E
2     (u, v).f = 0

    В цикле while в строках 3 - 8 выполняется неоднократный поиск увеличивающего пути p в Gf и увеличение потока f вдоль пути p увеличивается на остаточную пропускную способность cf(p). Каждое остаточное ребро в пути p является либо ребром исходной сети, либо обратным к ребру в исходной сети. В строках 6 - 8 выполняется обновление потока, соответствующее каждому случаю, путем добавления потока, если остаточное ребро является ребром исходной сети, и вычитания в противном случае. Когда увеличивающих путей больше нет, поток f является максимальным.

3  while существует путь p из s в t в остаточной сети Gf
4     cf(p) = min{cf(u, v): (u, v) ∈ p}
5     for каждого ребра (u, v) в p
6       if (u, v) ∈ E
7         (u, v).f = (u, v).f + cf(p)
8       else (v, u).f = (v, u).f - cf(p)

    Время выполнения процедуры Ford-Fulkerson зависит от того, как именно выпоняется поиск увеличивающего пути p в строке 3. При неудачном выборе поиска алгоритм может даже не завершиться: величина потока будет последовательно увеличиваться, но она не обязательно будет сходиться к максимальному значению потока.

    Если увеличивающий путь выбирается с использованием поиска в ширину, алгоритм выполняется за полиномиальнное время.

    На следующем шаге рассмотрим программный код, реализующий метод Фода-Фалкерсона для решения олимпиадной задачи.




Предыдущий шаг Содержание Следующий шаг