Description

有一颗N个节点的树,其中1号节点是整棵树的根节点,而对于第ii个点(2≤i≤N)(2≤i≤N),其父节点为PiPi

对于这棵树上每一个节点Snuke将会钦定一种颜色(黑或白),以及一个非负整数的点权。

Snuke有一个他最喜欢的整数序列,X1,X2,...,XNX1,X2,...,XN,他希望能够钦定这些点的点权和颜色。使得:

对于每一个点ii,都满足ii的整颗子数内所有和ii颜色相同的点(包括ii本身)的点权和恰好为XiXi。

现在给定你这棵树的结构和Snuke最喜欢的整数序列,请你判断是否有一种钦定的方案使得其满足上文所述的条件

Input

第一行一个正整数NN表示点的数量。

第二行N−1N−1个正整数,其中第ii个数表示编号为i+1i+1的点的父节点编号。

第三行NN个非负整数,表示Snuke最喜欢的整数序列。

Output

如果存在一种可行方案,则输出"POSSIBLE";

否则,输出"IMPOSSIBLE"

(不加引号)

Sample Input

Sample 1
3
1 1
4 3 2 Sample 2
3
1 2
1 2 3 Sample 3
8
1 1 1 3 4 5 5
4 1 6 2 2 1 3 3 Sample 4
1
0

Sample Output

Sample 1
POSSIBLE Sample 2
IMPOSSIBLE Sample 3
POSSIBLE Sample 4
POSSIBLE

HINT

1≤N≤10001≤N≤1000

1≤Pi≤i−11≤Pi≤i−1

0≤Xi≤5000

Sol

首先我们发现,一个点的子树中的和只要小于等于\(w[x]\)即可,因为\(val[x]\)可以是任意非负整数,但是另外一种颜色的值要尽量小,这样对它的祖先节点的贡献会更大。所以我们用\(f[x]\)表示x点子树中另一种颜色的最小值。

然后我们对于它的每个子节点做一次背包,子节点的权值要么是\(w[son]\),要么是\(f[son]\),而这两个值恰好一个给\(f[x]\)做贡献,一个给\(w[x]\)做贡献,这就是一个裸的背包了,用这两个式子结合转移即可,之后我们在\(0-w[i]\)中找到最小值并作为\(f[x]\)的值即可。如果全都是inf说明这个点找不到合适的取值,就return 0。

最后只需要判断dfs(1)的返回值即可。

Code

#include <bits/stdc++.h>
using namespace std;
int n,x,v[1005],f[1005],g[2][5005];vector<int>e[1005];
bool dfs(int x)
{
if(!e[x].size()){f[x]=0;return 1;}
for(int i=0;i<e[x].size();i++) if(!dfs(e[x][i])) return 0;
int w=1;memset(g[w],0x3f,sizeof(g[w]));g[w][0]=0;
for(int i=0;i<e[x].size();i++)
{
w=!w;memset(g[w],0x3f,sizeof(g[w]));
for(int j=0;j<=v[x];j++)
{
if(j>=f[e[x][i]]) g[w][j]=min(g[w][j],g[w^1][j-f[e[x][i]]]+v[e[x][i]]);
if(j>=v[e[x][i]]) g[w][j]=min(g[w][j],g[w^1][j-v[e[x][i]]]+f[e[x][i]]);
}
}
int gg=2147483647;
for(int i=0;i<=v[x];i++) gg=min(gg,g[w][i]);
if(gg>1e9) return 0;f[x]=gg;return 1;
}
int main()
{
scanf("%d",&n);
for(int i=2;i<=n;i++) scanf("%d",&x),e[x].push_back(i);
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
if(dfs(1)) puts("POSSIBLE");else puts("IMPOSSIBLE");
}

【ARC083E】Bichrome Tree 树形dp的更多相关文章

  1. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  2. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  3. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  4. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  5. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  6. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  7. Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】

    题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...

  8. codeforces Round #263(div2) D. Appleman and Tree 树形dp

    题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...

  9. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

随机推荐

  1. linux安装xgboost

    在学校服务器上安装xgboost,事先我已经安装了anaconda,但是因为师兄已经装了python所以没加入到path. 网上的方法一般都要编译,另外官方的下载方法要联网..总之出了一堆错,最终还是 ...

  2. 03-CSS中的选择器

    高级选择器分为: 后代选择器 子代选择器 并集选择器 交集选择器 后代选择器 使用空格表示后代选择器 , 顾名思义  父元素的后代(包括儿子,孙子,重孙子) 中间空格隔开 是后代 .container ...

  3. Java面向对象-String类

    1,实例化String对象 有两种方式,我们直接看代码: package com.java1234.chap03.sec08; public class Demo1 { public static v ...

  4. linux下的定时或计时操作(gettimeofday等的用法,秒,微妙,纳秒(转载)

    一.用select()函数实现非阻塞时的等待时间,用到结构体struct timeval {},这里就不多说了. 二.用gettimeofday()可获得微妙级(0.000001秒)的系统时间,调用两 ...

  5. Android独立交叉编译环境搭建

    我们经常需将一些C/C++源码编译成本地二进制,直接在android的linux内核上运行,这是就需要进行交叉编译.由于Android的运行环境核普通Linux又区别,所以常规方式针对ARM进行交叉编 ...

  6. SonarQube在CentOS上的安装

    1 简介 SonarQube 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具.与持续集成工具(例如 Hudson/Jenkins 等 ...

  7. mysql语句规范

  8. iPython notebook 安装使用

    pip install jupyter jupyter notebook --allow-root

  9. Python和其他语言的区别 (简单精辟啊 手打)

    首先是简单 读和写非常容易 免费 免费且开源 社区为专业人士和初学者提供知识和经验的分享交流平台 兼容性 与多平台兼容 面向对象 支持面向对象编程 php面向网络 函数库 python 社区创建了丰富 ...

  10. CF835F Roads in the Kingdom

    话说这是去年大爷的一道NOIP模拟赛题,对着大爷的代码看了一堂课的我终于把这题写掉了. 本题要求在基环树给定的环上删去一条边使剩下的树的直径最小,输出这个最小直径. 那么基环树可以画成这样子的: 有一 ...