Вкоренимо дерево у вершині 1.
Визначимо наступні масиви ДП:
\text{downDepth}_x: максимальна глибина від x до листа в його піддереві.
\text{downDiam}_x: діаметр (у кількості вершин) піддерева з коренем у x.
Обчислюємо їх як:
\text{downDepth}_x = 1 + \max_{y \in \text{children}(x)} \text{downDepth}_y
\text{downDiam}_x =
\max\left(
\max_{y \in \text{children}(x)} \text{downDiam}_y,\;
1 + \text{два найбільші значення серед } \text{downDepth}_y
\right)
Тепер визначимо висхідне ДП:
\text{upDepth}_x: максимальна глибина, починаючи від x і виходячи за межі його піддерева.
\text{upDiam}_x: діаметр дерева після видалення піддерева x.
Для обчислення \text{upDepth}_x (де p = \text{parent}(x)):
\text{upDepth}_x =
1 + \max\left(
\text{upDepth}_p,\;
\max_{y \in \text{children}(p),\, y \neq x} \text{downDepth}_y
\right)
Для обчислення \text{upDiam}_x беремо максимум з:
\text{upDiam}_p
\max_{y \in \text{children}(p),\, y \neq x} \text{downDiam}_y
1 + \text{два найбільші значення серед }
\left\{
\text{upDepth}_p
\right\}
\cup
\left\{
\text{downDepth}_y : y \in \text{children}(p),\, y \neq x
\right\}
Нарешті, для вершини v, після її видалення кожна компонента відповідає:
Для кожної компоненти обчислюємо її діаметр і кількість центрів:
\text{centers}(d) =
\begin{cases}
1 & \text{якщо } d \text{ непарне} \\
2 & \text{якщо } d \text{ парне}
\end{cases}
Таким чином,
\text{ans}_v =
\sum_{\text{діти } u \text{ вершини } v} \text{centers}(\text{downDiam}_u)
\;+\;
\text{centers}(\text{upDiam}_v)
Часова складність: O(n)