【BZOJ1999】树网的核
题目大意:题目过长,无法简单描述。。。
题解:
由于树网的核一定是树直径的一段,因此考虑先将直径取出,通过两次 BFS 即可。要求的东西是树上任意一点到这条取出的线段的距离的最大值,发现这个最大值有可能为三个值构成,首先是给定段到树直径的两个端点的距离,其次是树直径外的点到给的给定段的距离的最大值。到直径端点的值和直径外的点到给定段的值都可以 \(O(n)\) 预处理出来,最后采用双指针扫一遍取出的直径序列即可求出答案,总时间复杂度为 \(O(n)\)。
代码如下
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=5e5+10;
int n,s,d[maxn],pre[maxn],st,ed;
int dia[maxn],cnt,dmax;
bool vis[maxn];
queue<int> q;
struct node{
int nxt,to,w;
}e[maxn<<1];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w){
e[++tot]=node{head[from],to,w},head[from]=tot;
}
int bfs(int start){
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
d[start]=0,vis[start]=1,q.push(start);
while(q.size()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(vis[v])continue;
d[v]=d[u]+w,pre[v]=u;
vis[v]=1,q.push(v);
}
}
int mx=0,dst=0;
for(int i=1;i<=n;i++)if(d[i]>mx)mx=d[i],dst=i;
return dst;
}
void diameter(){
st=bfs(1);
ed=bfs(st);
int now=ed;
while(now!=st){
dia[++cnt]=d[now];
now=pre[now];
}
dia[++cnt]=0;
reverse(dia+1,dia+cnt+1);
}
void read_and_parse(){
scanf("%d%d",&n,&s);
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z),add_edge(y,x,z);
}
}
void dfs(int u){
vis[u]=1;
dmax=max(dmax,d[u]);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(vis[v])continue;
d[v]=d[u]+w;
dfs(v);
}
}
void solve(){
diameter();
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
for(int i=ed;i;i=pre[i])vis[i]=1;
for(int i=ed;i;i=pre[i])dfs(i);
int ans=0x3f3f3f3f;
for(int l=1,r=1;l<=cnt;l++){
while(r<=cnt&&dia[r]-dia[l]<=s)++r;
int ret=max(dia[l]-dia[1],dia[cnt]-dia[r-1]);
ans=min(ans,max(ret,dmax));
}
printf("%d\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【BZOJ1999】树网的核的更多相关文章
- [bzoj1999]树网的核
从下午坑到网上..noip的数据太弱,若干的地方写挂结果还随便过= = 最坑的就是网上有些题解没考虑周全... 第一步是找直径,用两次bfs(或者dfs,Linux下系统栈挺大的..)解决.找出其中一 ...
- 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]
洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...
- BZOJ1999 树网的核[数据加强版]
1999: [Noip2007]Core树网的核 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1214 Solved: 336[Submit][St ...
- [BZOJ1999] 树网的核 [数据加强版] (树的直径)
传送门 如果只是想验证算法正确性这里是洛谷数据未加强版 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenet ...
- 5.19[bzoj树网的核]
围观了final,SJTU还是飞了,泽民同志劲啊! 膜拜归膜拜...回来开题 bzoj1999树网的核 最近就喜欢给自己找切不动的题...QAQ ok.....昨天在家里做了一个下午+晚上 又困&am ...
- [BZOJ1999][codevs1167][Noip2007]Core树网的核
[BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...
- BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防
一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...
- bzoj1999 / P1099 树网的核
P1099 树网的核 (bzoj数据加强) 前置知识:树的直径 (并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE) 正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再 ...
- 【bzoj1999】[Noip2007]Core树网的核 树的直径+双指针法+单调队列
题目描述 给出一棵树,定义一个点到一条路径的距离为这个点到这条路径上所有点的距离的最小值.求一条长度不超过s的路径,使得所有点到这条路径的距离的最大值最小. 输入 包含n行: 第1行,两个正整数n和s ...
- [bzoj1999][noip2007]Core树网的核
好久没写题解了.这题不算太水就写一下题解. 话说回来,虽然不水但是挺裸.可以说题意即一半题解了. 我猜粘了题面也没有人去看的,所以直接人话题意了. 给一棵树,点数1e6,(当年noip的n当然是只有3 ...
随机推荐
- web开发(四) 一次性验证码的代码实现
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6426072.html>,在此仅供学习参考之用. 其实实现 ...
- Java学习之==>注释、数据类型、变量、运算符
一.注释 在Java中有3种标记注释的方式,最常用的方式是 // ,其注释的内容从 // 开始,到本行结束.但需要注意的是,我们不建议把注释写在代码的尾部(即尾注释),我们建议把注释写在代码的上一行, ...
- Oracle 笔记(四)
PLSQL编程[语法.plsql控制语句.异常.游标.触发器.存储过程] 1. PLSQL的语法–块编程 a) 概念:procedural language s ...
- 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】
old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...
- c++ 运算符 循环
运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 一.算术运算符 二.关系运算符 三.逻辑运算符 四.位运算符 位运算符作用于位,并逐位执行操作 假设如果 A = 60,且 ...
- 【MM系列】SAP S/4 HANA 1511的BP角色创建及供应商数据的创建方法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA 1511的 ...
- LeetCode.1005-K次取负数组和最大(Maximize Sum Of Array After K Negations)
这是悦乐书的第376次更新,第403篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第237题(顺位题号是1005).给定一个整数数组A,我们必须按以下方式修改数组:我们选 ...
- 【计算机视觉】Emvisi2
Emvisi2: A background subtraction algorithm, robust to sudden light changes Making Background Subtra ...
- vs2015中将复制过来的文件夹显示目录文件
先将文件夹和文件复制到VS程序所在的位置,点击解决方案资源管理器上的“显示所有文件”按纽,展开这个文件夹,这样你就可以看到这个文件或者文件夹了,这时,这个文件或者文件夹是虚线构成的.你右击这个文件或者 ...
- adb 打印kernel输出的log
一. linux 内核printk机制 1.1. Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出.与 ...