BZOJARC083 E - Bichrome Tree

Posted ONION_CYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJARC083 E - Bichrome Tree相关的知识,希望对你有一定的参考价值。

【算法】树型DP

【题意】给定含n个点的树的形态,和n个数字Xv,要求给每个点赋予黑色或白色和权值,满足对于每个点v,子树v中和v同色的点的权值和等于Xv

【题解】首先每个点的权值可以任意大,那么v的子树(不含v的部分)权值多少就无所谓了(因为缺的可以由v来补足),但是太大的话超过Xv就不可行了。

也就是说对于一个点v,假定其为黑色,那么子树中黑色总和为Xv,白色总和就要最小,将其定义为f[v]。

 

 

 

技术分享
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
const int maxM=5010,maxn=1010,inf=0x3f3f3f3f;
int f[maxn],g[2][maxM],n,first[maxn],tot,v[maxn];
struct edge{int v,from;}e[maxn];


int read(){
    char c;int s=0,t=1;
    while(!isdigit(c=getchar()))if(c==-)t=-1;
    do{s=s*10+c-0;}while(isdigit(c=getchar()));
    return s*t;
}
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
int min(int a,int b){return a<b?a:b;}
void dfs(int x){
    for(int i=first[x];i;i=e[i].from)dfs(e[i].v);
    memset(g[0],0x3f,sizeof(g[0]));
    int X=0;
    g[X][0]=0;
    for(int i=first[x];i;i=e[i].from){
        int y=e[i].v;
        X=1-X;
        memset(g[X],0x3f,sizeof(g[X]));
        for(int j=0;j<=v[x];j++){
            if(j-v[y]>=0)g[X][j]=min(g[X][j],g[1-X][j-v[y]]+f[y]);
            if(j-f[y]>=0)g[X][j]=min(g[X][j],g[1-X][j-f[y]]+v[y]);
        }
    }
    for(int i=0;i<=v[x];i++)f[x]=min(f[x],g[X][i]);
}
    
int main(){
    n=read();
    for(int i=2;i<=n;i++){
        int p=read();
        insert(p,i);
    }
    for(int i=1;i<=n;i++)v[i]=read();
    memset(f,0x3f,sizeof(f));
    dfs(1);
    if(f[1]<inf)printf("POSSIBLE");else printf("IMPOSSIBLE");
    return 0;
}
View Code

 

以上是关于BZOJARC083 E - Bichrome Tree的主要内容,如果未能解决你的问题,请参考以下文章

[动态规划][树形dp]Bichrome Tree

Oracle OCP 19c 认证1Z0-083考试(第65题) - #1z0-083

Oracle OCP 19c 认证1Z0-083考试(第65题) - #1z0-083

错误代码:88000, 错误信息:without comment privilege hint: [7oJ0533w689] rid: 630432cd-15944cf6-083e04fc

Oracle OCP 19c 认证1Z0-083考试大纲(Oracle官方版)

Oracle OCP 19c 认证1Z0-083考试(第16题)