hdu 5834 Magic boy Bi Luo with his excited tree
发布时间:2020-12-14 01:37:20 所属栏目:大数据 来源:网络整理
导读:首先,如果要求的是以1作为开始位置的话,很容易想到一个dp[u][2],其中dp[u][0]表示以u节点为开始位子的子树最后回到u节点获得最大值,dp[u][1]表示不回来。转移就显而易见了。 然后,考虑如果u节点结果已经计算出,怎么计算他的儿子节点v的答案。 那么,也
|
首先,如果要求的是以1作为开始位置的话,很容易想到一个dp[u][2],其中dp[u][0]表示以u节点为开始位子的子树最后回到u节点获得最大值,dp[u][1]表示不回来。转移就显而易见了。 然后,考虑如果u节点结果已经计算出,怎么计算他的儿子节点v的答案。 那么,也容易想到转移ans[v]=max(dp[v][1],dp2[u][!v][0] + dp[v][1] - 2 * c,dp2[u][!v][1] + dp[v][0] - c), 其中dp2[u][!v][0]表示以u为根节点,不遍历以v且回到u的最大值,dp2[u][!v][1]?表示以u为根节点,不遍历以v且不回到u的最大值。其中dp2可以在dp计算出来后,动态的维护一下。 //#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<bitset>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt << 1
#define rson m + 1,r,rt << 1 | 1
using namespace std;
const int maxn = 100100;
LL dp[maxn][2],ans[maxn];
vector<pair<int,int> > G[maxn];
int val[maxn];
void dfs(int u,int fa) {
dp[u][0] = val[u]; dp[u][1] = 0;
for(int i = 0; i < G[u].size(); i ++) {
int v = G[u][i].first,c = G[u][i].second;
if(v == fa) continue;
dfs(v,u);
if(dp[v][0] > c * 2) {
dp[u][0] += dp[v][0] - c * 2;
dp[u][1] = max(dp[v][1] - dp[v][0] + c,dp[u][1]);
}
else dp[u][1] = max(dp[v][1] - c,dp[u][1]);
}
dp[u][1] = dp[u][0] + dp[u][1];
}
void dfs2(int u,int fa,LL dp0,LL dp1) {
LL mx = 0,mx2 = 0,all = val[u];
for(int i = 0; i < G[u].size(); i ++) {
int v = G[u][i].first,c = G[u][i].second;
if(v == fa) {
if(dp0 - 2 * c > 0) {
all += dp0 - 2 * c;
if(dp1 - dp0 + c >= mx) mx2 = mx,mx = dp1 - dp0 + c;
else if(dp1 - dp0 + c > mx2) mx2 = dp1 - dp0 + c;
}
else {
if(dp1 - c >= mx) mx2 = mx,mx = dp1 - c;
else if(dp1 - c > mx2) mx2 = dp1 - c;
}
}
else {
if(dp[v][0] - 2 * c > 0) {
all += dp[v][0] - 2 * c;
if(dp[v][1] - dp[v][0] + c >= mx)
mx2 = mx,mx = dp[v][1] - dp[v][0] + c;
else if(dp[v][1] - dp[v][0] + c > mx2)
mx2 = dp[v][1] - dp[v][0] + c;
}
else {
if(dp[v][1] - c >= mx)
mx2 = mx,mx = dp[v][1] - c;
else if(dp[v][1] - c > mx2)
mx2 = dp[v][1] - c;
}
}
}
for(int i = 0; i < G[u].size(); i ++) {
int v = G[u][i].first,c = G[u][i].second;
if(v == fa) continue;
LL add = all,tmp = dp[v][1] - c;
if(dp[v][0] - 2 * c > 0) {
add -= (dp[v][0] - 2 * c);
tmp = dp[v][1] - dp[v][0] + c;
}
ans[v] = add + dp[v][1] - 2 * c;
ans[v] = max(ans[v],dp[v][1]);
if(tmp == mx) {
ans[v] = max(ans[v],add + mx2 + dp[v][0] - c);
dfs2(v,u,add,add + mx2);
}
else {
ans[v] = max(ans[v],add + mx + dp[v][0] - c);
dfs2(v,add + mx);
}
}
}
int main() {
int T,cas = 1,n;
scanf("%d",&T);
while(T --) {
scanf("%d",&n);
for(int i = 1; i <= n; i ++) {
scanf("%d",&val[i]);
G[i].clear();
}
for(int i = 1; i < n; i ++) {
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
G[u].push_back(MP(v,c));
G[v].push_back(MP(u,c));
}
dfs(1,-1);
ans[1] = dp[1][1];
dfs2(1,-1,0);
printf("Case #%d:n",cas ++);
for(int i = 1; i <= n; i ++)
printf("%I64dn",ans[i]);
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
