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: 131072/131072 K (Java/Others)
Total Submission(s): 1058 Accepted Submission(s): 308
You may attention that every V[i] can be taken only once, but for some C[i] , you may cost severial times.
Now, Bi Luo define ans[i] as the most value can Bi Luo gets if Bi Luo starts at node i.
Bi Luo is also an excited boy, now he wants to know every ans[i], can you help him?
Four each test:
The first line contain an integer N(N≤105).
The next line contains N integers V[i], which means the treasure’s value of node i(1≤V[i]≤104).
For the next N−1 lines, each contains three integers u,v,c , which means node u and node v are connected by an edge, it's cost is c(1≤c≤104).
You can assume that the sum of N will not exceed 106.
5
4 1 7 7 7
1 2 6
1 3 1
2 4 8
3 5 2
15
10
14
9
15
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
#define CT continue
#define SC scanf
const int N=1e5+10;
int val[N],dp[N][6],ans[N];
struct edge{
int v,c;
};
vector<edge> G[N]; void dfs1(int u,int f)
{
dp[u][1]=dp[u][0]=val[u];
for(int i=0;i<G[u].size();i++){
int v=G[u][i].v,c=G[u][i].c;
if(v==f) CT;
dfs1(v,u);
int cur=dp[u][0]-c+dp[v][1],
ano1=dp[u][1]+max(dp[v][0]-2*c,0),
ano2=dp[u][2]+max(dp[v][0]-2*c,0);
if(cur>ano1){
dp[u][4]=v;
dp[u][1]=cur;
dp[u][2]=ano1;
}
else if(cur>ano2) {
dp[u][1]=ano1;
dp[u][2]=cur;
}
else{
dp[u][1]=ano1;
dp[u][2]=ano2;
}
dp[u][0]+=max(0,dp[v][0]-2*c);
}
} void dfs2(int u,int f,int fback,int fnback)
{
ans[u]=max(dp[u][0]+fnback,dp[u][1]+fback);
for(int i=0;i<G[u].size();i++){
int v=G[u][i].v,c=G[u][i].c;
if(v==f) CT;
int uback=fback+dp[u][0]-max(0,dp[v][0]-2*c)-2*c,unback;
if(v==dp[u][4]){
unback=max(dp[u][0]-max(0,dp[v][0]-2*c)+fnback,
fback+dp[u][2]-max(0,dp[v][0]-2*c))-c;
}
else{
unback=max(fnback+dp[u][0]-max(0,dp[v][0]-2*c),
fback+dp[u][1]-max(0,dp[v][0]-2*c))-c;
}
dfs2(v,u,max(0,uback),max(0,unback));
}
} int main()
{
int cas,kk=0;
SC("%d",&cas);
while(cas--){
int n;SC("%d",&n);
MM(dp,0);
for(int i=1;i<=n;i++){
SC("%d",&val[i]);
G[i].clear();
}
for(int i=1;i<=n-1;i++){
int u,v,c;
SC("%d%d%d",&u,&v,&c);
G[u].push_back((edge){v,c});
G[v].push_back((edge){u,c});
}
dfs1(1,-1);
dfs2(1,-1,0,0);
printf("Case #%d:\n",++kk);
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}
return 0;
}
最新文章
- HTML5 的一些小的整理吧
- jquery Ajax的load、post、get、put、delete的用法
- 解决Linux性能问题的前60秒
- 基于HTML5实现的Heatmap热图3D应用
- View (二) 自定义属性
- 图像边缘检测——Sobel算子
- verilog实现的16位CPU单周期设计
- 在Hadoop伪分布式模式下安装Hbase
- Sequence Assignments FRM-41830: List of Value contains no entries.
- MFC的消息机制
- EpPlus读取生成Excel帮助类+读取csv帮助类+Aspose.Cells生成Excel帮助类
- cocoapods管理以及常遇到的问题
- 圆方树简介(UOJ30:CF Round #278 Tourists)
- TensorFlow 常用函数与方法
- Educational Codeforces Round 53 (Rated for Div. 2)
- protobuf 编译安装
- Nginx的安装和使用(Linux)
- UCOS时钟节拍的讲究
- java并发编程实战:第十一章----性能和可伸缩性
- IO流实现模拟软件试用的功能