Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ODM_GUZhVA_Lektsii_33_33_33.doc
Скачиваний:
42
Добавлен:
18.04.2019
Размер:
2.58 Mб
Скачать

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

  1. Выбрать любой начальный поток из вершины s в вершину t , то есть любой набор вершин , удовлетворяющий соотношениям (1-4). Можно, например, положить для всех дуг , что .

  2. Для всех дуг проделать следующее: если , то положить и считать дугу ; если , то положить и считать дугу .

  3. На множества I и R , сформированных на шаге 2 исходному графу, применить алгоритм поиска увеличивающего пути. Если при этом путь, который увеличивает поток, найти не удаётся, то заканчиваем процедуру алгоритма (текущий поток - максимальный), в противном случае надо осуществить максимально возможное увеличение потока вдоль найденного увеличивающего пути, а затем идти на шаг 2.

Пример: применить алгоритм поиска максимального потока к графу, изображённому на рисунке.

Рис. 63

  1. Выполнение алгоритма начинается с задания начального потока: положим .

  2. Поскольку для всех дуг оказывается, что (пропускные способности дуг приведены на рисунке цифрами), следовательно, , то , то есть во всех дугах поток можно увеличить.

  1. Окрашиваем вершину s. Она связана с вершинами а и b. Окрашиваем вершины а и b, дуги . Вершина а связана с вершинами s, с и b. Так как вершины s и b уже окрашены, то окрашиваем вершину c и дугу . Вершина с связана с вершинами а и t. Так как вершинa a уже окрашена, то окрашиваем вершину t и дугу . Возвращаемся по окрашенным дугам из вершины t в вершину s. Получили увеличивающий поток Определяем количество единиц. Возьмем . Согласно пункту 3 алгоритма мы увеличиваем поток на единицу во всех дугах, принадлежащих этому пути, Согласно алгоритму переходим на шаг 2.

  1. Распределим дуги по множествам I и R (во множество I войдут дуги, не участвовавшие в пути на предыдущем шаге).

превращается в промежуточную дугу.

превращается в промежуточную дугу.

уменьшить можно, увеличить нельзя.

  1. Определяем увеличивающий поток.

    1. Окрашиваем вершину s. Она связана с вершинами а и b. Окрашиваем вершины а и b, дуги . Вершина а связана с вершинами s, с и b. Так как вершины s и b уже окрашены, то окрашиваем вершину c и дугу . Вершина с связана с вершинами а и t. Из вершины с в вершину t перейти нельзя, так как , следовательно, переходим к вершине b, окрашиваем вершину t и дугу . Возвращаемся по окрашенным дугам из вершины t в вершину s. Получили увеличивающий поток Определяем количество единиц. Возьмём

и

    1. Переходим на шаг 2.

2. Распределяем дуги по множествам I и R .

Переходим на шаг 3.

  1. Применим алгоритм поиска увеличивающего пути для того чтобы определить увеличивающий поток.

    1. Окрашиваем вершину s. Она связана с вершинами а и b. Окрашиваем вершины а и b, дуги . Вершина а связана с вершинами s, с и b. Так как вершины s и b уже окрашены, то окрашиваем вершину c и дугу . Вершина с связана с вершинами а и t. Из вершины с в вершину t перейти нельзя, так как , следовательно, переходим к вершине b, окрашиваем вершину t и дугу . Из вершины b в вершину t перейти также нельзя, так как ,

    2. Следовательно, окрасить вершину t не удалось.

У нас найден максимальный поток 1+2=3, который проходит по путям и .

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