Description

小T打算在城市C开设一家外送快餐店。送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方。 快餐店的顾客分布在城市C的N 个建筑中,这N 个建筑通过恰好N 条双向道路连接起来,不存在任何两条道路连接了相同的两个建筑。任意两个建筑之间至少存在一条由双向道路连接而成的路径。小T的快餐店可以开设在任一建筑中,也可以开设在任意一条道路的某个位置上(该位置与道路两端的建筑的距离不一定是整数)。 现给定城市C的地图(道路分布及其长度),请找出最佳的快餐店选址,输出其与最远的顾客之间的距离。

Input

第一行包含一个整数N,表示城市C中的建筑和道路数目。
接下来N行,每行3个整数,Ai,Bi,Li(1≤i≤N;Li>0),表示一条道路连接了建筑Ai与Bi,其长度为Li 。

Output

仅包含一个实数,四舍五入保留恰好一位小数,表示最佳快餐店选址距离最远用户的距离。
注意:你的结果必须恰好有一位小数,小数位数不正确不得分。
Sample Input
1 2 1
1 4 2
1 3 2
2 4 1
Sample Output
2.0
HINT

数据范围

对于 10%的数据,N<=80,Li=1;

对于 30%的数据,N<=600,Li<=100;

对于 60% 的数据,N<=2000,Li<=10^9;

对于 100% 的数据,N<=10^5,Li<=10^9

首先把环求出来,然后枚举删掉环上某条边,再算出现在的直径,然后取个min

我们先求出不经过环的最长链,然后每次都只用做经过环的最长链了

删掉一条边我们得到了一条链,每个点有两个属性,一个是d[i],表示不走链最长的距离,一个是S[i],表示从1走环上的边到i的距离

我们要求的是max{S[j]-S[i]+d[i]+d[j]},所以我们维护max{S[i]+d[i]}和max{d[i]-S[i]},但是两个点不能是同一个点所以再维护一下次小值和最大值的编号,用线段树

 const
maxn=;
inf=;
type
node=record
max:array[..]of double;
id,l,r,lc,rc:longint;
end;
var
first,huan,fa:array[..maxn]of longint;
d:array[..maxn,..]of double;
next,last:array[..maxn*]of longint;
l,len,a:array[..maxn*]of double;
vis:array[..maxn]of boolean;
f:array[..maxn*]of node;
n,tot,cnt,num,root1,root2:longint;
ans,ans1,s:double; function max(x,y:double):double;
begin
if x>y then exit(x);
exit(y);
end; function min(x,y:double):double;
begin
if x<y then exit(x);
exit(y);
end; procedure insert(x,y:longint;z:double);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
l[tot]:=z;
end; procedure dfs1(x:longint);
var
i,j:longint;
begin
i:=first[x];
vis[x]:=true;
while i<> do
begin
if cnt> then exit;
if (last[i]<>fa[x]) and vis[last[i]] then
begin
j:=x;
len[last[i]]:=l[i];
while j<>fa[last[i]] do
begin
inc(cnt);
huan[cnt]:=j;
j:=fa[j];
end;
end;
if not vis[last[i]] then
begin
fa[last[i]]:=x;
len[last[i]]:=l[i];
dfs1(last[i]);
end;
i:=next[i];
end;
end; procedure dfs2(x:longint);
var
i:longint;
begin
vis[x]:=true;
i:=first[x];
while i<> do
begin
if not vis[last[i]] then
begin
dfs2(last[i]);
if d[last[i],]+l[i]>d[x,] then
begin
d[x,]:=d[x,];
d[x,]:=d[last[i],]+l[i];
end
else
if d[last[i],]+l[i]>d[x,] then d[x,]:=d[last[i],]+l[i];
end;
i:=next[i];
end;
if ans<d[x,]+d[x,] then ans:=d[x,]+d[x,];
end; procedure new(x:longint);
begin
f[x].max:=f[f[x].lc].max;
f[x].id:=f[f[x].lc].id;
if f[f[x].rc].max[]>f[x].max[] then
begin
f[x].max[]:=f[x].max[];
f[x].max[]:=f[f[x].rc].max[];
f[x].id:=f[f[x].rc].id;
end
else
if f[f[x].rc].max[]>f[x].max[] then f[x].max[]:=f[f[x].rc].max[];
if f[f[x].rc].max[]>f[x].max[] then f[x].max[]:=f[f[x].rc].max[];
end; procedure build(l,r:longint);
var
now,mid:longint;
begin
inc(num);now:=num;
f[now].l:=l;f[now].r:=r;
if l=r then
begin
f[now].max[]:=a[l];
f[now].max[]:=-inf;
f[now].id:=l;
exit;
end;
mid:=(l+r)>>;
f[now].lc:=num+;build(l,mid);
f[now].rc:=num+;build(mid+,r);
new(now);
end; procedure add(now,x:longint;y:double);
var
mid:longint;
begin
if f[now].l=f[now].r then
begin
f[now].max[]:=y;
exit;
end;
mid:=(f[now].l+f[now].r)>>;
if x<=mid then
add(f[now].lc,x,y)
else
add(f[now].rc,x,y);
new(now);
end; procedure main;
var
i,x,y:longint;
z:double;
begin
read(n);
for i:= to n do
begin
read(x,y,z);
insert(x,y,z);
insert(y,x,z);
end;
dfs1();
for i:= to n do vis[i]:=false;
for i:= to cnt do vis[huan[i]]:=true;
for i:= to cnt do dfs2(huan[i]);
z:=;
for i:= to cnt do
begin
a[i]:=z+d[huan[i],];
z:=z+len[huan[i]];
end;
root1:=num+;build(,cnt);
z:=;
for i:= to cnt do
begin
a[i]:=d[huan[i],]-z;
z:=z+len[huan[i]];
end;
root2:=num+;build(,cnt);
ans1:=inf;
for i:= to cnt do
begin
if f[root1].id<>f[root2].id then
ans1:=min(ans1,f[root1].max[]+f[root2].max[])
else
ans1:=min(ans1,max(f[root1].max[]+f[root2].max[],f[root1].max[]+f[root2].max[]));
s:=s+len[huan[i]];
add(root1,i,z-len[huan[i]]+d[huan[i],]+s);
add(root2,i,d[huan[i],]-z+len[huan[i]]-s);
end;
ans:=max(ans,ans1);
writeln(ans/::);
end; begin
main;
end.

3242: [Noi2013]快餐店 - BZOJ的更多相关文章

  1. bzoj 3242: [Noi2013]快餐店 章鱼图

    3242: [Noi2013]快餐店 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 266  Solved: 140[Submit][Status] ...

  2. bzoj 3242: [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  3. P1399 [NOI2013] 快餐店 方法记录

    原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...

  4. BZOJ - 3242 :快餐店 (基环树DP) 最小化半径

    题意:给定N点N边的无向连通图,现在让你在图中找一点作为餐厅,使得最远点距离这点最近. 思路:为了保留整数,我们求最小直径,最后去除2.  直径来源于两部分: 1,在外向树中: 那么就是树的直接,一棵 ...

  5. bzoj3242 [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  6. 动态规划:NOI2013 快餐店

    Description 小 T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近 的地方. 快餐店的顾客分布 ...

  7. NOI2013 快餐店

    http://uoj.ac/problem/126 总的来说,还是很容易想的,就是有点恶心. 首先,很明显只有一个环. 我们先找出这个环,给各棵树编号id[i],然后各棵树分别以环上的点为根,求出每个 ...

  8. BZOJ3242/UOJ126 [Noi2013]快餐店

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径

    传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...

随机推荐

  1. UEditor上传图片被压缩得模糊的解决方法

    UEditor功能很强大,但是有个很不友好的功能:会在使用UEditor上传图片时,如果你的原始图片尺寸过大,就会先自动对图片大小进行压缩,然后将压缩的文件给servlet.也就是说,使用UEdito ...

  2. openquery链表删除时报错 “数据提供程序或其他服务返回 E_FAIL 状态”

    DELETE OPENQUERY (VERYEAST_COMPANY_MYSQL_CONN, 'SELECT * FROM company ') WHERE c_userid in(select c_ ...

  3. WordPress 去除图片img标签的高度与宽度

    要求 如,在桌面设备上,图片使用的是以下的HTML代码:  代码如下 复制代码 1  <img src="abc.png" alt="abc" width ...

  4. UI3_UIViewController生命周期

    // // SecondViewController.h // UI3_UIViewController生命周期 // // Created by zhangxueming on 15/7/2. // ...

  5. Spring IoC容器的设计——BeanFactory应用场景2

    1.BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,通过这个方法,可以取得IoC容器中管理的Bean,Bean的取得是通过指定名字来索引的. 2.如果需要 ...

  6. MiZ702学习笔记12——封装一个普通的VGA IP

    还记得<MiZ702学习笔记(番外篇)--纯PL VGA驱动>这篇文章中,用verilog写了一个VGA驱动.我们今天要介绍的就是将这个工程打包成一个普通的IP,目的是为后面的一篇文章做个 ...

  7. 10款基于jquery实现的超酷动画源码

    1.jQuery二级下拉菜单 下拉箭头翻转动画 之前我们分享过不少基于jQuery的二级下拉菜单,甚至是多级的下拉菜单,比如这款jQuery/CSS3飘带状多级下拉菜单就非常华丽.但今天要介绍的这款j ...

  8. 济南学习 Day 4 T1 am

    完美的序列(sequence)Time Limit:1000ms Memory Limit:64MB题目描述LYK 认为一个完美的序列要满足这样的条件:对于任意两个位置上的数都不相同.然而并不是所有的 ...

  9. float,double和decimal的精度问题

    先标注一个音标,因为我老是读错:decimal ['desɪml] 精度对比: 类型 CTS 类型 描述 有效数字 范围 float System.Single 32-bit single-preci ...

  10. 四位数码管SH5461AS的问题,arduino学习实测.

    arduino入门教程到第16课遇到些问题.效果一直是混乱的状态. 琢磨了半天发现一些问题,和大家分享下 1)接线图,原图没有问题,只是比较含糊,线比较多不好看. 我用红色数字标示数码管的12个脚,并 ...