洛谷 1099 ( bzoj 1999 ) [Noip2007]Core树网的核
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999
《算法竞赛进阶指南》346页。https://www.cnblogs.com/shenben/p/5895325.html
1.用随便一条直径算就行了。
由题知所有直径都有交点。故有公共部分。
如果分叉形状。核选在分叉后的地方,偏心距一定它是到直径的较远端点的距离。不然直径就不是最长的了。
核选在分叉前的地方,偏心距一定比上述距离短。不然直径就不是最长的了。所以选在分叉前的地方一定更优。
所有的分叉前的地方就是所有直径的公共部分。所以随便找一条直径求就行了。
2.核在不超限的情况下越长越好。所以在直径上弄两个指针,枚举核就是O(n)的了。
3.max( max( dis[k] ) , dis[ s~i ] , dis[ j~t ] ) ( k是 i ~ j 连出去的子树中的点 ) <==> max( max( dis[k] ) , dis[ s~i ] , dis[ j~t ] ) ( k是所有的点 )
之所以等价是因为对于一段核,直径上别的部分连出去的子树中的点到直径的距离一定小于第一个式子中的三个部分。不然直径就不是最长的了。
然后 max( dis[k] ) ( k是所有的点 ) 就是一个定值了!只要找一下上式后两个部分的min,最后和max( dis[k] )取个max就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=5e5+;
int n,s,head[N],xnt,fa[N],dis[N],ans,l0,l1;
bool vis[N];
struct Edge{
int next,to,w;
Edge(int n=,int t=,int w=):next(n),to(t),w(w) {}
}edge[N<<];
int rdn()
{
int ret=,fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=-;ch=getchar();}
while(ch>=''&&ch<='')(ret*=)+=ch-'',ch=getchar();
return ret*fx;
}
void add(int x,int y,int z)
{
edge[++xnt]=Edge(head[x],y,z);head[x]=xnt;
edge[++xnt]=Edge(head[y],x,z);head[y]=xnt;
}
void dfs(int cr,int f)
{
for(int i=head[cr],v;i;i=edge[i].next)
if((v=edge[i].to)!=f&&!vis[v])
{
dis[v]=dis[cr]+edge[i].w;
fa[v]=cr;dfs(v,cr);
}
}
int main()
{
n=rdn();s=rdn();int x,y,z;
for(int i=;i<n;i++)
{
x=rdn();y=rdn();z=rdn();
add(x,y,z);
}
dfs(,);l0=;
for(int i=;i<=n;i++)if(dis[i]>dis[l0])l0=i;
dis[l0]=;fa[l0]=;dfs(l0,);
for(int i=;i<=n;i++)if(dis[i]>dis[l1])l1=i;
ans=0x7fffffff;int j=l1;
for(int i=l1;i;i=fa[i])
{
vis[i]=;
while(j&&dis[i]-dis[fa[j]]<=s)j=fa[j];
ans=min(ans,max(dis[l1]-dis[i],dis[j]));
}
for(int i=;i<=n;i++)if(vis[i])dis[i]=,dfs(i,);
for(int i=;i<=n;i++)ans=max(ans,dis[i]);
printf("%d",ans);
return ;
}
洛谷 1099 ( bzoj 1999 ) [Noip2007]Core树网的核的更多相关文章
- bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostr ...
- [BZOJ1999][codevs1167][Noip2007]Core树网的核
[BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...
- BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP
BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...
- 【bzoj1999】[Noip2007]Core树网的核 树的直径+双指针法+单调队列
题目描述 给出一棵树,定义一个点到一条路径的距离为这个点到这条路径上所有点的距离的最小值.求一条长度不超过s的路径,使得所有点到这条路径的距离的最大值最小. 输入 包含n行: 第1行,两个正整数n和s ...
- [bzoj1999][noip2007]Core树网的核
好久没写题解了.这题不算太水就写一下题解. 话说回来,虽然不水但是挺裸.可以说题意即一半题解了. 我猜粘了题面也没有人去看的,所以直接人话题意了. 给一棵树,点数1e6,(当年noip的n当然是只有3 ...
- [Noip2007]Core树网的核
嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以). 可以证明,只要求出任意一条直径就行了,为什么呢 ...
- BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防
一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...
- 洛谷1099 [NOIP2007] 树网的核
链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...
- 洛谷 P3307: bzoj 3202: [SDOI2013] 项链
题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...
随机推荐
- 深入理解JVM 垃圾收集器(上)
HotSpot虚拟机中的垃圾收集器 GC评价标准 GC调优 响应时间 吞吐量 1.新生代收集器 Serial收集器 ParNew收集器 Parallel Scavenge收集器 2.老年代收集器 Se ...
- iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)
CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.XcodeColors是用于控制台着色的工具,配合着CocoaLumberjack用有更好的效果,不废话, ...
- fabric生产环境代码包发布管理
- 矩阵螺旋遍历Spiral Matrix,Spiral Matrix2
SpiralMatrix: Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...
- java接口调试思想
对于接口调试的理解:最近多次参与接口调试工作,一般情况都是获取对方接口文档,文档中有加密验证方式,根据加密验证方式开发,调用对应的接口.可以不可以简化这个流程那,至少减少一方的工作量.1.减少调用方法 ...
- scala学习手记6 - 字符串与多行原始字符串
scala中的字符串类就是java中的java.lang.String类.不过scala也为String提供了一个富封装类:scala.runtime.RichString. scala可以将java ...
- Hyper:基于Hypervisor的容器化解决方案
近日,初创公司HyperHQ发布了他们的开源项目Hyper,Hyper是一个可以在hypervisor上运行Docker镜像的引擎,它融合了Docker容器和虚拟机的优点,旨在打造一个性能更好.更安全 ...
- Shell for、while循环
先顺带说下 if 1. if 条件;then else fi 如果else分支没有执行语句,可以不写. 2. if 条件;then elif 条件;then else fi #!/bin/bash ...
- python中配置文件的使用
一. 什么是配置文件?为什么要做配置文件? 将所有的代码和配置都变成模块化可配置化,这样就提高了代码的重用性,不再每次都去修改代码内部,这个就是我们逐步要做的事情,可配置化 二. python中的Co ...
- uva 11825 巧妙地子集枚举方法
https://vjudge.net/problem/UVA-11825 题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务 ...