Потоки
- Определение потока, величины потока, разреза, величины разреза, циркуляция
- Ориенитированный и неориентированный графы
- Теорема Менгера
- Теорема Форда-Фалкерсона и алгоритм Форда-Фалкерсона
- |f| = F(S, T) ≤ C(S, T)
- Нет дополняющего пути ⇒ можно увеличить поток
- Алгоритм поиска потока размера k за O(kE)
- Алгоритм декомпозиции потока на "пути и циркуляцию" за O(kE)
- Алгоритм поиска min разреза по max потоку за O(E)
- Алгоритмы поиска потока [code] [code]
- Основные идеи: толкать много, искать путь мудро, random shuffle ребер
- Форд-Фалкерсон: толкаем max по пути, ищем путь dfs-ом, экспонента в худшем случае
- Эдмондс-Карп: толкаем max по пути, ищем путь bfs-ом, O(VE2)
- Масштабирование потока (scaling): толкаем 2k, ищем путь чем угодно, O(E2logU) (если не строить специальный тест, то толкание максимума даст O(E2))
- Доказательство идеи масштабирование: с предыдущей фазы останется не более E путей размера 2k
- Доказательство идеи Эдмондса-Карпа
- Lm: если искать кратчайшие пути, то d(s,v) и d(v,t) только растут
- Расстояние не более V-1, поэтому операций "насытить ребро" не более (V-1)E/2 = O(VE), а каждый поиск пути насыщает ребро
- Простые модификации
- Вершинный поток
- Цикл через фиксированные две вершины
- [homework] Цикл через фиксированные два ребра
- Несколько истоков и стоков
- MinCost поток
- [L,R] поток через mincost
- [L,R] поток через обычный поток
- Нашли циркуляцию
- Нашли какой-то поток
- Нашли поток max размера
- Нашли размера ровно k
- Простые задачи на поток и mincost
- Паросочетание за O(VE)
- Паросочетание min веса за O(V*FordBellman)
- Турнирная таблица (футбол)
- Восстановление матрицы
- Транcпортная задача
- Выделение двух (трех, k) возрастающих подпоследовательностей максимальной суммарной длины за O(k*FordBellman)
- Удалить min число ребер, чтобы граф распался (или чтобы s и t перестали быть связными)
- Удалить ребра min суммарного веса
- Реклама того, что еще бывает
- Паросочетание в двудольном графе мы умеем искать за O(VE), еще можно искать за E√V − алгоритм Хопкрофта-Карпа (запустить алгоритм Диница на двудольном графе)
- Взвешенное Паросочетание в двудольном графе мы умеем искать за O(V*FordBellman), еще можно за O(V3) и O(VE + V2logV), заменив Форд-Беллмана на Дейкстру с потенциалами
- Паросочетание в произвольном графе можно изкать за O(V3) и O*(VE) сжатием соцветий и за E√V алгоритмом Вазирани
- Взвешенное паросочетание в произвольном графе ищется за полином
- Preflow push and Global relabeling [text] [text]
- Высоты вершин
- Push (толкнуть поток из вершины)
- Relabel (пересчитать высоту вершины)
- Global Relabeling (bfs из t, пересчитать за O(E) все высоты)
- Чтобы найти только размер потока, можно удалять вершины, высота которых хотя бы n (и оставлять в них избыток)
- Корректность (весь излишек всегда может уйти в s, но если может, то сольется в t)
- Реализация: current[v] − указатель на текущее ребро
- Время работы = O(VE) + количество "просмотров вершин"
- Алгоритм за O(VE + V3) в худшем и среднем [code]
- Алгоритм за O(VE) в среднем (просматриваем все вершины в порядке убывания глубины и делаем GlobalRelabeling, это точно не хуже |f|*E и V2E)
- Алгоритм за O(VE + V2logU) в худшем (Орлин, 1992) [text]
- [skipped] Сложные задачи
- [skipped] Матан
- [skipped] Hard Life