Независимое множество максимального веса в дереве
Множество вершин в графе независимо (independent), если никакая пара вершин в нём не соединена ребром.
Дано дерево, каждая вершина $v$ которого имеет вес $w_{v}$. Необходимо найти независимое множество максимального суммарного веса.
✍️ Невзвешенная версия этой задачи (все веса равны единице) решается жадным алгоритмом.
Динамическое программирование по поддеревьям
Выберем любую вершину $r$ в качестве корня дерева. Теперь каждой вершине дерева $v$ соответствует подзадача поиска независимого множества максимального веса в поддереве этой вершины; обозначим искомое множество за $I_{v}$. Как выразить решение подзадачи для вершины $v$ через подзадачи попроще? Если сама вершина $v$ не входит в $I_{v}$, то $I_{v}$ объединение $I_{u}$ по всем $u$ - детям $v$. Если же $v$ входит в $I_{v}$, то никто из детей $v$ в $I_{v}$ входить не может. В этом случае $I_{v}$ - объединение $I_{u}$ по всем $u$ - “внукам” $v$ - детям детей $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$ легко вычислить, запустив поиск в глубину из $r$. Получаем решение за $O(V+E)$.
|
|
Восстановление ответа
|
|