noip2007树网的核
想一下可以发现随便枚举一条直径做就可以了。
核越长越好。于是枚举核的过程可以做到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树网的核的更多相关文章
- Cogs 97. [NOIP2007] 树网的核 Floyd
题目: http://cojs.tk/cogs/problem/problem.php?pid=97 97. [NOIP2007] 树网的核 ★☆ 输入文件:core.in 输出文件:core ...
- [SDOI2011]消防/[NOIP2007] 树网的核
消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的 ...
- NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防
NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...
- noip2007 树网的核
P1099 树网的核 112通过 221提交 题目提供者该用户不存在 标签动态规划树形结构2007NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 设T=(V, E, W) ...
- 洛谷1099 [NOIP2007] 树网的核
链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...
- NOIP2007 树网的核 [提高组]
题目:树网的核 网址:https://www.luogu.com.cn/problem/P1099 题目描述 设 T=(V,E,W)T=(V,E,W) 是一个无圈且连通的无向图(也称为无根树),每条边 ...
- BZOJ2282 SDOI2011消防/NOIP2007树网的核(二分答案+树形dp)
要求最大值最小容易想到二分答案.首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的.那么如果剩下的点数量>=3,显然该答 ...
- [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 ...
随机推荐
- laravel后台返回ajax数据
后台模式: $array = array('msg'=>'添加失败!','status'=>'false'); return json_encode($array); 前台显示: $.aj ...
- 线程句柄和线程ID的区别
●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...
- weblogic 开启注意问题
1.关闭防火墙 service iptables stop chkconfig iptables off 2.weblogic unable to get file lock问题 我的解决办法是ps ...
- supervisor之启动rabbitmq报错原因
前言 今天重启了服务器,发现supervisor管理的rabbitmq的进程居然启动失败了,查看日志发现老是报错,记录一下解决的办法. 报错:erlexec:HOME must be set 找了网上 ...
- WebHeaderCollection类
.net添加http报头 string[] allKeys = WebHeaderCollection.AllKeys; for (int i = 0; i < allKeys.Length; ...
- Tutorial 1: Serialization
转载自:http://www.django-rest-framework.org/tutorial/1-serialization/#tutorial-1-serialization Tutorial ...
- C/C++——[04] 语句
在 C/C++语言中,语句以“ :”结束.某些情况下,一组语句在一起共同完成某一特定的功能,可以将它们用大括号括起来.我们称之为语句组.语句组可以出现在任何单个语句出现的地方. 1. 分支语句 一般情 ...
- C# winform或控制台Properties.Settings.Default的使用及存储位置
C# winform或控制台Properties.Settings.Default的使用及存储位置 作者的程序 是MmPS.ClientForm.exe,使用Properties.Settings.D ...
- Django 注册
一. 本地图片上传预览 1. 上传文件框隐藏到图片上面,点击图片相当于点上传文件框 <div class="login"> <div style="po ...
- 洛谷P1319压缩技术 题解
题目传送门 这道题是入门难度的题.特别水...QWQ...... #include<bits/stdc++.h> using namespace std; *],top; int main ...