https://vjudge.net/problem/UVALive-5713

题意:

秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通。道士徐福声称他可以用法术修路,不花钱,也不用劳动力,但只能修一条路,因此需要慎重选择用法术修哪一条路。秦始皇不仅希望其他道路的总长度B尽量短(这样可以节省劳动力),还希望法术连接的两个城市的人口之和A尽量大,因此下令寻找一个使得A/B最大的方案。你的任务是找到这个方案。

任意两个城市之间都可以修路,长度为两个城市之间的欧几里德距离。

思路:

先计算出最小生成树,之后用法术修的路肯定在最小生成树当中,那么之后我们就可以枚举边u-v。

当然,需要预处理,像最小生成树一样,计算出u和v之间唯一路径上的最大权maxcost[u][v]。

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long LL;
const int maxn=+; struct node
{
int u,v;
double dist;
bool operator < (const node& rhs) const
{
return dist<rhs.dist;
}
}edge[maxn*maxn]; int n;
int cnt;
int p[maxn];
int x[maxn],y[maxn];
int num[maxn];
vector<int> g[maxn]; //存储最小生成树中结点u的邻接结点
vector<double> c[maxn]; //c[u][i]表示结点u和和结点g[u][i]之间的边权 double maxcost[maxn][maxn]; //u,v两点之间的最大边权
vector<int> nodes; int find(int x)
{
return x==p[x]?x:p[x]=find(p[x]);
} double MST()
{
sort(edge,edge+cnt);
int tot_edge=;
double tot_q=;
for(int i=;i<cnt;i++)
{
int x=edge[i].u, y=edge[i].v;
int u=find(x), v=find(y);
if(u!=v)
{
p[u]=v;
g[x].push_back(y); c[x].push_back(edge[i].dist);
g[y].push_back(x); c[y].push_back(edge[i].dist);
tot_q+=edge[i].dist;
if(++tot_edge==n-) break;
}
}
return tot_q;
} void dfs(int u,int fa,double cost) //无根树转有根树,计算出u,v两点之间路径的最大边权
{
for(int i=;i<nodes.size();i++)
{
int x=nodes[i];
maxcost[x][u]=maxcost[u][x]=max(maxcost[x][fa],cost); //更新之前的结点与新加入的结点之前的最大边权
}
nodes.push_back(u);
for(int i=;i<g[u].size();i++)
{
int v=g[u][i];
if(v!=fa) dfs(v,u,c[u][i]);
}
} int main()
{
//freopen("D:\\input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
cnt=;
scanf("%d",&n);
for(int i=;i<n;i++) {p[i]=i; g[i].clear(); c[i].clear();}
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x[i],&y[i],&num[i]);
for(int j=;j<i;j++)
{
edge[cnt].u=j;
edge[cnt].v=i;
edge[cnt].dist=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
cnt++;
}
}
double tot=MST();
memset(maxcost,,sizeof(maxcost));
nodes.clear();
dfs(,-,);
double ans=-;
for(int i=;i<n;i++)
{
for(int j=i+;j<n;j++)
{
ans=max(ans,(num[i]+num[j])/(tot-maxcost[i][j]));
}
}
printf("%.2lf\n",ans);
}
return ;
}

LA 5713 秦始皇修路的更多相关文章

  1. LA 5713 秦始皇修路 MST

    题目链接:http://vjudge.net/contest/144221#problem/A 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不 ...

  2. hdu4081 秦始皇修路(次小生成树)

    题目ID:hdu4081   秦始皇修路 题目链接:点击打开链接 题目大意:给你若干个坐标,每个坐标表示一个城市,每个城市有若干个人,现在要修路,即建一个生成树,然后有一个魔法师可以免费造路(不消耗人 ...

  3. UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)

    题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...

  4. 【LA 5713 】 Qin Shi Huang's National Road System (MST)

    [题意] 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B ...

  5. LA5713 秦始皇修路 (mst)

    题意: 秦朝有n个城市,需要修路让每个城市都互相连通,现在可以免费修一条路,秦始皇希望他除了这条免费修的路外所需修的路的总和B最短,同时这条免费的路连接的人口之和A尽可能大,求最大的A/B是多少,城市 ...

  6. LA 5713 - Qin Shi Huang's National Road System(HDU 4081) MST

    LA:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  7. 【最小生成树】UVA1494Qin Shi Huang's National Road System秦始皇修路

    Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven ki ...

  8. UVALive - 5713 最小生成树

    题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...

  9. hdu 4081 Qin Shi Huang's National Road System (次小生成树的变形)

    题目:Qin Shi Huang's National Road System Qin Shi Huang's National Road System Time Limit: 2000/1000 M ...

随机推荐

  1. 雨痕 的《Python学习笔记》--附脑图(转)

    原文:http://www.pythoner.com/148.html 近日,在某微博上看到有人推荐了 雨痕 的<Python学习笔记>,从github上下载下来看了下,确实很不错. 注意 ...

  2. sql server常用性能计数器

    https://blog.csdn.net/kk185800961/article/details/52462913?utm_source=blogxgwz5 https://blog.csdn.ne ...

  3. python学习笔记(十二)python操作redis

    1.python要操作redis 首先需要安装redis模块,然后导入才能使用 安装:pip install redis 导入:import redis 2.连接redis r = redis.Red ...

  4. 脚本其实很简单-windows配置核查程序(1)

    先上成品图 需求描述 我们电脑上都安装各种过监控软件,比如360.鲁大师等等...其中有一个功能就是性能监控,在安全行业里面通常叫做"配置核查",目的就是将主机的各种性能指标展示, ...

  5. Linux打包压缩与安装卸载

     一.打包压缩 (1)tar:打包拆包命令 tar -cxzjvf 打包后的文件 欲打包的目录  -c:打包文件夹  -x:拆开文件夹  -z:以gzip格式压缩,默认压缩倍数为6倍  -j:以bzi ...

  6. Java游戏服务器成长之路——弱联网游戏篇(源码分析)

    前言 前段时间由于公司的一款弱联网游戏急着上线,没能及时分享,现在基本做的差不多,剩下的就是测试阶段了(本来说元旦来分享一下服务器技术的).公司的这款游戏已经上线一年多了,在我来之前一直都是单机版本, ...

  7. [HZNUOJ] 使用Excel + Word 批量制作准考证

    一般程序设计考试或者ACM比赛都会使用临时账号登录,这时候就需要批量制作密码条 首先需要用Excel 存储队伍的信息 比如像这样分门别类的放好 然后在word 中制作好密码条样式 选择邮件->开 ...

  8. Jmeter使用流程及简单分析监控(转载)

    转载自:https://www.cnblogs.com/linglingyuese/archive/2013/03/04/linglingyuese-one.html#undefined 一.安装Jm ...

  9. SSH整合不错的博客

    https://blog.csdn.net/struggling_rong/article/details/63153833?locationNum=9&fps=1  好好看看看哦

  10. 转载:逻辑回归的python实现

    转载自:http://blog.csdn.net/zouxy09/article/details/20319673 一.逻辑回归(LogisticRegression) Logistic regres ...