想一下可以发现随便枚举一条直径做就可以了。

核越长越好。于是枚举核的过程可以做到O(n)

然后就是统计答案。

对于每个核最大偏心距肯定是核上面每个点不走核内的点所能走到的最远点的最值。

而且对于核的两端点,距离最远的点肯定是本条直径的端点。

于是我们可以用树形dp,处理出每个直径上的点不走本直径,所能走到的最远点的距离,记为f[]。

然后核每+1,就把当前点f[]塞到单调队列里面。每-1,就把队头弹出。

总共是O(N)。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <deque>
const int N = 300 + 9;
struct edge{int next,link,w;}es[N*2];
std::deque<int>q;
int dis[N],d_len,len[N],pre[N],p[N],f[N],max_dis[N],ec,son[N],n,s,ans = 0x7fffffff;
bool mark[N];
inline void addedge(const int x,const int y,const int z)
{
es[++ec].next = son[x];
son[x] = ec;
es[ec].link = y;
es[ec].w = z;
}
inline void Addedge(const int x,const int y,const int z){addedge(x,y,z);addedge(y,x,z);}
int bfs(const int s)
{
memset(dis,0,sizeof dis);
memset(pre,0,sizeof pre);
static std::queue<int>q;
for (q.push(s); !q.empty(); ) {
const int u = q.front(); q.pop();
for (int i = son[u]; i; i = es[i].next) {
const int v = es[i].link;
if (v == s || dis[v]) continue;
dis[v] = dis[u] + es[i].w;
pre[v] = u;
q.push(v);
}
}
int res = 1;
for (int i = 1; i <= n; ++i) if (dis[i] > dis[res]) res = i;
return res;
}
void find_diameter()
{
int t,s;
d_len = dis[t = bfs(s = bfs(1))];
while (t) {
mark[t] = true;
p[++p[0]] = t;
len[p[0]] = dis[t] - dis[pre[t]];
t = pre[t];
}
}
void dp(const int u,const int fa)
{
for (int i = son[u]; i; i = es[i].next) {
if (mark[es[i].link] || es[i].link == fa) continue;
dp(es[i].link,u);
f[u] = std::max(f[es[i].link] + es[i].w,f[u]);
}
}
int calc_dis(const int u)
{
memset(f,0,sizeof f);
dp(u,0);
return f[u];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("core.in","r",stdin);
freopen("core.out","w",stdout);
#endif
scanf("%d%d",&n,&s);
for (int i = 1,x,y,z; i < n; ++i) {
scanf("%d%d%d",&x,&y,&z);
Addedge(x,y,z);
}
find_diameter();
for (int i = 1; i <= p[0]; ++i) {
max_dis[i] = calc_dis(p[i]);
//printf("%d\n",max_dis[i]);
}
for (int i = 1,head = 1,sum = 0,front_dis = 0,tail_dis = 0; i <= p[0]; ++i) {
sum += len[i - 1];
tail_dis += len[i - 1];
while (sum > s) {
front_dis += len[head];
sum -= len[head++];
}
while (q.size() && q.front() < head) q.pop_front();
while (q.size() && max_dis[q.back()] <= max_dis[i]) q.pop_back();
q.push_back(i);
if (q.size()) ans = std::min(ans,std::max(max_dis[q.front()],std::max(d_len - tail_dis,front_dis)));
}
printf("%d\n",ans);
}

  

noip2007树网的核的更多相关文章

  1. Cogs 97. [NOIP2007] 树网的核 Floyd

    题目: http://cojs.tk/cogs/problem/problem.php?pid=97 97. [NOIP2007] 树网的核 ★☆   输入文件:core.in   输出文件:core ...

  2. [SDOI2011]消防/[NOIP2007] 树网的核

    消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的 ...

  3. NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防

    NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...

  4. noip2007 树网的核

    P1099 树网的核 112通过 221提交 题目提供者该用户不存在 标签动态规划树形结构2007NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 设T=(V, E, W) ...

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

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

  6. NOIP2007 树网的核 [提高组]

    题目:树网的核 网址:https://www.luogu.com.cn/problem/P1099 题目描述 设 T=(V,E,W)T=(V,E,W) 是一个无圈且连通的无向图(也称为无根树),每条边 ...

  7. BZOJ2282 SDOI2011消防/NOIP2007树网的核(二分答案+树形dp)

    要求最大值最小容易想到二分答案.首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的.那么如果剩下的点数量>=3,显然该答 ...

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

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

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

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

随机推荐

  1. select多选框

    select多选框 效果: 代码: <HTML> <HEAD> <TITLE>选择下拉菜单</TITLE> <meta http-equiv=&q ...

  2. spring-boot支持websocket

    spring-boot本身对websocket提供了很好的支持,可以直接原生支持sockjs和stomp协议.百度搜了一些中文文档,虽然也能实现websocket,但是并没有直接使用spring-bo ...

  3. SMTP暴力破解

    这里实现一个SMTP的暴力破解程序,实验搭建的是postfix服务器,猜解用户名字典(user.txt)和密码字典(password.txt)中匹配的用户名密码对, 程序开发环境是: WinXP VC ...

  4. favico.js笔记

    1. favicon.js是什么 一个js库可以使用徽标.图像.视频等来设置网页的favicon,即网页标题栏上的小图标. 2. 如何使用 2.1 使用徽标 basic demo: <!DOCT ...

  5. 安装node-sass的正确姿势【转】

    安装 node-sass 的时候总是会各种不成功,今天我琢磨了一会儿总算知道要怎么解决了. 首先要知道的是,安装 node-sass 时在 node scripts/install 阶段会从 gith ...

  6. lspci 虚拟机网卡对应关系

    我这个办法有点笨: 到 /sys/devices/ 下去搜索网卡 eth*,找到网卡对应的PCI 总线位置,例如:05:00.0. 然后通过 "lspci -s 05:00.0" ...

  7. Ubuntu10.04 下安装RabbitVCS

    安装RabbitVCS的方法步骤如下: 1.sudo add-apt-repository ppa:rabbitvcs/ppa       #将rabbitvcs的添加到源里面.(次操作会提示是否要添 ...

  8. KVC, KVO 实现原理

    Key-Value Coding: 键值编码 (KVC) 方法调用: // 对象属性 // 类似: Person -> name setValue: forKey: // 对象的属性或者 属性的 ...

  9. Python递归 — — 二分查找、斐波那契数列、三级菜单

    一.二分查找 二分查找也称之为折半查找,二分查找要求线性表(存储结构)必须采用顺序存储结构,而且表中元素顺序排列. 二分查找: 1.首先,将表中间位置的元素与被查找元素比较,如果两者相等,查找结束,否 ...

  10. Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常

    Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...