社区讨论

转移正确性求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lqw1c3sw
此快照首次捕获于
2024/01/02 15:35
2 年前
此快照最后确认于
2024/01/02 20:19
2 年前
查看原帖
定义 f[rt][0/1/2]f[rt][0/1/2] 表示以 rtrt 为根的子树,除了根节点其他节点都保证点亮,选择了根节点/选择了至少一个根节点的儿子/根节点未被点亮时最少要选择多少个节点。 转移如下:
CPP
void dfs(int rt,int fa)
{
	f[rt][0]=1;
	f[rt][1]=N;
	for(int i=Head[rt];i;i=E[i].nxt)
	{
		int son=E[i].to;
		if(son==fa)	
 	   		continue;
		dfs(son,rt);
		f[rt][0]+=min(min(f[son][0],f[son][1]),f[son][2]);
		f[rt][1]=min(f[rt][2]+f[son][0],f[rt][1]+min(f[son][0],f[son][1]));
		f[rt][2]+=f[son][1];
	}
}
答案取 max(f[1][0],f[1][1])\max (f[1][0],f[1][1])
个人感觉这个转移是错误的,因为可能会有 f[rt][1]f[rt][1] 全是 f[son][1]f[son][1] 转移过来的情况,但这个 dfs 它过了,不知道怎么证伪。
玄关

回复

0 条回复,欢迎继续交流。

正在加载回复...