[ZJOI2007]时态同步(树形DP+DFS)

2024-02-05 10:48

本文主要是介绍[ZJOI2007]时态同步(树形DP+DFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P1131 [ZJOI2007]时态同步
题目描述
小Q在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在一条通路(通路指连接两个元件的导线序列)。
在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点。而中间节点接收到激励电流后,得到信息,并将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终,激烈电流将到达一些“终止节点”――接收激励电流之后不再转发的节点。
激励电流在导线上的传播是需要花费时间的,对于每条边e,激励电流通过它需要的时间为te,而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路――即保持时态同步。由于当前的构造并不符合时态同步的要求,故需要通过改变连接线的构造。目前小Q有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请问小Q最少使用多少次道具才可使得所有的“终止节点”时态同步?
输入输出格式
输入格式:

第一行包含一个正整数N,表示电路板中节点的个数。
第二行包含一个整数S,为该电路板的激发器的编号。
接下来N-1行,每行三个整数a , b , t。表示该条导线连接节点a与节点b,且激励电流通过这条导线需要t个单位时间。
输出格式:

仅包含一个整数V,为小Q最少使用的道具次数。
输入输出样例
输入样例#1:

3
1
1 2 1
1 3 3
输出样例#1:

2
说明
对于40%的数据,N ≤ 1000
对于100%的数据,N ≤ 500000
对于所有的数据,te ≤ 1000000
思路:
这个题正解思路是树形DP,我的思路是两遍深度优先搜索(其实也是树形DP,只是累加的方式不同,但实质上就是树形DP)。
思路是这样的,对于这一棵树,我们执行第一遍DFS的时候是要调整好树上所有节点的属性,包括深度,节点到根节点的前缀和距离(因为后面的查询边权我是利用的前缀和搞的)这些。然后第二遍DFS是核心,首先递推到叶子节点,然后对于每一个有儿子节点的节点,我们比较它们的出度路径长度并找出最大值,以及它们的路径条数,既然每一个道具都是增加一个单位,我们还要尽可能的让它少用道具,那我们对每一个节点的所有出边的操作就是分别让经过这些子节点到达叶子节点的路径长度一致。而我们只能增加长度,所以我们要求一个最大值,让这些不是最大值的边向最大值靠拢,而所需要的代价就是最大值*出边数(使用道具以后的总时间)-出边边权总值(当前的总时间),对于每一次的代价用一个ANS来记录即可。
切记long long,不然会有两个点是WA了的,改了好几次TAT。

#include<iostream> 
#include<cstdio> 
#include<cstdlib> 
using namespace std;
long long i,j,m,n,s; 
long long hd[1000001],temp; 
long long ANS; 
long long deep[1000001],dis[1000001]; 
long long dismax; 
long long sum[1000001]; 
long long ma[1000001]; 
struct data 
{ 
long long v,t,nxt; 
}a[2000001]; 
long long r() 
{ 
long long ans=0; 
char ch=getchar(); 
while(ch<'0'||ch>'9') 
{ 
ch=getchar();
} 
while(ch>='0'&&ch<='9') 
{
ans*=10; 
ans+=ch-'0'; 
ch=getchar(); 
} 
return ans; 
} 
void add(long long x,long long y,long long z) 
{ 
a[++temp].v=y;
a[temp].t=z; 
a[temp].nxt=hd[x]; 
hd[x]=temp; 
} 
void dfs(long long x) 
{ 
for(long long p=hd[x];p;p=a[p].nxt) 
{ 
if(!deep[a[p].v]) 
{ 
deep[a[p].v]=deep[x]+1; 
dis[a[p].v]=dis[x]+a[p].t;
dfs(a[p].v); 
} 
} 
} 
void dfs2(long long x) 
{ 
long long mm=0,t=0; 
for(long long p=hd[x];p;p=a[p].nxt) 
{ 
if(deep[a[p].v]>deep[x])
{ 
dfs2(a[p].v); 
if(dis[ma[a[p].v]]-dis[x]>mm) 
{ 
ma[x]=ma[a[p].v];
mm=dis[ma[a[p].v]]-dis[x]; 
} 
sum[x]+=dis[ma[a[p].v]]-dis[x];
t++; 
} 
} 
ANS+=(dis[ma[x]]-dis[x])*t-sum[x]; 
} 
int main() 
{ 
n=r(); 
s=r(); 
long long xx,yy,zz; 
for(i=1;i<n;i++) 
{ 
xx=r(),yy=r(),zz=r(); 
add(xx,yy,zz); 
add(yy,xx,zz); 
} 
temp=0; 
deep[s]=1; 
dfs(s); 
for(i=1;i<=n;i++) 
{
dismax=max(dismax,dis[i]); 
ma[i]=i;
} 
dfs2(s); 
cout<<ANS; 
return 0; 
}/* 7 1 1 2 3 1 3 1 1 4 7 3 5 5 3 6 1 6 7 2 */

这里写图片描述

这篇关于[ZJOI2007]时态同步(树形DP+DFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680672

相关文章

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Nacos集群数据同步方式

《Nacos集群数据同步方式》文章主要介绍了Nacos集群中服务注册信息的同步机制,涉及到负责节点和非负责节点之间的数据同步过程,以及DistroProtocol协议在同步中的应用... 目录引言负责节点(发起同步)DistroProtocolDistroSyncChangeTask获取同步数据getDis

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上