P1099 树网的核

(bzoj数据加强)

前置知识:树的直径

(并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE)

正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再dfs,再全图找一遍。

分类讨论:

1.偏心距可能是所取路径上(非端点)的某一点与直径外一点的距离

解决方案:在该点上跑一遍dfs,不能通过树的直径,找到距离最远的点。

2.偏心距可能是所取路径的端点与直径端点之间未取部分的长度。

所取路径的端点在直径上,根据性质,与它相对距离最远的点十分显然是直径的端点。

解决方案:在直径上用尺取法找一遍

end.

#include<iostream>
#include<cstdio>
#include<cstring>
#define rint register int
using namespace std;
void read(int &x){
char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 500002
int n,s,k,ans=1e9,fa[N],mark[N],d[N];
int cnt,hd[N],nxt[N<<],ed[N],poi[N<<],val[N<<];
inline void adde(int x,int y,int v){
nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
ed[x]=cnt, poi[cnt]=y, val[cnt]=v;
}
void dfs(int x,int ffa){
fa[x]=ffa;
if(d[x]>d[k]) k=x; //更新距离最远的点
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==ffa||mark[to]) continue;
d[to]=d[x]+val[i];
dfs(to,x);
}
}
int main(){
read(n); read(s); int q1,q2,q3;
for(rint i=;i<n;++i){
read(q1); read(q2); read(q3);
adde(q1,q2,q3),adde(q2,q1,q3);
}k=; dfs(,); d[k]=; dfs(k,);//常规方法求树的直径
for(rint i=k,j=k;i;i=fa[i]){
while(d[j]-d[i]>s) j=fa[j];
ans=min(ans,max(d[k]-d[j],d[i]));
}//在直径上用尺取法找偏心距
for(rint i=k;i;i=fa[i]) mark[i]=;
for(rint i=k;i;i=fa[i]) d[i]=,dfs(i,fa[i]);//dfs找路径上某点与非直径的某点的偏心距
for(rint i=;i<=n;++i) ans=max(ans,d[i]);//全图找一遍
printf("%d",ans);
return ;
}

bzoj1999 / P1099 树网的核的更多相关文章

  1. 洛谷 P1099 树网的核

    P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...

  2. P1099 树网的核——模拟+树形结构

    P1099 树网的核 无根树,在直径上找到一条长度不超过s的路径,使得最远的点距离这条路径的距离最短: 首先两遍dfs找到直径(第二次找的时候一定要吧father[]清零) 在找到的直径下枚举长度不超 ...

  3. P2491 消防/P1099 树网的核

    P2491 消防/P1099 树网的核 双倍经验,双倍快乐. 题意 在一个树上选择一段总长度不超过\(s\)的链使所有点到该链距离的最大值最小. 输出这个最小的值. 做法 Define:以下\(s\) ...

  4. [NOIP2007] 提高组 洛谷P1099 树网的核

    题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...

  5. 【BZOJ1999】树网的核

    题目大意:题目过长,无法简单描述... 题解: 由于树网的核一定是树直径的一段,因此考虑先将直径取出,通过两次 BFS 即可.要求的东西是树上任意一点到这条取出的线段的距离的最大值,发现这个最大值有可 ...

  6. P1099 树网的核 && P2491 [SDOI2011]消防

    给定一棵树, 你可以在树的直径上确定一条长度不超过 \(S\) 的链, 使得树上离此链最长的点距离最小, 输出这个距离 P2491 数据范围为 P1099 的 \(1000\) 倍 Solution ...

  7. #P1099 树网的核 题解

    题目描述 pdf 题解 这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵. 已经给出来这是个DAG,所以不用担心连通性的问题.那么怎么做呢? 朴素的做法是把树的直径的两个端点都统计出来 ...

  8. P1099 树网的核

    NOIP 2007 提高第四题. 啊......我还是看了题解才做出来的. 这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊! 然后,这破题怎么暴力?感觉我的 ...

  9. 洛谷P1099 树网的核

    传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...

随机推荐

  1. 《C++ Primer Plus》第15章 友元、异常和其他 学习笔记

    友元使得能够为类开发更灵活的接口.类可以将其他函数.其他类和其他类的成员函数作为友元.在某些情况下,可能需要前向声明,需要特别注意类和方法声明的顺序,以正确地组合友元.潜逃类是在其他类中生命的类,它有 ...

  2. Android 使用线性布局LinearLayout和Button实现一个点红块游戏

    这个游戏的功能类似打地鼠. 项目地址:https://github.com/moonlightpoet/RedBlock 程序下载试玩地址:https://github.com/moonlightpo ...

  3. poj2096 Collecting Bugs[期望dp]

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 5394   Accepted: 2670 ...

  4. java 中的String类型数据添加双引号

    转义符 \ 加上引号   \" <?xml version="1.0"encoding="GBK"?> String temp = &qu ...

  5. maven指定项目的构建、打包和tomcat插件的pom.xml配置

    1.pom.xml添加如下配置: <build> <finalName>${parent.artifactId}</finalName> <plugins&g ...

  6. lunux系统安全

    1.清除不必要的系统帐户 [root@deep]# userdel adm [root@deep]# userdel lp [root@deep]# userdel sync [root@deep]# ...

  7. js判断浏览器是否安装Flash插件,并提示安装或开启

    var flashChecker = function() { var hasFlash = 0; //是否安装了flash var flashVersion = 0; //flash版本 if(do ...

  8. 委托(Func与Action)

    1.平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Sa ...

  9. HOJ Recoup Traveling Expenses(最长递减子序列变形)

    A person wants to travel around some places. The welfare in his company can cover some of the airfar ...

  10. VirtualBox vbox not found

    VirtualBox vbox file not found Problem When I opened virtualbox, Today, it showed "inaccessible ...