// 树形DP CCPC网络赛  HDU5834 Magic boy Bi Luo with his excited tree
// 题意:n个点的树,每个节点有权值为正,只能用一次,每条边有负权,可以走多次,问从每个点出发的最大获益
// 思路:
// dp[i]: 从i点出发回到i点的最大值
// d[i][0] 从i点出发不回来的最大值
// d[i][1] 从i点出发取最大值的下一个点
// d[i][2] 从i点出发取次大值
// dfs1处理出这四个
// 然后,从1开始转移,分别DP求子节点从父亲转移过来的最大值,和从父亲出去不回来的最大值 #include <bits/stdc++.h>
using namespace std;
#define LL long long
const double inf = 123456789012345.0;
const LL MOD =100000000LL;
const int N =1e5+;;
#define clc(a,b) memset(a,b,sizeof(a))
const double eps = 1e-;
void fre() {freopen("in.txt","r",stdin);}
void freout() {freopen("out.txt","w",stdout);}
inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-; ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;} vector<pair<int,int> > g[N];
int a[N],ans[N];
int dp[N],d[N][];
void dfs1(int u,int f){
dp[u]=a[u];
for(int i=;i<(int)g[u].size();i++){
int v=g[u][i].first;
int val=g[u][i].second;
if(v==f) continue;
dfs1(v,u);
dp[u]+=max(,dp[v]-*val);
}
d[u][]=d[u][]=a[u];
d[u][]=-;
for(int i=;i<(int)g[u].size();i++){
int v=g[u][i].first;
int val=g[u][i].second;
if(v==f) continue;
int tem=dp[u]-max(,dp[v]-*val)+max(,d[v][]-val);//当前选择路径不回来的最大值
if(tem>d[u][]){
d[u][]=d[u][];
d[u][]=tem;
d[u][]=i;
}
else if(tem>d[u][]){
d[u][]=tem;
}
}
} //no从父亲不回来的最大值,yes从父亲回来的最大值
void dfs2(int u,int f,int no,int yes){
ans[u]=max(dp[u]+no,yes+d[u][]);
for(int i=;i<(int)g[u].size();i++){
int v=g[u][i].first;
int val=g[u][i].second;
if(v==f) continue;
int tem1,tem2;
if(i==d[u][]) tem1=max(,d[u][]-max(,dp[v]-*val));//从父亲出去但不是最优方案的最大值
else tem1=max(,d[u][]-max(,dp[v]-*val));
tem2=max(,dp[u]-max(,dp[v]-*val));//从父亲出去又回来的最大值
tem1=max(,max(tem1+yes-val,tem2+no-val));//儿子节点从父亲转移过来的是 max(父亲儿子节点出去不回来+父亲的父亲出去回来的最大值,父亲儿子节点出去回来+父亲的父亲出去不回来的最大值)
tem2=max(,yes+tem2-*val);
dfs2(v,u,tem1,tem2);
}
} int main(){
int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++) g[i].clear();
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<n;i++){
int u,v,x;
scanf("%d%d%d",&u,&v,&x);
g[u].push_back(make_pair(v,x));
g[v].push_back(make_pair(u,x));
}
dfs1(,-);
dfs2(,-,,);
printf("Case #%d:\n",cas);
for(int i=;i<=n;i++) printf("%d\n",ans[i]);
}
return ;
}

树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree的更多相关文章

  1. 动态规划(树形DP):HDU 5834 Magic boy Bi Luo with his excited tree

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8UAAAJbCAIAAABCS6G8AAAgAElEQVR4nOy9fXQcxZ0uXH/hc8i5N+

  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. 2016中国大学生程序设计竞赛 - 网络选拔赛 C. Magic boy Bi Luo with his excited tree

    Magic boy Bi Luo with his excited tree Problem Description Bi Luo is a magic boy, he also has a migi ...

  4. HDU5834 Magic boy Bi Luo with his excited tree(树形DP)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5834 Description Bi Luo is a magic boy, he also ...

  5. hdu5834 Magic boy Bi Luo with his excited tree 【树形dp】

    题目链接 hdu5834 题解 思路很粗犷,实现很难受 设\(f[i][0|1]\)表示向子树走回来或不回来的最大收益 设\(g[i][0|1]\)表示向父亲走走回来或不回来的最大收益 再设\(h[i ...

  6. HDU5834 Magic boy Bi Luo with his excited tree (树形DP)

    题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...

  7. 【树形动规】HDU 5834 Magic boy Bi Luo with his excited tree

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 题目大意: 一棵N个点的有根树,每个节点有价值ci,每条树边有费用di,节点的值只能取一次,边 ...

  8. 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: 13107 ...

  9. HDU 5834 Magic boy Bi Luo with his excited tree(树形dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=5834 题意: 一棵树上每个节点有一个价值$Vi$,每个节点只能获得一次,每走一次一条边要花费$Ci$,问从各个节 ...

随机推荐

  1. Intellij IDEA调试功能

    public class Demo { public static void f1() { System.out.println("one"); System.out.printl ...

  2. QQ在线图标 离线 QQ开通在线QQ服务 QQ陌生人直接聊天

           如图  永远都显示离线,即使QQ在线也显示离线的原因和解决方法   1:打开 这个页面  提示你开通  你就点击一下开通  这样头像就可以正常显示 离线 和在线了 http://wp.q ...

  3. POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)

    题意 有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚且能与所有人不发生 ...

  4. 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!

    本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...

  5. Unit testing Cmockery 简单使用

    /********************************************************************** * Unit testing Cmockery 简单使用 ...

  6. 关于web安全

    从技术到安全, 这是一个趋势. 以前追求的是比较炫酷的技术, 等实现过后发现, 自己还能做什么. 炫技完了之后,差不多就该到悟道的时候了. 用户安全, 就是一个很大的禅. 苹果拒绝 FBI, goog ...

  7. javascript中常用数组函数

    1.split方法——通过分隔符,将字符串分割,导出字符数组 常用于:分割IP地址,分割文件路径(上传文件时)等等 <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  8. android学习—— context 和 getApplicationContext()

    一直看到好多应用里面,随手使用getApplicationContext(),不想说也不乐意说,今天转载一篇文章区分两者的区别: 在android中常常会遇到与context有关的内容 浅论一下con ...

  9. Redis,Memcache,mongoDB的区别

    从以下几个维度,对redis.memcache.mongoDB 做了对比,欢迎拍砖 1.性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mo ...

  10. How to easily create popup menu for DevExpress treelist z

    http://www.itjungles.com/how-to-easily-create-popup-menu-for-devexpress-treelist.html Adding popup m ...