Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 231 additions & 0 deletions Example/content/Lecture-10/1.md

Large diffs are not rendered by default.

88 changes: 88 additions & 0 deletions Example/content/Lecture-10/2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
## Приложения

### Поиск максимального паросочетания в двудольном графе.

Задача: есть парни и девушки.
Какие-то парни знакомы с какими-то девушками.
Нужно переженить как можно больше пар, при условии:
1. Женить можно только знакомых.
2. Многожёнство/многомужничество запрещено.

В терминах теории графов: есть двудольный граф (левая доля --- мальчики, правая --- девочки).
Рёбра --- это знакомства (могут быть только между долями).
Паросочетание --- это набор рёбер без общих концевых вершин.
Нужно найти максимальное паросочетание (по количеству рёбер).

Алгоритм решения:
* Добавляем новые вершины: исток $s$ и сток $t$.
* Из истока $s$ в каждую вершину $u$ левой доли добавляем ребро.
* Из любой вершины $v$ правой доли добавляем ребро в сток $t$.
* Приписываем всем рёбрам пропускную спосбность 1.
* Находим максимальный поток из $s$ в $t$.
* Искомое паросочетание --- это те рёбра между долями, по которым течёт поток.

Поскольку пропускные способности целые и единичные, в максимальном потоке все величины будут $0$ или $1$.
Если посмотреть на рёбро $(u, v)$ между долями, по которому течёт поток, то:
* в начало $u$ втекает единица потока (из $s$ по ребру $(s, u)$);
* из конца $v$ вытекает единица потока (в $t$ по ребру $(v, t)$).

Это так в силу закона сохранения потока и того, что больше потоку неоткуда браться/неоткуда течь.
Заметим, что и этих рёбер $(u, v)$ не может быть общих концевых вершин,
т.к. иначе или из $s$ поток был бы больше единицы, либо в $t$ тёк бы поток больше $1$.
По сути, рёбра $(s, u)$ обеспечивают несовпадение левых вершин и рёбра, а $(v, t)$ --- правых.

Можно показать, что верно обратное: для любого паросочетания строится соответствующий поток в этой сети.

### Рёберная теорема Менгера.

Есть граф c выделенными вершинами $s$ и $t$.
Теорема Менгера гласит, что следующие числа совпадают:
* максимальное количество путей из $s$ в $t$ без общих рёбер;
* минимальное количество рёбер, при удалении которых нельзя добраться из $s$ в $t$.


Если рассматривать граф как сеть с единичными пропускными способностями, то:
* любой набор путей из $s$ в $t$ без общих рёбер --- это поток в сети, а по любому потоку можно построить непересекающиеся пути;
* рёбра любого $A|B$ разреза дают набор рёбер, удаление которых ведёт к несвязности $s$ и $t$.

В таком случае теорема Менгера следует из теорема Форда-Фалкерсона для этой сети.

Найти рёберно-непересекающиеся пути (максимальное количествово) можно так:
1. Ищем максимальный поток $f$ в сети.
2. Пока $|f| > 0$:
2.1. Находим любой путь $P$ из $s$ в $t$, вдоль которого течёт поток.
2.2. Вычитаем из потока $f$ единичный поток вдоль $P$ (стираем поток вдоль $P$).

Для поиска пути вдоль потока достаточно обычного цикла, никакого $DFS$/$BFS$ не требуется.

В конце останется поток $|f| = 0$.
В нём всё ещё может течь какой-то поток по кругу.

Время работы: $O(E^2)$, т.к. $|f| \le |E|$.

### Вершинная теорема Менгера.

Есть граф c выделенными вершинами $s$ и $t$.
Теорема Менгера гласит, что следующие числа совпадают:
* максимальное количество путей из $s$ в $t$ без общих промежуточных вершин;
* минимальное количество вершин, при удалении которых нельзя добраться из $s$ в $t$.

Чтобы найти вершинно-непересекающиеся пути, нужно ограничить количество путей, которые идут через каждую вершину.
В сети можно ограничивать только объём потока через рёбра.
Значит нужно воткнуть в каждую вершину по ребру, и как-то заставить поток течь по этим рёбрам при прохождении вершины.

Решение: строим удвоенный граф, у каждой вершины $u$ есть "верхняя" вершина $u_1$ и "нижняя" вершина $u_2$.
Строим рёбра:
1. Для каждой вершины $u$ ставим ребро из $u_1$ в $u_2$ (т.е. вниз) пропускной способности 1.
2. Для каждого ребра $(u, v)$ исходного графа ставим ребро из $u_2$ в $v_1$ (если граф неориентированный,
надо ещё добавить ребро из $v_2$ в $u_1$).

Получается, что поток по-прежнему распадается на пути, но при прохождении каждой вершины путь вынужден "протекать вниз".
Это делается через ребро единичной пропускной способности, что обеспечивает отсутствие пересечений по вершине.

Алгоритм поиска вершинно-непересекающихся путей:
1. строим удвоенный граф;
2. находим максимальный поток $f$ из $s_2$ в $t_1$;
3. высекаем из потока $f$ пути так же, как в предыдущем алгоритме.

Время работы составит $O(V \cdot E)$, т.к. $|F| \le |V|$.
Loading
Loading