题目大意:

给定一棵树 每个点都有点权 每条边的长度都为1

树上一点到另一点的距离为最短路经过的边的长度总和

树上一点到另一点的花费为距离乘另一点的点权

选定一点出发 使得其他点到该点的花费总和是最大的

先dfs一遍 获得 s[u] 为u点往下的点权总和(包括u点)

由其子节点v及其本身权值可得 s[u]=s[v]+w[u]

获得 dp[u] 为u点出发往下的花费总和(u点出发的花费不需要包括u点)

由其子节点v的dp[v]及s[v]可得 dp[u]=dp[v]+s[v]

再深搜一遍树形dp 获得 dp[u] 为u点出发到其他所有点的花费总和

此时 fa=1 u=5

dp[fa]=dp[9]=1*(7+10+4)+2*(1+6+5+1)=(1+6+5)*2+(7+4+10)*1+1*2

dp[u]=dp[5]=1*(1+6+5+9)+2*(7+4)+3*1=(1+6+5)*1+9*1+(7+4)*2+1*3

发现由fa的结果得到u的结果需要 加上u往上的值 再减去u往下(包括u)的值

相当于 加上整棵树的值sum 再减两次u往下的值s[u] 即dp[u] = dp[fa] + sum - 2*s[u]

dp[fa]+sum-2*s[u] =(1+6+5)*2+(7+4+10)*1+1*2 + (1+6+5+7+4+10+9+1) - 2*(10+1+6+5)

        =(1+6+5)*3+(7+4+10)*2+1*3+9 - 2*(10+1+6+5)

        =(1+6+5)*1+(7+4)*2+1*3+9*1 = dp[u]

#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+;
LL n, w[N];
LL ans, sum;
LL s[N], dp[N];
// s[u]为u点往下的点的权值总和
vector <int> E[N]; void dfs2(int u,int fa) {
if(fa) dp[u]=dp[fa]+sum-*s[u];
// 如果u存在父节点 由dp[fa]可得到dp[u]
// 此时dp[u]为由u点出发去往其他所有点的总花费
for(int i=;i<E[u].size();i++) {
int v=E[u][i];
if(v==fa) continue;
dfs2(v,u);
}
ans=max(ans,dp[u]);
}
void dfs1(int u,int fa) {
s[u]=w[u];
for(int i=;i<E[u].size();i++) {
int v=E[u][i];
if(v==fa) continue;
dfs1(v,u);
s[u]+=s[v];
dp[u]=dp[u]+dp[v]+s[v];
// 此时dp[u]为由u点出发往下的总花费
}
} int main()
{
while(~scanf("%I64d",&n)) {
ans=sum=0LL;
for(int i=;i<=n;i++) {
scanf("%I64d",&w[i]);
sum+=w[i]; E[i].clear();
}
for(int i=;i<n;i++) {
int u,v; scanf("%d%d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
}
memset(s,,sizeof(s));
memset(dp,,sizeof(dp));
dfs1(,); dfs2(,);
printf("%I64d\n",ans);
} return ;
}

Codeforces Round #527 F - Tree with Maximum Cost /// 树形DP的更多相关文章

  1. CF F - Tree with Maximum Cost (树形DP)给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大。输出最大的值。

    题目意思: 给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大.输出最大的值. ...

  2. Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】

    传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 sec ...

  3. Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 dp排序

    B. Maximum Submatrix 2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  4. CodeCraft-19 and Codeforces Round #537 (Div. 2) E 虚树 + 树形dp(新坑)

    https://codeforces.com/contest/1111/problem/E 题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点 ...

  5. Codeforces Round #527 (Div. 3) . F Tree with Maximum Cost

    题目链接 题意:给你一棵树,让你找一个顶点iii,使得这个点的∑dis(i,j)∗a[j]\sum dis(i,j)*a[j]∑dis(i,j)∗a[j]最大.dis(i,j)dis(i,j)dis( ...

  6. Codeforces 1092 F Tree with Maximum Cost (换根 + dfs)

    题意: 给你一棵无根树,每个节点有个权值$a_i$,指定一个点u,定义$\displaystyle value = \sum^v a_i*dist(u,v)$,求value的最大值 n,ai<= ...

  7. Educational Codeforces Round 58 (Rated for Div. 2) D 树形dp + 数学

    https://codeforces.com/contest/1101/problem/D 题意 一颗n个点的树,找出一条gcd>1的最长链,输出长度 题解 容易想到从自底向长转移 因为只需要g ...

  8. Codeforces Round #302 (Div. 1) D - Road Improvement 树形dp

    D - Road Improvemen 思路:0没有逆元!!!! 不能直接除,要求前缀积和后缀积!!! #include<bits/stdc++.h> #define LL long lo ...

  9. Codeforces Round #527 (Div. 3) ABCDEF题解

    Codeforces Round #527 (Div. 3) 题解 题目总链接:https://codeforces.com/contest/1092 A. Uniform String 题意: 输入 ...

随机推荐

  1. [已解决]报错: No module named pip

    cmd中敲命令: python -m ensurepip 更新升级pip命令: python -m pip install --upgrade pip

  2. ssh文件 ip锁定

    vi ~/.ssh/config Host web*hostname 115.29.242.1**user lian Host **hostname 192.168.1.**user dface

  3. Arcpy里莫名其妙的字段类型(Field type)

    对比6个常用的字段数据类型在Arcpy字段创建与字段属性输出时奇怪的事情: 添加字段使用arcpy.AddField_management: # addfield 的 type参数 # 浮点型,Flo ...

  4. Java中的session详解

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  5. JUnit中Assert简单介绍

    junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类.1.assertTrue/False([String message,]boolean condi ...

  6. 不用 PS 和 AI,5个网站能做出更好看的设计

    要完成漂亮的设计,一定要掌握 PS.AI.Sketch 等专业的做图工具才可以.其实,现在有很多网站可以帮助不会专业设计工具的我们,做出很多很漂亮的设计,完成自己的设计需求.今天,我们就来介绍一下这些 ...

  7. LeetCode Array Easy 122. Best Time to Buy and Sell Stock II

    Description Say you have an array for which the ith element is the price of a given stock on day i. ...

  8. MyBatis使用注解方式实现CRUD操作

    一.使用注解后就不需要写SysGroupDaoMapper.xml 只需要在Dao的抽象方法前加上相应的注解就可以. package cn.mg39.ssm01.dao; import java.ut ...

  9. 在阅读众多的blog中,我学到了什么

    写博客的人,自然会读别人的博客:读博客的人,不一定会写博客.但是这两种人之间的差别是很大的 在最近在一段时间,发现了一个好的博客,通过该博客的友链,发现了新大陆.... 从Jeff Wong开始,到老 ...

  10. 说一下HTML5与传统HTML的区别

    1.首先说一下什么是HTML5 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HT ...