这题其实有点骗人...

通过观察很容易发现:考虑某一些叶节点的LCA,由于根节点到这个LCA的距离唯一,故要求这些叶节点到这一LCA的距离都相等

于是我们仅需dfs,找到次底层的节点,然后使这些节点的子节点到这些节点的距离都相等即可

再向上回溯,算法完全相同,仅需把下面的距离累计到该节点向上的边即可

用图理解一下:

如图所示,所有蓝边长度应当相同,红边长度相同,绿边长度相同

那么我们就找出蓝边中长度最长的一个,然后将所有边长变成他就可以了

然后向上回溯:

如图所示,将蓝边边权累计到黄边上,将红边累积到紫边上,将绿边累计到橙边上,然后令黄边,紫边,橙边长度相同即可

贴代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
struct Edge
{
int next;
int to;
int val;
}edge[1000005];
int head[500005];
int dis[500005];
int cnt=1;
int f[500005];
void add(int l,int r,int w)
{
edge[cnt].to=r;
edge[cnt].next=head[l];
edge[cnt].val=w;
head[l]=cnt++;
}
void dfs(int x,int fx)//O(n)
{
f[x]=fx;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(to==fx)
{
continue;
}
dfs(to,x);
}
}
ll tot=0;
void dfs2(int rt,int frt)//O(n*log2n)
{
for(int i=head[rt];i!=-1;i=edge[i].next)//O(n*log2n)
{
int to=edge[i].to;
if(to==frt)
{
continue;
}
dfs2(to,rt);
}
priority_queue <int> M;
for(int i=head[rt];i!=-1;i=edge[i].next)//O(log2n)
{
int to=edge[i].to;
if(to==frt)
{
continue;
}
M.push(edge[i].val);
}
if(!M.empty())
{
int l=M.top();
M.pop();
while(!M.empty())//O(n*log2n)
{
int l1=M.top();
M.pop();
tot+=(ll)l-l1;
}
for(int i=head[frt];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(to==rt)
{
edge[i].val+=l;
break;
}
}
}
}
int main()
{
memset(head,-1,sizeof(head));
int n;
scanf("%d",&n);
int rt;
scanf("%d",&rt);
for(int i=1;i<n;i++)
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
add(x,y,v);
add(y,x,v);
}
dfs(rt,rt);
dfs2(rt,rt);
printf("%lld\n",tot);
return 0;
}

bzoj 1060的更多相关文章

  1. BZOJ 1060: [ZJOI2007]时态同步

    Description 一个有根树,你只能进行增加操作,问你将所有叶节点到根的路径权值相同至少需要增加几次. Sol 我也不知道该叫什么算法... 反正就是记录一下到子节点到当前节点的最大距离统计答案 ...

  2. bzoj 1060 [ZJOI2007]时态同步(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1060 [题意] 求最少的增加量,使得以rt为根的树中由一个结点出发的所有到叶子结点的路 ...

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

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

  4. 【BZOJ 1060】 1060: [ZJOI2007]时态同步 (树形DP)

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

  5. BZOJ 1060 时态同步

    贪心. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  6. bzoj 1060 贪心

    设根到每个叶子节点的距离为dis,比较容易的看出来,我们需要把这颗树的所有叶子节点的值都变成其中最大的内个,我们设为max,那么对于一颗子树来说,设其中dis值最大的为x,我们需要将这个子树根节点和子 ...

  7. bzoj 1060: [ZJOI2007]时态同步【树形dp】

    可能算不上dp,大概是个树形模拟 先一遍dfs算出f[u]为每个点最深的叶子到u的距离,然后再dfs一下,ans加上f[u]-f[e[i].to]-e[i].va,f[u]-f[e[i].to]是这条 ...

  8. BZOJ 1060: [ZJOI2007]时态同步 树上问题 + 贪心

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

  9. 洛谷 P1131 BZOJ 1060 [ZJOI2007]时态同步

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

随机推荐

  1. Hibernate_事务管理

    今天学习Hibernate,发现当我在执行下面操作时,不会对数据库产生任何效果,就是说Customer对象并不会保存到数据库中 Session session = HibernateUtils.ope ...

  2. MapReduce与关系型数据库的不同之处。

    MapReduce能够被视为RDBMS(关系型数据库)的补充. 1.MapReduce适合处理那些需要分析整个数据集的问题(日志分析等),以批处理的方式.RDBMS适合做点查询和更新. 2.MapRe ...

  3. Swift学习笔记4

    1.延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用lazy来标示一个延迟存储属性. 必须将延迟存储属性声明成变量(使用var关键字),因为属性的初始值可能在实例构造完成之 ...

  4. vscode vue代码提示错误

    在用vscode编写vue代码时,因为安装的有vetur插件,所以当代码中有v-for语法时,会提示 [vue-language-server] 'v-for' directives require ...

  5. PageRank简单实现中的一个错误

    在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的.这个错误也体现出我当时对PageRank算法有理解上的偏差. 这是个什么样的错误呢?是这样的: 简单实现中计算每个 ...

  6. pygame中多个class类之间的关系

    用一个实例介绍一下有关pygame中不同类之间的通信,详细介绍在代码段有标注,感兴趣的可以复制代码试试: import pygame import sys # -------------------- ...

  7. saltstack系列~第一篇

    一 简介:从今天开始学习saltstack 二 salt的认证系列操作 1 原理 saltstack通过/etc/salt/pki/目录下面的配置文件的密钥进行通信,master端接受minion端后 ...

  8. Python 入门基础20 --面向对象_继承、组合

    今日内容 组合:自定义类的对象作为类的属性 继承:父类与子类.多继承 1.组合 将自定义类的对象作为类的属性 class Teacher: def __init__(self, name): self ...

  9. session和cookies

    Cookie 与session的产生过程                                 我们都知道HTTP协议本身是无状态的,客户只需要简单的向服务器来发送请求下载某些文件,客户端向 ...

  10. android 基础题

    1. Android的四大组件是哪些,它们的作用? (1).Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很 ...