传送门

题意:给一棵nnn个点的基环树,找一个点(可以在边上),求所有节点到这个点的最大值的最小值。

n≤1e5n \leq1e5n≤1e5

先考虑一棵普通树的情况

显然是直径长度的一半

因为如果有个点大于直径长度的一半,显然可以找一个更长的链,所以这个长度可以覆盖所有点。而如果小于,不能覆盖直径的端点。

如果是基环树,发现仍然可以按普通树的形式覆盖所有点。也就是断掉环上的一条边后的最小直径。

非环边是不受影响的,分别跑一次直径记录下来。

对每个环上的点记录最大深度,套路性地断环为链,set瞎搞一下就出来了

和前面的最大直径取max输出

复杂度O(nlogn)O(nlogn)O(nlogn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <utility>
#include <set>
#define MAXN 100005
#define MAXM 200005
using namespace std;
typedef long long ll;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
struct edge{int u,v,w;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt;
void addnode(int u,int v,int w)
{e[++cnt]=(edge){u,v,w};nxt[cnt]=head[u];head[u]=cnt;
}
bool vis[MAXN],isrt[MAXN];
int lop[MAXN],x[MAXN],tot,tmp;
ll dep[MAXM];
void dfs(int u,int f)
{vis[u]=true;for (int i=head[u];i;i=nxt[i])if (!vis[e[i].v]&&e[i].v!=lop[1]){dfs(e[i].v,u);if (isrt[e[i].v]&&e[i].v!=tmp) isrt[lop[++tot]=u]=true,x[tot]=e[i].w;}elseif (e[i].v!=f&&e[i].v!=lop[1])isrt[lop[++tot]=u]=true,x[tot]=e[i].w,tmp=e[i].v;vis[u]=false;
}
ll dis[MAXN]={-1};
int mx;
void getdis(int u,int f)
{if (dis[u]>dis[mx]) mx=u;for (int i=head[u];i;i=nxt[i])if (e[i].v!=f&&!isrt[e[i].v]){dis[e[i].v]=dis[u]+e[i].w;getdis(e[i].v,u);}
}
typedef pair<ll,int> pi;
multiset<pi> s1,s2;//+,-
inline ll calc(){return s1.rbegin()->second==s2.rbegin()->second? max((++s1.rbegin())->first+s2.rbegin()->first,s1.rbegin()->first+(++s2.rbegin())->first):s1.rbegin()->first+s2.rbegin()->first;}
ll sum[MAXM];
int main()
{int n=read();for (int i=1;i<=n;i++){int u,v,w;u=read(),v=read(),w=read();addnode(u,v,w);addnode(v,u,w);}dfs(1,0);ll ans0=0;for (int i=1;i<=tot;i++){isrt[lop[i]]=false;mx=0;dis[lop[i]]=mx=0;getdis(lop[i],0);dep[i]=dis[mx];dis[mx]=0;getdis(mx,0);ans0=max(ans0,dis[mx]);isrt[lop[i]]=true;}for (int i=2;i<=tot;i++) sum[i]=sum[i-1]+x[i];for (int i=tot+1;i<=2*tot;i++) sum[i]=sum[i-1]+x[i-tot],dep[i]=dep[i-tot];ll ans1=1e18;for (int i=1;i<=tot;i++) s1.insert(make_pair(dep[i]+sum[i],i)),s2.insert(make_pair(dep[i]-sum[i],i));ans1=min(ans1,calc());for (int i=tot+1;i<=2*tot-1;i++){s1.erase(s1.find(make_pair(dep[i-tot]+sum[i-tot],i-tot)));s2.erase(s2.find(make_pair(dep[i-tot]-sum[i-tot],i-tot)));s1.insert(make_pair(dep[i]+sum[i],i));s2.insert(make_pair(dep[i]-sum[i],i));ans1=min(ans1,calc());}ans1=max(ans0,ans1);printf("%lld.%d\n",ans1>>1,(ans1&1)? 5:0);return 0;
}

【NOI2013】快餐店【基环树】【树的直径】【set】相关推荐

  1. NOI2013快餐店【图上找环+线段树】

    NOI 2013 快餐店 NOI 线段树 题目传送点 说白了,就是给个N个点N条边的图,然后求一个点(不一定是给的那N个点),到所有给定的点的路程最大值最小 =≡Σ((( つ•̀ω•́)つ我是蒟蒻,想 ...

  2. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  3. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP

    传送门1 传送门2 思路: 好题 比较简单的DP思路 之前没写过基环树DP,第一次搞真心orz 我们发现这些元素是具有从属关系的 也就是说如果对"厌恶的骑士"两两相互连边,那么问题 ...

  4. 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)

    Description 注意:时限更改为4s 题解 考虑最原始的直径求法:找到离根节点(或离其他任意一点)最远的节点far1,再从far1出发找到离far1最远的节点far2,far1至far2的距离 ...

  5. NOI2013 快餐店

    NOI2013 快餐店 Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方 ...

  6. bzoj 3242: [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  7. 主题图片_临床医学院“树树皆秋色,山山唯落晖”主题图片征集活动

    自古逢秋悲寂寥,我言秋日胜春朝.秋风起,金叶舞,趵突泉校区迎来了金色的秋天.在老舍先生笔下,冬天是济南最美的季节,而在同学们的眼中,趵突泉校区的秋色更是别具一番风味.临床医学院新媒体中心特此举办&qu ...

  8. The Trip On Abandoned Railway(线段树+树状数组)

    链接:https://ac.nowcoder.com/acm/problem/13891 来源:牛客网 题目描述 There are many ghosts at the abandoned stat ...

  9. [XSY] 智慧树(线性同余方程组,线段树/树状数组)

    智慧树 解决此题有两个要点: 如何判断一个线性同余方程组有没有解 如何统计合法子序列数目 先看第2点: 若一个序列是合法的,则这个序列的所有子序列都是合法的 考虑对∀1≤i≤n\forall 1\le ...

  10. [Bzoj2243][SDOI2011]染色(线段树树剖)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243 线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色 ...

最新文章

  1. hitTest和pointInside方法
  2. 标题: Debian 下 VirtualBox 的桥接、USB 设置 ── 迷你怎么做 [转自sir]
  3. 服务器无响应 错误691,错误 691:由于域上的用户名和/密码无效而拒绝访问的原因及解决办法...
  4. 5进程间锁:进程间pthread_mutex,文件锁
  5. ( )不是html的布局标签,不要使用的HTML标签(WEB标准网页布局)
  6. 为什么不可以使用哈曼顿距离_K-means真的不能使用曼哈顿距离吗?
  7. CentOS 7在虚拟机上安装之后没有桌面问题
  8. jqueryui时间插件_jQueryUI工具提示插件
  9. error C2668: “pow”: 对重载函数的调用不明确
  10. 借助 Flink 与 Pulsar,BIGO 打造实时消息处理系统
  11. 【转】WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking的使用
  12. JDBC————PreparedStatement批处理
  13. 苹果耳机可以用在安卓手机上吗_苹果史上最良心配件,安卓机用了根本停不下来...
  14. foxmai邮件服务器pop,常见pop和stmp服务器地址-foxmail6或outlook邮件管理
  15. 淘宝大数据量产品技术架构
  16. 使用Excel中的公式计算日期
  17. Pyside2新手1400行代码QQ音乐网易云酷狗轻松下载
  18. 【杂记】如何利用Python3+you-get快速的下载B站的视频(尤其是多P的教程类视频)
  19. Artificial Intelligence Computer Vision ML and DL
  20. 序列学习——RNN网络之 LSTM 原理

热门文章

  1. 据说很多女生都想知道男生是如何上厕所的?
  2. 上班骚扰男同事被抓到......
  3. 如何用数学方法估算一个女生前男友的数量?
  4. 明天放假,我放价!一个国庆假期教你学会数学建模
  5. c语言时间算法如何以毫秒显示,C语言时间的方法.doc
  6. python 逆向生成正则表达式_用Python中的正则表达式生成lis
  7. 怎样安装php52-71,CentOS如何安装PHP5和PHP7
  8. windows传真和扫描由于不能访问您的文档_扫描识别工具Dynamic Web TWAIN全年最低价来了!错过再等一年...
  9. .net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...
  10. 用python实现流程自动化_Python自动化开发 - 流程控制