题意

一颗基环树,选一对点使得这两个点的最短距离最大。

题解

相当于找基环树的直径,但是这个直径不是最长链,是基环树上的最短距离。

然后不会做。

然后看了ljh_2000的博客。

然后会了。

这道题最难的就是为什么枚举断边(i→i+1)(i\to i+1)(i→i+1)后,求出最长链是取min⁡\minmin。实际上是因为这个最长链是求的经过了环的最长链,但是经过了环的最长链不一定是题目中要求的最短距离,所以枚举断边取min⁡\minmin就是为了取小的那一段,而且一定不会错过答案。

.

CODE

听说CF835F的数据强点。不过要改一下输出和数据范围。

#pragma GCC optimize (3)
#include <bits/stdc++.h>
using namespace std;
char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
void read(int &res){
char ch; for(;!isdigit(ch=getchar()););
for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0');
}
typedef long long LL;
const int MAXN = 100005;
int n, seq[MAXN], stk[MAXN], indx, m;
bool inq[MAXN], vis[MAXN], flg[MAXN];
int fir[MAXN], to[MAXN<<1], nxt[MAXN<<1], wt[MAXN<<1], cnt = 1;
inline void link(int u, int v, int w) {
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; wt[cnt] = w;
to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt; wt[cnt] = w;
}
void dfs(int u, int ff) {
vis[u] = inq[u] = 1; stk[++indx] = u;
for(int i = fir[u], v; i; i = nxt[i])
if((i^1) != ff) {
if(!vis[v = to[i]]) dfs(v, i);
else {
if(inq[v]) {
for(int i = indx; i; --i) {
flg[seq[++m] = stk[i]] = 1;
if(stk[i] == v) break;
}
}
}
}
inq[u] = 0; --indx;
}
LL dp[MAXN], chain;
LL DP(int u, int ff) {
for(int i = fir[u], v; i; i = nxt[i])
if((v=to[i]) != ff && !flg[v]) {
chain = max(chain, dp[u] + DP(v, u) + wt[i]);
dp[u] = max(dp[u], dp[v] + wt[i]);
}
return dp[u];
}
LL val[MAXN], len[MAXN];
LL pre[MAXN], f[MAXN];
LL suf[MAXN], g[MAXN];
int main () {
//freopen("shuju.in", "r", stdin);
read(n);
for(int i = 1, u, v, w; i <= n; ++i) read(u), read(v), read(w), link(u, v, w);
dfs(1, 0);
for(int i = 1; i <= m; ++i) {
val[i] = DP(seq[i], 0);
for(int j = fir[seq[i]]; j; j = nxt[j])
if(to[j] == seq[i%m+1]) len[i] = wt[j];
}
LL sum = 0, mx = 0;
for(int i = 1; i <= m; ++i) {
pre[i] = max(pre[i-1], sum + val[i]);
f[i] = max(f[i-1], sum + mx + val[i]);
mx = max(mx, val[i]-sum);
sum += len[i];
}
sum = 0; mx = 0;
for(int i = m; i >= 1; --i) {
suf[i] = max(suf[i+1], sum + val[i]);
g[i] = max(g[i+1], sum + mx + val[i]);
mx = max(mx, val[i]-sum);
sum += len[i-1];
}
LL ans = f[m];
for(int i = 1; i < m; ++i)
ans = min(ans, max(pre[i] + suf[i+1] + len[m], max(f[i], g[i+1])));
ans = max(ans, chain);
if(ans & 1) printf("%lld.5\n", ans/2);
else printf("%lld.0\n", ans/2);
}

[NOI2013]快餐店 / CF835F Roads in the Kingdom (基环树)的更多相关文章

  1. CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径

    传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...

  2. CF835F Roads in the Kingdom

    话说这是去年大爷的一道NOIP模拟赛题,对着大爷的代码看了一堂课的我终于把这题写掉了. 本题要求在基环树给定的环上删去一条边使剩下的树的直径最小,输出这个最小直径. 那么基环树可以画成这样子的: 有一 ...

  3. Codeforces 835 F. Roads in the Kingdom

    \(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗 ...

  4. bzoj3242 [Noi2013]快餐店

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

  5. P1399 [NOI2013] 快餐店 方法记录

    原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...

  6. bzoj 3242: [Noi2013]快餐店 章鱼图

    3242: [Noi2013]快餐店 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 266  Solved: 140[Submit][Status] ...

  7. Codeforces 835 F Roads in the Kingdom(树形dp)

    F. Roads in the Kingdom(树形dp) 题意: 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后,保证图还连通时不便利度的最小值 $n & ...

  8. codeforces 427 div.2 F. Roads in the Kingdom

    F. Roads in the Kingdom time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  9. Codeforces 835F Roads in the Kingdom (环套树 + DP)

    题目链接 Roads in the Kingdom 题意  给出一个环套树的结构,现在要删去这个结构中的一条边,满足所有点依然连通. 删边之后的这个结构是一棵树,求所有删边情况中树的直径的最小值. 显 ...

随机推荐

  1. flask返回数据类型

    服务器这种后台返回的数据只能是string,json或者是文件类型,对应Html的解析文件类型 无法返回自定义的元组,只能返回规定好的元组,说白了只第一个元素有效 所有返回前台的内容其实都应该是Res ...

  2. supervisor+daphne+djangochannels

    参照官网配置:https://channels.readthedocs.io/en/latest/deploying.html 1.supervisor 主要是用来管理进程,比如我们想让一个进程一直执 ...

  3. SpringBoot中使用@Scheduled创建定时任务

    SpringBoot中使用@Scheduled创建定时任务 定时任务一般会在很多项目中都会用到,我们往往会间隔性的的去完成某些特定任务来减少服务器和数据库的压力.比较常见的就是金融服务系统推送回调,一 ...

  4. Redis--list类型操作命令

    列表 list Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列 表的头部(左边)或者尾部(右边) 列表 list——基本命令 lpush 语法:lpush key valu ...

  5. SRID (空间引用识别号, 坐标系)【转】

    SRID (空间引用识别号, 坐标系)-云栖社区-阿里云 Spatial Reference List -- Spatial Reference Chapter 8. PostGIS Referenc ...

  6. hdu 1342.. 复习广搜 顺便练习一下一个脑残的格式

    In a Lotto I have ever played, one has to select 6 numbers from the set {1,2,...,49}. A popular stra ...

  7. SringMVC笔记

    SpringMvc主要是三个Servlet:HttpServletBean,FramwworkServlet,DispatcherServlet,它们是依次继承的关系,其处理过程大致功能如下: 1.H ...

  8. jquery.fileupload源码解读笔记

    基础编程风格 新建 test.html  和 test.js和 main.js和 无论哪种顺序 <body> <script src="/Sandeep/js/jquery ...

  9. CSS3Ps -Photoshop图层特效转CSS3代码

    CSS3Ps 这个ps插件可以将ps图层特效直接转化成css3代码,对前端非常有益. 插件下载:http://css3ps.com/Download/

  10. OpenStack kilo版(7) 部署dashboard

    安装dashboard  root@controller:~# apt-get install openstack-dashboard  配置 /etc/openstack-dashboard/loc ...