【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 ...
随机推荐
- redhat下配置SEED DVS6446开发环境3
1.运行arm_v5t_le-gcc,报错为: 64bit的Linux操作系统,无法运行32bit的应用程序 /lib/ld-linux.so.2: bad ELF interpreter: No s ...
- datagrid——jQuery EasyUI
API文档:[http://www.jeasyui.com/documentation/datagrid.php] 一.创建datagrid 在页面上添加一个div或table标签,然后用jquery ...
- Mybatis 之 SQL生成技巧
一.增 1.<trim> 和<if>实现数据插入 <insert id="addInOrder" parameterType="XXX.mo ...
- 平衡树(fhq无旋treap)
fhq板子(代码正确且风格易懂) 洛谷P3369 #include<iostream> #include<cstring> #include<cstdio> #in ...
- python基础之字符串索引与切片
字符串索引与切片:切片后组成新字符串与原字符串无关系增:str1+str2查:str1[index] str1[start_index:end_index]1,索引从0开始2,根据索引获取元素:索引超 ...
- 【6.28校内test】T2 【音乐会】二重变革
[音乐会]二重变革[题目链接] T2其实是一道数学题,因为你看: 2MB??一共就可以存下个int,然鹅再看数据范围: 那么大是稳稳的不是TLE就是MLE了,所以肯定是数学题,而且是只需要存很少数据的 ...
- Laravel5.8自定义函数存放位置
1. 创建文件 app/helpers.php <?php // 示例函数 function foo() { return "foo"; } 2. 修改项目 composer ...
- Windows7下Pycharm安装Keras
1.安装Anaconda3 2.安装Pycharm 3.安装TensorFlow 一.File -> Settings -> Install 二.搜索TensorFlow -> In ...
- 两张超级大表join优化
一个简单的两表关联,SQL跑了差不多一天一夜,这两个表都非常巨大,每个表都有几十个G,数据量每个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G ...
- 正则表达式、原始字符串及re
正则表达式.原始字符串及re re是python中的一个文本解析工具,常用的方法有: 来源:https://www.ibm.com/developerworks/cn/opensource/os-cn ...