![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Глава 22, Потоки в сетях. int cap() const { return pcap; } int flow() const { return pflow; } bool from (int v) const
{ return pv == v; } int other (int v) const { return from(v)? pw: pv; } int capRto(int v) const { return from(v)? pflow: pcap - pflow; } void addflowRto(int v, int d) { pflow += from(v)? -d: d; } };
Программа 22.3 представляет собой реализацию, построенную на базе очереди с приоритетами, которая охватывает все эти возможности, используя для этой цели слегка модифицированную версию полученной нами реализации поиска по приоритету на графах из программы 21.1, которая показана в программе 22.4. Эта реализация позволяет выбирать нужную реализацию алгоритма Форда-Фалкерсона из нескольких различных классических реализаций этого алгоритма за счет простого выбора приоритетов, который обеспечивает реализацию различных структур данных для бахромы. Как было показано в разделе 21.2, использование очереди с приоритетами для реализации стека, очереди или рандомизированной очереди для структуры данных типа бахрома влечет употребление дополнительного множителя lgV, учитывающего затраты на операции с бахромой. Ввиду того, что мы можем избежать этих затрат, воспользовавшись АТД обобщенной очереди в реализациях, подобных программе 18.10 с прямыми реализациями, мы полагаем при анализе алгоритмов, что затраты на операции с бахромой в рассматриваемых случаях постоянны. Используя единственную реализацию программы 22.3, мы тем самым подчеркиваем наличие прямой связи между различными реализациями алгоритма Форда-Фалкерсона. Несмотря на свою универсальность, программа 22.3 не охватывает всех реализаций алгоритма Форда-Фалкерсона (см. например, упражнения 22.36 и 22.38). Исследователи продолжают разрабатывать новые пути реализации этого алгоритма. Однако семейство алгоритмов, охватываемых программой 22.3, получило широкое распространение, и оно служит нам основой для понимания вычислений максимальных потоков и знакомит с реализациями, которые хорошо зарекомендовали себя в практических сетях. Часть 5. Алгоритмы на графах
РИСУНОК 22.16. ОСТАТОЧНЫЕ СЕТИ (АУГМЕНТАЛЬНЫЕ ПУТИ) Вычисление аугментальных путей в транспортной сети эквивалентно поиску ориентированных путей в остаточной сети, определяемой потоком. Для каждого ребра в исходной транспортной сети мы создаем в остаточной сети ребро в каждом направлении: одно в направлении потока с весом, равным неиспользованной пропускной способности, а другое - в обратном направлении с весом, равным потоку. Ни в одном из случаев мы не включаем в сеть ребра, вес которых равен 0. Первоначально (диаграмма вверху) остаточная сеть ничем не отличается от транспортной сети с весами ребер, равными их пропускным способностям. Когда мы производим наращивание потока вдоль пути 0-1-3-5 (вторая диаграмма сверху), мы заполняем ребра 0-1 и 3-5 до их пропускной способности с таким расчетом, чтобы они поменяли направление в остаточной сети, мы уменьшаем вес ребра 1-3 с тем, чтобы он соответствовал оставшемуся потоку, и добавляем ребро 3-1 с весом 2. Аналогично, когда мы производим наращивание вдоль пути 0-2-4-5, мы заполняем ребро 2-4 до его пропускной способности, так что оно меняет направление на обратное, и получаем ребра, ведущие в разных направлениях между вершинами 0 и 2 и между вершинами 4 и 5, представляющие поток и неиспользованную пропускной способность. После того, как будет проведено наращивание потока вдоль пути 0-2-3-1-4-5 (диаграмма внизу), в остаточной сети не остается ни одного ориентированного пути из истока в сток, в связи с чем отсутствуют аугментальные пути.
|