zoukankan      html  css  js  c++  java
  • 【BZOJ】ARC083 E

    【算法】树型DP

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

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

    也就是说对于一个点v,假定其为黑色,那么子树中黑色总和为Xv,白色总和就要最小(从而后面加起来超过的可能更小),将白色总和定义为f[v]。

    那么点v选择为黑色后,假设子树黑色总和为B(不含v),白色总和为W(f[v]),对于每个v的子节点u,有如下二选一:

    B+=Xu,W+=f[u]。

    B+=f[u],W+=Xu

    然后做形如背包的操作就可以O(kXv)的计算每个点的f[v]。

    树型DP即可。

    #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
  • 相关阅读:
    Linux下安装mysql5.7
    springcloud alibaba-sentinel流控规则简介
    springcloud alibaba-sentinel初始化
    springcloud alibaba-sentinel下载安装和运行
    Python内置函数
    Python生成器
    Python解析式
    Python模块-----日期模块
    Python内置数据结构----字典
    Linux配置免密登录
  • 原文地址:https://www.cnblogs.com/onioncyc/p/7541322.html
Copyright © 2011-2022 走看看