题意:给定N点N边的无向连通图,现在让你在图中找一点作为餐厅,使得最远点距离这点最近。

思路:为了保留整数,我们求最小直径,最后去除2。  直径来源于两部分:

1,在外向树中; 那么就是树的直接,一棵树求直径直接跑一边DP就可以了。(或者两遍BFS吧,麻烦一点而已),假设最大值为ans1。

2,可能通过了环。 一定有环上的边不在直接上,我们枚举这个断边。 那么现在就相当于一个X元环,环上的边有权值,X个点也各有权值,现在枚举每个断边,变成一条带枝桠的链,让你求ans2=min(最长链)。

答案就是二者取max(ans1,ans2)。

对于第二份部分,我们可以通过记录一个前缀和,一个后缀和,一个前缀答案,后缀答案,取得。

而bzoj1791让你求基环树的直径,那就是所有位置取max,通过环的部分可以加倍成链用单调队列搞定。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn],To[maxn],Len[maxn],cnt=;
int r[maxn],vis[maxn],tot;
ll L[maxn],sum[maxn],ans,dp[maxn],p[maxn];
void add(int u,int v,int w)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
bool dfs(int u,int f)
{
if(vis[u]==)
{ vis[u]=; r[++tot]=u;L[tot]=Len[f]; return true;} //开始出现环
vis[u]=;
for(int i=Laxt[u];i;i=Next[i]){
if(i==(f^)) continue;
if(dfs(To[i],i)) {
if(vis[u]==) return false; //环遍历完了
else {vis[u]=; r[++tot]=u; L[tot]=Len[f]; return true;}
}
}
return false;
}
void treedp(int u,int f) //得到外向树的直径
{
for(int i=Laxt[u];i;i=Next[i]){
if(i==(f^)||vis[To[i]]==) continue;
treedp(To[i],i);
ans=max(ans,dp[u]+Len[i]+dp[To[i]]);
dp[u]=max(dp[u],dp[To[i]]+Len[i]);
}
}
ll A[maxn],B[maxn],C[maxn],D[maxn];
void solve()
{
ll P=,Mx=;
rep(i,,tot) p[i]=dp[r[i]];
rep(i,,tot){
P+=L[i-];
A[i]=max(A[i-],P+p[i]);
C[i]=max(C[i-],P+p[i]+Mx);
Mx=max(Mx,p[i]-P);
}
P=; Mx=; ll res=C[tot];
for(int i=tot;i>=;i--){
if(i==tot) P=;
else P+=L[i];
B[i]=max(B[i+],P+p[i]);
D[i]=max(D[i+],P+p[i]+Mx);
Mx=max(Mx,p[i]-P);
}
rep(i,,tot-) {
ll tmp=max(max(C[i],D[i+]),A[i]+B[i+]+L[tot]);
res=min(res,tmp);
}
ans=max(ans,res);
}
int main()
{
int N,u,v,w;
scanf("%d",&N);
rep(i,,N) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w); add(v,u,w);
}
dfs(,);
rep(i,,tot) treedp(r[i],);
solve();
printf("%lld",ans/);
if(ans&) puts(".5");
else puts(".0");
return ;
}

BZOJ - 3242 :快餐店 (基环树DP) 最小化半径的更多相关文章

  1. 基环树DP

    基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...

  2. [CSP-S模拟测试]:卡常题/b(基环树+DP)

    题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...

  3. [bzoj2878][Noi2012]迷失游乐园(基环树dp)

    [bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...

  4. bzoj1791[IOI2008]Island岛屿(基环树+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...

  5. 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...

  6. BZOJ1040:骑士(基环树DP)

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...

  7. How Javascript works (Javascript工作原理) (十四) 解析,语法抽象树及最小化解析时间的 5 条小技巧

    个人总结:读完这篇文章需要15分钟,文章介绍了抽象语法树与js引擎解析这些语法树的过程,提到了懒解析——即转换为AST的过程中不直接进入函数体解析,当这个函数体需要执行的时候才进行相应转换.(因为有的 ...

  8. BZOJ3037 创世纪[基环树DP]

    实际上基环树DP的名字是假的.. 这个限制关系可以看成每个点有一条出边,所以就是一个内向基环树森林. 找出每个基环树的环,然后对于树的部分,做DP,设状态选或不选为$f_{x,0/1}$,则 $f_{ ...

  9. [ZJOI2008] 骑士 - 基环树dp

    一类基环树dp都是这个套路吧 随便拆掉环上的一条边 然后跑树形dp,设\(f[i][0/1]\)表示以第\(i\)个人为根的子树,第\(i\)个人选或不选,能收获的最大值 以断点\(u,v\)为根分别 ...

  10. BZOJ3037 创世纪(基环树DP)

    基环树DP,攻的当受的儿子,f表选,g表不选.并查集维护攻受关系.若有环则记录,DP受的后把它当祖宗,再DP攻的. #include <cstdio> #include <iostr ...

随机推荐

  1. 微信企业微信调试JS神器vConsole

    在js页面上放以下代码 <script src='https://cdn.bootcss.com/vConsole/3.3.2/vconsole.min.js'></script&g ...

  2. C# 实现Escape UnEscape方法(支持中文-转载)

    //Escape方法 public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] by ...

  3. JMeter扩展插件实现对自定义协议进行支持 转

    本文版权归xmeter.net 所有.欢迎转载,转载请注明出处. 摘要## JMeter本身提供了插件机制,允许第三方扩展JMeter以支持JMeter不支持的协议的测试.本文以扩展一个简单的Apac ...

  4. Sitecore 9 为什么数据驱动的组织选择它

    Sitecore 9使用个性化和机器学习来帮助客户提高数字营销对数字投资的回报 Sitecore 9比以往任何时候都更加智能.主要功能包括: 数据集中化 向后兼容性 简单的迁移 该平台简化了营销人员和 ...

  5. Java学习:等待唤醒机制

    等待唤醒机制 线程的状态 NEW   至今尚未启动的线程处于这种状态 RUNNABLE   正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WA ...

  6. 卸载webpack,降低版本

    卸载:npm uninstall webpack -g 重新安装:npm install webpack@3.7.1 -g

  7. C#项目 App.config 配置文件不同使用环境配置

    问题 部署项目时,常常需要根据不同的环境使用不同的配置文件.例如,在部署网站时可能希望禁用调试选项,并更改连接字符串以使其指向不同的数据库.在创建 Web 项目时,Visual Studio 自动生成 ...

  8. 在HTML网页中嵌入脚本的方式

    在HTML标记的事件属性中直接添加脚本 <!doctype html> <html> <head> <meta charset="utf-8&quo ...

  9. 第二章 Maven 构建 Java Web项目

    本教程中,我们将教给大家如何创建一个基于Spring MVC 的 Maven Web Project. 用到的技术/工具: 1.Eclipse 4.9 2.Maven 3.6.2 3.Tomcat 8 ...

  10. python基础08--迭代器,生成器

    1.1 迭代器 1.可迭代对象:str,list,tuple,set,dict, 迭代器:f(文件),range() 可迭代对象和迭代器都可以for循环 可迭代对象不会计数, 迭代器会计数,上面操作到 ...