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. SharpMap V1.1 For Web教程系列之——前言

    上次使用SharpMap还是在0.9版本阶段,那个时候主要是为了将SharpMap移植到Windows Mobile环境中,具体可参见原先的文章.互联网真的是风云变幻啊,才短短几年,Windows M ...

  2. springside出现Description Resource Path Location Type

    <?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.sp ...

  3. ionic项目相关的操作命令

     更新npmD:\Program Files\npm-3.9.0\npmnode cli.js install npm -gf vs安装 更新node.js  windows版直接从官网下载安装包 n ...

  4. Connected_Component Labelling(联通区域标记算法) C++实现

    // Connected-Component Labelling.cpp : 定义控制台应用程序的入口点.//如有是使用,请务必注明引用出处网站:http://www.cnblogs.com/Amat ...

  5. C++ Vector 动态数组

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  6. Difference between ref and out parameters

    Original link: http://www.dotnet-tricks.com/Tutorial/csharp/K0Hb060414-Difference-between-ref-and-ou ...

  7. nginx作反向代理,实现负载均衡

    nginx作反向代理,实现负载均衡按正常的方法安装好 ngixn,方法可参考http://www.cnblogs.com/lin3615/p/4376224.html其中作了反向代理的服务器的配置如下 ...

  8. 用泛型的IEqualityComparer<T>接口去重复项

    提供者:porschev 题目:下列数据放在一个List中,当ID和Name都相同时,去掉重复数据 ID Name 1  张三 1  李三 1  小伟 1  李三  2  李四 2  李武 ----- ...

  9. 安装mongodb后服务启动不了的问题

    安装mongodb后,在命令行进入mongoDB安装目录执行如下: mongod --dbpath [数据存放的本地路径] 提示如下错误: ERROR: dbpath (数据存放的本地路径) does ...

  10. Geoserver 相关学习

    参考资料: http://geoserver.org/ http://docs.geoserver.org/ 相关文档 http://docs.geoserver.org/stable/en/user ...