15.7. Независимое множество максимального веса в дереве
Определение
Независимое множество (independent set) графа — множество вершин, никакие две из которых не соединены ребром. Задача о максимальном независимом множестве (maximum weight independent set): дано дерево, каждая вершина $v$ которого имеет вес $w_v$; найти независимое множество максимального суммарного веса.
Свойства
На общем графе задача о максимальном независимом множестве NP-трудна. На деревьях она решается за линейное время динамическим программированием по поддеревьям.
✍️ Невзвешенная версия (все веса равны единице) решается жадным алгоритмом.
Динамическое программирование по поддеревьям
Выберем любую вершину $r$ в качестве корня дерева. Каждой вершине $v$ соответствует подзадача поиска независимого множества максимального веса в поддереве $v$; обозначим искомое множество за $I_v$. Как выразить решение для $v$ через подзадачи попроще?
- Если $v$ не входит в $I_v$: $I_v$ = объединение $I_u$ по всем детям $u$ вершины $v$.
- Если $v$ входит в $I_v$: никто из детей $v$ в $I_v$ входить не может. Тогда $I_v = \{v\}$ плюс объединение $I_u$ по всем «внукам» (детям детей) $v$.
Пусть $I[v] = \sum_{u \in I_v} w_u$ и $J[v] = \sum_{u\text{ — ребёнок }v} I[u]$.
Тогда:
$$ I[v] = \max\!\left(J[v],\; w_v + \sum_{u\text{ — ребёнок }v} J[u]\right). $$Все значения $I$, $J$ легко вычислить одним запуском DFS из $r$. Получаем решение за $O(V+E)$.