洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]
树网的核
Description
Input
Output
Sample Input
1 2 5
2 3 2
2 4 4
2 5 3
Sample Output
HINT
对于70%的数据,n<=200000
对于100%的数据:n<=500000, s<2^31, 所有权值<500
分析:
这里上的题面是$BZOJ$的,数据是加强版的,洛谷的数据比较水,可以用各种神奇方法暴力搞过去。
首先这题的题面是比较迷,要是在考场上看到肯定让人无比懵逼。。。题意就是让你找直径中的一段作为核心,然后求距离核心最远的点的距离,并使这个距离最短。
先求出树的直径,然后先考虑最长距离就在直径上的情况,用尺取法做出来,然后我们枚举直径上的每一个点,从该节点开始遍历,如果在遍历的时候遇到直径上的点就跳过,然后就这样比较出最长距离。。。复杂度:能$A$,证明:我$A$了。(好吧,实际上我也不会证明正确性和具体的时间复杂度,照数据看,应该是$O(n)$才对)
Code:
//It is made by HolseLee on 19th Aug 2018
//Luogu.org P1099/BZOJ 1999
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std; const int N=5e5+;
int n,s,dis[N],fa[N],head[N],cnt,hh,tt,ans;
bool vis[N];
struct Node{
int to,val,nxt;
}edge[N<<]; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline int add(int x,int y,int z)
{
edge[++cnt].to=y;
edge[cnt].val=z;
edge[cnt].nxt=head[x];
head[x]=cnt;
} inline void dfs(int u)
{
int v;
for(int i=head[u];i!=-;i=edge[i].nxt){
v=edge[i].to;
if(vis[v]||v==fa[u])continue;
fa[v]=u;
dis[v]=dis[u]+edge[i].val;
dfs(v);
}
} int main()
{
n=read();s=read();
memset(head,-,sizeof(head));
int x,y,z;
for(int i=;i<n;++i){
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
}
hh=,tt=;
dis[tt]=;dfs(tt);
memset(fa,,sizeof(fa));
for(int i=;i<=n;++i)if(dis[i]>dis[tt])tt=i;
dis[tt]=;dfs(tt);
for(int i=;i<=n;++i)if(dis[i]>dis[hh])hh=i;
ans=2e9+;int j=hh;
for(int i=hh;i;i=fa[i]){
while(fa[j]&&dis[i]-dis[fa[j]]<=s)j=fa[j];
ans=Min(ans,Max(dis[j],dis[hh]-dis[i]));
}
for(int i=hh;i;i=fa[i])vis[i]=;
for(int i=hh;i;i=fa[i])dis[i]=,dfs(i);
for(int i=;i<=n;++i)ans=Max(ans,dis[i]);
printf("%d",ans);
return ;
}
洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]的更多相关文章
- luogu题解 P1099 【树网的核】树的直径变式+数据结构维护
题目链接: https://www.luogu.org/problemnew/show/P1099 https://www.lydsy.com/JudgeOnline/problem.php?id=1 ...
- 洛谷1099 [NOIP2007] 树网的核
链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...
- P1099 [NOIP2007 提高组] 树网的核 (树的直径)
题目的意思就是在直径上找一段距离不超过s的路径,使该路径的偏心距最小. 求出直径之后,显然我们可以用双指针扫描一段合法路径.设u1,u2...ut是直径上的点,d[ui]表示从ui出发能到达的最远距离 ...
- bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostr ...
- 洛谷P4408 [NOI2003] 逃学的小孩 (树的直径)
本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离 ...
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...
- 洛谷P3377 【模板】左偏树(可并堆) 题解
作者:zifeiy 标签:左偏树 这篇随笔需要你在之前掌握 堆 和 二叉树 的相关知识点. 堆支持在 \(O(\log n)\) 的时间内进行插入元素.查询最值和删除最值的操作.在这里,如果最值是最小 ...
- 洛谷 P1099 树网的核
P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...
随机推荐
- [DeeplearningAI笔记]卷积神经网络2.2经典网络
4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [LeNet]--Lécun Y, Bottou L, Bengio Y, et al. Gradient-bas ...
- numpy数组中冒号和负号的含义
numpy数组中":"和"-"的意义 觉得有用的话,欢迎一起讨论相互学习~Follow Me 在实际使用numpy时,我们常常会使用numpy数组的-1维度和& ...
- 用CSS3画出一个立方体---转
css3实践—创建3D立方体 要想实现3D的效果,其实非常简单,只需指定一个元素为容器并设置transform-style:preserve-3d,那么它的后代元素便会有3D效果.不过有很多需要注意的 ...
- svn工具的使用问题总结
前言: 最近在开发的时候,由于需求太多,开发周期长短不一,从主线上切了多个分支(一般不在主线trunk上开发,万一线上出问题可及时修改代码上线),在部分功能上线后,想把代码同步到新的分支上去,最开始的 ...
- 垂直居中vertical-align
vertical-align对一些特定显示样式(例如单元格显示方式:table-cell)的元素才会起作用. div{display:table-cell; vertical-align:middle ...
- 【Ural】1519. Formula 1 插头DP
[题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题 ...
- HDU 1711 Number Sequence (字符串处理 KMP)
题目链接 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...
- 大聊PYthon----生成器
再说迭代器与生成器之前,先说一说列表生成式 列表生成式 什么是列表生成式呢? 这个非常简单! 先看看普通青年版的! >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, ...
- THINKPHP简单商品查询项目
代码:http://files.cnblogs.com/files/wordblog/test.zip
- IE9 下 ellipsis bug fix
fiddle: http://jsfiddle.net/tagliala/TtbuG/10/ original: https://github.com/FortAwesome/Font-Awesome ...