题目: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树网的核的更多相关文章

  1. bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】

    我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostr ...

  2. [BZOJ1999][codevs1167][Noip2007]Core树网的核

    [BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...

  3. BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP

    BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...

  4. 【bzoj1999】[Noip2007]Core树网的核 树的直径+双指针法+单调队列

    题目描述 给出一棵树,定义一个点到一条路径的距离为这个点到这条路径上所有点的距离的最小值.求一条长度不超过s的路径,使得所有点到这条路径的距离的最大值最小. 输入 包含n行: 第1行,两个正整数n和s ...

  5. [bzoj1999][noip2007]Core树网的核

    好久没写题解了.这题不算太水就写一下题解. 话说回来,虽然不水但是挺裸.可以说题意即一半题解了. 我猜粘了题面也没有人去看的,所以直接人话题意了. 给一棵树,点数1e6,(当年noip的n当然是只有3 ...

  6. [Noip2007]Core树网的核

    嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以). 可以证明,只要求出任意一条直径就行了,为什么呢 ...

  7. BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防

    一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...

  8. 洛谷1099 [NOIP2007] 树网的核

    链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...

  9. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

随机推荐

  1. 利用Metasploit进行Linux提权

    利用Metasploit进行Linux提权 Metasploit 拥有msfpayload 和msfencode 这两个工具,这两个工具不但可以生成exe 型后门,一可以生成网页脚本类型的webshe ...

  2. 《Pro Git》第1章 起步

    关于版本控制 什么是版本控制:记录文件内容变化,将来可查阅特定版本修订情况的系统. 版本控制演进 1)本地版本控制系统 2)集中化的版本控制系统(Centralized Version Control ...

  3. [BZOJ1587]叶子合并leaves

    Description 在一个美丽的秋天,丽丽每天都经过的花园小巷落满了树叶,她决定把树叶堆成K堆,小巷是笔直的 共有N片树叶(树叶排列也是笔直的),每片树叶都有一个重量值,并且每两片想邻的树叶之间的 ...

  4. 查找java程序进程快速指令jps

    通过jdk1.5以后内置的一个指令,可以快速查找java进程pid,该命令是:jps 位置在:JAVA_HOME/bin/目录下面 功能 jps(Java Virtual Machine Proces ...

  5. Node.js 项目的配置文件

    在 Node.js 中可以通过process.env来访问当前的环境变量信息,比如: { PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', T ...

  6. struts2取值

    http://www.cnblogs.com/yangy608/archive/2010/11/23/1885256.html struts2取值 1.标签取值方式一 通过<s:property ...

  7. 常见linux系统中RPM包的通用命名规则

    本文重点说一下在常见的linux系统中,RPM包通用的命名规则. RPM包的一般格式为:name-version-arch.rpmname-version-arch.src.rpm 例:httpd-2 ...

  8. tyvj 1056 能量项链 区间dp

    P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩 ...

  9. 把本地jar包发布到maven私服和本地maven库

    有时时候下载了jar包,但发现maven库里没有,可以将jar包上传到本地私服和本地maven库: 1.上传到本地私服 mvn deploy:deploy-file -Dfile=D:\GETUI_S ...

  10. iptables(四)iptables匹配条件总结之一

    经过前文的总结,我们已经能够熟练的管理规则了,但是我们使用过的"匹配条件"少得可怜,之前的示例中,我们只使用过一种匹配条件,就是将"源地址"作为匹配条件. 那么 ...