博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 6201 【树形dp||SPFA最长路】
阅读量:5736 次
发布时间:2019-06-18

本文共 1296 字,大约阅读时间需要 4 分钟。

  n个城市都在卖一种书,该书的价格在i城市为cost[i],商人打算从某个城市出发到另一个城市结束,途中可以在任意城市买书或者卖书,但一次只能买一本和卖一本,一个城市到另一个城市需要花费。问商人最大收益是多少。

 

方法一(树形dp):

  设dp[u][0]表示在以u为根的树中卖一本书获得的最大价值,dp[u][1]表示在以u为根的树中买一本书获得的最大价值。那么在以u为根的子树中能获得的最大价值为max(dp[u][0])+max(dp[u][1]).

  

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int MAXN = 1e5 + 100; 8 typedef pair
P; 9 vector

G[MAXN];10 int dp[MAXN][2], ans;11 int cost[MAXN];12 13 void dfs(int u,int pre)14 {15 dp[u][0] = cost[u];16 dp[u][1] = -cost[u];17 for (int i = 0; i < G[u].size(); i++)18 {19 int v = G[u][i].first, w = G[u][i].second;20 if (v == pre) continue;21 dfs(v, u);22 dp[u][0] = max(dp[u][0], dp[v][0] - w);23 dp[u][1] = max(dp[u][1], dp[v][1] - w);24 }25 ans = max(ans, dp[u][0] + dp[u][1]);26 }27 28 int main()29 {30 int T, n,u, v, w;31 scanf("%d", &T);32 while (T--)33 {34 scanf("%d", &n);35 for (int i = 1; i <= n; i++) {36 G[i].clear();37 scanf("%d", &cost[i]);38 }39 for (int i = 1; i < n; i++) {40 scanf("%d%d%d", &u, &v, &w);41 G[u].push_back(P(v, w));42 G[v].push_back(P(u, w));43 }44 ans = 0;45 dfs(1,-1);46 printf("%d\n", ans);47 }48 return 0;49 }

 

 

 

转载于:https://www.cnblogs.com/zxhyxiao/p/7530550.html

你可能感兴趣的文章
Git 方法
查看>>
[Python] numpy.nonzero
查看>>
2016-11-29
查看>>
C#反射的坑
查看>>
css3 box-shadow阴影(外阴影与外发光)讲解
查看>>
时间助理 时之助
查看>>
nginx快速安装
查看>>
自定义转场动画
查看>>
英国征召前黑客组建“网络兵团”
查看>>
Silverlight 2.5D RPG游戏“.NET技术”技巧与特效处理:(十二)魔法系统
查看>>
[NPM] Run npm scripts in series
查看>>
vs2013修改书签(vs书签文件位置)
查看>>
C语言学习笔记
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
PS 如何使用液化工具给人物减肥
查看>>
cvc-complex-type.2.4.c: The matching wildcard...
查看>>
android 读取json数据(遍历JSONObject和JSONArray)
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
<JavaScript语言精粹>-读书笔记(一)
查看>>
NPM教程
查看>>