题目大意:给定一棵有根树,1 号节点为根节点,点有点权,边有边权,初始给定一个价值,每经过一条边都会减少该价值,每经过一个点都会增加相应的答案贡献值,求如何在给定价值的情况下最大化答案贡献,并要求最后在 N 号节点停留,若无法停留,则输出相应字符串。

题解:

首先,不考虑要求在 N 号节点停留的限制,发现就是一个裸的树上背包问题。但是现在多了一个限制条件,我们假设一定可以从根节点走到 N 号节点。

引理:最有情况下,从根节点到 N 号节点的树链中的每一条边经过且仅经过一次。

证明:若先经过树链上的边 e ,再通过 e 返回,再经过其他非树链边之后,再次返回 e,得到的一条路径 P。构造一条路径 P‘,使得在未经过 e 时,先经过 P’ 中的对应非树边,再经过 e ,得到路径 P。发现 P 总是比 P‘ 小 2e 的代价,证毕。

根据引理,又根据从 1 到 N 的路径必须经过的性质,采用将这条树链压缩成一个点,即:将这条路径上的点压缩成一个点,再在新的树上进行树形dp操作,得到的最优解即是全局最优解。对于压缩路径的等价操作是:记录这条必经树链的每条边,将边权全部置为 0 即可。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
const int maxt=505; int n,t,a[maxn];
struct node{int nxt,to,w;}e[maxn<<1];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w){
e[++tot]=node{head[from],to,w},head[from]=tot;
}
int d[maxn],pre[maxn],f[maxn][maxt]; void dfs(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w*2;
if(v==fa)continue;
dfs(v,u);
for(int j=t;j>=0;j--)
for(int k=0;k<=j-w;k++)
f[u][j]=max(f[u][j],f[u][j-k-w]+f[v][k]);
}
for(int j=0;j<=t;j++)f[u][j]+=a[u];
}
void getdis(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(v==fa)continue;
pre[v]=i,d[v]=d[u]+w;
getdis(v,u);
}
}
void clear(){
int now=n;
while(now!=1){
int id=pre[now];
e[id].w=e[id^1].w=0;
now=e[id^1].to;
}
}
void read_and_parse(){
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z),add_edge(y,x,z);
}
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
}
void solve(){
getdis(1,0);
if(d[n]>t)return (void)puts("Human beings die in pursuit of wealth, and birds die in pursuit of food!");
clear();
t-=d[n];
dfs(1,0);
printf("%d\n",f[1][t]);
}
void init(){
memset(head,0,sizeof(head)),tot=1;
memset(pre,0,sizeof(pre));
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
}
int main(){
while(scanf("%d%d",&n,&t)!=EOF){
init();
read_and_parse();
solve();
}
return 0;
}

【HDU4276】The Ghost Blows Light的更多相关文章

  1. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  2. HDU 4276 The Ghost Blows Light

    K - The Ghost Blows Light Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  3. BNUOJ 26283 The Ghost Blows Light

    The Ghost Blows Light Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...

  4. HDU4276 The Ghost Blows Light(树形DP+背包)

    题目大概说一棵n个结点树,每个结点都有宝藏,走过每条边要花一定的时间,现在要在t时间内从结点1出发走到结点n,问能获得最多的宝藏是多少. 放了几天的题,今天拿出来集中精力去想,还是想出来了. 首先,树 ...

  5. 树形DP(01组合背包The Ghost Blows Light HDU4276)

    题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...

  6. HDU-4276 The Ghost Blows Light (树形DP+背包)

    题目大意:在一个n个节点的树形迷宫中,1为起点,n为出口.每个节点上有一定价值的珠宝,在节点之间移动的时间已知,问在能走出迷宫的前提下并且不超过m的时间内能收集的最多珠宝是多少? 题目分析:在树上,从 ...

  7. HDU4276 The Ghost Blows Light SPFA&&树dp

    题目的介绍以及思路完全参考了下面的博客:http://blog.csdn.net/acm_cxlove/article/details/7964739 做这道题主要是为了加强自己对SPFA的代码的训练 ...

  8. HDU4276 - The Ghost Blows Light(树形DP)

    题目大意 给定一棵n个结点的树,每个结点上有一定数量的treasure,经过每条边需要花一定的时间,要求你从结点1出发,在不超过时间T的情况下,最多能够获得的treasure是多少,并且要求结束于结点 ...

  9. HDU 4276-The Ghost Blows Light(树状背包)

    题意: n个房间,每个有一定的钱,一个房间到另一个房间花费一定的时间,给你房间连接树,求在t时间内到达房间m能得到的最大钱数(从房间1(根)出发) 分析: 该题关键是最后要到达m,没有这个条件,就是基 ...

随机推荐

  1. $q服务——angular

    $q是做为angular的一个服务而存在的,只是对promise异步编程模式的一个简化实现版,源码中剔除注释实现代码也就二百多行,下面开始介绍$q的API. 一.defer对象(延迟对象)可以通$q. ...

  2. Pytorch笔记 (1) 初始神经网络

    一.人工神经元 上方人工神经元中: 输入 * 权重 ——>  相当于 人神经元中  树突的功能 各输入 相加 ,再做非线性变化f ——>  相当于胞体的功能 将非线性变化的结果输出 ——& ...

  3. pip提示ModuleNotFoundError: No module named 'pkg_resources'

    卸载setuptools后,pip下载python包一直提示ModuleNotFoundError: No module named 'pkg_resources',如下图: 在网上找了很多贴了都无法 ...

  4. 【miscellaneous】北斗短报文

    北斗系统最大的特色在于有源定位和短报文特色服务,不止解决了中国有无卫星导航系统的问题,还能将短信和导航结合,是中国北斗卫星导航系统的独特发明,也是一大优势. 北斗的短报文功能,在国防.民生和应急救援等 ...

  5. dos2unix Linux解决编写脚本出现“%0D

    ## Linux解决编写脚本出现“%0D”# 安装# yum install -y dos2unix# 然后进行转化一下脚本,将其中的install_mysql.sh换成你的脚本# dos2unix ...

  6. (转).net中的session与cookies区别及使用方法

    cookie数据存放在客户的浏览器上,session数据放在服务器上,cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session   先介绍一 ...

  7. java 不可变对象 final Collections guava 简单样例

    本地环境 jdk1.8 连接 Google Guava官方教程(中文版) journaldev 说明 java的final关键字大家都了解,但是final修饰的如果是引用类型,那么不可修改的其实只是重 ...

  8. eclipse 逆向生成hbm配置文件及pojo

    1.eclipse配置hibernate环境 由于在公司中不能在线安装jboss Tools,只能简单介绍手动安装 在jboss官网下载对应自己eclipse的压缩包. 在eclipse 中选择Hel ...

  9. 小白学习django第二站-模版配置

    上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...

  10. MUI沉浸式代码

    var ben_immer = (function() { var immersed = 0; var ms = (/Html5Plus\/.+\s\(.*(Immersed\/(\d+\.?\d*) ...