# теория · шаг 1 из 7
Паросочетание: та же задача о потоке, другими словами
Коротко
Паросочетание - набор рёбер, попарно не имеющих общих вершин: «кого с кем сопоставили». Максимальное паросочетание в ДВУДОЛЬНОМ графе - это максимальный поток в сети, где из истока в каждую левую вершину ведёт ребро пропускной способности 1, из каждой правой вершины в сток - тоже 1, а сами рёбра графа направлены слева направо. Целость потока при целых пропускных способностях гарантирует, что ответ будет честным: каждое ребро либо взято целиком, либо не взято. Жадный набор рёбер даёт паросочетание, которое нельзя расширить, но оно может быть меньше максимального; чинит это дополняющий путь - чередующаяся цепочка, вдоль которой все пары переставляются разом.
Если ты умеешь сводить двудольное паросочетание к потоку, отличаешь «нельзя расширить» от «максимальное» и знаешь теорему Бержа про дополняющие пути, листай до «Теперь сам».
Как думаешь, почему жадность ошибается
Три работника и три задачи. Аня умеет делать только первую задачу, Борис - первую и вторую, Вера - вторую и третью. Жадность идёт по списку: Аня берёт первую, Борис - вторую, Вера... третью. Все трое при деле, повезло.
Теперь поменяй порядок: пусть первым в списке идёт Борис. Он берёт первую задачу, Аня остаётся без работы (она больше ничего не умеет), Вера берёт вторую. Двое из трёх. Тот же граф, тот же жадный алгоритм - и ответ хуже на единицу только из-за порядка. Что надо уметь, чтобы такого не случалось?
На что это похоже
Пересадка гостей за столом. Расселил всех как попало, а потом заметил, что двое хотят поменяться местами, и после обмена становится лучше обоим. Одиночная перестановка тут не спасает - меняться приходится цепочкой: этот пересядет на место того, тот на место третьего, и в конце освободится место для гостя, который вообще стоял. Такая цепочка и называется дополняющим путём.
Механизм: сведение к потоку и чередующиеся пути
двудольный граф: левая доля L, правая доля R, рёбра только между долями
сеть: s → каждая вершина L пропускная способность 1
рёбра графа L → R пропускная способность 1 (или бесконечность - не важно)
каждая вершина R → t пропускная способность 1
максимальный поток = максимальное паросочетание
Почему это работает: пропускная способность 1 на рёбрах из истока означает «каждый работник берёт не больше одной задачи», а на рёбрах в сток - «каждую задачу берёт не больше одного работника». Поток целый (пропускные способности целые), поэтому по каждому ребру идёт либо 0, либо 1 - никаких «половин работника».
чередующийся путь - путь, где рёбра по очереди: не в паросочетании, в паросочетании,
не в паросочетании, ...
дополняющий путь - чередующийся путь, который НАЧИНАЕТСЯ и КОНЧАЕТСЯ в свободных вершинах
(в такой цепочке рёбер «вне пары» на одно больше)
теорема Бержа - паросочетание максимально ⟺ дополняющего пути не существует
Если дополняющий путь найден, его «переключают»: рёбра вне паросочетания берут в пару, рёбра из паросочетания - убирают. Путь начинался и кончался свободными вершинами, значит взятых рёбер на одно больше - паросочетание выросло ровно на единицу.
Правило
Паросочетание - набор рёбер без общих вершин. МАКСИМАЛЬНОЕ ПО ВКЛЮЧЕНИЮ («жадное, некуда добавить ребро») и МАКСИМАЛЬНОЕ ПО РАЗМЕРУ - разные вещи, и первое бывает меньше второго. Двудольное паросочетание сводится к потоку: исток → левые (1), рёбра графа, правые → сток (1); целость потока даёт честный ответ. Паросочетание максимально тогда и только тогда, когда нет дополняющего пути (теорема Бержа), а переключение такого пути увеличивает паросочетание ровно на единицу.
Разбор: как дополняющий путь чинит жадность
Вернёмся к работникам. Слева А, Б, В, справа задачи 1, 2, 3. Рёбра: А-1, Б-1,
Б-2, В-2, В-3.
Жадность в неудачном порядке дала пары Б-1 и В-2, Аня свободна, задача 3 свободна. Ищем
дополняющий путь из свободной вершины А:
А —(не в паре)— 1 —(в паре)— Б —(не в паре)— 2 —(в паре)— В —(не в паре)— 3
свободна свободна
Рёбра чередуются, концы свободны - это дополняющий путь. Переключаем: А-1 берём, Б-1 убираем,
Б-2 берём, В-2 убираем, В-3 берём.
было: Б-1, В-2 размер 2
стало: А-1, Б-2, В-3 размер 3
Заметь, что произошло: никого не «выгнали». Борис и Вера остались при работе, просто сдвинулись, и освободившееся место досталось Ане. Именно поэтому жадность и ошибается - она умеет только добавлять, а нужно уметь ПЕРЕСТАВЛЯТЬ.
Разбор: почему это тот же поток
Сложим ту же сеть по рецепту из механизма. Исток s, работники А, Б, В, задачи 1, 2, 3,
сток t.
s→А=1 s→Б=1 s→В=1
А→1=1 Б→1=1 Б→2=1 В→2=1 В→3=1
1→t=1 2→t=1 3→t=1
Жадный поток s→Б→1→t и s→В→2→t имеет величину 2. Дополняющий путь в ОСТАТОЧНОЙ сети выглядит
так: s → А → 1 → Б → 2 → В → 3 → t, где 1 → Б и 2 → В - обратные рёбра (по ним уже идёт
поток). Величина узкого места - единица, поток становится 3.
Сравни с предыдущим разбором: это буквально тот же чередующийся путь, только записанный через остаточную сеть. Обратное ребро потока и «ребро, которое сейчас в паре» - одно и то же. Поэтому все теоремы про потоки автоматически работают для паросочетаний, а алгоритм Куна из следующего урока - это Форд-Фалкерсон, записанный без слова «поток».
Что ломается без этого
Первое: путать «максимальное по включению» и «максимальное по размеру». Жадный набор нельзя расширить, но переставить - можно, и именно это даёт прирост. Второе: сводить к потоку, но ставить на рёбрах из истока пропускную способность больше единицы - тогда один работник получит две задачи, и ответ перестанет быть паросочетанием. Третье: искать дополняющий путь из ЗАНЯТОЙ вершины: путь обязан начинаться в свободной, иначе переключение сломает существующую пару и размер не вырастет. Четвёртое: применять всё это к произвольному, не двудольному графу. Теорема Бержа верна и там, но искать дополняющий путь обходом уже нельзя: мешают нечётные циклы, и нужен алгоритм Эдмондса со сжатием «цветков». Пятое: думать, что максимальное паросочетание единственно, - их обычно много, и алгоритмы выдают разные, но одного размера.
Зачем это в работе
Любая задача вида «сопоставить одно с другим, и каждому не больше одного» - это паросочетание: заявки на исполнителей, доклады по залам, студенты по проектам, водители по маршрутам, резюме по вакансиям. Сюда же - задачи, где сопоставление неочевидно: проверка расписания на выполнимость, распределение переменных по регистрам в компиляторе, склейка кадров в трекинге объектов. А ещё этот приём - типовой способ доказать, что задача РЕШАЕТСЯ быстро: если получилось свести к двудольному паросочетанию, значит есть полиномиальный алгоритм, и не надо ни перебора, ни эвристик.
Теперь сам
Граф: слева A, B, C, справа 1, 2, 3. Рёбра: A-1, A-2, B-1, C-2, C-3. Жадность
взяла A-1 и C-2. Найди дополняющий путь и увеличь паросочетание.
Ответ. Свободны: слева B, справа 3. Начинаем из B:
B —(не в паре)— 1 —(в паре)— A —(не в паре)— 2 —(в паре)— C —(не в паре)— 3
Концы свободны, рёбра чередуются - путь дополняющий. Переключаем: берём B-1, убираем A-1, берём
A-2, убираем C-2, берём C-3. Паросочетание стало B-1, A-2, C-3 - размер 3 вместо 2, и
это совершенное паросочетание: заняты все шесть вершин.
Проверь себя вторым способом: в сети с истоком и стоком величина потока выросла с 2 до 3, а разрез
S = {s} даёт пропускную способность 3 - значит больше трёх не бывает, и ответ доказан.
Главное
Паросочетание - рёбра без общих вершин; «нельзя добавить» и «максимальное по размеру» - разные вещи. Двудольное паросочетание сводится к максимальному потоку: исток → левые (1), рёбра графа, правые → сток (1), и целость потока даёт честный ответ. Дополняющий путь - чередующаяся цепочка между двумя СВОБОДНЫМИ вершинами; его переключение увеличивает паросочетание ровно на единицу, а по теореме Бержа паросочетание максимально тогда и только тогда, когда такого пути нет. Обратное ребро остаточной сети и «ребро, которое сейчас в паре» - одно и то же, поэтому вся теория потоков переносится сюда дословно.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий