【uoj126】 NOI2013—快餐店
http://uoj.ac/problem/126 (题目链接)
题意
求基环树直径。
Solution
zz选手迟早退役,唉,右转题解→_→:LCF
细节
拓扑排序的时候度数为0时入队。我在想什么w(゚Д゚)w
代码
// uoj126
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf (1ll<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
LL f[maxn][2],W[2][maxn],mx[2][maxn],suf[maxn],pre[maxn],deep[maxn];
LL ans,E;
int cnt,m,n,dag[maxn],head[maxn],vis[maxn],a[maxn];
struct edge {int to,next,w;}e[maxn<<1]; void link(int u,int v,int w) {
e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
e[++cnt]=(edge){u,head[v],w};head[v]=cnt;
}
void topsort() {
queue<int> q;
for (int i=1;i<=n;i++) if (dag[i]==1) q.push(i);
while (!q.empty()) {
int x=q.front();q.pop();dag[x]--;
for (int i=head[x];i;i=e[i].next)
if (dag[e[i].to]) if (--dag[e[i].to]==1) q.push(e[i].to);
}
}
void dfs(int x,int fa) {
for (int i=head[x];i;i=e[i].next) if (!dag[e[i].to] && e[i].to!=fa) {
deep[e[i].to]=deep[x]+e[i].w;
dfs(e[i].to,x);
if (f[x][0]<f[e[i].to][0]+e[i].w) f[x][1]=f[x][0],f[x][0]=f[e[i].to][0]+e[i].w;
else if (f[x][1]<f[e[i].to][0]+e[i].w) f[x][1]=f[e[i].to][0]+e[i].w;
}
ans=max(ans,f[x][0]+f[x][1]);
}
void dp(int x) {
vis[x]=1;
int t=++m;a[m]=x;
for (int i=head[x];i;i=e[i].next) if (dag[e[i].to] && !vis[e[i].to]) {
W[0][m+1]=W[0][m]+e[i].w;
dp(e[i].to);
W[1][t]=W[1][t+1]+e[i].w;
}
for (int i=head[x];i;i=e[i].next) if (dag[e[i].to]) E+=e[i].w;
}
void circle() {
LL tmp;
pre[1]=tmp=mx[0][1]=f[a[1]][0]+W[0][1];
for (int i=2;i<=m;i++) {
pre[i]=max(pre[i-1],tmp+f[a[i]][0]+W[0][i]);
mx[0][i]=max(mx[0][i-1],f[a[i]][0]+W[0][i]);
tmp=max(tmp,f[a[i]][0]-W[0][i]);
}
suf[m]=tmp=mx[1][m]=f[a[m]][0]+W[1][m];
for (int i=m-1;i;i--) {
suf[i]=max(suf[i+1],tmp+f[a[i]][0]+W[1][i]);
mx[1][i]=max(mx[1][i+1],f[a[i]][0]+W[1][i]);
tmp=max(tmp,f[a[i]][0]-W[1][i]);
}
LL d=pre[m];E=E/2-W[0][m];
for (int i=1;i<m;i++)
d=min(d,max(E+mx[0][i]+mx[1][i+1],max(pre[i],suf[i+1])));
ans=max(ans,d);
}
int main() {
scanf("%d",&n);
for (int u,v,w,i=1;i<=n;i++) {
scanf("%d%d%d",&u,&v,&w);
link(u,v,w);dag[u]++,dag[v]++;
}
topsort();
for (int i=1;i<=n;i++) if (dag[i]) dfs(i,0);
for (int i=1;i<=n;i++) if (dag[i]) {dp(i);break;}
circle();
printf("%.1lf",ans/2.0);
return 0;
}
【uoj126】 NOI2013—快餐店的更多相关文章
- BZOJ3242/UOJ126 [Noi2013]快餐店
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径
传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...
- bzoj 3242: [Noi2013]快餐店 章鱼图
3242: [Noi2013]快餐店 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 266 Solved: 140[Submit][Status] ...
- P1399 [NOI2013] 快餐店 方法记录
原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...
- bzoj3242 [Noi2013]快餐店
Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...
- 3242: [Noi2013]快餐店 - BZOJ
Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...
- 动态规划:NOI2013 快餐店
Description 小 T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近 的地方. 快餐店的顾客分布 ...
- NOI2013 快餐店
http://uoj.ac/problem/126 总的来说,还是很容易想的,就是有点恶心. 首先,很明显只有一个环. 我们先找出这个环,给各棵树编号id[i],然后各棵树分别以环上的点为根,求出每个 ...
- bzoj 3242: [Noi2013]快餐店
Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...
随机推荐
- Python3入门(五)——高级特性
一.切片 对于取指定索引的值,python提供了切片来简化傻傻的循环 list2 = ["apple", "water", "banana" ...
- [SPOJ2939]Qtree5
[SPOJ2939]Qtree5 Tags:题解 题意 链接 给你\(n\)个节点的黑白树,初始全黑.每次可以翻转某点颜色,或查询距离某点最近的白点的距离.\(n\le 10^5\).强制LCT,不准 ...
- python 回溯法 子集树模板 系列 —— 15、总结
作者:hhh5460 时间:2017年6月3日 用回溯法子集树模板解决了这么多问题,这里总结一下使用回溯法子集树模板的步骤: 1.确定元素及其状态空间(精髓) 对每一个元素,遍历它的状态空间,其它的事 ...
- 51nod 小朋友的笑话
链接 分析: 每次操作把以前没有出现这个数的设为1,有这个数的设为0.首先将当前区间设为1,考虑有set维护这个颜色出现的区间,然后把所有与当前区间相交的拿出来,修改为0. 复杂度?每次操作的线段只会 ...
- java 读写ini配置文件
ini配置文件 ;客户端配置[Client];客户端版本号version=0001;设备号devNum=6405 public final class ConfigurationFile { /** ...
- vs编译器好多下划波浪线但不报错
解决办法:项目属性->c/c++->常规->附加包含目录->$(ProjectDir): $(ProjectDir) 项目的目录(定义形式:驱动器 + 路径):包括尾部的反斜杠 ...
- libgdx学习记录13——矩形CD进度条绘制
利用ShapeRenderer可进行矩形进度条的绘制,多变形的填充等操作. 这是根据角度获取矩形坐标的函数. public Vector2 GetPoint( float x, float y, fl ...
- REST-framework快速构建API--初体验
一.快速上手 1.环境准备 安装restframework,注册app pip install djangorestframework INSTALLED_APPS = [ 'django.contr ...
- nginx 新增域名访问
nginx 新增域名访问 1.申请阿里云域名 2.指向阿里云主机 3.配置nginx文件 server { listen 80; server_name zlx.test.com; set $root ...
- c语言数字图像处理(二):图片放大与缩小-双线性内插法
图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...