[ZJOI2007] 时态同步

news/2024/9/17 21:08:41/文章来源:https://www.cnblogs.com/wyl123ly/p/18407887

[ZJOI2007] 时态同步

题目描述

小 Q 在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字 \(1,2,3\cdots\) 进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在一条通路(通路指连接两个元件的导线序列)。

在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点。而中间节点接收到激励电流后,得到信息,并将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终,激励电流将到达一些“终止节点”――接收激励电流之后不再转发的节点。

激励电流在导线上的传播是需要花费时间的,对于每条边 \(e\),激励电流通过它需要的时间为 \(t_e\),而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路――即保持时态同步。由于当前的构造并不符合时态同步的要求,故需要通过改变连接线的构造。目前小 Q 有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请问小 Q 最少使用多少次道具才可使得所有的“终止节点”时态同步?

输入格式

第一行包含一个正整数 \(N\),表示电路板中节点的个数。

第二行包含一个整数 \(S\),为该电路板的激发器的编号。

接下来 \(N-1\) 行,每行三个整数 \(a,b,t\)。表示该条导线连接节点 \(a\) 与节点 \(b\),且激励电流通过这条导线需要 \(t\) 个单位时间。

输出格式

仅包含一个整数 \(V\),为小 Q 最少使用的道具次数。

样例输入

3
1
1 2 1
1 3 3

样例输出

2

树形DP:

设计状态 \(dp_i\) 为以 \(i\) 为根节点下所用道具的最小次数,此状态不能直接转移。

设计辅助数组 \(val_i\) 表示 \(i\) 节点到以 \(i\) 为根节点的子树中到各个叶子节点的路径的最大值。

\(val\) 数组的转移:

$ val_i = max(val_{to_i} + to_{val} , val_i)$

\(dp\) 数组的转移:

\(dp_i = \sum dp_{to_i} + val_i - (val_{to} + to_{val})\)

其中 \(to_{val}\) 表示 \(i \to to\) 的边权

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define int long long
const int MAXN = 5e5 + 7;
int n,r;
int x,y;
int dp[MAXN],val[MAXN];
struct NODE{int to,val;
};
vector<NODE> tree[MAXN];
void sumup(int pos,int fa){for(NODE to : tree[pos]){if(to.to != fa){sumup(to.to,pos);val[pos] = max(val[pos],val[to.to] + to.val);}}
}
void dfs(int pos,int fa){for(NODE to : tree[pos]){if(to.to != fa){dfs(to.to,pos);dp[pos] += dp[to.to] + val[pos] - (val[to.to] + to.val);}}
}
signed main(){scanf("%lld%lld", &n, &r);for(int i = 1;i < n;i++){int val;scanf("%lld%lld%lld", &x, &y, &val);tree[x].push_back({y,val});tree[y].push_back({x,val});}sumup(r,0);dfs(r,0);cout<<dp[r]<<endl;return 0;
}

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

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

相关文章

[Python] Python 基础教程

1 概述 1.1 简介Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。https://www.python.org/Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。 像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。…

从数据洞察到智能决策:合合信息infiniflow RAG技术的实战案例分享

从数据洞察到智能决策:合合信息&infiniflow RAG技术的实战案例分享从数据洞察到智能决策:合合信息&infiniflow RAG技术的实战案例分享 标题取自 LLamaIndex,这个内容最早提出于今年 2 月份 LlamaIndex 官方博客。从 22 年 chatGpt 爆火,23 年大模型尝鲜,到 24 年真…

数据飞轮转进快递行业 能够为企业带来哪些新想象

快递行业的2024年下半场竞赛已然开始,鉴于双11、年货节等电商营销重要节点都集中在下半年,流转出快递行业在下半年的巨大市场机会,数据飞轮或许能成为更多快递企业的增长动力,转出更为稳健的业绩增长。更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【…

手动用梯度下降法和随机梯度下降法实现一元线性回归

手动用梯度下降法和随机梯度下降法实现一元线性回归(超详细)手动用梯度下降法实现一元线性回归 实验目的 本次实验旨在通过手动实现梯度下降法和随机梯度下降法来解决一元线性回归问题。具体目标包括:生成训练数据集,并使用matplotlib进行可视化。 设计一个`LinearModel`类…

[JavaScript] 事件委托以及 Vue 列表循环事件绑定的性能优化

前言 事件委托(Event Delegation) 是一种通过将事件监听器绑定到父元素,而不是直接绑定到每个子元素上的技术。这样可以减少事件监听器的数量,提升性能,并使得对动态添加或移除的元素更容易进行事件处理。 事件冒泡和事件捕获 事件冒泡:从里往外 <div id="parent…

GT收发器

1.GT触发器的IP使用 第一页 第二页 第三页 GTP IP 提供了两种解决跨时钟域的方法:(1)RX Elastic Buffer(RX 弹性缓冲器);(2)RX Phase Alignment(RX 相位对齐电路),两种方法的比较:RXElastic Buffer优点在于稳定,易使用, 执行相位校准的速度快,但是需要时钟和通道进…

Qt 中实现异步散列器

在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件。 而在 Qt 中,负责这项工作的类为 `QCryptographicHash`。 虽然 `QCryptographicHash `很优秀,但它最大的问题在于其散列值的计算是同步的( 即阻塞 ),对小数据来说并没什么影响,但对大数据来说则意味明…

新建工程——STM32学习笔记2

目录新建工程 添加启动程序Start 添加内核程序Core相关资料下载 下载链接(来自B站江协科技) 通过百度网盘分享的文件:STM32入门教程资料 链接:https://pan.baidu.com/s/17_sbwMXU-xBVFA2sK0smrg?pwd=cgn6 提取码:cgn6STM32开发方式有3种,分别是基于寄存器开发、基于标准…

Java八股复习指南-集合

Java集合 Map HashMap 实现原理/底层 Java1.8之前:数组加链表 Java1.8之后:当一个链表的长度超过8,且数组大小超过64时,会将链表转换成红黑树存储,查找效率更高,时间复杂度O(log n)。如果长度超过8,但是数组容量不足64,则会选择扩容数组。 定位算法 计算key的哈希值,并…

幂函数与指数函数区别

本文来自博客园,作者:cytlz2730,转载请注明原文链接:https://www.cnblogs.com/cytwjyy/p/18407701

zabbix“专家坐诊”第255期问答

问题一 Q:大家好,问一下,zabbix做聚合图的时候,可以做到两根线在一个图里- 吗?还是说只能,单边计算聚合,然后再最后作图的时候,添加两条线上去A:两个数据吗 Q:是的。一个端口,有进有出 A:如果是两个监控项可以做到聚和一起问题二 Q:请问大佬们,这个加密是干嘛的?…