Tree with Maximum Cost---CF1092F 树上DP

2023-11-02

								F. Tree with Maximum Cost
								time limit per test2 seconds
								memory limit per test256 megabytes
								inputstandard input
								outputstandard output

You are given a tree consisting exactly of n vertices. Tree is a connected undirected graph with n−1 edges. Each vertex v of this tree has a value av assigned to it.

Let dist(x,y) be the distance between the vertices x and y. The distance between the vertices is the number of edges on the simple path between them.

Let’s define the cost of the tree as the following value: firstly, let’s fix some vertex of the tree. Let it be v. Then the cost of the tree is ∑ i = 1 n \sum_{i=1}^n i=1ndist(i,v)⋅ai

Your task is to calculate the maximum possible cost of the tree if you can choose v arbitrarily.

Input
The first line contains one integer n, the number of vertices in the tree (1≤n≤2⋅105).

The second line of the input contains n integers a1,a2,…,an (1≤ai≤2⋅105), where ai is the value of the vertex i.

Each of the next n−1 lines describes an edge of the tree. Edge i is denoted by two integers ui and vi, the labels of vertices it connects (1≤ui,vi≤n, ui≠vi).

It is guaranteed that the given edges form a tree.

Output
Print one integer — the maximum possible cost of the tree if you can choose any vertex as v.

Examples
input 1

8
9 4 1 7 10 1 6 5
1 2
2 3
1 4
1 5
5 6
5 7
5 8

output 1

121

input 2

1
1337

output 2

0

Note
Picture corresponding to the first example:
图片来自于Codeforces

You can choose the vertex 3 as a root, then the answer will be 2⋅9+1⋅4+0⋅1+3⋅7+3⋅10+4⋅1+4⋅6+4⋅5=18+4+0+21+30+4+24+20=121.

In the second example tree consists only of one vertex so the answer is always 0.

题目大意:给出一个具有n个点的无向图,给出 n-1条边,然后求出如果以一个点为树的根,那么这棵树的Cost是多少,Cost定义为 ∑ i = 1 n \sum_{i=1}^n i=1ndist(i,v)⋅ai,dist(a,b)的含义就是两个点之间的距离
另外,数据保证该图联通

同学博客奉上

在以 1 为根节点的时候,如果这个根节点转移到与其相连的子节点,那么来说,和转移之前的节点相连的子树的节点的距离就要减小 1 ,假设a[t] 表示以 t 为根的子树的权值,那么来说,以之前的 1 为根的子树的权值就是a[1] , 如果是相连的子节点那么距离就要减少 a[i] , 然后对于那些非子节点的 Cost 就要增加 1,那么来说,增加的就是a[1] - a[i],所以说,总的变化就是
a[1] - a[i] - a[i]
则当前节点的Cost:
Cost[子节点] = Cost[父节点] + a[1] - a[i] - a[i]

深度优先搜索的时候遍历一下就行了,注意遍历的时候父节点子节点的关系问题

Code:

#include <bits/stdc++.h>
#include <cmath>
using namespace std;
typedef long long ll;
typedef int itn;
const int maxn = 2e5 + 7;
/// 链式前向星向存图
struct node {
	int pt;///当前节点
	int net;///下一个节点的
}p[maxn << 1];
int cnt = 0;
ll head[maxn];
ll pre[maxn];///预处理的权值
ll n;///总共有N个点
ll ans;///记录答案
ll a[maxn];
void _Add(int u, int v) {
	p[cnt].pt = v;///下一个节点;
	p[cnt].net = head[u];
	///cnt++;
	head[u] = cnt++;
}
/// 初始化
void _Init() {
	for (int i = 0; i <= n; i++) {
		head[i] = -1;///初始化为 -1
		pre[i] = 0;
	}
}

void DFS(int x, int fa) {
	/// 当前节点和父节点
	for (int i = head[x]; ~i; i = p[i].net) {
		int pt = p[i].pt;///找到对应的节点
		if (pt == fa) continue;///所连向的点正好是父亲节点
		DFS(pt, x);///这时候,x就成了父亲节点,pt就是子节点
		/// wawawa此时的父节点是x
		a[x] += a[pt];///父节点的权值要加上这个子节点的权值
		/// wawawa应该是+=
		pre[x] += (pre[pt] + a[pt]);/// 父亲节点子树的成本就是其子节点树的成本加上这个点的权
	}
}
void dfs(int x, int fa) {
	if (x != 1) {
		///这个点不是根节点的时候
		pre[x] = pre[fa] + a[1] - 2 * a[x];///逻辑关系
	}
	for (int i = head[x]; ~i; i = p[i].net) {
		int pt = p[i].pt;///获得当前指向的节
		if (pt == fa) continue;
		dfs(pt, x);///这时候,x就成了父亲节点,pt就是子节点
	}
}
int main() {
	cin >> n;
	_Init();

	for (int i = 1; i <= n; i++) cin >> a[i];
	/// 输入当前节点的权值
	/// n-1条边
	for (int i = 1; i < n; i++) {
		int u, v;
		cin >> u >> v;
		_Add(u, v);
		_Add(v, u);///无向图双向建边
	}
	DFS(1, -1);
	dfs(1, -1);
	ans = 0;
	for (int i = 1; i <= n; i++) {
		ans = max(ans, pre[i]);
	}
	cout << ans << endl;
	return 0;
}
/**
8
9 4 1 7 10 1 6 5
1 2
2 3
1 4
1 5
5 6
5 7
5 8


121
**/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tree with Maximum Cost---CF1092F 树上DP 的相关文章

  • 2021杭电多校第三场-Road Discount-wqs二分+最小生成树

    Description There are n cities in Byteland labeled by 1 to n The Transport Construction Authority of Byteland is plannin
  • P1018 [NOIP2000 提高组] 乘积最大

    题目 题目链接 题解 状态定义 dp i j 表示前i个数分成j段 即需要j 1个 的最大乘积 状态转移 dp i j max dp k 1 j 1 a k i dp i j 表示在第k 1和第k个数之间加上一个 得到的最大值 其中前k 1
  • MAX 的读书计划——dp

    题目描述 MAX 很喜欢读书 为了安排自己的读书计划 他会预先把要读的内容做好标记 A B 表示一个页段 即第 A 到 B 面 当然 A
  • Tree with Maximum Cost---CF1092F 树上DP

    F Tree with Maximum Cost time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstand
  • 最长公共子序列 蓝桥杯 1189

    题目描述 给定一个长度为n数组A和一个长度为m数组B 请你求出它们的最长公共子序列长度为多少 输入描述 输入第一行包含两个整数n m 第二行包含n个整数ai 第三行包含m个整数bi 1 lt n m lt 10 3 1 lt ai bi l
  • 全排列的价值 python实现 蓝桥杯 2137

    问题描述 对于一个排列 A a1 a2 an 定义价值 ci 为 a1 至 ai 1 中小于 ai 的数 的个数 即 ci aj j
  • leetcode买卖股票的最佳时机含手续费

    动态规划简单题 我们设置二维数组dp size 2 其中dp i 0 代表第i 天不持有股票的最大价值 其中dp i 1 代表第i天持有股票的最大价值 当天持有股票可以从前一天持有股票和前一天不持有股票现今买入转换得来 当天不持有股票可以从
  • [leetcode] 鸡蛋掉落 Google面试题 dp

    题目链接 给你 k 枚相同的鸡蛋 并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑 已知存在楼层 f 满足 0 lt f lt n 任何从 高于 f 的楼层落下的鸡蛋都会碎 从 f 楼层或比它低的楼层落下的鸡蛋都不会破 每次操作
  • APAC 2013 部分题解

    目录 A The Alphabet Sticker C Increasing Shortest Path D Cup of Cowards E Balloons Colors F NASSA s Robot G The Stones Gam
  • SPFA 算法模板

    SPFA 代替 Dijkstra 计算最短路 题目 题目链接 题解 SPFA 一般时间复杂度为 O m O m O m 最坏情况下为 O
  • HDU-2063过山车

    题目链接 http acm hdu edu cn showproblem php pid 2063 解题思路 匈牙利算法 二分图模板 代码 include
  • L3-005 垃圾箱分布 (30 分)

    题目 题目链接 题解 对每个垃圾箱进行一次队列优化的Dijskra 每算出一个垃圾箱到其余各个居民点的最短距离后 计算这些距离中的最大距离 最短距离 如果最大距离大于要求的距离则直接忽略这个位置放垃圾桶的情况 否则 如果最短距离小于已经记录
  • Optimal Coin Change(完全背包计数)

    题目描述 In a 10 dollar shop everything is worthy 10 dollars or less In order to serve customers more effectively at the cas
  • [leetcode] 2039. 网络空闲的时刻

    题目链接 题意 给定一张n个点不含重边的无向图 点的编号从0开始到n 1 两点之间如果有连边 可以认为耗时为1秒 1 gt n 1的点都需要向0号点发送消息 从第0秒开始 在0号收到消息之后 会回复消息 从第一秒开始 如果1 gt n 1号
  • Leetcode 376.摆动序列

    题目 如果连续数字之间的差严格地在正数和负数之间交替 则数字序列称为 摆动序列 第一个差 如果存在的话 可能是正数或负数 仅有一个元素或者含两个不等元素的序列也视作摆动序列 例如 1 7 4 9 2 5 是一个 摆动序列 因为差值 6 3
  • Queen on Grid_dp

    思想很单纯 gt dp Code 代码解释 dp i j ans 1 i 1 j 竖着过来 dp i j mod dp i j ans 2 i j 1 横着过来 dp i j mod dp i j ans 3 i 1 j 1 斜着过来 dp
  • 【01规划】POJ 3621 Sightseeing Cows

    POJ 3621 Sightseeing Cows 题意 给定一张 n 个点 m 条边的有向图 每个点都有一个权值 f i 每条边都有一个权值 t i 求图中的一个环 使 环上各点的权值之和 除以 环上各边的权值之和 最大 输出这个最大值
  • [UVA1364

    评测地址 网址1 网址2 题目描述 题意 给出n位骑士 然后有m个关系 每个关系以格式 a b a b a b给出 表达骑士 a a
  • LeetCode338. 比特位计数

    题目连接 https leetcode cn com problems counting bits 解题思路 这道题需要计算从 0 到 num 的每个数的二进制表示中的 1 的数目 最直观的方法是对每个数直接计算二进制表示中的 1 的数目
  • L3-014 周游世界 (30 分)

    题目 题目链接 题解 DFS 采用的数据结构 vector 索引为起点 值为 终点 起点公司编号 当然你也可以保存终点公司编号 但是代码中的语句就需要改一下了 dfs 传入四个信息 当前节点 遇到的节点数 换乘数 当前节点所在公司的编号 由

随机推荐

  • 数组-约瑟夫环

    题目描述 已知有n个人围坐在一张圆桌上 编号依次为0 1 2 n 1 编号为n 1与编号为0的人坐在相邻的位置 现在编号为k的人从1开始报数 数到m的那个人会退出圆桌 他的下一个人又从1开始报数 数到m的那个人又出列 依此规律重复下去 请问
  • OSS对象存储的简单实现

    前提准备好阿里云对象存储的账号 gt 创建一个bucket 设置好访问权限 gt 创建用于上传文件的子账号得到accessKey和secretKey以及endpoint gt sdk例子java简单上传的例子测试 引入alicloud os
  • 快速排序(非递归)

    快速排序非递归 基本思想 默认升序 从数组中选取一个数来作为标准数 所有比这个数小的数全部放到其前面 比这个数字大的数放到其后面 此时这个标准数所处的位置就是其在有序数组中的位置 因此该标准数就不用在移动了 我们对其左右两边的数字继续执行之
  • 通过RabbitMq实现动态定时任务的实现。

    通过RabbitMq实现动态定时任务的需求 一 需求背景 定时任务的需求所谓是数不胜数 其中实现方式也是百花齐放 用得最多的大概率为Springboot中的 Scheduled cron 0 0 1 1 注解 或者是定时任务XXL JOB框
  • 蓝桥杯官网练习题(翻硬币)

    题目描述 小明正在玩一个 翻硬币 的游戏 桌上放着排成一排的若干硬币 我们用 表示正面 用 o 表示反面 是小写字母 不是零 比如 可能情形是 oo oooo 如果同时翻转左边的两个硬币 则变为 oooo oooo 现在小明的问题是 如果已
  • JAVA中getClass()以及getName()方法

    getClass public final Class
  • JSch链接linux服务器问题解决方案

    问题 Session connect java io IOException End of IO Stream Read或者Algorithm negotiation fail 方案 需要修改的文件路径 etc ssh sshd confi
  • 金融经济学研究什么?

    文章目录 什么是金融 资产和资产的回报率 资产定价 金融摩擦与金融契约理论 有效市场之争与行为金融 什么是金融 金融就是资金融通 由维基百科所定义的 金融是处理资产和负债 在 时间和确定及不确定状态下分配的领域 如何理解呢 主要从这么几点入
  • pom.xml的scope/classifier等容易忽略标签

    文章目录 一 scope标签的值 二 pom xml案例 三 scope不同值参与阶段 四 Maven的打包三种插件 五 classifier使用 1 classifier概述 2 使用场景 六 optional标签使用 一 scope标签
  • 微信小程序——生命周期

    在微信小程序中 可以通过生命周期函数来执行相应的代码操作 以下是一些常见的生命周期代码操作示例 在 onLoad 生命周期中进行数据初始化和网络请求 onLoad function options 数据初始化 this setData na
  • 3-Numpy数组操作2(索引和切片)

    索引和切片 一维 a1 np arange 0 20 print a1 print a1 1 gt gt gt 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 多维 a2 np ara
  • 目标检测中的Label Assignment

    PaperWeekly 原创 作者 燕皖 单位 渊亭科技 研究方向 计算机视觉 CNN Label Assignment Label assignment 主要是指检测算法在训练阶段 如何给特征图上的每个位置进行合适的学习目标的表示 以及如
  • idea常用插件和注释

    背景 随着idea越来越受开发者捧月 相信很多人 无论在换公司或者配置新得电脑 都会重新配置各种各样得插件 比如 lombok mybatis系列 maven等 但人得记忆都有限得 每天都在行走 从未没有停下 借用法师一句话 人生那么长 停
  • 无序链表的归并排序 - Java代码纯享版

    public class ListNodeMergeSort public static class ListNode int val ListNode next public ListNode int val this val val p
  • 嵌入式linux内存分析

    在linux的桌面发行版中 一般都会有一个swap分区 然而在用FLASH做存储介质的嵌入式设备中 是没有交换分区的 这主要的有如下原因 1 一旦使用了交换分区 系统的性能将下降得很快 不可接受 2 FLASH的写次数有限的 大概在几十万次
  • win10 安装 mysql server

    welcome to my blog 如何启动mysql server 只需四步 安装 配置mysql server 第一步 去官网下载mysql server 下载地址 有两个下载链接 第一个安装包比较小 第二个安装包比较大 因为包含调试
  • CCP集成和基于CANoe的简易标定实现

    CCP简介 CCP就是基于CAN总线的标定协议 在没有这个协议之前 每个供应商有自己的标定工具和协议 五花八门 很难协调 终于有一天有个哥们跳出来制定了一个规范 说大家伙都按这个方法来搞标定测试吧 这个哥们就是ASAP CCP协议属于其中的
  • 最大类间方差(大津法)

    1 概述 最大类间方差法是由日本学者大津 Nobuyuki Otsu 于1979年提出的 是一种自适应的阈值确定的方法 又叫大津法 简称OTSU 它是按图像的灰度特性 将图像分成背景和目标2部分 背景和目标之间的类间方差越大 说明构成图像的
  • 好玩的脚本代码大全_Scriptable脚本——网易云热评

    Scriptable脚本 网易云热评 今天我为大家带来新的作品 iOS14桌面组件神器 Scriptable 原创脚本 精美作品分享 喜欢的话就点关注吧 更多脚本正在路上 效果图 如何使用 iPhone 上下载 Scriptable App
  • Tree with Maximum Cost---CF1092F 树上DP

    F Tree with Maximum Cost time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstand