写在前面:由于是双倍经验就放一块了,虽然数据范围差的有点大。

题目链接

题意:在树的直径上选择一条长度不超过s的路径使这条路径上的点到树上任意点的最大距离最小。

这题数据好像非常水,我写了上界n^2不考虑多条直径还能过?不知道什么操作。

我就说说我的水法吧。dfs两遍求直径。处理直径上路径到直径两端的距离。然后再处理直径上每个点的最远距离,取min。

正确性显然。

#include<bits/stdc++.h>
#define mk make_pair
using namespace std;
inline int read()
{
register int X=;register char ch=;bool flag=;
for(;!isdigit(ch);ch=getchar()) if(ch=='-') flag=;
for(;isdigit(ch);ch=getchar()) X=(X<<)+(X<<)+ch-'';
return (flag ? -X : X);
}
inline void write(int x)
{
if(x>) write(x/);
putchar(x%+'');
}
const int N=1e6+;
vector<pair<int ,int > > e[N];
int dis[N],fa[N],n,m,s,ans=<<;
bool vis[N];
void dfs(int u)
{
int sz=e[u].size();
for(int i=;i<sz;i++)
{
int v=e[u][i].first;
if(!vis[v] && fa[u]!=v)
{
fa[v]=u;
dis[v]=dis[u]+e[u][i].second;
dfs(v);
}
}
}
int main()
{
n=read(),s=read();
for(int i=;i<n;i++)
{
int u=read(),v=read(),val=read();
e[u].push_back(mk(v,val)),e[v].push_back(mk(u,val));
}
int l1=,l2=;
dis[l1]=;
dfs(l1);
memset(fa,,sizeof fa);
for(int i=;i<=n;i++) if(dis[i]>dis[l1]) l1=i;
dis[l1]=;
dfs(l1);
for(int i=;i<=n;i++) if(dis[i]>dis[l2]) l2=i;
int j=l2;
for(int i=l2;i;i=fa[i])
{
while(fa[j] && dis[i]-dis[fa[j]]<=s) j=fa[j];
ans=min(ans,max(dis[j],dis[l2]-dis[i]));
}
for(int i=l2;i;i=fa[i]) vis[i]=;
for(int i=l2;i;i=fa[i]) dis[i]=,dfs(i);
for(int i=;i<=n;i++) ans=(ans>dis[i] ? ans : dis[i]);
write(ans);
}

洛谷 P1099 树网的核+P2491 [SDOI2011]消防的更多相关文章

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

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

  2. 洛谷 P1099 树网的核

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

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

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

  4. 洛谷P1099 树网的核

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

  5. 2018.11.06 洛谷P1099 树网的核(最短路+枚举)

    传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...

  6. BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防

    一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...

  7. NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防

    NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...

  8. bzoj1999 (洛谷1099) 树网的核——dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999  https://www.luogu.org/problemnew/show/P109 ...

  9. P2491 消防/P1099 树网的核

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

随机推荐

  1. ImportBeanDefinitionRegistrar接口实现bean动态注入

    借助ImportBeanDefinitionRegistrar接口实现bean的动态注入https://www.jianshu.com/p/2b993ced6a4c ImportBeanDefinit ...

  2. c# 创建Excel com加载项Ribbon动态加载工作簿和工作表

    使用 VSTO 创建外接程序,Gallery控件动态加载工作簿名称 代码如下: 加载工作簿名称: private void Gallery1_ItemsLoading(object sender, R ...

  3. 记vs2017编辑launchSettings.json中launchUrl错误

    当编辑launchSettings.json中launchUrl后,api访问出错,Swagger页面不能使用. 解决方法:将项目根目录下.vs文件夹删除,然后重新生成,ok

  4. RabbitMQ学习之Publish/Subscribe(3)

    上一个教程中,我们创建了一个work queue. 其中的每个task都会被精确的传送到一个worker. 这节,我们将会讲把一个message传送到多个consumers. 这种模式叫做publis ...

  5. C#拼音帮助类

    如果使用此帮助类需要引用 using Microsoft.International.Converters.PinYinConverter; using NPinyin; 可以在NuGet里面下载 1 ...

  6. C# ThreadStart中如何带参数

    1.ThreadStart 线程执行带参数的方法,new Thread(new ThreadStart(delegate { ThreadTask(firstPage, lastPage); })); ...

  7. Winform串口编程---接收数据demo(VSPD虚拟串口)

    参考地址:https://blog.csdn.net/memgxingfeixiang/article/details/52513970  https://blog.csdn.net/kevin_io ...

  8. Visual Studio的语法着色终于调得赏心悦目

    代码可读性瞬间大大提升.Reshaper真的强大.

  9. JAVA 架构和技术框架百科

    YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只 ...

  10. 英语insuraunce保险insuraunce单词

    English Alternative forms insuraunce Etymology From the older form ensurance, see also assurance. Pr ...