换根 DP 板子

以前一直以为这玩意是随机应变的。

结果还真能总结出板子。

当然也有一定的局限性,比如 dp 值必须 O(1) 算。但不影响正常使用。

ins:向 k子树信息中插入/删除 nx子树信息

这里的 子树dfs1 中是指以 1 为根的子树;dfs2 中是指以 k 为根。

recalc:重新计算 kdp 值。

recalc 的信息储存在 dp_[k] 内,dp[k] 是最终的 dp 值。

void dfs1(int k, int fa)
{
	for(int i = h[k]; ~i; i = ne[i])
	{
		int nx = e[i];
		if(nx == fa)
			continue;
		dfs1(nx, k);
		ins(k, nx, 1);
	}
	recalc(k);
}

void dfs2(int k, int fa)
{
	dp[k] = dp_[k];
	for(int i = h[k]; ~i; i = ne[i])
	{
		int nx = e[i];
		if(nx == fa)
			continue;
		ins(k, nx, -1);
		recalc(k);
		ins(nx, k, 1);
		recalc(nx);
			
		dfs2(nx, k);
		
		ins(nx, k, -1);
		recalc(nx);
		ins(k, nx, 1);
		recalc(k);
	}
}
posted @   ningago  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
点击右上角即可分享
微信分享提示