题意

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

题解

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

然后不会做。

然后看了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. 031 Android 异步任务(AsyncTask)

    1.介绍 AsyncTask(了解即可),重点掌握Handler+Thread 2.实现方法 3.执行步骤 4.java后台 package com.lucky.test36asynctask; im ...

  2. Django 在admin中自定义app名

    前提条件,注册时是: 完整的注册,不是直接用app名进行注册 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'dj ...

  3. jqgrid属性以及事件

    转载 1.属性 参数名称 类型 描述 默认值 是否可以被修改 ajaxGridOptions object 对ajax参数进行全局设置,可以覆盖ajax事件:error,complete 和 befo ...

  4. WCF header 域

    [OperationContract] [WebInvoke(UriTemplate = "poststr1")] public string poststr1(csinfo cs ...

  5. 每周分享五个 PyCharm 使用技巧(三)

    文章首发于 微信公众号:Python编程时光 PyCharm 是大多数 Python 开发者的首选 IDE,每天我们都在上面敲着熟悉的代码,写出一个又一个奇妙的功能. 一个每天都在使用的工具,如果能掌 ...

  6. Python基础初识

    一.安装 暂时没空写,预留 二.python基础初识 2.1 注释 当行注释:# 被注释内容 多行注释:'''被注释内容''',或者"""被注释内容"" ...

  7. 关于/var/log/maillog 时间和系统时间不对应的问题 -- 我出现的是日志时间比系统时间慢12个小时

    那么让我们来见证奇迹的时刻吧!! 首先你要看下/etc/localtime的软连接,到哪了 一般就是这块出问题了 检查这里就绝对不会错的 对比图 : 这种情况, 删除/etc/localtime : ...

  8. 二、openfeign生成并调用客户端动态代理对象

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 上一篇文章中,我们了解到了@FeignClient注解的接口被扫描到以后,会生成一个Fe ...

  9. FreeRTOS 任务创建和删除(静态)

    #define configSUPPORT_STATIC_ALLOCATION 1 //打开静态方法 StackType_t TaskStackBuffer[50]; //任务堆栈大小 StaticT ...

  10. Hive数据库操作

    Hive数据结构 除了基本数据类型(与java类似),hive支持三种集合类型 Hive集合类型数据 array.map.structs hive (default)> create table ...