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)\)

posted @ 2026-08-29 21:41  txp2025  阅读(6)  评论(0)    收藏  举报