#树形dp#jzoj 2005 皇宫看守

题目

宫殿间可以相互看见,在看守全部宫殿的前提下,使花费的经费最少。


分析

f [ i ] [ 0 ] 表 示 i 节 点 在 父 节 点 可 看 到 时 , 以 i 为 根 的 子 树 需 要 安 排 的 最 少 士 兵 数 f[i][0]表示i节点在父节点可看到时,以i为根的子树需要安排的最少士兵数 f[i][0]ii
f [ i ] [ 1 ] 表 示 i 节 点 在 子 节 点 可 看 到 时 , 以 i 为 根 的 子 树 需 要 安 排 的 最 少 士 兵 数 f[i][1]表示i节点在子节点可看到时,以i为根的子树需要安排的最少士兵数 f[i][1]ii
f [ i ] [ 2 ] 表 示 i 节 点 安 装 士 兵 时 , 以 i 为 根 的 子 树 需 要 安 排 的 最 少 士 兵 数 f[i][2]表示i节点安装士兵时,以i为根的子树需要安排的最少士兵数 f[i][2]ii
f [ i ] [ 0 ] = m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) , f [ i ] [ 1 ] = m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) + d f[i][0]=min(f[son][1],f[son][2]),f[i][1]=min(f[son][1],f[son][2])+d f[i][0]=min(f[son][1],f[son][2]),f[i][1]=min(f[son][1],f[son][2])+d
f [ i ] [ 2 ] = m i n ( f [ s o n ] [ 0 ] , f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) + c o s t [ i ] f[i][2]=min(f[son][0],f[son][1],f[son][2])+cost[i] f[i][2]=min(f[son][0],f[son][1],f[son][2])+cost[i]
d = m i n ( f [ s o n ] [ 2 ] − m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) ) d=min(f[son][2]-min(f[son][1],f[son][2])) d=min(f[son][2]min(f[son][1],f[son][2]))


代码

#include 
#include 
using namespace std;
struct node{int y,next;}e[4001]; int ls[1501]; bool v[1501];
int n,k,f[1501][3],m,root,x,y,cost[1501];
int in(){
	int ans=0; char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=ans*10+c-48,c=getchar();
	return ans;
}
int min(int a,int b){return (a<b)?a:b;}
void dp(int x,int last){
	int d=1e7;
	for (int i=ls[x];i;i=e[i].next){
		if (e[i].y==last) continue;//不退回去
		dp(e[i].y,x);
		f[x][0]+=min(f[e[i].y][1],f[e[i].y][2]);
		f[x][1]+=min(f[e[i].y][1],f[e[i].y][2]);
		d=min(d,f[e[i].y][2]-min(f[e[i].y][2],f[e[i].y][1]));
		f[x][2]+=min(f[e[i].y][2],min(f[e[i].y][0],f[e[i].y][1]));
	}
	f[x][1]+=d; f[x][2]+=cost[x];
}
int main(){
	freopen("guard.in","r",stdin);
	freopen("guard.out","w",stdout);
	n=in();
	for (int i=1;i<=n;i++){
		x=in(); cost[x]=in(); k=in();
		while (k--) e[++m]=(node){y=in(),ls[x]},ls[x]=m,v[y]=1;
	}
	for (root=1;root<=n&&v[root];root++);
	dp(root,0); return !printf("%d",min(f[root][1],f[root][2]));
}

你可能感兴趣的:(树形dp,jzoj,2005,皇宫看守)