147
правок
Изменения
→Поиск пути
Научимся находить путь из <tex>S</tex> в <tex>T</tex> в описанной выше сети при помощи леса корневых деревьев. Будем отдельно хранить дерево с потоками и дерево с пропускными способностями.
* Начало* '''Шаг 1'''. Пусть <tex>U</tex> {{---}} корень дерева, в котором лежит <tex>S</tex>. * Заметим, что если '''Шаг 2'''. Если вершина <tex>SU</tex>, совпала с вершиной <tex>T</tex> лежат в одном деревепереходим к '''шагу 6''', то путь ищется легко. Это путь по дереву до корняиначе к '''шагу 3'''. * '''Шаг 3'''. Выберем следующее ненасыщеюнное исходящее ребро. Если <tex>S</tex>, <tex>T</tex> лежат в разных деревьях. Просмотрим все ненасыщенные исходящие ребранет {{---}} переходим к '''шагу 7'''. Будем рассматривать их Ребра рассматриваем также, как и в алгоритме Диница, с глобальным итератором. Т.е начинать просмотр будем с последнего подошедшего ребра. Если ребро не подошло {{---}} больше его не рассматриваем. * '''Шаг 4'''. Пусть просматриваем какое-то ненасыщенное ребро, ведущее в некоторую вершину <tex>V</tex>:# . Подвесим корень <tex>U</tex> через это ребро к вершине <tex>V</tex>, выполнив запрос (3). #* '''Шаг 5'''. В <tex>U</tex> записываем число, равное остаточной пропускной способности ребра. Переходим к '''шагу 1'''. * '''Шаг 6'''. Возвращаем найденный путь.* Будем повторять, пока '''Шаг 7'''. Пути из <tex>S</tex> и в <tex>T</tex> не окажутся в одном деревенет.* Конец
===Улучшение пути===