hdu 5834 Magic boy Bi Luo with his excited tree

AG32VF407直流电流采集仪设计:从1uA到10A宽范围采样与FPGA加速方案 本文详细介绍了基于AG32VF407芯片的直流电流采集仪设计方案,实现了从1uA到10A的宽范围采样。方案采用低噪声电源、精密运放调理、高速比较器自动档位切换及高精度ADC同步采样,并重点阐述了利用AG32VF407片内FPGA实现硬件加速以提升性能的架构思路,为精密电流测量提供了完整的硬件与FPGA加速解决方案。 阅读详情


Magic boy Bi Luo with his excited tree

Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 559    Accepted Submission(s): 131


Problem Description
Bi Luo is a magic boy, he also has a migic tree, the tree has  N  nodes , in each node , there is a treasure, it's value is  V[i] , and for each edge, there is a cost  C[i] , which means every time you pass the edge  i  , you need to pay  C[i] .

You may attention that every  V[i]  can be taken only once, but for some  C[i]  , you may cost severial times.

Now, Bi Luo define  ans[i]  as the most value can Bi Luo gets if Bi Luo starts at node  i .

Bi Luo is also an excited boy, now he wants to know every  ans[i] , can you help him?
 

Input
First line is a positive integer  T(T≤104)  , represents there are  T  test cases.

Four each test:

The first line contain an integer  N (N≤105) .

The next line contains  N  integers  V[i] , which means the treasure’s value of node  i(1≤V[i]≤104) .

For the next  N−1  lines, each contains three integers  u,v,c  , which means node  u  and node  v  are connected by an edge, it's cost is  c(1≤c≤104) .

You can assume that the sum of  N  will not exceed  106 .
 

Output
For the i-th test case , first output Case #i: in a single line , then output  N  lines , for the i-th line , output  ans[i]  in a single line.
 

Sample Input
  
1 5 4 1 7 7 7 1 2 6 1 3 1 2 4 8 3 5 2
 

Sample Output
  
Case #1: 15 10 14 9 15
 

Author
UESTC
 

Source
 

Recommend
wange2014   |   We have carefully selected several similar problems for you:   5842  5841  5840  5839  5838 
 

Statistic |  Submit |  Discuss |  Note
题意:给你一棵树,有n个节点n-1条边,边有权值,点也有权值,只要经过边就要付费,走过之前没走过的点拿钱,问从每个点出发最多能得到多少钱。

第一次做树形dp的题就遇到这么恶心的题,赛后看着别人的代码研究了一个下午终于弄出来了,细节不是一般的多,思路要非常非常清晰,不然就gg。下面说下思路:

我们默认1为根节点跑一次dfs,用g数组表示以该节点为根向下走返回到该节点时的最大值,明显有转移方程:g[根] += max(g[子] -边权值*2, 0);从某个点出发获得最大值肯定最后的落点不会在原来的点上,所以我们用dp来存该点最后能获得的最大值和次大值,转移方程详情看代码。最后就知道根节点也就是1的答案就是dp[1][0]。

我们现在只知道1的答案,但是我们不能用一个循环重复上面步骤,时间复杂度很高,所以最后要靠根节点和子节点的关系再跑一次dfs,把其他点的答案全部推出来。子节点最大值的情况只有两种,子节点往上走然后回到原点,再往下走到某个地方达到最大,或者是反过来往下走然后回到原点往上走到最大。往下走到最大就是我们已经记录过的数dp[子][0],往下走回到原点的最大就是g[子],往上走我们可以看出根节点和子节点的关系,详情请看代码:

#include<iostream>
#include<stack>
#include<cstring>
#include<map>
#include<string>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<set>
#include<cmath>
using namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
typedef long long LL;
int value[maxn], head[maxn], dp[maxn][2], edge[maxn][3], g[maxn], ans[maxn][3];
struct node{
	int u, value, next;
}p[maxn << 1];
const int read()
{
	char ch = getchar();
	while (ch<'0' || ch>'9') ch = getchar();
	int x = ch - '0';
	while ((ch = getchar()) >= '0'&&ch <= '9') x = x * 10 + ch - '0';
	return x;
}
void dfs(int x, int fa){
	g[x] = value[x];
	for (int i = head[x]; i != -1; i = p[i].next){
		if (p[i].u == fa)
			continue;
		dfs(p[i].u, x);
		g[x] += max(g[p[i].u] - (p[i].value << 1), 0);
	}
	edge[x][0] = edge[x][1] = -1;
	for (int i = head[x]; i != -1; i = p[i].next){
		if (p[i].u == fa || (dp[p[i].u][0] - p[i].value <= 0))
			continue;
		int now = g[x] - max(g[p[i].u] - (p[i].value << 1), 0) + max(dp[p[i].u][0] - p[i].value, 0);
		if (edge[x][0] == -1){
			edge[x][0] = i;
			dp[x][0] = now;
		}
		else if (edge[x][1] == -1 || now > dp[x][1]){
			edge[x][1] = i;
			dp[x][1] = now;
			if (dp[x][0] < dp[x][1]){
				swap(edge[x][0], edge[x][1]);
				swap(dp[x][0], dp[x][1]);
			}
		}
	}
	if (edge[x][0] == -1)
		dp[x][0] = g[x];
	if (edge[x][1] == -1)
		dp[x][1] = g[x];
}
void solve(int x,int fa){
	for (int i = head[x]; i != -1; i = p[i].next){
		if (p[i].u == fa)
			continue;
		int y = p[i].u;
		ans[y][0] = dp[y][0] + max(g[x] - max(g[y] - (p[i].value << 1), 0) - (p[i].value << 1), 0);
		ans[y][1] = dp[y][1] + max(g[x] - max(g[y] - (p[i].value << 1), 0) - (p[i].value << 1), 0);
		edge[y][2] = i;
		if (edge[x][0] == i){
			if (g[y] >= (p[i].value << 1))
				ans[y][2] = ans[x][1] + p[i].value;
			else
				ans[y][2] = g[y] - p[i].value + ans[x][1];
		}
		else{
			if (g[y] >= (p[i].value << 1))
				ans[y][2] = ans[x][0] + p[i].value;
			else
				ans[y][2] = g[y] - p[i].value + ans[x][0];
		}
		if (ans[y][2] > ans[y][1]){
			swap(ans[y][2], ans[y][1]);
			swap(edge[y][2], edge[y][1]);
		}
		if (ans[y][1] > ans[y][0]){
			swap(ans[y][1], ans[y][0]);
			swap(edge[y][1], edge[y][0]);
		}
		g[y] += max(g[x] - max(g[y] - (p[i].value << 1), 0) - (p[i].value << 1), 0);
		solve(y, x);
	}
}
int main(){
	int t;
	t = read();
	for (int tcase = 1; tcase <= t; tcase++){
		int n;
		n = read();
		for (int i = 1; i <= n; i++){
			value[i] = read();
			head[i] = -1;
			g[i] = 0;
		}
		for (int i = 0; i < ((n - 1) << 1); i++){
			int x, y, z;
			x = read();
			y = read();
			z = read();
			p[i].u = y;
			p[i].value = z;
			p[i].next = head[x];
			head[x] = i++;
			p[i].u = x;
			p[i].value = z;
			p[i].next = head[y];
			head[y] = i;
		}
		dfs(1, 0);
		ans[1][0] = dp[1][0];
		ans[1][1] = dp[1][1];
		solve(1, 0);
		printf("Case #%d:\n", tcase);
		for (int i = 1; i <= n; i++){
			printf("%d\n", ans[i][0]);
		}
	}
}


安路TangDynasty和FD和JTAG驱动器安装 安路FPGA产品矩阵包含SALPHOENIX高性能、SALEAGLE高性价比和SALELF低功耗三大系列,广泛应用于网络通信、消费电子等领域。配套的TangDynasty(TD)集成开发环境支持标准设计输入,提供完整优化流程与调试工具。简要介绍了TD 6.2.1版本的安装步骤。 阅读详情

相关推荐

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 312

Hdu 5834 Magic boy Bi Luo with his excited tree(从树上每个点出发,获得的最大的利润为多少)

传送门:Hdu 5834 Magic boy Bi Luo with his excited tree 题意:给你一棵树,有n个点,每个点都有一个利润,每条边都有一个花费,问从每个点出发, 获得的最大的利润为多少(每个点上的利润只能取一次,每条边每走一次就要花费) 思路:我们任意选取一个根,每个点都保存四个值,down[i][0],down[i][1]分别表示向下不回到这个点和回到这个点

_zidaoziyan的博客 616

【Stata双重差分模型】双重差分DID的具体操作步骤

本案例将详细阐述如何使用双重差分法进行实证分析,并展示具体的STATA操作代码。

a519573917的博客 2万+

hdu-5834 Magic boy Bi Luo with his excited tree

Magic boy Bi Luo with his excited treeTime Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1737    Accepted Submission(s): 521Problem DescriptionBi...

qq_37064135的博客 318

Conda换源全攻略:从清华源到默认源的保姆级切换教程(附常见问题解决)

本文提供Conda换源的完整教程,详细讲解如何从清华源切换到默认源,包括配置步骤、常见问题解决方案及高级技巧。针对国内开发者遇到的下载速度慢问题,清华源提供了高速稳定的解决方案,同时文章也介绍了恢复默认源的方法和多种镜像源选择。

weixin_28837817的博客 940

宜搭子表单(自定义页面全部展示)

效果:增加自定义页面添加表格组件,配置数据源变量: formUuid'表单编码'变量: pageSize10变量: currentPage1。

2301_80286061的博客 2276

『HDU 5834』Magic boy Bi Luo with his excited tree

转载声明:http://blog.youkuaiyun.com/cqu_hyx/article/details/52213912 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5834题意: 给你一棵树,每个结点有个宝藏价值w,每次只能拿一次宝藏,每次经过路径需要花费val值,路径可以来回经过,同时可以多次花费val值,求从i点出发,能拿到的最大权值ans【i

Gavinjou大笨象的博客 1536

DELL服务器BIOS下配置RAID阵列

dell服务器配置raid阵列

weixin_58250887的博客 1万+

Magic boy Bi Luo with his excited tree

题意:给出一棵树,给出每个节点的价值以及每条路径的花费,每个节点不论经过多少次只能取一次对应的价值,而每条路径每通过一次都要付出对应的代价。要求输出从每一个节点出发的最大获利。 树形dp。 思路挺显然的,但是关键是对细节的处理。先做一次dfs,预处理出每一个节点往下走不会来(v1)以及回来(v2)的最大收益。然后第二次dfs就是伴随记录每个节点往父亲走不会来(fa_v1)以及回来(fa_v2

lzh的博客 504

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 195

海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)

海洋CMS admin_notify.php 接口处存在远程代码执行漏洞,经过身份验证的远程攻击者可利用该漏洞执行任意代码,写入后门文件,进而控制整个web服务器。

0xSec 2713

CPPC网络选拔赛 C题 [HDU 5834] Magic boy Bi Luo with his excited tree (树形dp)

链接HDU 5834题意给出N个节点的树,每个节点含权,且点权值只可获得一次,每条边也含权,但每次通过边时都会减少相应边权的价值。对每个节点求出,从该节点出发能获得的最大总价值。思路模型是一道很经典的树形dp:HDU 2196 对所有节点都求出最值。本题为该模型的复杂化版本,数据规模大,需要在线性级别的树形dp内取得对所有点的最值。 仍然是一次dfs下去,对多有节点取得“ 子关系”上的局部最优解,

mysterious 417

BoT-SORT实战:手把手教你实现BoT-SORT训练和测试

文章目录摘要1、数据准备2、配置BoT-SORT环境2.1、获取代码2.2、创建虚拟环境2.3、安装必要的包2.3.1、安装pytorch2.3.2、安装cython2.3.3、安装Cython-bbox2.3.4、安装faiss2.3.5、安装其他的包3、训练3.1、生成REID数据集3.2、预训练模型3.2.1、ByteTrack预训练模型3.2.2、REID预训练模型3.3、开始训练4、如何更改FASTREID的BackBone?5、测试5.1、测试视频5.2、测试摄像头5.3、多类别测试 摘要 Bo

m0_47867638的博客 2298

hdu5834Magic boy Bi Luo with his excited tree

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5834 题意:给定一棵树,有点权和边权,点权上的价值只能取一次,多次通过边要花费多次边权,求以每个节点为起点能获得的最大价值。 分析:比较经典的一类树形dp,设1为根设g[i][0/1]表示从i出发只向儿子走的最大收获,0表示最终回到了i,1表示最终是在某个子孙中结束的,设f[i][0/1]表示i到i的

Fsss 2103

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

hdu5834 Magic boy Bi Luo with his excited tree

hdu5834 Magic boy Bi Luo with his excited tree 题意:一棵树,每个点有点权,边有边权,从一点出发,遍历树,每次遍历到一条边就减去边权,第一次遍历到一个点就加上点权(后续不加)。问从所有点出发能得到最大价值。 刚碰这题认为这题和洛谷的Kamp很像,都是点权一次(点权可以设置为0),边权多次。但是洛谷的kamp是给定了遍历到哪些点,而这题是所有点都可以被遍历到。这也就导致了,Kamp解题思路中的边权值*2加上最长边的“最长边”这一个信息很难在这题中被维护。

qq_48344603的博客 289

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Hdu 5834 Magic boy Bi Luo with his excited tree —— 树形DP

This way 题意: 现在有一棵大小为n的树,每个点有一个点权,边有边权,你到一个点可以得到它的权值,每个点权只能加一次,但是边权只要走过就会扣。问你从每个点出发能够得到的最大权值是多少。 题解: 三目运算符下次记得加括号…少加了这个括号我debug了好久 那么首先明显是树形DP,每个点需要记录的是两个值: dp[x][0]:从x向子树走,并且回到x的最大权值 dp[x][1]从x向子树走,不回到x的最大权值 那么我们首先dfs处理出来这两个东西 if(((dp[ne][0]−w∗2)>0?su

天翼之城的博客 173

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Magic boy Bi Luo with his excited tree HDU - 5834(树形DP)

Bi Luo is a magic boy, he also has a migic tree, the tree has N nodes , in each node , there is a treasure, it’s value is V[i], and for each edge, there is a cost C[i], which means every time you pass...

tomjobs的博客 453

树型dp hdu5834 Magic boy Bi Luo with his excited tree

传送门:点击打开连接 题意:一棵树,对于每个点出发,结束位置可以是任意的,走过的点权值只加一次,走过的边权值要减去走过的次数乘以边权值。 问对于每一个点,权值和最大是多少。 思路: 我们需要维护4个内容 A[u]表示从u往下走,并回到u,路上的最大权值之和 B[u]表示从u往下走,不需要回到u,路上的最大权值之和 C[u]表示从u往上走,需要回到u,路上的最大权值之和 D[u]表示从

qwb的博客 954

HDU 5834 Magic boy Bi Luo with his excited tree

题意:问从每个节点出发,能获得的最大价值。 做法:树形DP。 思路:用两个DFS。 第一个DFS维护出,每个节点,从它的所有子节点返回该点能得到的最大价值(subtree_max_back),它的一个子节点不返回该点可以得到的最大价值(subtree_max_nback)和次大值(subtree_submax_nback),以及不返回的最大价值是当那个点不返回时得到的(subtree_max

moon_NO2015的博客 668

hdu5834Magic boy Bi Luo with his excited tree(树形DP)

Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 823    Accepted Submission(s): 222 Problem De

ACMan 756

hdu 5834 Magic boy Bi Luo with his excited tree (树形dp)

Problem Description Bi Luo is a magic boy, he also has a migic tree, the tree has N nodes , in each node , there is a treasure, it's value is V[i], and for each edge, there is a cost C[i], wh

Dizzy的专栏 345

【HDU 5834】Magic boy Bi Luo with his excited tree

题意 给你一棵树,边有边权,每经过边一次,就得支付过路费c[i],点上面有宝藏,每个点只能拿一次。 问从每个点出发,能够拿到的最大值是多少? 分析 换根法老祖宗,树形dp必做经典。一上午都献给这题了TAT 分两次dfs进行计算考虑到从一个点出发的最长路径。两种情况1.去了儿子回来后,从父亲出去,走到终点。2.去了父亲回来后,从儿子出去,走到终点。所以需要分别维护这个点从父亲出去...

Ashley_2013的博客 66

HDU 5834 Magic boy Bi Luo with his excited tree【树形DP⭐】

Magic boy Bi Luo with his excited tree 题意: 在一棵既有边权又有点权的(无向)树上,要求求从每个节点出发能获得的最大权值。 每经过某条边,都要花费相对应的边权。重复经过将重复花费。 到达某个点,可以获得相对应的点权。只能获得一次。 题解: 题目中强调边权重复花费的时候就应该明白一点,为了得到最大权值,是需要走多条路才会走某些路往返走了两遍。 一、什么路可能会走多遍? 某条支路,走过去走回来,获得点权,扣去两次边权,仍有收益。 二、什么路需要走多...

lllllan 206

HDU5834 Magic boy Bi Luo with his excited tree(树形DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5834 Description Bi Luo is a magic boy, he also has a migic tree, the tree has N nodes , in each node , there is a treasure, it's value is ...

dengliugong3918的博客 168

【树形动规】HDU 5834 Magic boy Bi Luo with his excited tree

题目链接:   http://acm.hdu.edu.cn/showproblem.php?pid=5834 题目大意:   一棵N个点的有根树,每个节点有价值ci,每条树边有费用di,节点的值只能取一次,边权每次经过都要扣,问从每一个节点开始走最大能获得的价值。 题目思路:   【树形动态规划】   首先用dfs求出从根1往下走的:节点u往下走最后回到节点

Coolxxx的博客 544

Hdu-5834 Magic boy Bi Luo with his excited tree(树形DP)

Problem Description Bi Luo is a magic boy, he also has a migic tree, the tree has N nodes , in each node , there is a treasure, it's value is V[i], and for each edge, there is a cost C[i], wh

WZJRJ28 799
上一篇: c++的输入优化
下一篇: ZZULIOJ 多校训练三
overload1997
博客等级 码龄11年 328粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值