Максимальное независимое множество и минимальное покрытие путями в двудольном графе через паросочетание
Две связанные задачи, которые, говорят, решаются через паросочетание в двудольном графе: (1) максимальное независимое множество вершин; (2) минимальное число путей, покрывающих все вершины DAG (path cover). Как они сводятся к паросочетанию и какие тут формулы?
2 ответа
Обе задачи опираются на König и max-matching.
(1) Максимальное независимое множество в двудольном графе. В двудольном графе (и только в нём — в общем NP-трудно):
Это прямое следствие König: максимальное независимое множество = дополнение минимального вершинного покрытия, а . Само множество восстанавливается как .
(2) Минимальное покрытие путями DAG (minimum path cover). Нужно покрыть все вершины ориентированного ациклического графа минимальным числом вершинно-непересекающихся путей. Сводим так:
- Каждую вершину дублируем: в левой доле, в правой.
- Ребро исходного DAG → ребро в двудольном графе.
- Считаем максимальное паросочетание .
Тогда:
Интуиция: каждое ребро паросочетания «склеивает» два пути в один, сокращая их число на 1. Изначально путей (по одной вершине), и каждое ребро уменьшает счётчик.
Важно: эта формула — для вершинно-непересекающихся путей в DAG. Для путей, которые могут делить вершины, нужно сначала транзитивно замкнуть граф. Асимптотика — стоимость паросочетания, Куном или Хопкрофтом-Карпом.
Уточнение к path cover, на котором часто ошибаются: формула верна для минимального покрытия вершинно-непересекающимися путями. Если же разрешено покрывать вершину несколькими путями (пути могут пересекаться) — задача меняется: нужно построить транзитивное замыкание DAG (добавить ребро , если есть путь ), и уже на нём считать паросочетание. Без замыкания вы решаете задачу про непересекающиеся пути. Внимательно читайте условие: «пути не пересекаются по вершинам» или «можно пересекаться» — это два разных ответа.