Паросочетания и покраски (СПБГУ МатМех, весна 2013, спецкурс 344-й группы)
Паросочетание
- Паросочетание. Совершенное паросочетание. Задача о максимальном паросочетании (M).
- Задачи о минимальном контролирующем множестве (C) и максимальном независимом множестве (N).
- max |M| ≤ min |C|, min |C| = |V| - max |I|. Верно для произвольного графа.
- Лемма о дополняющем чередующемся пути: если пути нет, паросочетание максимально. Лемма верна для произвольного графа.
- Доказательство леммы через симметрическую разность (сим.разность состоит из путей и циклов).
- Поточное доказательство того, что |M| = |C| (биекции Matching ↔ Flow, Cut ↔ Cover).
- Способ получать C (Cover) и I (Independent Set) из M (Matching) и за O(E): смотрим пометки последнего dfs-а, I = A+ + B-, C = A- + B+.
- Конструктивное доказательство того, что max |M| = min |C|.
- Алгоритм поиска дополняющего пути = dfs, код dfs-а (pair[b]; used[a]; (a,b): a → pair[b])
- Получили алгоритм за O(VE) (V раз найти дополняющий путь). Константа меньше, чем у потока.
- Алгоритм Куна, тоже O(VE), но проще в реализации и еще меньше константа.
- Жадная инициализация паросочетания: еще уменьшили константу.
Рандомизированные алгоритмы для произвольного графа
- dfs заранее не знает, какая вершина в какой доли, мы по ходу расставляет пометки + делаем random_shuffle перед каждым запуском
- dfs в раздвоенном графе, когда нашли путь, проверяем содержит ли он какую-то вершину 2 раза
- dfs в раздвоенном графе, когда ищем путь, запрещаем идти (a → b), если в предках вершины a есть парная к вершине b
Потоки: алгоритм Диница
- Слоистая сеть. За O(E + kd) нашли все дополняющие пути длины d.
- Реализация: head := head0, while ((cur = head[e]) != -1) { ... if (good) break; head[e] = next[cur] }
- Время работы: O(V2E) (т.к. сумма всех k не более VE, а фаз не более V)
- Время работы с масштабированием: O(VElogC) (т.к. сумма всех k не более ElogC, а фаз не более VlogC)
- Применения для единичных сетей: время работы не более O(VE) (т.к. каждая фаза работает за O(E), а фаз не более V)
- Применения для поиска паросочетания (алгоритм Хопкрофта-Карпа): время работы O(E√ V ), т.к. посмотрим на симметрическую разность после первых √ V фаз
Задачи
- [matching] Задачка про покрытие доминошками
- [matching] Задачка про такси, сведение к паросочетанию.
- Not read [matching] Покрытие транзитивно замкнутого ацикличного графа не пересекающимися цепями
- Not read [matching] Покрытие произвольного ацикличного графа возможно пересекающимися цепями
- Not read [max clique] birthday
- Not read [independent set] party
- Not read [cover] Замощение грида минимальным числом палок 1xN
- Not read [hard] Теорема Дилворта
- Not read max Анти цепь ≤ min Покрытия цепями
- Not read конструктивное построение равных объектов (следовательно max и min)
Про раскраску графов
- D = max deg[v]. Через эту величину будут записаны все теоремы.
- Вершины графа можно покрасить в D+1 цвет
- Теорема Брукса: если в графе нет D+1 вершины, образующих клику, то можно покрасить вершины в D цветов
- Not read Конструктивное доказательство теоремы Брукса (конструктивное = дан алгоритм покраски)
- Случай планарного графа: вершины можно покрасить в 5 цветов
- Конструктивное доказательство теоремы (конструктивное = дан алгоритм покраски)
- Алгоритмы, которые пытаются красить в минимальное число цветов
- Удаляем вершину минимальной степени и красим
- Бинпоиск по ответу + каждый раз красим ту вершину, которую min кол-во способов покрасить
- Теорема Визинга: min число цветом, в которые можно покрасить ребра -- или D, или D + 1
- Not read Конструктивное доказательство теоремы Визинга (конструктивное = дан алгоритм покраски)
- Для двудольного графа: ребра можно раскрасить в D цветов.
- Лемма Холла (совершенное паросочетание существует тогда и только тогда).
- k-регулярный граф по Лемме Холла имеет совершенное паросочетание.
- Алгоритмы раскраски ребер произвольного двудольного графа.
- Дополним до регулярного, раскрасим
- Кратные ребра разрешены
- Алгоритмы раскраски ребер двудольного регулярного графа.
- Простой: ищем паросочетание D раз = O(D*Matching)
- Если D = 2k, то можно k раз найти эйлеров цикл и разбить граф на два D/2 регулярных: O(ElogD)
- Если D - произвольно, то можно нечетное уменьшать на 1, а четное делить попалам = O(logD*Matching)
- Итого: O(E√ V logD)
Задачи на покраску
- [2d] Разбить граф на min количество паросочетаний
- [2d] Дано множество несыгранных игр в турнире из n команд (каждая играет с каждой), нужно их сыграть как можно бытсрее.
- [any] Разбить граф на минимальное количество клик
- [any] Кластеризация точек на плоскости: минимизировать расстояние внутри кластера