喵哈哈村的魔法源泉(3)
发布时间: 2017年5月9日 20:59 最后更新: 2017年5月9日 20:59 时间限制: 1000ms 内存限制: 128M
喵哈哈村有一个魔法源泉,里面有无穷无尽的力量。
但是前提是你能答出这样一个问题:
小T打算在城市C开设一家外送快餐店。送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方。
快餐店的顾客分布在城市C的N个建筑中,这N个建筑通过恰好N-1条双向道路连接起来,不存在任何两条道路连接了相同的两个建筑。任意两个建筑之间至少存在一条由双向道路连接而成的路径。小T的快餐店可以开设在任一建筑中,也可以开设在任意一条道路的某个位置上(该位置与道路两端的建筑的距离不一定是整数)。
现给定城市C的地图(道路分布及其长度),请找出最佳的快餐店选址,输出其与最远的顾客之间的距离。
第一行包含一个整数N,表示城市C中的建筑和道路数目
接下来N-1行,每行3个整数,Ai,Bi,Li(1≤i≤N;Li>0),表示一条道路连接了建筑Ai与Bi,其长度为Li
满足:,n<=200000,Li<=10000
一个实数,四舍五入保留恰好一位小数,表示最佳快餐店选址距离最远用户的距离
4 1 2 1 1 3 2 2 4 1
2.0
经分析知其最优点一定是直径的中点,所谓直径,就是这n个城市中的两个城市之间的最大距离
如何求最大距离?
首先从一个点开始dfs,找到一个最远的点,该点一定是直径的一个端点,则从这个端点再搜回去即可
其保存的距离便是直径
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 500005
#define Mod 1000000007
int n,ans,dp[maxn],m;
struct node
{
int v,c;
};
vector<node>q[maxn];
void dfs(int u,int p,int sum)
{
int i;
for(i=0;i<q[u].size();i++)
{
node v=q[u][i];
if(v.v==p)
continue;
dfs(v.v,u,sum+v.c);
}
if(sum>ans)
{
m=u;
ans=sum;
}
}
int main(void)
{
node a;
int i,x,y,z;
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
a.v=y;a.c=z;
q[x].push_back(a);
a.v=x;
q[y].push_back(a);
}
dfs(1,-1,0);
dfs(m,-1,0);
printf("%.1f\n",(double)ans/2);
return 0;
}