Дивергенция

Напишем динамику по поддеревьям $$$dp[v][set]$$$ — длина кратчайшего пути от $$$v$$$ до некоторой вершины $$$u$$$ в поддереве $$$v$$$, такого, что множество мощностей D-mail-ов на этом пути равно $$$set$$$. Так как в множестве мощностей может быть только три элемента: $$$0$$$, $$$1$$$ и $$$2$$$, есть всего $$$2^3$$$ возможных множеств $$$set$$$, которые нам интересно хранить. Научимся пересчитывать $$$dp[v]$$$. Если $$$v$$$ — это лист, то множество мощностей на пути может быть только пустым, поэтому нам нужно сохранить только $$$dp[v][\varnothing] = 0$$$. Если же $$$v$$$ — не лист, то переберём $$$u_i$$$ — детей $$$v$$$, насчитаем $$$dp[u_i]$$$ рекурсивно, после чего переберём все $$$set$$$, сохранённые в $$$dp[u_i]$$$. Напомним, что в $$$dp[u_i]$$$ для каждого множества хранится кратчайший путь от $$$u$$$ до какой-то вершины, на котором есть D-mail-ы из этого множества, а в $$$dp[v]$$$ нам нужен путь от $$$v$$$. Продлим эти пути из $$$dp[u_i]$$$ до $$$v$$$: добавим в $$$set$$$ элемент $$$a_{u_i}$$$ и пересчитаем $$$dp[v][set \cup \{a_{u_i}\}]$$$ через $$$dp[u_i][set] + 1$$$.

После того как все $$$dp$$$ насчитаны, нужно посчитать ответ. Для пересчёта ответа нам понадобится массив $$$ans[set]$$$, в котором будет храниться кратчайшая длина пути, на котором есть все мощности из множества $$$set$$$. Для начала обновим $$$ans[set]$$$ через все $$$dp[v][set]$$$. Однако в $$$dp[v]$$$ мы рассматривали только вертикальные пути: те, которые спускаются из $$$v$$$ в поддерево $$$v$$$. Для нахождения ответа нам нужно рассмотреть вообще все пути в дереве, в том числе и такие, которые стартуют в $$$v$$$, поднимаются наверх в некоторую вершину $$$w$$$, а потом спускаются из $$$w$$$ вниз в вершину $$$u$$$. Переберём $$$w$$$, обозначим её детей за $$$s$$$ и $$$t$$$. Переберём, какое подмножество мощностей $$$set_s$$$ мы хотим найти в поддереве $$$s$$$, а какое — $$$set_t$$$ — в поддереве $$$t$$$, и пересчитаем $$$ans[set_s \cup set_t \cup \{a_s\} \cup \{a_t\}]$$$ через $$$dp[s][set_t] + dp[t][set_t] + 2$$$.

Если в $$$ans$$$ нашлось множество $$$\{0, 1, 2\}$$$, то мы можем вернуться в прошлое на $$$3$$$ дня при помощи пути длиной $$$ans[\{0, 1, 2\}]$$$. Если нашлось $$$\{0, 1\}$$$, то, соответственно, на два дня, если $$$\{0\}$$$, то на один, а если ни на каком пути нет D-mail-а мощности $$$0$$$, то ответ — $$$0$$$.

Итоговая асимптотика: $$$\mathcal O(n (2^3)^2)$$$.