[NOI2013]快餐店 / CF835F Roads in the Kingdom (基环树)
题意
一颗基环树,选一对点使得这两个点的最短距离最大。
题解
相当于找基环树的直径,但是这个直径不是最长链,是基环树上的最短距离。
然后不会做。
然后看了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 (基环树)的更多相关文章
- CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径
传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...
- CF835F Roads in the Kingdom
话说这是去年大爷的一道NOIP模拟赛题,对着大爷的代码看了一堂课的我终于把这题写掉了. 本题要求在基环树给定的环上删去一条边使剩下的树的直径最小,输出这个最小直径. 那么基环树可以画成这样子的: 有一 ...
- Codeforces 835 F. Roads in the Kingdom
\(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗 ...
- bzoj3242 [Noi2013]快餐店
Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...
- P1399 [NOI2013] 快餐店 方法记录
原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...
- bzoj 3242: [Noi2013]快餐店 章鱼图
3242: [Noi2013]快餐店 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 266 Solved: 140[Submit][Status] ...
- Codeforces 835 F Roads in the Kingdom(树形dp)
F. Roads in the Kingdom(树形dp) 题意: 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后,保证图还连通时不便利度的最小值 $n & ...
- 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 ...
- Codeforces 835F Roads in the Kingdom (环套树 + DP)
题目链接 Roads in the Kingdom 题意 给出一个环套树的结构,现在要删去这个结构中的一条边,满足所有点依然连通. 删边之后的这个结构是一棵树,求所有删边情况中树的直径的最小值. 显 ...
随机推荐
- ding
Import "shanhai.lua"Dim currHour,currMinute,currSecondDim mmRnd = 0Dim sumFor=Int(ReadUICo ...
- 题解 Luogu P1110 【[ZJOI2007]报表统计】
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...
- youku项目总结(粗略总结)
一.ORM 之前我们都是以文件保存的形式存储数据,这次我们用的是数据库结合python使用,用到 ORM:关系型映射 类>>数据库的一张表 对象>>表一条记录 对象.属性> ...
- 血小板 live2d web使用
关于此插件 看到一个很多网站都有动态的小人,目前除了即将废弃的flash就是canvas和h5动画了,h5动画能力有限,不能画出复杂的效果 那么canvas就是首选,全部手画也不可能,大部分使用库和工 ...
- 安装CentOS7服务器
1. 基本安装 https://www.cnblogs.com/kreo/p/4396825.html 2.安装补充 防火墙 / FTP / Nginx https://www.cnblogs.com ...
- windowsAPI创建句柄失败的返回值
创建句柄的api返回值 INVALID_HANDLE_VALUE CreateFile CreateNamedPipe CreateToolhelp32Snapshot FilterConnectCo ...
- Java内存模型之总结
经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结. 总结 JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序.一方面,要为 ...
- nodejs之express的中间件
express中间件分成三种 内置中间件 static 自定义中间件 第三方中间件 (body-parser) (拦截器) 全局自定义中间件 在请求接口时 有几个接口都要验证传来的内容是否存在或者是否 ...
- .NET 对文件和文件夹操作的介绍
1 Directory和File类只包含静态方法,不能被实例化 2 DirectoryInfo和FileInfo他们是有状态的,需要被实例化 //构造函数初始化一个文件的路径 FileInfo myF ...
- Axure总结
https://blog.csdn.net/xlegendxblog/article/details/54378705 1.常用符号 2.箭头的绘制 3.绘制流程图基本要点:流程路径不要交叉 4.对复 ...