好久没写题解了.这题不算太水就写一下题解. 话说回来,虽然不水但是挺裸.可以说题意即一半题解了. 我猜粘了题面也没有人去看的,所以直接人话题意了. 给一棵树,点数1e6,(当年noip的n当然是只有300了,,),就管他叫树网. 首先定义树的直径:树上最远点对之间的路径.我们定义树的一个点到一段路径的距离是:点和路径上最近的点之间路径长. 然后定义一段路径的偏心距ecc:除了这这路径上的点,其他点到这条路径的距离中的max.(和所有点没区别) 现在要求出这样一个路径,它在一条直径上(直径可能不止…
NOIP的数据好水,一开始有好几个错结果NOIP数据就水过了?? [题目大意] 求无根树的直径上一段不超过S长的链,使得偏心距最小.具体概念见原题. [思路] 首先明确几个性质: (1)对于树中的任意一点,距离其最远的点一定是树的直径的某一端点. (2)所有的直径是等价的,即任意一条所能求出的该最小偏心距相等. 于是我们可以用两次dfs求出直径.任取一个点找到离它最远的点r,再从r找到距离它最远的点l.l到r的路径就是直径. 显然在长度不超过S的情况下,链最长最好.在l到r上维护尽可能长的链,找…
[BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点. 路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a,b)表示以a,b为端点的路径的长度,它是该路径上各边长度之和.我们称d(a,b)为a,b两结点间的距离. 一点v到一条路径P的距离为该…
BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点. 路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a,b)表示以a,b为端点的路径的长度,它是该路径上各边长度之和.我们称d(a,b)为a,b两结点间的距离. 一点v到一条路径P…
1999: [Noip2007]Core树网的核 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1214  Solved: 336[Submit][Status][Discuss] Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点. 路径:树网中任何两结点a,b都存在唯…
题目描述 给出一棵树,定义一个点到一条路径的距离为这个点到这条路径上所有点的距离的最小值.求一条长度不超过s的路径,使得所有点到这条路径的距离的最大值最小. 输入 包含n行: 第1行,两个正整数n和s,中间用一个空格隔开.其中n为树网结点的个数,s为树网的核的长度的上界.设结点编号依次为1, 2, ..., n. 从第2行到第n行,每行给出3个用空格隔开的正整数,依次表示每一条边的两个端点编号和长度.例如,“2 4 7”表示连接结点2与4的边的长度为7. 所给的数据都是正确的,不必检验. 输出…
传送门 如果只是想验证算法正确性这里是洛谷数据未加强版 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点. 路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a,b)表示以a,b为端点的路径的长度,它是该路径上各边长度之和.我们称d(a,b)为a,b两结点间的距离. 一点v到一条路径P的距离为该点与P上的最…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999 <算法竞赛进阶指南>346页.https://www.cnblogs.com/shenben/p/5895325.html 1.用随便一条直径算就行了. 由题知所有直径都有交点.故有公共部分. 如果分叉形状.核选在分叉后的地方,偏心距一定它是到直径的较远端点的距离.不然直径就不是最长的了. 核选在分叉前的地方,偏心距一定比上述距离短.不然直径就不是最长的了.所以选在分叉前的地方一定…
嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以). 可以证明,只要求出任意一条直径就行了,为什么呢?考虑一下,如果我们在直径上选了一段,那么最远偏心距可肯定是到直径两端的最大值,和直径外的点无关,只和直径的长度有关. 于是我们求完了直径.然后在直径上搞一搞:很容易想到,如果当前选了一段长度为a,他还可以延伸为b,且a < b < s,那么b的答案一定比a优.因此我们建立一个双指针L,R,代表当…
我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostream> #include<cstdio> using namespace std; const int N=500005; int n,m,h[N],cnt,d[N],s,t,mx,f[N],ans=1e9,q[N],tot,l,r; bool v[N]; struct qwe { int…