
- •Задание 1 Алгоритм построения минимального остовного дерева
- •1.1 Теоретическая часть
- •1.2 Пример выполнения задания
- •1.3 Варианты заданий
- •Задание 2. Алгоритм Дейкстры.
- •2.1 Теоретическая часть
- •2.2 Пример выполнения задания
- •2.3 Варианты заданий
- •Задание 3. Алгоритм Флойда
- •3.1 Теоретическая часть
- •3.2 Пример выполнения задания
- •3.3 Варианты заданий
- •Задание 4 Алгоритм нахождения максимального потока
- •4.1 Теоретическая часть
- •4.2. Пример выполнения задания
- •4.3 Варианты заданий
Задание 4 Алгоритм нахождения максимального потока
4.1 Теоретическая часть
Идея данного алгоритма состоит в поиске сквозных путей с положительными потоками от источника к стоку.
Рассмотрим ребро
с (начальной) пропускной способностью
.
В процессе выполнения алгоритма части
этих пропускных способностей "забираются"
потоками, проходящими через данное
ребро, в результате каждое ребро будет
иметь остаточную пропускную способность.
Будем использовать запись
для представления остаточных пропускных
способностей. Сеть, в которой все ребра
имеют остаточную пропускную способность,
назовем остаточной.
Для произвольного
узла
,
получающего поток от узла
,
определим метку
,
где
—
величина потока, протекающего от узла
к узлу
.
Чтобы найти максимальный поток, выполним
следующие действия.
Этап 1.
Для всех ребер
положим остаточную пропускную способность
равной первоначальной пропускной
способности, т.е. приравняем
.
Назначим
и пометим узел 1 меткой
.
Полагаем
и переходим ко второму этапу.
Этап 2.
Определяем множество
как множество узлов
,
в которые можно перейти из узла
по ребру с положительной остаточной
пропускной способностью (т.е.
для всех
).
Если
выполняем третий этап, в противном
случае переходим к п. 4.
Этап 3.
В множестве
находим узел
,
такой, что
.
Положим
и пометим узел
меткой
.
Если последней меткой помечен узел
стока (т.е. если
),
сквозной путь найден, и мы переходим к
пятому этапу. В противном случае полагаем
и возвращаемся к п. 2.
Этап 4.
Откат назад. Если
,
сквозной путь невозможен, и мы переходим
к п. 6. Если
,
находим помеченный узел
,
непосредственно предшествующий узлу
,
и удаляем узел
из множества узлов, смежных с узлом
.
Полагаем
и возвращаемся ко второму этапу.
Этап 5.
Определение остаточной сети. Обозначим
через
множество узлов, через которые проходит
-й
найденный сквозной путь от узла источника
(узел 1) до узла стока (узел
).
Тогда максимальный поток, проходящий
по этому пути, вычисляется как
.
Остаточные
пропускные способности ребер, составляющих
сквозной путь, уменьшаются на величину
в направлении движения потока и
увеличиваются на эту же величину в
противоположном направлении. Таким
образом, для ребра
,
входящего в сквозной путь, текущие
остаточные пропускные способности
изменятся
следующим образом:
a)
, если поток идет от узла
к узлу
,
b)
,
если поток идет от узла
к узлу
.
Далее восстанавливаем
все узлы, удаленные в п. 4. Полагаем
и возвращаемся ко второму этапу для
поиска нового сквозного пути.
Этап 6. Решение.
а) При
найденных сквозных путях максимальный
поток вычисляется по формуле
b) Имея значения
начальных
и конечных
пропускных способностей ребра
,
можно вычислить оптимальный поток через
это ребро следующим образом. Положим
.
Если
,
поток, проходящий через ребро
,
равен
.
Если же
,
тогда поток равен
.
(Случай, когда одновременно
и
,
невозможен.)
Процесс отката
назад на четвертом этапе выполняется
тогда, когда алгоритм должен "убить"
промежуточный узел до момента реализации
сквозного пути. Коррекцию пропускных
способностей, выполняемых в п. 5, можно
пояснить на примере простой сети,
показанной на рис. 4.1. На рис. 4.1
найден первый сквозной путь
с максимальным потоком
.
После этого остаточные пропускные
способности ребер
,
,
изменятся соответственно с
на
.
На рис. 4.1б показан второй сквозной путь
с максимальным потоком
.
После коррекции пропускных способностей
получаем сеть, показанную на рис. 4.1в,
где уже невозможно построить сквозной
путь. Почему так получилось? При вычислении
остаточных пропускных способностей в
п. 5 при переходе от сети 4.1б к сети 4.1в
невозможна организация потока в
направлении
.
Получается, что алгоритм как бы "помнит",
что поток в направлении
уже был в предыдущих сквозных путях, и
поэтому снова (на пятом этапе) изменяет
пропускную способность с 0 до 5 в
направлении от узла 3 к узлу 2.
Рис. 4.1. Использование остаточных пропускных способностей для вычисления потока