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. mysql联合其他表做更新

    在sql server中,我们可是使用以下update语句对表进行更新: update a set a.xx= (select yy from b) where a.id = b.id ; 但是在my ...

  2. U盘安装CentOS7笔记

    准备工具: 8G左右U盘; 最新版UltraISO; CentOS7光盘镜像; CentOS7的镜像文件可以在网易的开源镜像站或者阿里云的开源镜像站下载,地址分别是:http://mirrors.16 ...

  3. 出现 Request Entity Too Large问题的解决方法

    根据经验判断应该是上传文件大小被限制了,检查了应用配置是10M,把它设置成100M,重启服务也不能解决问题. 原来我们的tomcat是通过nginx发现服务代理的,问题就出现nginx服务器上,原来n ...

  4. nodejs跨平台应用

    nodejs官网https://nodejs.org/download/release/ 一.发行版 1)ubuntu sudo apt-get install nodejssudo apt-get ...

  5. 已经安装好了的lamp或者lnmp环境,编译其他的模块进来?

    问题: 如何为已经编译好了的环境再次编译其他的模块? 方法: 一般分为两种情况: 1. php的源码安装包中本来就有这个 .so 的扩展,我们只需要进入到php的安装源码包中的ext文件夹下,然后找到 ...

  6. Spring基本功能-扫描与继承

    一.Spring的扫描 一个稍大的项目中,可能会有成百上千个bean,此时采用xml的配置形式注入bean,一方面是配置文件显得十分庞大,另一方面也会导致后期的维护难度增加,为 此,Spring引入了 ...

  7. 基于TSUNG对MQTT进行压力测试-基础概念温习

    [单台Broker压测结果]请移步另一篇博客:http://www.cnblogs.com/lingyejun/p/7941271.html 一.TCP报头部中的SYN.FIN.ACK: ACK : ...

  8. splay伸展树模板

      普通版本: struct SplayTree { ; ], key[maxn], val[maxn], sz[maxn], lz[maxn], fa[maxn]; , ) { ch[x][]=ch ...

  9. 2017浙江省赛 D - Let's Chat ZOJ - 3961

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3961 题目: ACM (ACMers' Chatting Messe ...

  10. 理解js的DOM操作

    1.DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动.document.documentElement     返回文档的根节点<html> document.body ...