【题解】 [NOI2013] 快餐店

披着狼皮的羊

题意:让你选基环树上一个点,最小化所有点到该点的最短距离的最大值。

solution:
首先对于一颗树而言,将快餐店设在直径的中点一定最优,且答案为 d/2 。

推广到基环树上,可以证明快餐店设在 基环树直径的中点 一定最优,且答案为 d/2 。(巧妙的转化

然后求基环树直径有两种求法,第一种是枚举一个确定另一个,第二种是枚举断边,这里两种都可以(雾。

#include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f #define fi first #define se second #define pii pair<int,int> using namespace std; const int Maxn=2e5+5; int n,fa[Maxn],to[Maxn],ver[Maxn],rt,re,a[Maxn],e[Maxn],hua[Maxn],le; ll sum[Maxn],f[Maxn][2],g[Maxn][2],dp[Maxn]; ll ans,ans0; vector<pii> vec[Maxn]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void dfs(int x) { for(auto y:vec[x]) { if(y.fi==to[x]) continue; to[y.fi]=x,ver[y.fi]=y.se; dfs(y.fi); } } void dfs2(int x,int fa) { for(auto y:vec[x]) { if(hua[y.fi]||y.fi==fa) continue; dfs2(y.fi,x); ans0=max(ans0,dp[x]+dp[y.fi]+y.se); dp[x]=max(dp[x],dp[y.fi]+y.se); } } signed main() { scanf("%d",&n); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); if(find(u)!=find(v)) { fa[fa[u]]=fa[v]; vec[u].push_back(make_pair(v,w)); vec[v].push_back(make_pair(u,w)); } else { rt=u,re=v; to[rt]=0; ver[rt]=w; dfs(rt); for(int x=re;x;x=to[x]) { a[++le]=x; e[le+1]=ver[x]; } swap(e[1],e[le+1]); } } for(int i=1;i<=le;i++) { hua[a[i]]=1; } for(int i=1;i<=le;i++) { dfs2(a[i],0); sum[i]=sum[i-1]+e[i]; } ll tot=-a[1]; for(int i=1;i<=le;i++) { f[i][0]=max(f[i-1][0],dp[a[i]]+sum[i]); f[i][1]=max(f[i-1][1],dp[a[i]]+sum[i]+tot); tot=max(tot,dp[a[i]]-sum[i]); } for(int i=le;i>=1;i--) { sum[i]=sum[i+1]+e[i+1]; } tot=0; for(int i=le;i>=1;i--) { g[i][0]=max(g[i+1][0],dp[a[i]]+sum[i]); g[i][1]=max(g[i+1][1],dp[a[i]]+sum[i]+tot); tot=max(tot,dp[a[i]]-sum[i]); } ans=g[1][1]; for(int i=2;i<=le;i++) { ans=min(ans,max({f[i-1][1],g[i][1],f[i-1][0]+g[i][0]})); } printf("%.1lf",max(ans,ans0)/2.0); }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530247.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(16)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示