当前位置: 首页 > 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血型的性格
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【技术性】Search知识
  • leetcode-27. Remove Element
  • Mybatis初体验
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Vue--数据传输
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 关于使用markdown的方法(引自CSDN教程)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深入浅出webpack学习(1)--核心概念
  • 王永庆:技术创新改变教育未来
  • 携程小程序初体验
  • 移动端解决方案学习记录
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 如何用纯 CSS 创作一个货车 loader
  • # Apache SeaTunnel 究竟是什么?
  • # centos7下FFmpeg环境部署记录
  • #stm32驱动外设模块总结w5500模块
  • (02)Hive SQL编译成MapReduce任务的过程
  • (52)只出现一次的数字III
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (编译到47%失败)to be deleted
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (蓝桥杯每日一题)love
  • (南京观海微电子)——COF介绍
  • (算法)N皇后问题
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .Net Core与存储过程(一)
  • .net MySql
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET企业级应用架构设计系列之结尾篇
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [ 第一章] JavaScript 简史
  • [14]内置对象
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians