题目描述



分析

我们从根节点开始搜索,搜索到叶子节点,回溯的时候进行维护

先维护节点的所有子节点到该节点最大边权(边权为叶子节点到同时到达它所需要时间)

然后维护答案,答案为最大边权减去所有到子节点的边权。

然后维护父节点的边权,父节点边权为该节点子节点的 最大边权+父节点到该节点的时间。

然后就回溯,重复操作,到根节点为止。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;
typedef long long ll;
struct asd{
int from,to,next;
ll val;
}b[maxn];
int head[maxn],tot=1;
void ad(int aa,int bb,ll cc){
b[tot].from=aa;
b[tot].to=bb;
b[tot].next=head[aa];
b[tot].val=cc;
head[aa]=tot++;
}
ll f[maxn];
ll sum[maxn],ans[maxn];
ll siz[maxn];
void dfs(int now,int fa){
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
dfs(u,now);
sum[now]=max(sum[now],b[i].val+sum[u]);
}
}//第一遍dfs求出修改后m节点到叶子节点的权值之和
void dfs2(int now,int fa){
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
f[now]+=sum[now]-sum[u]-b[i].val;
dfs2(u,now);
f[now]+=f[u];
}
}//第二遍dfs求出修改以m节点为根的子树所需要的最小花费
int main(){
memset(head,-1,sizeof(head));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int aa,bb;
ll cc;
scanf("%d%d%lld",&aa,&bb,&cc);
ad(aa,bb,cc);
ad(bb,aa,cc);
}
dfs(m,0);
dfs2(m,0);
printf("%lld\n",f[m]);
return 0;
}

最新文章

  1. Fast RCNN 训练自己的数据集(3训练和检测)
  2. gulp使用笔记
  3. [LeetCode]题解(python):052-N-Queens II
  4. LINUX防火墙firewall、iptables
  5. Selenium 初见
  6. 【转】Android开发工具--android-studio-bundle-141.2288178
  7. Codeforces Round #261 (Div. 2)——Pashmak and Buses
  8. OC之KVC,KVO
  9. 生成订单:三个表(Products,Orders,OrderItem)
  10. ImageLoader配置(凝视)
  11. Python 基础【一】
  12. SQL SERVER数据库附加是只读的解决方法
  13. ResultHandler的用法
  14. Http协议和Https协议的安全性问题
  15. shell文件查找和压缩命令
  16. 20155237 第十一周java课堂程序
  17. Android模拟器内安装应用
  18. J2EE 13种技术规范
  19. (剑指Offer)面试题3:二维数组中的查找
  20. 003——数组(三)count()reset()end()prev()next()current()

热门文章

  1. 数组 &amp; 链表
  2. [C#.NET 拾遗补漏]05:操作符的几个骚操作
  3. numpy.random.randn()与numpy.random.rand()的区别
  4. Python中class的三种继承方法
  5. C#winform单线程事例与多线程事例
  6. String 的格式化
  7. windows10+office2019各版本激活密钥
  8. App接口设计之token的php实现
  9. redis 的简明教程
  10. (一)Log4j使用