BZOJ - 3242 :快餐店 (基环树DP) 最小化半径
题意:给定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) 最小化半径的更多相关文章
- 基环树DP
基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...
- [CSP-S模拟测试]:卡常题/b(基环树+DP)
题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...
- [bzoj2878][Noi2012]迷失游乐园(基环树dp)
[bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...
- bzoj1791[IOI2008]Island岛屿(基环树+DP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...
- 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...
- BZOJ1040:骑士(基环树DP)
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- How Javascript works (Javascript工作原理) (十四) 解析,语法抽象树及最小化解析时间的 5 条小技巧
个人总结:读完这篇文章需要15分钟,文章介绍了抽象语法树与js引擎解析这些语法树的过程,提到了懒解析——即转换为AST的过程中不直接进入函数体解析,当这个函数体需要执行的时候才进行相应转换.(因为有的 ...
- BZOJ3037 创世纪[基环树DP]
实际上基环树DP的名字是假的.. 这个限制关系可以看成每个点有一条出边,所以就是一个内向基环树森林. 找出每个基环树的环,然后对于树的部分,做DP,设状态选或不选为$f_{x,0/1}$,则 $f_{ ...
- [ZJOI2008] 骑士 - 基环树dp
一类基环树dp都是这个套路吧 随便拆掉环上的一条边 然后跑树形dp,设\(f[i][0/1]\)表示以第\(i\)个人为根的子树,第\(i\)个人选或不选,能收获的最大值 以断点\(u,v\)为根分别 ...
- BZOJ3037 创世纪(基环树DP)
基环树DP,攻的当受的儿子,f表选,g表不选.并查集维护攻受关系.若有环则记录,DP受的后把它当祖宗,再DP攻的. #include <cstdio> #include <iostr ...
随机推荐
- SyntaxError: Non-ASCII character ‘\xe5’ in file 的解决办法
在Python脚本中包含中文的时候,会遇到编码错误.例如: 出现SyntaxError: Non-ASCII character ‘\xe5’ in file 的错误. 解决办法:是因为编码有问题,所 ...
- Python下的XML-RPC客户端和服务端实现(基于xmlrpclib SimpleXMLRPCServer 模块)
RPC是Remote Procedure Call的缩写,翻译成中文就是远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立 ...
- 基于springboot的flowable工作流实例实现
基于springboot的flowable工作流实例实现 flowableUI 创建实例教程 https://www.cnblogs.com/nanstar/p/11959389.html Flowa ...
- SQL join 三种扩展用法
以前学习,只知道 LEFT JOIN.RIGHT JOIN.INNER JOIN.FULL JOIN,共四种集合,然而加上一些条件,可以组合成另外三种集合,直接上图.
- 25个led灯新玩法
Microbit板子的25个led灯,是5X5的阵列,led(lights emitting diodes)中文叫发光二极管,有单向导电性,还发光,有各种颜色的,红,蓝,黄等等.mPython可以让你 ...
- CLH lock 原理及JAVA实现
--喜欢记得关注我哟[shoshana]-- 前记 JUC中的Lock中最核心的类AQS,其中AQS使用到了CLH队列的变种,故来研究一下CLH队列的原理及JAVA实现 一. CLH背景知识 SMP ...
- excel 使用
列于列拼接
- 『Blocks 区间dp』
Blocks Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, ...
- java ASM
一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.J ...
- scarpy设置日志打印级别和存储位置
在settings.py中配置 日志级别设置 LOG_LEVEL = 'ERROR' # 当LOG_LEVEL设置为ERROR时,在进行日志打印时,只是打印ERROR级别的日志 日志存储设置 LOG_ ...