题目描述

小 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%40%40% 的数据, N≤1000

对于 100%100%100% 的数据, N≤500000

对于所有的数据, te≤1000000




Solution

这道题,一开始想了一个很简单的贪心思路.

即先做一遍 遍历 ,找出当前到根节点距离最大的点的距离.

然后,再用 遍历一遍,将每个点都改成这个点的距离.再加到答案.结果发现全 WA ...




然后想了想,发现这样子会把我刚才统计到的最大的那个点也修改掉.然后就会导致不符合...

所以,再想了下优化,那么我们每次都统计一遍当前这个节点的子节点中到根节点距离最大的那个点.

那么我们每一需要修改的就是当前这个点的子树的最大距离减去其去往的点的子树的最大距离.

然后再搜一遍即可.


代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=500008;
struct sj{
ll to;
ll next;
ll w;
}a[maxn*2];
ll size,head[maxn];
ll n,s,v[maxn],tag;
ll now,f[maxn],ans; void add(ll x,ll y,ll z)
{
a[++size].to=y;
a[size].next=head[x];
head[x]=size;
a[size].w=z;
} void pre(ll x)
{
v[x]=1;
for(ll i=head[x];i;i=a[i].next)
{
ll tt=a[i].to;
if(!v[tt])
{
pre(tt);
f[x]=max(f[x],f[tt]+a[i].w);
}
}
} void dfs(ll x)
{
v[x]=1;
for(ll i=head[x];i;i=a[i].next)
{
ll tt=a[i].to;
if(!v[tt])
{
dfs(tt);
ans+=f[x]-f[tt]-a[i].w;
}
}
} int main()
{
ios::sync_with_stdio(false);
cin>>n>>s;
for(ll i=1;i<n;i++)
{
ll x,y,s;
cin>>x>>y>>s;
add(x,y,s);
add(y,x,s);
}
pre(s);
memset(v,0,sizeof(v));
dfs(s);
cout<<ans<<endl;
}

[ZJOI2007]时态同步 (树形DP)的更多相关文章

  1. 【BZOJ1060】[ZJOI2007]时态同步 树形DP

    [BZOJ1060][ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路 ...

  2. BZOJ 1060: [ZJOI2007]时态同步( 树形dp )

    坑爹...数据是错的..详见discuss  http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1060 先求根到叶子的距离最大值x, 然后把所有叶 ...

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

    Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路 ...

  4. BZOJ1060: [ZJOI2007]时态同步(树形dp 贪心)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3285  Solved: 1286[Submit][Status][Discuss] Descript ...

  5. Luogu P1131 [ZJOI2007]时态同步 树形DP

    要自下向上调整,尽可能用一个道具修改多个: 搜的时候记录叶节点的最大深度,减一下就好了. #include<cstdio> #include<iostream> #includ ...

  6. 洛谷 1131 [ZJOI2007]时态同步——树形dp

    题目:https://www.luogu.org/problemnew/show/P1131 因为越高,调节一个影响到的越多,所以底下只要把子树间的差异消除了就行了,与其他部分的差异由更高的边调节. ...

  7. 洛谷 P1131 [ZJOI2007]时态同步 树形DP

    题目描述 分析 我们从根节点开始搜索,搜索到叶子节点,回溯的时候进行维护 先维护节点的所有子节点到该节点最大边权(边权为叶子节点到同时到达它所需要时间) 然后维护答案,答案为最大边权减去所有到子节点的 ...

  8. 【BZOJ-1060】时态同步 树形DP (DFS爆搜)

    1060: [ZJOI2007]时态同步 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2101  Solved: 595[Submit][Statu ...

  9. LG1131 「ZJOI2007」时态同步 树形DP

    问题描述 LG1131 题解 正难则反,把从一个点出发到叶子结点看做从叶子结点走到那个点. DP方程很显然. \(\mathrm{Code}\) #include<bits/stdc++.h&g ...

随机推荐

  1. iOS打包上传app store各种问题解决总结

    问题1 this action could not be completed. try again 问题2 there was an error sending data to the iTunes ...

  2. JSON数组不用字符串转换的写法

    var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...

  3. 字符串赋值方式理解 sizeof 和strlen的一些区别

    #include<stdio.h>#include<string.h>  int main(){ int a,i=0; char ch[10000]; while(scanf( ...

  4. 历史管理 onhashchange

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Linux之Nginx服务 nfs文件存储 负载均衡

    一.搭建Nginx服务 Nginx 是俄罗斯人编写的十分轻量级的HTTP 服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个I ...

  6. springboot上传linux文件无法浏览,提示404错误

    1.配置文件地址置换 @Componentclass WebConfigurer implements WebMvcConfigurer { @Autowired ConfigUtil bootdoC ...

  7. 洛谷 P1126 机器人搬重物 (BFS)

    题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...

  8. shell脚本,计算学生分数的题目。

    1.计算学生平均分数的值是多少? 2.计算每门课都大于80分的学生姓名.3.计算每门课都小于90分的学生姓名.

  9. 连接器前置挂载U盾

    连接器前置挂载U盾 1. 宿主机配置及其信息 虚拟化软件版本 主机名 宿主机IP 账号及其密码 WorkStation windows idca- vm01 172.16.6.30 * Qemu-kv ...

  10. ios面试题(三)

    4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy) ...