我们令 \(dp_i\) 表示正常处理完 \(i\) 子树节点的最优步数
转移时我们分两种情况
\(dp\) 代码:
inline void dfs(int now,int pre) {
dep[now]=dep[pre]+1; size[now]=1;
int a=0,b=INF;
if(du[now]==1) { dp[now]=dep[now]-1; return; }
for(re int i=head[now],to;~i;i=edge[i].nxt) {
if((to=edge[i].var)==pre) continue;
dfs(to,now);
size[now]+=size[to];
a+=min(dp[to],2*size[to]);
b=min(b,dp[to]-2*size[to]);
}
dp[now]=a+max(b,0ll); //存在负数的话那肯定有一点的dp大于2×size,不用再加dp值
// 否则就是 dp-2*size+2*size,相当与加上该点的dp值
}
原文:https://www.cnblogs.com/zjxlm/p/15164996.html