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

洛谷 P 3574 [ P O I 2014 ] F A R − F a r m C r a f t (树形 d p ) \Huge{洛谷P3574 [POI2014] FAR-FarmCraft(树形dp)} 洛谷P3574[POI2014]FARFarmCraft(树形dp

文章目录

  • 题意
    • 题目说明
  • 思路
  • 标程

题目链接:P3574 [POI2014] FAR-FarmCraft - 洛谷

题意

给出 n n n个节点、 n − 1 n-1 n1条边的一棵无根树;经过每条边所用时间都为 1 1 1。然后每个节点都有点权 b [ i ] b[i] b[i]

题目故事:管理员从自己家(一号节点)出发,然后将一批电脑分发给每个节点的居民,每个居民得到电脑后会立即开始下载游戏,下载游戏的时间为点权 b [ i ] b[i] b[i]

管理员每次经过某节点就相当于直接分发给居民。

管理员的车恰好能够走每条路两遍。

要求计算出管理员从开始配送到所有居民都能玩上游戏所用最少时间。

题目说明

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

思路

跟据题目要求,显然能够知道,题目要求求出所有居民中最后玩上游戏的居民所用时间,并且要求这个时间最小。

跟据题目说明,我们可以想到:对于同一个节点的子节点,大致的贪心思路是先遍历点权最大的节点

但是可能会出现一种情况(画的比较丑陋,多多见谅):
在这里插入图片描述

但是我们可以注意到题目有限制条件**“管理员的车恰好能够走每条路两遍”**,那么我们就不用考虑这种情况了。

一般地,我们用 f [ i ] f[i] f[i]表示节点 i i i这棵子树中的最大值 d e p [ i ] dep[i] dep[i]表示从节点 i i i出发遍历其子树并返回所用的总时间 b [ i ] b[i] b[i]表示点权

容易发现,这道题属于树形dp中的选择节点型,只不过需要判断的是选择子节点的先后顺序。

那么对应的状态转移方程即为:
f [ x ] = max ⁡ ( f [ x ] , d e p [ x ] + max ⁡ ( f [ i ] , f [ j ] + d e p [ i ] + 2 ) + 1 ) f[x]=\max(f[x], dep[x]+\max(f[i],f[j]+dep[i]+2)+1) f[x]=max(f[x],dep[x]+max(f[i],f[j]+dep[i]+2)+1)
其中 x x x为当前节点, i , j i,j i,j表示它的其中两个子节点。需要解释一下:

  • 方程中的+2是因为从一个子节点到另一个子节点的两段路。
  • 方程中的+1是因为从 x x x节点到子节点的一段路。

但是该这样进行状态转移,我们需要对子节点相互比较,其时间复杂度为 O ( n 2 ) O(n^2) O(n2),会超时。

我们考虑优化状态转移方程:

  • 如果先 i i i j j j max ⁡ ( f [ i ] , f [ j ] + d e p [ i ] + 2 ) \max(f[i],f[j]+dep[i]+2) max(f[i],f[j]+dep[i]+2)

  • 如果先 j j j i i i max ⁡ ( f [ j ] , f [ i ] + d e p [ j ] + 2 ) \max(f[j],f[i]+dep[j]+2) max(f[j],f[i]+dep[j]+2)

  • 因为 f [ i ] < f [ i ] + d e p [ j ] + 2 f[i] <f[i]+dep[j]+2 f[i]<f[i]+dep[j]+2 f [ j ] < f [ j ] + d e p [ i ] + 2 f[j]<f[j]+dep[i]+2 f[j]<f[j]+dep[i]+2

  • 原式可化为: max ⁡ ( f [ j ] + d e p [ i ] + 2 , f [ i ] + d e p [ j ] + 2 ) \max(f[j]+dep[i]+2,f[i]+dep[j]+2) max(f[j]+dep[i]+2,f[i]+dep[j]+2)

  • 即为: f [ i ] − d e p [ i ] < f [ j ] − d e p [ j ] f[i]-dep[i]<f[j]-dep[j] f[i]dep[i]<f[j]dep[j](当选 j j j时成立)

因此在判断选取子节点时,可以先对子节点按照上述不等式排序,即为选取子节点的先后顺序。

最后需要注意的是,dfs过程中我们并没有判断根节点的时间,需要输出时进行判断取 m a x max max

标程

#include<bits/stdc++.h>using namespace std;#define IOS ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
#define int long long 
#define ULL unsigned long long 
#define PII pair<int, int>
#define lowbit(x) (x & -x)
#define Mid ((l + r) >> 1)
#define ALL(x) x.begin(), x.end()
#define endl '\n'
#define fi first 
#define se secondconst int INF = 0x7fffffff;
const int Mod = 1e9 + 7;
const int N = 5e5 + 10;int n;
vector<int> a[N];
int b[N], dep[N], f[N];void dfs(int x, int y) {if(x != 1) f[x] = b[x];for(auto i : a[x]) {if(i == y) continue;dfs(i, x);}sort(ALL(a[x]), [](int n1, int n2) {return dep[n1] - f[n1] < dep[n2] - f[n2];});for(auto i : a[x]) {if(i == y) continue;f[x] = max(f[x], f[i] + dep[x] + 1);dep[x] += dep[i] + 2;}
}void Solved() {cin >> n;for(int i = 1; i <= n; i ++ ) {cin >> b[i];}for(int i = 1; i < n; i ++ ) {int x, y; cin >> x >> y;a[x].push_back(y); a[y].push_back(x);}dfs(1, 0);cout << max(f[1], dep[1] + b[1]) << endl;
}signed main(void) {IOSint ALL = 1; // cin >> ALL;while(ALL -- ) Solved();// cout << fixed;//强制以小数形式显示// cout << setprecision(N); //保留n位小数return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nuxt: generate打包后访问资源404问题

现象 使用Nuxt.js开发的个人页面&#xff0c;部署到nginx服务器中&#xff0c;/_nuxt/*.js、/_nuxt/*.css等静态问题不能访问&#xff0c;提示404错误。 而我们的这些资源文件是存在的。 解决方法 加上此处代码进行上下文配置 baseURL: /nuxt/ 此时在nginx配置 /nuxt 代理 lo…

张大哥笔记:穷人都在拼命挣钱,而富人都在努力让自己更值钱

最近行业大佬&#xff0c;纷纷网红化&#xff0c;比如周鸿祎&#xff0c;雷军&#xff0c;刘强东纷纷下场&#xff01; 大佬当网红&#xff0c;图啥&#xff1f;当然是图钱了。 大佬都很精的&#xff0c;他们老早就运用媒体的传播杠杆&#xff0c;把自己热度炒起来。 在不断…

屎山代码SSM转换Springboot

SSM项目转Springboot项目 最近很多人可能是在网上买的那种屎山代码&#xff0c;数据库都是拼音的那种 比如项目如下所示&#xff1a; 这种屎山代码我改过太多了&#xff0c;很多人可能无从下手&#xff0c;因为代码结构太混乱了&#xff0c;但是我改过太多这种代码&#xff0…

ASP+ACCESS公司门户网站建设

【摘 要】随着计算机科学的发展&#xff0c;数据库技术在Internet中的应用越来越广泛&#xff0c;为广大网络用户提供了更加周到和人性化的服务。本文讲解了一个公司的网站的建设&#xff0c;它基于数据关联规则的公司个性化页面及动态数据生成案例&#xff0c;在网页方面&…

编程基础:掌握运算符与优先级

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、运算符的基石&#xff1a;加减乘除 二、比较运算符&#xff1a;判断数值大小 三、整除…

【Redis】String源码剖析:512MB大字符串的内存管理之道

大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#xff0c;但是也想日更的人。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa…

13.js对象

定义 一种复杂数据类型&#xff0c;是无序的&#xff08;不保留键的插入顺序&#xff09;&#xff0c;以键值对&#xff08;{key:value})形式存放的数据集合 对象的创建 &#xff08;1&#xff09;字面量创建 var 对象名{ } &#xff08;2&#xff09;内部构造函数创建 v…

【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【iOS】——工厂设计模式

文章目录 一、设计模式创建型模式结构型模式行为型模式 二、设计模式七大准则三、简单工厂模式四、工厂方法模式五、抽象工厂模式 一、设计模式 设计模式是指在特定上下文中解决常见问题时所采用的一套可复用的解决方案。这些模式是面向对象编程中的通用概念&#xff0c;广泛应…

Docker安装OnlyOffice

工作需要&#xff0c;多人在线编辑同一文档&#xff0c;找了一圈发现onlyoffice满足需求&#xff0c;于是使用docker安装了社区版本。下面记录下安装过程。 Onlyoffice 是什么&#xff1f; Onlyoffice 是一个多端协同的 Office 办公套件&#xff0c;相当于微软的 Office365 全…

【Linux网络编程】传输层中的TCP和UDP(TCP篇)

【Linux网络编程】传输层中的TCP和UDP&#xff08;TCP篇&#xff09; 目录 【Linux网络编程】传输层中的TCP和UDP&#xff08;TCP篇&#xff09;TCP协议TCP协议段格式确认应答&#xff08;ACK&#xff09;机制&#xff08;保证可靠性&#xff09;超时重传机制连接管理机制理解T…

ingress-nginx控制器安装(ingress ImagePullBackOff )

支持的版本&#xff08;查看自己的kubernetes版本替换安装过程中的版本选择合适的版本安装&#xff09; 安装过程&#xff1a; 这里不采用helm的方式&#xff0c;而是采用YAML manifest的方式来安装。 下载ingress-nginx的https://raw.githubusercontent.com/kubernetes/ingr…

多线程事务

一、业务场景 我们在工作中经常会到往数据库里插入大量数据的工作&#xff0c;但是既需要保证数据的一致性&#xff0c;又要保证程序执行的效率。因此需要在多线程中使用事务&#xff0c;这样既可以保证数据的一致性&#xff0c;又能保证程序的执行效率。但是spring自带的Trans…

并发编程笔记7--并发编程基础

1、线程简介 1.1、什么是线程 现代操作系统中运行一个程序&#xff0c;会为他创建一个进程。而每一个进程中又可以创建许多个线程。现代操作系统中线程是最小的调度单元。 两者关系&#xff1a;一个线程只属于一个进程&#xff0c;而一个进程可以拥有多个线程。线程是一个轻量…

CS 下载安装详解

目录 CS简介&#xff1a; CS下载地址&#xff1a; CS的安装&#xff1a; CS简介&#xff1a; CS为目前渗透中常用的一款工具&#xff0c;它的强大在于控制windows木马&#xff0c;CS主要控制windows木马。 CS下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/…

WordPress Country State City Dropdown CF7插件 SQL注入漏洞复现(CVE-2024-3495)

0x01 产品简介 Country State City Dropdown CF7插件是一个功能强大、易于使用的WordPress插件,它为用户在联系表单中提供国家、州/省和城市的三级下拉菜单功能,帮助用户更准确地填写地区信息。同时,插件的团队和支持也非常出色,为用户提供高质量的服务。 0x02 漏洞概述 …

【Pytorch】【MacOS】14.m1芯片使用mps进行深度模型训练

读者要先自行安装python以及anaconda&#xff0c;并且配置pytorch环境 第一步 测试环境 import torch # 判断macOS的版本是否支持 print(torch.backends.mps.is_available()) # 判断mps是否可用 print(torch.backends.mps.is_built())如果第一个语句为False&#xff0c;说明当前…

Python简介

Python简介 1. Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构&#xff0c;它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言&#xff1a; 开发过程中没有了编译这个环…

AIGC-常见图像质量评估MSE、PSNR、SSIM、LPIPS、FID、CSFD,余弦相似度----理论+代码

持续更新和补充中…多多交流&#xff01; 参考: 图像评价指标PNSR和SSIM 函数 structural_similarity 图片相似度计算方法总结 MSE和PSNR MSE: M S E 1 m n ∑ i 0 m − 1 ∑ j 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 MSE\frac{1}{mn}\sum_{i0}^{m-1}\sum_{j0}^{n-1}[…

汽车展厅应用客流统计,洞察客户规律,完成热门车型分析

在汽车展厅中&#xff0c;客流统计正逐渐成为一项不可或缺的重要工具&#xff0c;它帮助我们洞察客户规律&#xff0c;从而能够更好地完成热门车型分析。 一、客流统计-客户画像分析 客流统计下的客户画像构建为我们提供了深入了解客户的途径。通过对进入展厅的人群进行细致分析…