Потоки (СПБГУ МатМех, весна 2013, спецкурс 344-й группы)
- Определения
- 2 неперсекающихся по ребрам пути - поток. k неперсекающихся по ребрам путей - поток.
- Определение потока f в общем случае: (1) 0 ≤ fe ≤ ce. (2) Сумма fe для каждой вершины равна 0. (3) fe = -fe'
- Решение задачи о k неперсекающихся по ребрам путях. Картинка, объясняющая, почему "просто k раз пустить dfs" не работает.
- Разрез C(A,B) - разрез между множествами. C(s,t) - разрез между вершинами.
- Лемма: любой разрез |C(S,T)| >= |F(S,T)| = |f|.
- Форд-Фалкерсон
- Алгоритм Форда-Фалкерсона для поиска max потока за O(|f|*E).
- Теорема Менгера, Теорема Форда-Фалкерсона, формулировки.
- Доказательство теоремы Форда-Фалкерсона. Поиск min разреза по готовому max потоку за O(E).
- Хранение графа и короткая реализация dfs-а для потока.
- Модификации
- Ориентированный и неориентированный граф
- Вершинный поток (и вершинно непересекающиеся пути)
- Вершинный разрез (пример с препятствиями на гриде)
- Несколько истоков и стоков
- Избытки и недостатки (переправить все избытки в недостатки)
- [L,R]-циркуляция
- [L,R]-поток
- Задача "найти два непересекающихся пути: из A в B и из C в D"
- Применения потоков
- [flow] Нахождение max паросочетания в двудольном графе с помощью потока за O(VE).
- [flow] Даны суммы в строках и столбцах матрицы. Восстановить матрицу с такими суммами, чтобы все элементы были от 0 до 100.
- [LR-flow] Нужно округлить вещественную матрицу так, чтобы суммы в строках и столбцах тоже округлились.
- [flow] Дана недоигранная турнирная таблица и окончательные суммы очков. Ничей не бывает. Восстановить таблицу.
- [cut] Дан ориентированный граф, у вершины i есть ценность wi. Выбрать замкнутое множество вершин с положительной суммой wi.
- [flow-easy] Простой цикл, проходящий через s и t
- [flow] Люди и самолеты. У самолета есть время вылета и вместимость, у человека есть отрезок допустимых времен вылета.
- [cut] Работы и инструменты (или гранты и критерии, по которым они выдаются).
- Алгоритмы поиска
- Проталиквать максимум по пути
- Искать путь bfs-ом, а не dfs-ом
- Искать сперва толстые пути. Например, размера ≥ 2k.
- 1 + 2 = Эдмондс-Карп = O(V2E). Доказательство.
- 3 = Масштабирование = O(E2logC). Доказательство.
- 1 + 3 = O(E2) в среднем. Пример с полным двудольным графом.
- Технические оптимизации: (1) храним не f и c, а c и c-f, (2) храним граф списком ребер, (3) минимум c-f на пути ищем не по ходу dfs, а в конце.