Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

关于树形dp的一点想法(不包含优化)

Posted by wib at 2019-08-18 19:22:40 on Problem 1848
用f[i][4]数组
f[i][0]:以i为顶点的子树中,还有一条以i节点为一端的链(链长>2)未被覆盖时,连边的最小值。
f[i][1]:以i为顶点的子树全部覆盖时,连边的最小值。
f[i][2]:以i为顶点的子树中,仅剩i节点未被覆盖时,连边的最小值。
f[i][3]:以i为顶点的子树中,仅剩i节点和其一子节点未被覆盖时,连边的最小值。
可知当i为叶子,f[i][0]=f[i][1]=f[i][3]=INF,f[i][2]=0;
当i非叶子
f[i][0]:
需要还有一条以i节点的子节点为一端的链未被覆盖,同时保证其它子节点被覆盖
即
f[i][0]=INF;
for(u为i的子节点)
{
	vl=min(f[u][0],f[u][3]);
	for(k为i的子节点且k!=u)vl+=f[k][1];
	f[i][0]=min(vl,f[i][0]);
}

f[i][1]:
此时,需要一条包含i的链(链长>2),这样加条边就成环
以i为顶点:f[i][0]+1便是答案
不以i为顶点,在里面的找两个子树中的链或子节点,同时保证其它子节点被覆盖
即
f[i][1]=f[i][0]+1;
for(u为i的子节点)
for(k为i的子节点且k!=u)
{
	vl=1+min(f[u][0],f[u][2],f[u][3])+min(f[k][0],f[k][2],f[k][3]);
	for(c为i的子节点且c!=u且c!=k)
	vl+=f[c][1];
	f[i][1]=min(vl,f[i][1]);
}

f[i][2]:
此时,下面必然全部被覆盖
即:
f[i][2]=0;
for(u为i的子节点)f[i][2]+=f[u][1];

f[i][3]:
此时,需要还有一个i节点的子节点为一端的链未被覆盖,同时保证其它子节点被覆盖
即
f[i][3]=INF;
for(u为i的子节点)
{
	vl=f[u][2];
	for(k为i的子节点且k!=u)vl+=f[k][1];
	f[i][0]=min(vl,f[i][0]);
}
最后答案就是f[root][1](当f[root][1]==INF时输出-1);

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator