EduBrick
← вернуться к уроку · Продвинутый уровень: проверь себя

E. Наибольшее удаление

2000 мс · 256 МБ · всё или ничего

Дано взвешенное дерево. Для каждой вершины найдите наибольшее взвешенное расстояние от неё до какой-нибудь другой вершины. Для дерева из одной вершины ответ ноль.

Схема та же, что в предыдущей задаче, но с важным отличием: максимум не обратим.

В сумме расстояний вклад «всего остального» удавалось выразить одним числом и пересчитать арифметикой. С максимумом так нельзя: чтобы узнать максимум по всем детям, кроме одного, вычесть ничего не получится.

Два максимума

Стандартное лекарство - хранить в каждой вершине два наибольших значения среди детей и знать, на каком ребёнке достигнут первый.

Тогда «максимум по всем детям, кроме cc» - это первый максимум, если он достигнут не на cc, и второй иначе.

down[v] = 0;
for (auto [c, w] : children[v]) down[v] = std::max(down[v], down[c] + w);

Обход вверх: пусть up[v]up[v] - наибольшее расстояние от vv в часть дерева вне её поддерева. Тогда для ребёнка cc с весом ребра ww:

up[c]=w+max(up[v], лучший спуск среди детей v, кроме c)up[c] = w + \max\bigl(up[v],\ \text{лучший спуск среди детей } v, \text{ кроме } c\bigr)

Ответ для вершины - max(down[v],up[v])\max(down[v], up[v]).

Проверьте себя

Максимум под up[c]up[c] должен браться и с нулём тоже: если у vv нет других детей и vv - корень, то путь может кончиться в самой vv, и «лучший спуск среди остальных детей» равен нулю, а не минус бесконечности.

На цепочке из трёх вершин с весами рёбер 5 и 7 ответы должны получиться 12, 7, 12. Если у вас вышло что-то другое - ошибка ровно в этом месте.

Подробнее: «Смена корня».

Формат ввода

В первой строке - число nn (1n1051 \le n \le 10^5).

В следующих n1n - 1 строках - тройки vv, uu, ww (1v,un1 \le v, u \le n, 0w1060 \le w \le 10^6).

Формат вывода

Выведите nn чисел - наибольшее удаление для каждой вершины.

Примеры

ввод
3
1 2 5
2 3 7
вывод
12 7 12
ввод
1
вывод
0
Войдите, чтобы отправлять решения.
← Вернуться к уроку