题意

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

题解

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

然后不会做。

然后看了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. hugepage设置

    1.设置memlock 编辑/etc/security/limits.conf 增加: * Soft memlock 稍小于RAM值 * hard memlock 稍小于RAM值 Memlock,锁定 ...

  2. Python socket编程 (2)--实现文件验证登入

    可以实现从客户端输入账号和密码然后发送到服务器进行验证,实现用户登入校正操作. 服务器: import socket import json server = socket.socket() serv ...

  3. 关于#define 的宏替换的一些问题

    #define PI 3.14; int main() { , s = ; s = r * r * PI; s = PI * r * r; // s = 3.14; * r * r; printf(& ...

  4. binlogserver搭建

    在MySQL 5.7.x版本中,mysqlbinlog工具解析任何一个本地的binlog或relay log时,都不会在mysqlbinlog命令执行结束时追加rollback语句, 但在MySQL ...

  5. 微信公众号h5页面自定义分享

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. 使用parted对Linux未分区部分进行分区

    1. 使用命令parted -l 查看当前分区 可以看到硬盘有2396GB即有2.5T , 但是分区就分了50G一个盘, 需要分剩下部分 [root@localhost ~]# parted -l M ...

  7. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  8. navigator(浏览器对象)Screen对象(屏幕)

    浅谈navigator对象: 注意:不是所有浏览器都支持 .cookieEnabled  判断是否启用了cookie  在客户端硬盘持久保存用户私密数据的小文件 .plugins 浏览器安装的所有插件 ...

  9. soapUI与post测试soap webservice接口

    之前装了SoapUI,最近装了Postman,分别用它们测试了WebService,下面为用法. 测试的在线WebService(数据来源于中国气象局)Endpoint: http://www.web ...

  10. extjs6 创建工程和打包发布

    准备工作: 下载extjs6的开发包,我这里是试验版:ext-6.6.0-trial.zip.解压到某个目录,我这里解压到:D:\tools\about-ext\ext-6.6.0-trial 目录下 ...