cf codeforces round#527F. Tree with Maximum Cost树形dp
Posted lishengkangshidatiancai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf codeforces round#527F. Tree with Maximum Cost树形dp相关的知识,希望对你有一定的参考价值。
这道题换根时候要计算对答案的影响,就是减去to节点的子树和sum,加上from节点的子树和sum(这里假设to和sum都是一棵树的根,这棵树没有其他部分
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n; ll a[200010]; ll sum[200010]; ll ans,res; vector<int> vec[200010]; void dfs1(int v,int p,int h) { sum[v]=a[v]; res+=a[v]*h; for(int i=0;i<vec[v].size();i++) { int to=vec[v][i]; if(to==p) continue; dfs1(to,v,h+1); sum[v]+=sum[to]; } } void dfs2(int v,int p) { ans=max(ans,res); for(int i=0;i<vec[v].size();i++) { int to=vec[v][i]; if(to==p) continue; res-=sum[to]; sum[v]-=sum[to]; res+=sum[v]; sum[to]+=sum[v]; dfs2(to,v); sum[to]-=sum[v]; res-=sum[v]; sum[v]+=sum[to]; res+=sum[to]; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } for(int i=1;i<=n-1;i++) { int u,v; scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } dfs1(1,-1,0); dfs2(1,-1); printf("%lld ",ans); }
)
以上是关于cf codeforces round#527F. Tree with Maximum Cost树形dp的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #527 (Div. 3)D2(栈,思维)
CodeForces Round #527 (Div3) C. Prefixes and Suffixes
CF #1354 Educational Codeforces Round 87