【树形dp】 [POI2014] FAR-FarmCraft

poi实现对树形结构数据导出excel并合并表格 poi实现对树形结构数据导出excel并合并表格 最近好像得罪了poi,遇到的都是导出word、Excel、pdf的问题。下面我记录一下poi对树形结构的处理,前面先梳理整体思路,文章末尾会贴上完整代码。 首先我们看一下模板和效果图吧: 怎么样,效果还行吧,有没有达到你心目中的标准?如果你也遇到了这样的问题,那么请静下心来花费几分钟时间,我会详细的梳理出自己的思路,希望能够帮助到你。 现在开始... 阅读详情

在这里插入图片描述
思路:
由于是树形结构,我们直接考虑树形dp。
定义f[u]f[u]f[u],表示从uuu出发,走完uuu的子树花费的最短时间,也就是子树中每一个点(走到的时间+点权)的最大值。
我们考虑如何转移,用tim[u]tim[u]tim[u]表示走完uuu的若干子节点所代表的子树,返回uuu,所花费的时间。
那么有f[u]=max(f[u],f[v]+tim[u]+1)f[u] = max(f[u], f[v] + tim[u] + 1)f[u]=max(f[u],f[v]+tim[u]+1),我们发现这个转移方式和子节点的遍历顺序有关。
考虑uuu的两个子节点xxx和yyy,假设xxx比yyy先被遍历到。
那么有xxx和yyy对于f[u]f[u]f[u]的贡献为:
max(tim[u]+1+f[x],tim[u]+tim[x]+2+1+f[y])max(tim[u] + 1 + f[x], tim[u] + tim[x] + 2 + 1 + f[y])max(tim[u]+1+f[x],tim[u]+tim[x]+2+1+f[y])
我们把x,yx,yx,y交换一下位置,那么贡献变为:
max(tim[u]+1+f[y],tim[u]+tim[y]+2+1+f[x])max(tim[u] + 1 + f[y], tim[u] + tim[y] + 2 + 1 + f[x])max(tim[u]+1+f[y],tim[u]+tim[y]+2+1+f[x])
把上下两式的tim[u]+1tim[u] + 1tim[u]+1都去掉之后,得到以下两式子:
max(f[x],tim[x]+2+f[y])max(f[x], tim[x] + 2 + f[y])max(f[x],tim[x]+2+f[y])
max(f[y],tim[y]+2+f[x])max(f[y], tim[y] + 2 + f[x])max(f[y],tim[y]+2+f[x])
假设我们交换之后结果更优,那么有max(f[x],tim[x]+2+f[y])>max(f[y],tim[y]+2+f[x])max(f[x], tim[x] + 2 + f[y]) > max(f[y], tim[y] + 2 + f[x])max(f[x],tim[x]+2+f[y])>max(f[y],tim[y]+2+f[x])
又因为f[x]<tim[y]+2+f[x],f[y]<tim[x]+2+f[y]f[x] < tim[y] + 2 + f[x], f[y] < tim[x] + 2 + f[y]f[x]<tim[y]+2+f[x],f[y]<tim[x]+2+f[y],那么可以得到tim[x]+2+f[y]>tim[y]+2+f[x]tim[x] + 2 + f[y] > tim[y] + 2 + f[x]tim[x]+2+f[y]>tim[y]+2+f[x],即tim[x]−f[x]>tim[y]−f[y]tim[x] - f[x] > tim[y] -f[y]tim[x]−f[x]>tim[y]−f[y]
那么也就是说,只要有相邻的两个孩子x,yx,yx,y满足tim[x]−f[x]>tim[y]−f[y]tim[x] - f[x] > tim[y] - f[y]tim[x]−f[x]>tim[y]−f[y],我们就可以将其交换并且结果更优,那么最优解中孩子的遍历顺序就是按照tim[]−f[]tim[] - f[]tim[]−f[]从小到大排序的顺序。
那么我们就可以用贪心来做,每一次把孩子排个序之后再遍历。
其中,tim[u]=∑vtim[v]+2tim[u]=\sum_{v}tim[v] + 2tim[u]=∑v​tim[v]+2

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 500005;

int n;
int c[N];
int tim[N];
struct edge
{
	int to, next;
}e[N << 1];
int head[N], cnt;
int w[N];
int tmp[N];
LL f[N];

void add(int u, int v)
{
	e[ ++ cnt ] = {v, head[u]};
	head[u] = cnt;
}

bool cmp(int x, int y)
{
	return tim[x] - f[x] < tim[y] - f[y];	
}

void dfs(int u, int ff)
{
	if (u != 1) f[u] = w[u];
	int cnt = 0;
	for (int i = head[u]; i; i = e[i].next)
	{
		int v = e[i].to;
		if (v == ff ) continue;
		dfs(v, u);
		
	}
	for (int i = head[u]; i; i = e[i].next)
		if (e[i].to != ff) 
			tmp[++ cnt] = e[i].to;
	sort(tmp + 1, tmp + 1 + cnt, cmp);
	
	for (int i = 1; i <= cnt; i ++ )
	{
		int v = tmp[i];
		f[u] = max(f[u], tim[u] + f[v] + 1);
		tim[u] += tim[v] + 2; 	
	}
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
	for (int i = 0; i < n - 1; i ++ )
	{
		int u, v;
		scanf("%d%d", &u, &v);
		add(u, v); add(v, u);
	}
	
	dfs(1, 0);
	
	printf("%lld\n", max(f[1], 1LL * tim[1] + w[1]));
	
	return 0;
}
POI导出Tree结构数据(连接线).doc 仅用于个人学习 立即下载

相关推荐

java导出excel树结构工具类

该工具类实现java导出树形结构的方法,并未采用excel分组功能实现,而是根据树节点显示层级设置excel样式。针对easyUi,treeGrid开发的导出excel功能。方法简便实用、性强、通俗易懂。项目中亲测,no problem。

树形数据以POI导出Excel的方法

一、简介 这里介绍了使用java poi导出树形结构数据到excel表,这是一种方法。 二、数据源(树形结构数据) DcdbInfoAO infoAO(根数据) TaskMainAO(一级目录数据) TaskSubAO(二级目录数据) 三、代码示例 /** * POI : 导出数据,存放于Excel中 * * @param os * ...

这里是博客标题 7306

从零开始:用Neo4j构建你的第一个知识图谱(附完整代码示例)

本文提供了一份从零开始的Neo4j知识图谱构建实战指南。通过一个“经典科幻电影宇宙”的具体案例,手把手教你安装环境、设计图谱模式,并使用Cypher查询语言完成节点与关系的创建、数据查询及可视化,帮助你快速掌握自下而上构建知识图谱的核心技能。

weixin_29053073的博客 474

java生成树(generateTree)

参考:https://blog.youkuaiyun.com/mynamepg/article/details/79802885 //生成权限树 public List&lt;Tree&gt; generateTree(List&lt;Tree&gt; treeList) { if (CollectionUtils.isEmpty(treeList)) { return null; ...

风的专栏 5389

别再死记公式了!用HFSS/CST手把手教你仿真一个2.4GHz WiFi的PIFA天线(附参数调试技巧)

本文详细介绍了使用HFSS和CST仿真软件设计2.4GHz WiFi PIFA天线的全流程,包括建模准备、分步操作指南和参数调试技巧。通过可视化结果和实战案例,帮助工程师快速掌握天线设计的关键参数优化方法,提升辐射性能和工作效率。

weixin_31682031的博客 336

Python爬虫实战:从巨潮资讯网高效获取结构化JSON数据

在数据采集与处理领域,网络爬虫是实现自动化信息获取的核心技术。其基本原理是通过模拟浏览器行为,向目标服务器发送HTTP请求并解析响应内容,从而提取所需数据。相较于传统的网页解析,直接获取结构化数据(如JSON格式)能极大提升数据处理的效率与准确性,避免了复杂的HTML解析或PDF文本提取过程。这一技术价值在金融数据分析、市场研究、舆情监控等场景中尤为突出,能够快速构建高质量的数据集。本文以Python爬虫为例,聚焦于从巨潮资讯网这类官方信息披露平台,精准定位并抓取JSON格式的上市公司年报数据,详细阐述了接

weixin_29243279的博客 1421

洛谷P3574 [POI2014] FAR-FarmCraft(树形dp)

洛谷P3574POI2014FAR−FarmCraft(树形dp) 给一棵树,走过每条边需要花费一个时间,安装软件又需要花费一个时间,需要遍历整棵树并回到起点,想让所有点中到达时间+安装时间的最大值最小,问这个值是多少?

鱼香rose_的博客 1343

保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案)

本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。

weixin_28683391的博客 301

P3574 [POI2014]FAR-FarmCraft(树形dp)

P3574 [POI2014]FAR-FarmCraft 洛谷 来源: P3574 [POI2014]FAR-FarmCraft 由于我也是这道题的被害人,所以前来提醒后来人 ---------------------------------------------------------------------------------------------------- 在看洛谷题解的时候相信很多人看到了 或者有很多类似的,其实是有点不准确的 这个真的很误导人,我也是看了一下午,试了又试才搞明白 这里明

323的博客 402

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5762

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.youkuaiyun.com/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

P3574 [POI2014]FAR-FarmCraft 树形DP,贪心

题目链接 https://www.luogu.com.cn/problem/P3574 题意 n点树,树根为1,穿越道路花费时间1,点带权。你需要遍历树,每个点会在被遍历到后执行操作,时间为权(你不需要在那里停留),最终当你回到1点后,你也需要开始执行时间为权的操作, 思路 复杂度 O(n∗logm) O(n*logm) O(n∗logm) 教训/收获 代码 在这里插入代码片 ...

TheSunspot的博客 249

C#串口通信从入门到精通(11)——串口接收的数据存储到本地文件(txt、csv)

本文详细介绍如何将串口通信将数据进行本次存储,主要介绍常用的csv、txt格式文件,由多年实战经验总结,绝对干货!

qq_34059233的博客 7239

[POI2014]FAR-FarmCraft 树形DP + 贪心思想

(感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译。。。。。。)题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权,要最小化max(点权+到达时间) <---所有点的首先这看起来就是一道DP题,但是根据直觉,,,应该跟贪心挂钩,因为感觉耗时久的要先去是吧但是我们发现并不能这么弄,因为去一棵子树就要走完它,这个...

weixin_30784945的博客 193

基于机器学习和深度学习的新能源功率预测研究综述--学术论文模式--个人梳理

本文是博主根据前人的研究成果总结的机器学习和深度学习等理论方法在新能源功率预测领域的相关研究内容要点,按照学术科技论文写作的模式进行的呈现,包括文章引用等也都做了详细的批注,花了很多时间和心血,一方面是对自己学习成果的一些总结,另一方面也希望对大家有用(尽量不要直接copy哦,转载请标注,如有不当请评论或私信指出哦可再生能源的间歇性给新型电力系统的运行带来了巨大挑战,准确地预测新能源出力对于电网的安全可靠运行尤为重要。

干吧滴! 6322

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

树形DP(P1352 没有上司的舞会/P3574 [POI 2014] FAR-FarmCraft)

通常以。

2401_88124440的博客 1279

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

P3574 [POI2014]FAR-FarmCraft (树形DP)

这题直接贪心显然不可行. 考虑树形dp,用 \(f_i\) 表示到 \(i\) 人后,以 \(i\) 为根的所有人安装完的最短时间. 对于一个节点 \(u\), 假设拜访子节点的顺序为 \(v_1,v_2,...,v_m\) ,那么得到转移方程. \[f_u = max(f_v + \sum\limits_{j = 1}^{i - 1}sum_j) \]其中 \(sum_i\) 表示拜访完以 \...

橘嘉禾 103

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]

题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 再考虑状态转移 dp[u]=MAX(dp[to]+1,siz+dp[to]);siz为枚举子树到以to为节点的子树时之前已遍历的总时间 很明显这个转移过来的dp值的最优化依赖于子树遍历...

weixin_30924239的博客 180

BZOJ 3829 Poi2014 FarmCraft 树形DP+贪心

题目大意:给定一棵树,从1号节点出发对树进行欧拉遍历,每到达一个点这个点就开始装MC,每个点装MC的时间不同,最后回到1号节点装MC,求所有人都能联机的最少时间 令f[x]为对第x个节点进行欧拉遍历的时间,g[x]为对第x个节点进行欧拉遍历并完成所有节点的装机的最小时间 那么在每个节点以什么顺序遍历每棵子树呢? 我们发现装机多出来的时间 即g[x]-f[x]可以用来遍历其它子树 那么显然要从

世界 2209

P3574 [POI2014]FAR-FarmCraft 树上DP

题意: 给定一棵大小为nnn树,走过每条边需要花费111时间,安装软件又需要花费cic_ici​时间,需要遍历整棵树并回到起点,想让所有点中到达时间+安装时间的最大值最小,问这个值是多少 范围&性质:1≤n≤5×105,1≤ci≤1091\le n\le 5\times10^5,1\le c_i\le 10^91≤n≤5×105,1≤ci​≤109 分析: 我们对于节点uuu的儿子,按照最优方案下安装时间排序,我们二分一个最优时间,对于这些点我们从大往小的加入队列中,若当前的点无法直接插入到队列末尾

youth518的博客 217

换根DP(P3478 [POI 2008] STA-StationP3574 [POI 2014] FAR-FarmCraft)

换根DP(又称二次扫描法)是一种树形动态规划技术,用于解决需要以每个节点为根重新计算子树信息的问题。核心思想是通过一次DFS预处理子树信息,再通过第二次DFS利用父节点信息推导其他根节点的结果,避免对每个根节点单独计算,将时间复杂度优化至O(n)。

2401_88124440的博客 739

[POI2014]FAR-FarmCraft

传送门 preface   下午颓的时候看到这道题,当时也没怎么想,就去找题解,结果听不懂ta在讲啥。晚上自己回来弄一弄就完了,就写个题解翻译一下。 分析   这个树形dp就没什么好说的了。用dp[i]表示把以i为根的子树全处理完后最少还要多少时间(划重点)。刚开始想最常规的思路,提交一发只对了一个点,然后才改用题解的dp。这样的话,最后只用判断c1和dp[1]哪个大再加上所有边...

weixin_30279671的博客 139

YbtOJ 树形DP问题课堂过关 例2 节点覆盖【树形DP】

题目 给出一棵有根树,要求选出一些结点。若选中某个结点,则它本身、它的父亲结点和儿子结点被覆盖。选出第 iii 个结点需要一定的花费 Wi\mathcal W_iWi​,求覆盖这棵树所需的最小花费。 思路 这道题我们设 fi,0/1/2f_{i,0/1/2}fi,0/1/2​ 表示选到第 iii 个点时的最小花费。然后0表示选自己,1表示选父亲,2表示选儿子。在回溯时转移即可。 代码 #include<iostream> #include<cstdio> using namespac

JA_yichao欢迎你 cnblogs账号:https://www.cnblogs.com/mayichao/ 355
上一篇: 【背包dp】[NOIP2014 提高组] 飞扬的小鸟
下一篇: CF1114F Please, another Queries on Array?【线段树+欧拉函数】
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值