P1099 树网的核——模拟+树形结构
P1099 树网的核
无根树,在直径上找到一条长度不超过s的路径,使得最远的点距离这条路径的距离最短;
首先两遍dfs找到直径(第二次找的时候一定要吧father[]清零)
在找到的直径下枚举长度不超过s的链,ans的下界是直径两端点到这条链距离的最小值;
然后将直径上的点都标记,再次求一下别的点到直径的距离。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int n,s;
int pre[maxn],last[maxn],other[maxn],len[maxn],l; void add(int x,int y,int z)
{
l++;
pre[l]=last[x];
last[x]=l;
other[l]=y;
len[l]=z;
} int dis[maxn],father[maxn],vis[maxn];
int l1,l2; void dfs(int x)
{
for(int p=last[x];p;p=pre[p])
{
int v=other[p];
if(v==father[x]||vis[v]) continue;
father[v]=x;
dis[v]=dis[x]+len[p];
dfs(v);
}
} int main()
{
scanf("%d%d",&n,&s);
for(int i=;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
} dis[]=; dfs();
l1=;
for(int i=;i<=n;i++) if(dis[i]>dis[l1]) l1=i;
memset(father,,sizeof(father));
dis[l1]=; dfs(l1); l2=;
for(int i=;i<=n;i++) if(dis[i]>dis[l2]) l2=i; //printf("??%d %d\n",l1,l2); int ans=,j=l2;
for(int i=l2;i;i=father[i])
{
while(father[j]&&dis[i]-dis[father[j]]<=s) j=father[j];
ans=min(ans,max(dis[l2]-dis[i],dis[j]));
}
for(int i=l2;i;i=father[i]) vis[i]=;
for(int i=l2;i;i=father[i])
{
dis[i]=;
dfs(i);
}
for(int i=;i<=n;i++) ans=max(ans,dis[i]);
printf("%d",ans);
return ;
}
P1099 树网的核——模拟+树形结构的更多相关文章
- 洛谷 P1099 树网的核
P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...
- bzoj1999 / P1099 树网的核
P1099 树网的核 (bzoj数据加强) 前置知识:树的直径 (并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE) 正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再 ...
- P2491 消防/P1099 树网的核
P2491 消防/P1099 树网的核 双倍经验,双倍快乐. 题意 在一个树上选择一段总长度不超过\(s\)的链使所有点到该链距离的最大值最小. 输出这个最小的值. 做法 Define:以下\(s\) ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- P1099 树网的核
NOIP 2007 提高第四题. 啊......我还是看了题解才做出来的. 这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊! 然后,这破题怎么暴力?感觉我的 ...
- P1099 树网的核 && P2491 [SDOI2011]消防
给定一棵树, 你可以在树的直径上确定一条长度不超过 \(S\) 的链, 使得树上离此链最长的点距离最小, 输出这个距离 P2491 数据范围为 P1099 的 \(1000\) 倍 Solution ...
- #P1099 树网的核 题解
题目描述 pdf 题解 这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵. 已经给出来这是个DAG,所以不用担心连通性的问题.那么怎么做呢? 朴素的做法是把树的直径的两个端点都统计出来 ...
- 洛谷P1099 树网的核
传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...
- 2018.11.06 洛谷P1099 树网的核(最短路+枚举)
传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...
随机推荐
- Mybatis中使用association及collection进行自关联示例(含XML版与注解版)
XML版本: 实体类: @Data @ToString @NoArgsConstructor public class Dept { private Integer id; private Strin ...
- Java自学-控制流程 for
Java的for循环 for循环,和while一样,只是表达方式不一样 示例 1 : for 比较for和while public class HelloWorld { public static v ...
- 闭锁CountDownLatch与栅栏CyclicBarrier
https://blog.csdn.net/lmc_wy/article/details/7866863 闭锁CountDownLatch与栅栏CyclicBarrier 浅谈 java ...
- C#中的委托、事件及事件的订阅
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JAVA基础之HttpServletRequest请求
HttpServletRequest请求是获取请求行.请求头和请求体:可以通过这个方法设置防盗链,获取地址.牢记解决乱码的方式. 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持reques ...
- 关于服务器程序运行中收到SIGPIPE(转)
(此文为原文删减版,原文地址:http://blog.sina.com.cn/s/blog_502d765f0100kopn.html) 我写了一个服务器程序,在Linux下测试,然后用C++写了客户 ...
- Google 浏览器保存mht网页文件(单个网页)的方法(无需插件)
1.找到设置打开单个网页保存的地方 在google浏览器地址栏输入:chrome://flags”,回车 2.实现保存单个网页 打开你要保存的网页后,只需 Ctrl+s ,搞定!如下: 假设找到了一篇 ...
- selenium三个等待方法
为什么需要等待时间:页面加载需要时间,如果页面没有加载完成,直接去定位,可能定位不到元素 1.强制等待: import time time.sleep(2) 不管有没有完成加载,必须等待2秒 2.隐式 ...
- 【Intellij Idea】Intellij Idea 某个提示功能disable,想恢复怎么做
比如,恢复实现抽象类和接口的功能, 打开idea设置-->editor -->interntions 搜索 implement,然后将空白的打上勾
- 安装JDK(Windows)
安装JDK java 安装JDK 下载JDK并安装 配置环境变量 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.8.0_144 (jdk安装路径) 变量名: ...