题意:给出一棵无向树,从1走到n,总时间为T,每走一条边需要花费一定时间,每个结点有一定权值,问在指定时间内到达n点能获取的最大权值。

由于已经到过的点能再次返回(虽然不能再次获得该点权值),情况数倍增.....普通搜索必然爆

参考神方法:先用某种方法跑出1到n的最短路径,如果时间限定之内,继续,因为最短路上的边只会走一遍才是最优的,多走就是多余的,将最短路的边的时间变为0,总时间减去最短路时间。把最短路当做根,现在其他的路径就是分支了,分支有走两边或者不走两种情况.....就是树形DP了

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
# define MAX 222
# define INF 0x7FFFFFFF
using namespace std;struct node {int s,e,v,next;
} ed[MAX];
int head[MAX],num = 0,n,m,tim,flag,timee;
int dp[MAX][5555],va[MAX]; // dp[i][j] 表示回到i点时使用了j的时间能获得的最多的权值void add(int s,int e,int v) {ed[num].s = s;ed[num].e = e;ed[num].v = v;ed[num].next = head[s];head[s] = num++;
}void init() {memset(head,-1,sizeof(head));num = 0;flag = 0;timee = 0;
}int dfstime(int v0,int pre) {if(v0 == n) return 1;for(int i=head[v0];i != -1; i =ed[i].next) {int e = ed[i].e ;if(e != pre) {if(dfstime(e,v0)) {timee += ed[i].v;ed[i].v = 0;return 1;}}}return 0;
}void dfs(int v0,int pre) {for(int i=0; i<=tim; i++) dp[v0][i] = va[v0];for(int i=head[v0];i != -1; i = ed[i].next) {int e = ed[i].e ;if(e != pre) {dfs(e,v0);int cost = ed[i].v * 2;for(int j=tim; j>=cost; j--) {for(int k=0; k<=j -cost; k++) {dp[v0][j] = max(dp[v0][j],dp[e][k] + dp[v0][j-k-cost]);}}}}
}int main() {int i,a,b,c;while(cin >> n >> tim) {init();for(i=0; i<n-1; i++) {scanf("%d%d%d",&a,&b,&c);add(a,b,c);add(b,a,c);}for(i=1; i<=n; i++) {scanf("%d",&va[i]);}dfstime(1,-1);if(tim < timee) {printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");continue;}tim -= timee ;//最短路上的花费已经为0dfs(1,-1);printf("%d\n",dp[1][tim]);}return 0;
}

HDU 4276 The Ghost Blows Light(树形DP)相关推荐

  1. HDU 4276 The Ghost Blows Light 最短路+树形背包

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4276 目录 题意 分析 Code 题意 有一棵树,每个节点都有财富wi,每条边都会花费ci的时间,问你 ...

  2. hdu 4276 The Ghost Blows Light(树型DP)

    题意:给出一棵树,走过每条边都要花费时间,每个点有一定价值的物品.求在给定时间内能不能从1走到n,如果能,最多可以带走多少价值的物品. 思路:首先对树进行一遍搜索,看能不能从1走到n,如果不能直接输出 ...

  3. hdu 1561 The more, The Better 树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 做树形dp比较小. 先上网学习下,总结下套路. dp[i][j]表示在第i个节点,有j个名额选的时候的最大 ...

  4. HDU - 6769-In Search of Gold-二分+树形dp

    https://vjudge.net/problem/HDU-6769 题目大意:给你n个点,有n-1条边,每条边有a,b两个权值,给你一个k,恰好有k条边的权值取a,其余取b的时候,树的直径的最小值 ...

  5. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  6. 【HDU - 1520】Anniversary party (树形dp)

    题干: There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. Th ...

  7. hdu 4799 LIKE vs CANDLE(树形dp)

    题目链接:hdu 4799 LIKE vs CANDLE 解题思路 dp[i][0]表示第i个节点不翻转的最优解,dp[i][1]表示翻转的最优解,每个位置翻转的代价到其父亲节点的位置再计算. 代码 ...

  8. 【HDU4276】The Ghost Blows Light

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

  9. HDU 4123 Bob’s Race(树形DP+RMQ)

     题目大意:给定一棵树,每一个点都从当前位置走到距离最远的位置,1~n的连续区间中最大并且走的最远距离差值不超过Q的区间右多大. 思路:首先求出每个点能到达的最远距离,这一步有两种做法: 第一种做 ...

最新文章

  1. 清华教授穿红色短裤火“出圈”,网友:哈哈哈哈太真实了
  2. Microbiome:中科院微生物所蔡磊组揭示病害影响植物微生物组群落构建与功能适应...
  3. linux 下jdk的卸载与安装
  4. 脑电分析系列[MNE-Python-15]| Epochs数据可视化
  5. 手把手Tinyxml入门,C++ VS2010
  6. Hadoop MapReduce程序的模板框架
  7. 运维基础(3)备份篇
  8. html5判断text文本是数字,JavaScript常用判断写法大全
  9. C语言:gcc编译过程及make命令、makefile语法规则
  10. Vue.js-Day04-AM【父子组件通信(父传子、子传父)、动态组件、组件的生命周期、动画】
  11. 第19次csp认证 202006-2 稀疏向量(C++)
  12. 电够动力足——认识主板上的CPU供电模块
  13. 最全CacheCloud最完整安装使用文档【实操系列】
  14. 关于Iphone的手势识别
  15. English--consonant_爆破音
  16. Ubuntu 更换阿里云软件源
  17. H5 +蓝牙打印机 CPCL和ESC
  18. [FirefoxOS_开发]Firefox OS Quick Start
  19. 手机赚钱靠谱的方法,小编分享三个赚钱项目给你!
  20. 计算机无法识别苹果手机,如何解决电脑无法识别iphone的问题?

热门文章

  1. Solidity中Storage
  2. 机器学习-46-ML-02-Gradient Descent as LSTM(元学习-用LSTM做Gradient Descen)
  3. linuxcnc 源码解读01
  4. vsCode的git提交上传使用
  5. 行测-判断推理-类比推理-语义关系-近义关系、反义关系
  6. 什么是事务?事务有什么特性?分别是什么?
  7. HDU 6127 Hard challenge
  8. 【GD32F427开发板试用】从0开始到RTthread移植
  9. 特征工程相关面试题以及参考答案
  10. 互联网时代的【三国演义】