Паросочетания-1 (9 сентября 2024)
- Введение
- Определения: паросочетание, совершенное паросочетание, вершинное покрытие, независимое множество, клика.
- Сведения задач друг к другу: max клика = max независимое множество = min контролирующее множество.
- Сложность задач: в произвольном графе класс задач clique NP-hard, в двудольном графе все задачи решаются.
- Поиск паросочетания
- Дополняющая чередующаяся цепь: определение, увеличение паросочетания с помощью пути.
- Лемма о дополняющем пути для произвольного графа.
- Алгоритм поиска дополняющей цепи за O(E) в двудольном (dfs в графе G').
- Техническая реализация: восстановление пути на обратном ходе рекурсии.
- Алгоритм Куна за O(VE) (от каждой вершины искать лишь один раз). Доказательство от противного.
- Оптимизация Куна
- Не обнуляем пометки: время поиска паросочетания теперь равно O(kE).
- Обнуляем пометки за O(1).
- Жадная инициализация алгоритма Куна: ускорение в два раза
- Не обнуляем пометки даже после того, как успешно найдём путь.
- И пошафлить. Переходить за O(1) в совободного соседа. % Иначе есть тест, где VE/logV.
- Поиск вершинного покрытия и независимого множеств
- Лемма: ∀C, M : |C| ≥ |M|
- Алгоритм поиска за O(E) по паросочетанию: I = A+ + B-, C = A- + B+
- Мы искали дополняющий путь, но не нашли, поэтому Afree ⊂ A+; Bfree ⊂ B-
- I независимо (из A+ нет рёбер в B-), C контролирующее (как дополнение)
- |C| = |M| из конструкции выше, т.к. A- и B+ − разные концы рёбер паросочетания (разные т.к. нет рёбер из B+ в A-)
- Теорема Кёнига: min|C| = max|M|
- Обзор решений
- Двудольный граф: Кун за O(VE)
- Двудольный граф: Хопкрофт-Карп за O(EV1/2)
- Произвольный граф: сжатие соцветий. Реализации Габова и Тарьяна за O(V3) и O*(VE).
- Произвольный граф: матрица Татта, Th о проверке за O(V3), алгоритм построения за O(V5)
- Произвольный граф: алгоритм Вазирани, O(EV1/2).
- Матрица Татта
- Двудольная матрица смежности перманент (знакопостоянный определитель)
- Чётность числа совершенных паросочетаний
- Собственно матрица Татта, лемма Шварца-Зиппеля, алгоритм за O(n3).
- Кун для произвольного графа
- Алгоритм: dfs, который помечает вершины обеих долей used[v]=used[x]=1
- Когда не работает. Как сделать, чтобы хотя бы с Pr>0 работал.