题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999

    https://www.luogu.org/problemnew/show/P1099

“分析性质,O(n)扫描”

看了半天才懂...发现自己对树的直径的相关知识太不熟了...

这篇博客的讲解很详细:https://www.cnblogs.com/shenben/p/5895325.html

说一下自己的理解:

1.每个直径对答案的贡献是相同的;

因为所有直径都相交,所以不妨考虑公共部分和分叉部分;

会发现分叉部分的答案不如公共部分优,因为我们要取最小的偏心距,而分叉部分的偏心距一定会覆盖公共部分;

所以只需要找出一条直径来做;

2.一条直径上找最小偏心距,一定在“核”最长的时候找;

这个很容易想到,因为长“核”一定不会劣于短“核”;

3.对于一个“核”,有三个值可以更新它的偏心距:

①直径上的两端到“核”的两端的两个距离;

②“核”上所有点到直径外子树的最长距离;

其中的①,许多“核”会重复求同样的值,所以干脆把它扩展到整条直径上的点到直径外子树的最大距离,求一遍即可;

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=;
int n,s,head[maxn],ct,dis[maxn],fa[maxn],l,l2;
bool vis[maxn];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxn<<];
void add(int x,int y,int z){edge[++ct]=N(y,head[x],z); head[x]=ct;}
int rd()
{
int ret=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret*f;
}
void dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(vis[u]||u==fa[x])continue;
dis[u]=dis[x]+edge[i].w;
fa[u]=x; dfs(u);
}
}
int main()
{
n=rd(); s=rd();
for(int i=,x,y,z;i<n;i++)
{
x=rd(); y=rd(); z=rd();
add(x,y,z); add(y,x,z);
}
l=; l2=;
dis[l]=; fa[l]=; dfs(l);
for(int i=;i<=n;i++)
if(dis[i]>dis[l])l=i;
dis[l]=; fa[l]=; dfs(l);
for(int i=;i<=n;i++)
if(dis[i]>dis[l2])l2=i;
int ans=0x3f3f3f3f,j=l2;
for(int i=l2;i;i=fa[i])
{
while(fa[j]&&dis[i]-dis[fa[j]]<=s)j=fa[j];
ans=min(ans,max(dis[j],dis[l2]-dis[i]));//min,max
}
for(int i=l2;i;i=fa[i])vis[i]=;
for(int i=l2;i;i=fa[i])dis[i]=,dfs(i);
for(int i=;i<=n;i++)ans=max(ans,dis[i]);//max
printf("%d",ans);
return ;
}

最新文章

  1. 详解java方法的重载
  2. Kafka——分布式消息系统
  3. Ubuntu 利用 xinetd 限制 SSH 连接数
  4. 重构第20天 提取子类(Extact SubClass)
  5. C#借助谷歌翻译实现翻译小工具(二)添加托盘图标
  6. 结论: blocking_query 是当前堵塞其他会话正在运行的SQL.而不是原始堵塞SQL
  7. android退出Activity
  8. 使用unity创建塔防游戏(原译)(part1)
  9. DDMS工具使用(转)
  10. Java如何判断字符串中包含有全角,半角符号
  11. React中父组件与子组件之间的数据传递和标准化的思考
  12. uvalive 2965 Jurassic Remains
  13. [LeetCode] Employee Importance 员工重要度
  14. 【Vue】动态加载Html片段
  15. Web 前端编程运维必备
  16. 开源项目Zookeeper、Doozer、etcd进行总结
  17. linux常用命令:pwd 命令
  18. github 最新项目快报
  19. 关于PHP中的 serialize () 和 unserialize () 的使用(即关于PHP中的值与已存储的表示的相互转换)
  20. SpringBoot入门篇--Thymeleaf引擎模板的基本使用方法

热门文章

  1. leetcode-169求众数
  2. 张小龙最新内部演讲:KPI 是副产品,警惕复杂流程
  3. 2015 湘潭大学程序设计比赛(Internet)部分题解,其中有一个题与NYOJ1057很像,贪心过~~
  4. 食物(bzoj 3280)
  5. memcache 原理 &amp; 监测 &amp; 查看状态 &amp; stats &amp; 结构
  6. 【ZJOI2017 Round1游记】
  7. P1765 手机_NOI导刊2010普及(10)
  8. MongoDB小结27 - 聚合管道【$project】
  9. 【转】基于Linux下的TCP编程
  10. Core Data 的简单使用