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. 2014.8.8 CAD系统连接

    CDA数据库连接生产库.研发库.临时库对应3个连接名 cad = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = backupserver)(POR ...

  2. 利用HADOOP中的jar写一个RPC

    RPC调用需要服务端和客户端使用相同的协议: 协议: package cn.itcast.bigdata.hadooprpc.protocol; public interface IUserLogin ...

  3. EasyGui

    EasyGui 在IDLE上运行EasyGui可能存在冲突 EasyGui是运行在Tkinter上并哟拥有自身的事件循环,而IDLE也是Tkinter写的一个应用程序并页拥有自身的事件循环.两者同时运 ...

  4. spark 中文编码处理

    日志的格式是GBK编码的,而hadoop上的编码是用UTF-8写死的,导致最终输出乱码. 研究了下Java的编码问题. 网上其实对spark输入文件是GBK编码有现成的解决方案,具体代码如下 impo ...

  5. 场景中,并没有灯源的存在,但是cube却会有灯光照射的反应,这就是Light Probe Group的作用。

    http://blog.csdn.net/qq617119142/article/details/41674755

  6. Codeforces 1120C Compress String(DP)

    题意:给你一个字符串,有2种消除方式:1:消除一个单独的字母,代价为a.2:s[j]到s[k]是s[1]到s[j - 1]的子串,那么s[j]到s[k]可以消除,代价为b,问最小的代价. 思路:官方题 ...

  7. php格式化时间戳显示友好的时间

    在项目中时间一律显示为2014-10-20 10:22显得很呆板.在微博.QQ空间等网站通常会显示为几秒前,几分钟前,几小时前等容易阅读的时间,我们称之为友好的时间格式.那么用php怎么实现呢? 大体 ...

  8. WDCP/wdlinux安装php_zip扩展教程

    linux服务器安装wdcp之后,php的路径默认是/www/wdlinux/php,有些网友按照网上的教程安装的时候总出错,原因就是php的路径不对,我们知道了php的路径之后就可以开始安装了> ...

  9. linux下配置eclipse环境

    注明:本文为博主原创文章,转载请注明出处 前期准备 (此文使用的是非安装版jdk1.8,你也可以下载版本更低的,而且建议使用1.6版本,66大顺嘛,嘻嘻) 1.点击下载jdk 2.点击下载eclips ...

  10. 1.ef 映射关系

    1.edmx <?xml version="1.0" encoding="utf-8"?><edmx:Edmx Version="3 ...