E. Наибольшее удаление
Дано взвешенное дерево. Для каждой вершины найдите наибольшее взвешенное расстояние от неё до какой-нибудь другой вершины. Для дерева из одной вершины ответ ноль.
Схема та же, что в предыдущей задаче, но с важным отличием: максимум не обратим.
В сумме расстояний вклад «всего остального» удавалось выразить одним числом и пересчитать арифметикой. С максимумом так нельзя: чтобы узнать максимум по всем детям, кроме одного, вычесть ничего не получится.
Два максимума
Стандартное лекарство - хранить в каждой вершине два наибольших значения среди детей и знать, на каком ребёнке достигнут первый.
Тогда «максимум по всем детям, кроме » - это первый максимум, если он достигнут не на , и второй иначе.
down[v] = 0;
for (auto [c, w] : children[v]) down[v] = std::max(down[v], down[c] + w);
Обход вверх: пусть - наибольшее расстояние от в часть дерева вне её поддерева. Тогда для ребёнка с весом ребра :
Ответ для вершины - .
Проверьте себя
Максимум под должен браться и с нулём тоже: если у нет других детей и - корень, то путь может кончиться в самой , и «лучший спуск среди остальных детей» равен нулю, а не минус бесконечности.
На цепочке из трёх вершин с весами рёбер 5 и 7 ответы должны получиться 12, 7, 12. Если у вас вышло что-то другое - ошибка ровно в этом месте.
Подробнее: «Смена корня».
Формат ввода
В первой строке - число ().
В следующих строках - тройки , , (, ).
Формат вывода
Выведите чисел - наибольшее удаление для каждой вершины.
Примеры
3 1 2 5 2 3 7
12 7 12
1
0