当前位置: 首页 > news >正文

[BZOJ1060][ZJOI2007]时态同步 树形dp

Description

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

Input

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

Output

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

Sample Input

3
1
1 2 1
1 3 3

Sample Output

2

HINT

N ≤ 500000,te ≤ 1000000

Solution

做法:树形dp

很容易想出来是树形dp(如果有基础的话)

式子也不难推

设$f[u]$表示从$u$到以它为根的子树中的叶子节点的最大距离

转移方程则为$f[u]=max(f[u],f[son]+e[i].v)$

然后答案就是$\sum f[u]-f[son]-e[i].v$

#include <bits/stdc++.h>

using namespace std ;

#define N 1000010
#define inf 0x3f3f3f3f
#define ll long long
#define int long long

int n , s , fa[ N ] , f[ N ] ;
int head[ N ] , cnt ; 
ll ans = 0 ;
struct node {
    int to , nxt , v ;
}e[ N ] ;
//f[i]表示i节点到叶子节点所需要花的最长时间 

void ins( int u , int v , int w ) {
    e[ ++ cnt ].to = v ;
    e[ cnt ].nxt = head[ u ] ;
    e[ cnt ].v = w ;
    head[ u ] = cnt ;
} 

void dfs1( int u ) {
    for( int i = head[ u ] ; i ; i = e[ i ].nxt ) {
        if( e[ i ].to == fa[ u ] ) continue ;
        fa[ e[ i ].to ] = u ;
        dfs1( e[ i ].to ) ;
    }
}

void dfs( int u ) {
    for( int i = head[ u ] ; i ; i = e[ i ].nxt ) {
        if( e[ i ].to == fa[ u ] ) continue ;
        dfs( e[ i ].to ) ;
        f[ u ] = max( f[ u ] , f[ e[ i ].to ] + e[ i ].v ) ; 
    }
    for( int i = head[ u ] ; i ; i = e[ i ].nxt ) {
        if( e[ i ].to != fa[ u ] ) {
            ans += f[ u ] - f[ e[ i ].to ] - e[ i ].v ;
        } 
    }
}

main() {
    scanf( "%lld%lld" , &n , &s ) ;
    for( int i = 1 ; i < n ; i ++ ) {
        int a , b , t ;
        scanf( "%lld%lld%lld" , &a , &b , &t ) ;
        ins( a , b , t ) ;
        ins( b , a , t ) ;
    }
    dfs1( s ) ;
    dfs( s ) ;
    printf( "%lld" , ans ) ;
    return 0 ;
} 

 

转载于:https://www.cnblogs.com/henry-1202/p/BZOJ1060.html

相关文章:

  • 2004-3-26+ 数据库连接字符串的简易表示法
  • Python基础-----函数式编程含义及特点(及尾递归)
  • 第一次用.net2.0 LOGIN登陆控件的困惑和解决方法。
  • docker 容器详解
  • 2分分页处理存储过程通用存储过程
  • 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)
  • QTP关于验证码的应用解决方法之一
  • [Swift]LeetCode217. 存在重复元素 | Contains Duplicate
  • 网管日志-06.07.18
  • unity 中 Tilemap的使用 笔记
  • 正版和盗版对开发的影响(请注意这个问题)
  • github上更新fork项目
  • 基于DBDataAccess类的具体数据访问类,这些代码大部分都可以自动生成。
  • 通俗易懂系列 | 设计模式(八):建造者模式
  • O血型的性格
  • ----------
  • [译]Python中的类属性与实例属性的区别
  • const let
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • httpie使用详解
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • React Transition Group -- Transition 组件
  • Sublime text 3 3103 注册码
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 安卓应用性能调试和优化经验分享
  • 回顾 Swift 多平台移植进度 #2
  • 盘点那些不知名却常用的 Git 操作
  • 前端性能优化--懒加载和预加载
  • 数组大概知多少
  • 异常机制详解
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • ${factoryList }后面有空格不影响
  • (4)STL算法之比较
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot教学评价 毕业设计 641310
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (十一)图像的罗伯特梯度锐化
  • (转)jQuery 基础
  • (转)关于pipe()的详细解析
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .“空心村”成因分析及解决对策122344
  • .gitignore文件设置了忽略但不生效
  • .Net Winform开发笔记(一)
  • .NET使用存储过程实现对数据库的增删改查
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解