hihocoder 1247
描述
王胖浩有一个n个节点的树。他有特殊的能力,能将树划分成若干条链。
一个有根树的树链剖分为将整棵树划分成若干条从一个点到这个点的祖先(包括本身)的链,并且这些链没有公共点。如果一条边在某条链上,即这条边的两个端点在同一个链上,那么这个边为重边,否则为轻边。
一个树链剖分的代价为所有点对的路径上轻边的个数之和。这里将u,v和v,u当成同一个点对。一个有根树的最优树链剖分为所有方案中代价最小的方式。
他想通过合理地使用他的特殊能力,使得树链剖分最优。
他得到了一个无根树,他想知道以每个点为根对应的有根树的最优树链剖分的代价。
每个边的代价为两头节点数的乘积
那么对于一个确定了根的树,非叶子节点将选择一条代价最大的边作为重边,贪心即可得到最小的代价
对于每一个点为根的答案,不可能暴力求解,需要进行信息维护。
一、先以1为根,贪心求出这个树的最小代价,第一次DFS
二、把根转移到孩子节点,把外界的信息传递给孩子节点,同时修正以孩子节点为根的树的结构~~第二次DFS
这里的外界信息指得是除去当前孩子节点为根的子树的其他子树的信息
总的来说这类题目就是先求出一个根的答案(第一个DFS),然后将根往孩子节点移动,传递外界信息给孩子节点以及修正新树的结构(第二次DFS)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include