转移正确性求助
  • 板块学术版
  • 楼主Themooncake
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/2 15:34
  • 上次更新2024/1/2 20:19:14
查看原帖
转移正确性求助
516353
Themooncake楼主2024/1/2 15:34

题目链接 P2899 [USACO08JAN] Cell Phone Network G

定义 f[rt][0/1/2]f[rt][0/1/2] 表示以 rtrt 为根的子树,除了根节点其他节点都保证点亮,选择了根节点/选择了至少一个根节点的儿子/根节点未被点亮时最少要选择多少个节点。 转移如下:

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 它过了,不知道怎么证伪。

玄关

2024/1/2 15:34
加载中...