这题其实有点骗人...

通过观察很容易发现:考虑某一些叶节点的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. selenium_采集药品数据

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  2. SQL记录-PLSQL基本语法与数据类型

    PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...

  3. Tomcat 或JBOSS java.lang.ArrayIndexOutOfBoundsException: 8192 解决方案【转】

    错误信息: 2017-1-17 10:09:39 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() ...

  4. error: control may reach end of non-void function [-Werror,-Wreturn-type]

    编译出现如下错误 error: control may reach end of non-void function [-Werror,-Wreturn-type] 这个错误可能和编译器有关(在相同代 ...

  5. 微信开发创业交流QQ群列表

    方倍工作室参与或主导的微信相关的QQ社群列表,欢迎对照加入. QQ群号 群名称 说明 推荐 518924126 微信平台开发有问必答 知识付费  ★★★★★ 188280503 微信公众平台开发最佳实 ...

  6. dijkstra补充

    dijkstra主要写法: priority_queue<pair<int,int> >q; //大根堆 //dis第一维为dis的相反数 void dijkstra(){ m ...

  7. linq to xml 简单的增、删、改、查、保存xml文件操作

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  8. Java EE之Struts2-2.5配置

    开学以来,已经三周了.Java EE却不太走心,于是,这几日空杯心态,重新学习.复习了Java SE和Java Web开发技术,然后入手Struts2.为了使用最新版本的Structs2,我去官网下载 ...

  9. TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'

    这个问题说的很清楚,就是类型不对,需要转化类型,首先讲一下这个问题是在使用pandas的resample函数激发的,官方文档解释的较为清楚,如下: Convenience method for fre ...

  10. sql server 查询某个时间段共有多少周及每周的日期段

    sql 语句 as wknum,dateadd(wk,number,'2017-01-01') as firstday, (,, then '2017-12-31' ,,'2017-01-01')) ...