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

Codeforces Round #527 (Div. 3)D2(栈,思维)

CodeForces Round #527 (Div3) C. Prefixes and Suffixes

CF #1354 Educational Codeforces Round 87

Codeforces Round #538 (Div. 2) (CF1114)

Codeforces Round #541 (Div. 2) (A~F)