zoukankan      html  css  js  c++  java
  • 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);
    }
    

      

  • 相关阅读:
    企业级 SpringBoot 教程 (九)springboot整合Redis
    03 网格系统
    02 表单
    01 排版
    客户端调用webSerices
    sql 一行转多行
    sql 多行转一行
    时间差计算 Stopwatch
    sql 游标
    Linq连接查询
  • 原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10151571.html
Copyright © 2011-2022 走看看