2026暑假 梦熊/十二中集训 模拟赛四 T2 tree 题解
我们可以先o(n^2)跑一个全源最短路.
然后我们就知道那些路径的权值超过了D.
我们将一长度超过D的路径和其的两个端点称为一个非法路径和非法点对.
那么问题就变成了切割边,使得对于每个联通块.存在一个点使得和他配对的二元组点不再一个联通块内.
我们可以考虑以下树上dp做.
\(dp[i]\)代表以\(i\)为根的子树,并截断连接\(i\)与\(i\)的父亲的边, 最少需要删去的边价值
然后我们转移的时候,枚举那那个使得我们满足要求的点.
此时的复杂度是\(O(n^2)\)
我们考虑如何转移.
我们将一个联通块内,满足条件点到该连通块中其他所有点的距离均不超过\(D\)的点称为条件点.
我们将一个联通块内,满足亮点距离超过\(D\)的点乎对称为对应的匹配点.
我们转移的核心难点在与,当我们枚举条件点的时候,我们不知道要截断那些边,使得这个点与对应的匹配点断开,核心在与图结构的不确定性.
我们这么考虑,我们不利用预处理的全员最短路获得的非法点对转移. 而是每次枚举条件点的时候,现往外扩张.
我们每次扩张,分为两种.
扩张后,端点到达当前枚举的条件点的距离大于\(D\),那么无法扩张. 否则可以扩张.
诺可以扩张,我们可以选择当前就不扩张了,这个边作为截断边. 否则扩张.
那么就是截断当前边的代价和继续扩展后的代价取最小.
我们如何计算继续扩展的代价?
这个也可以\(dp\)做,我们令数组为\(f\)
\(f_{u,v}\)代表点\(u\)为条件点,从\(v\)开始往下扩展的最小代价,
显然,只有\(u\)不在以\(v\)的子树内(不含\(v\))时,存在对应的有意义\(f\)值.
同时,对应每个\(f_{u,v}\),可以以来\(v\)的子结点的\(f\)来转移.
转移的时候,有两种选择:连接这个边,加上子结点的\(f\);不连接这个边,代价加上这个边的权值和子结点的\(dp\)数组值.
所以对于相同的\(u\),要从深度由浅入深来枚举\(v\)
同时,意味着\(dp\)和\(f\)是相互依赖的.
同时,计算\(f\)所花费的总复杂度是\(O(n^2)\)的
我们考虑怎么以来\(f\)来计算\(dp\)
首先,我们在确定\(dp\)子树的根\(root\),然后枚举条件点\(u\). 那么条件点到子树根的边是必须连的,不然就不是一个联通块了.
然后从子树的根到这个条件点的边连上后,我们就要计算最小代价了.
首先是\(f_{u,u}\)是必须算上的
其次,我们要计算条件点到子树根的路径上,往外扩张的最小的代价. 由于这个路径上包含枚举的根节点,但是又要依赖根节点的\(f\)来转移,所以对于相同深度的点,总是先算\(f\),再算\(dp\)
然后每次计算条件点到子树根的路径上扩张的代价,如果暴力遍历路径上的点,然后对\(f\)求和就太慢了.
由于枚举的\(f\)和\(dp\)都关于深度单调递减
所以我们可以对于每个点,维护一个sum. 记录当前往根的节点跳的路径上,往外扩展的代价的最小值.
总复杂度\(O(n^2)\)

浙公网安备 33010602011771号