题目大意

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

题解

本题主要的困难是如何恰好结束于结点n。

先进行一次dfs求出从结点1到结点n的最短时间s(假设此条路径为a),如果s比T还大,不能走完,输出-1。否则的话继续处理,由于路径a是最短路径,因此肯定会经过此条路径,并且只会经过一次,其他的结点要么不经过,要么经过两次(因此时间花费是边权的两倍),接下来的任务就是在树上做背包了,但是如何使得最终结果一定会选取结点n呢?我们只需要把总时间减去最短时间s,并且把最短路径a上所有的边权全部赋为0,然后再进行动态规划,为什么这样做呢?因为我们选取最短路径上的结点不需要花时间,所以肯定会选啦!方程怎么表示呢?假设当前结点为u,某个子树为v,那么

dp[u][j]=max(dp[u][j],dp[u][j-2*w-k]+dp[v][k] 表示从结点u开始花费j分钟能够获得的最大值,因为边(u,v)需要走两次,所以花费是2*w

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
#define MAXN 105
vector<int>G[MAXN];
int dp[MAXN][MAXN*5],value[MAXN],p[MAXN][MAXN];
int n,T,V;
bool dfs1(int rt,int u,int fa)
{
if(rt==u)
return true;
for(size_t i=0;i<G[u].size();i++)
{
int v=G[u][i];
int w=p[u][v];
if(fa==v) continue;
if(dfs1(rt,v,u))
{
V+=w;
p[u][v]=0;
p[v][u]=0;
return true;
}
}
return false;
}
void dfs2(int u,int fa)
{
for(int i=0;i<=T;i++) dp[u][i]=value[u];
for(size_t i=0;i<G[u].size();i++)
{
int v=G[u][i];
int w=2*p[u][v];
if(v==fa) continue;
dfs2(v,u);
for(int j=T;j>=w;j--)
for(int k=0;k<=j-w;k++)
dp[u][j]=max(dp[u][j],dp[u][j-k-w]+dp[v][k]);
}
}
int main()
{
while(scanf("%d%d",&n,&T)!=EOF)
{
for(int i=0;i<MAXN;i++)
{
G[i].clear();
}
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u].push_back(v);
G[v].push_back(u);
p[u][v]=p[v][u]=w;
}
for(int i=1;i<=n;i++) scanf("%d",&value[i]);
memset(dp,0,sizeof(dp));
V=0;
dfs1(n,1,-1);
if(V>T)
printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");
else
{
T-=V;
dfs2(1,-1);
printf("%d\n",dp[1][T]);
}
}
return 0;
}

HDU4276 - The Ghost Blows Light(树形DP)的更多相关文章

  1. HDOJ 4276 The Ghost Blows Light(树形DP)

    Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The tomb consists of N room ...

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

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

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

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

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

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

  5. 【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 ...

  6. HDU 4276 The Ghost Blows Light

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

  7. BNUOJ 26283 The Ghost Blows Light

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

  8. HDU 4276 The Ghost Blows Light(树形)

    题意:给出一棵n个节点的树,起点1,终点n,相连的两个节点之间有距离,每个节点有个价值,给出一个时间T.问从1到达n在给定时间T内取得的最大价值? 思路:先从1走到n,如果总的时间不够走完,直接退出, ...

  9. 【HDU4276】The Ghost Blows Light

    题目大意:给定一棵有根树,1 号节点为根节点,点有点权,边有边权,初始给定一个价值,每经过一条边都会减少该价值,每经过一个点都会增加相应的答案贡献值,求如何在给定价值的情况下最大化答案贡献,并要求最后 ...

随机推荐

  1. uva 348

    dp还是比较容易  关键是输出路径 .... #include <cstdlib> #include <cstdio> #include <cstring> #de ...

  2. firefly 环境配置所需工具

    原地址:http://www.9miao.com/question-15-59032.html http://down.9miao.com/attachment/forum/201405/19/120 ...

  3. JVM并发机制的探讨——内存模型、内存可见性和指令重排序

    并发本来就是个有意思的问题,尤其是现在又流行这么一句话:“高帅富加机器,穷矮搓搞优化”. 从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多台机器或者多个CP ...

  4. [java]2015上海邀请赛 B Base64

    题意: 给n和一个字符串(可以有空格) 求字符串编码n次后的字符串 编码方式:字符串的每个字符转化成ASCII码, ASCII码转化成8位2进制,    将二进制数分割成6位为一组的(不够的补0), ...

  5. PJSIP在windows(xp或者win7)下的编译,编译工具是vs2008,PJSIP版本2.3

    PJSIP是一个开源的SIP协议库,它实现了SIP.SDP.RTP.STUN.TURN和ICE.PJSIP作为基于SIP的一个多媒体通信框架提供了非常清晰的API,以及NAT穿越的功能.PJSIP具有 ...

  6. dp和px,那些不得不吐槽的故事——Android平台图

    http://blog.sina.com.cn/s/blog_6499f8f101014ipq.html 一个优秀的手机软件,不仅要有精巧的功能,流畅的速度,让人赏心悦目的UI也往往是用户选择的重要理 ...

  7. mysqld -install命令时出现install/remove of the service denied错误的原因和解决办法

    原因:没有使用管理员权限 解决方法:使用管理员权限打开cmd,然后运行mysqld -install,服务安装成功

  8. 比较const ,readonly, stitac readonly

    比较const ,readonly, stitac readonly: const和readonly的值一旦初始化则都不再可以改写: const必须在声明时初始化:readonly既可以在声明时初始化 ...

  9. RMAN 备份与恢复深入解析(二)

    RMAN 备份与恢复深入解析(一)  http://space.itpub.net/26686207/viewspace-760869 更多精彩内容尽在 www.leonarding.com < ...

  10. 【转】C,C++中使用可变参数

    可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是 int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处 ...