потока находят нетривиальное применение во многих областях. Роутинг пакетов в компьютерных сетях Логистика (контейнерные перевозки, погрузка грузовых судов, etc) Управление водными ресурсами Составление национальной энергетической политики 1
вершин V и ребер E, то есть соединений между парами вершин. В ориентированном графе у каждого ребра есть направление. Во взвешенном графе каждому ребру приписано некторое число, называемое весом. Путь в графе - это последовательность вершин, в которой каждая вершина соединена со следующей ребром. 2
= (V , E), где V - множество вершин, а E - ребер, и каждому ребру приписана неотрицательная пропускная способность и неотрицательная величина потока, не превышающая пропускную способность. В сети выделены две вершины - источник и сток, такие, что любая другая вершина лежит на пути из источника в сток. При этом сумма потоков в любую вершину, кроме источника и стока, равна сумме потоков из нее. 3
алгоритмов Алгоритм Описание Out-of-kilter Поиск и сокращение дефектных ребер Симплекс-метод Симплекс-метод на сетях Сокращение циклов Поиск и сокращение отрицательных циклов в остаточной сети Модификации алгоритма Форда-Фалкерсона Поиск наименее затратного пути для потока 5
как он легко реализуем и хорошо поддается функциональной декомпозиции. Остаточная сеть - граф G = (V , E ), где E - множество ребер, где каждому ребру (u, v) ∈ E соответствует два ребра: (u, v) с пропускной способностью, равной разности пропускной способности (u, v) и потока в нем и ребро (v, u) с пропускной способностью, равной величине потока в (u, v) f f f ′ ′ 6
алгоритм Беллмана-Форда, чтобы найти в остаточной сети отрицательные циклы. Инициализируем массив расстояний до каждой вершины +∞ ∣V ∣ − 1 раз обходим все дуги Если сумма длины дуги и расстояния до начала дуги меньше, чем предыдущее значение в массиве, обновляем его в массиве ("релаксируем") Если на ∣V ∣ итерации удалось релаксировать какое-то расстояние, в графе есть отрицательный цикл. 10
списки смежности, так как связность сетей обычно мала Программа написана в объектно-ориентированной парадигме Основа программы - класс Graph , хранящий список вершин и рёбер для удобства итерации и поддерживающий некоторые дополнительные методы Ребра представлены классом Edge , в котором хранятся ссылки на начальную и конечную вершины и информация о пропускной способности, потоке и весе ребра Вершины представлены классом Node , в котором хранится список ссылок на входящие и исходящие ребра 11
, использующий алгоритм Эдмондса-Карпа для проталкивания потока. Алгоритм Эдмондса-Карпа работает за O(∣V ∣ ∣E∣) и для решения данной задачи выполняется один раз Класс Graph также реализует метод optimizeFlow() , использующий алгоритм Беллмана-Форда для поиска отрицательных циклов в остаточной сети. Асимптотика алгоритма Беллмана-Форда - O(∣V ∣∣E∣) Асимптотика количества циклов в сети с нецелыми значениями веса и пропускной способности плохо поддаётся оценке, однако точно принадлежит O(2 27∣E∣) 2 1 12