UValive 5713 Qin Shi Huang's National Road System
Qin Shi Huang's National Road System
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1287 Accepted Submission(s): 475
Problem
Description
During
the Warring States Period of ancient China(476 BC to 221 BC), there were seven
kingdoms in China ---- they were Qi, Chu, Yan, Han, Zhao, Wei and Qin. Ying
Zheng was the king of the kingdom Qin. Through 9 years of wars, he finally
conquered all six other kingdoms and became the first emperor of a unified
China in 221 BC. That was Qin dynasty ---- the first imperial dynasty of
China(not to be confused with the Qing Dynasty, the last dynasty of China). So
Ying Zheng named himself "Qin Shi Huang" because "Shi
Huang" means "the first emperor" in Chinese.

Qin Shi Huang undertook gigantic projects, including the first version of the
Great Wall of China, the now famous city-sized mausoleum guarded by a
life-sized Terracotta Army, and a massive national road system. There is a
story about the road system:
There were n cities in China and Qin Shi Huang wanted them all be connected by
n-1 roads, in order that he could go to every city from the capital city
Xianyang.
Although Qin Shi Huang was a tyrant, he wanted the total length of all roads to
be minimum,so that the road system may not cost too many people's life. A
daoshi (some kind of monk) named Xu Fu told Qin Shi Huang that he could build a
road by magic and that magic road would cost no money and no labor. But Xu Fu
could only build ONE magic road for Qin Shi Huang. So Qin Shi Huang had to
decide where to build the magic road. Qin Shi Huang wanted the total length of
all none magic roads to be as small as possible, but Xu Fu wanted the magic
road to benefit as many people as possible ---- So Qin Shi Huang decided that
the value of A/B (the ratio of A to B) must be the maximum, which A is the
total population of the two cites connected by the magic road, and B is the
total length of none magic roads.
Would you help Qin Shi Huang?
A city can be considered as a point, and a road can be considered as a line
segment connecting two points.
Input
The
first line contains an integer t meaning that there are t test cases(t <=
10).
For each test case:
The first line is an integer n meaning that there are n cities(2 < n <=
1000).
Then n lines follow. Each line contains three integers X, Y and P ( 0 <= X,
Y <= 1000, 0 < P < 100000). (X, Y) is the coordinate of a city and P
is the population of that city.
It is guaranteed that each city has a distinct location.
Output
For
each test case, print a line indicating the above mentioned maximum ratio A/B.
The result should be rounded to 2 digits after decimal point.
Sample
Input
2
4
1 1 20
1 2 30
200 2 80
200 1 100
3
1 1 20
1 2 30
2 2 40
Sample
Output
65.00
70.00
Source
2011 Asia
Beijing Regional Contest
【思路】
最小生成树+边交换。
题目中要求:两城市P之和为A,其他城市路径长度为B,有A/B最小。
简单的想可以求出最小生成树之后一次枚举n条边使徐福同学修路然后求一遍MST,时间为O(NMlogM)。
类比于求次小生成树,我们可以做一遍MST得到总权值tot,预处理出maxcost[][]为两点之间在MST上的最长边。枚举两点ij使徐福修maxcost代表的边(这种情况一定对应着删边后的生成树总权值最小),此时有A=P[i]+P[j],有B=tot-maxcost[i][j],比较得ans。时间为O(N^2)。
【代码】
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = +;
struct Edge{
int v,next;
double w;
}e[maxn*maxn];
int en,front[maxn];
inline void AddEdge(int u,int v,double w) {
en++; e[en].v=v; e[en].w=w; e[en].next=front[u]; front[u]=en;
} int n,m;
int x[maxn],y[maxn],p[maxn];
double maxcost[maxn][maxn]; struct Edge_Krus{
int u,v;
double w;
bool operator<(const Edge_Krus& rhs) const{
return w<rhs.w;
}
}edges[maxn*maxn];
int f[maxn];
inline int find(int x) {
return x==f[x]? x:f[x]=find(f[x]);
}
inline double dist(int i,int j) {
return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j]));
}
double Kruskal()
{
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
edges[m++]=(Edge_Krus) {i,j,dist(i,j)};
for(int i=;i<=n;i++) f[i]=i;
sort(edges,edges+m);
int cnt=;
double res=;
for(int i=;i<m;i++) {
int x=find(edges[i].u),y=find(edges[i].v);
if(x!=y) {
f[x]=y;
res += edges[i].w;
AddEdge(edges[i].u,edges[i].v,edges[i].w);
AddEdge(edges[i].v,edges[i].u,edges[i].w);
if(++cnt==n-) break;
}
}
return res;
} vector<int> nodes;
void dfs(int u,int fa,double facost) {
for(int i=;i<nodes.size();i++) {
int x=nodes[i];
maxcost[x][u]=maxcost[u][x]=max(maxcost[x][fa],facost);
}
nodes.push_back(u);
for(int i=front[u];i>=;i=e[i].next) {
int v=e[i].v;
if(v!=fa) dfs(v,u,e[i].w);
}
} int main() {
int T;
scanf("%d",&T);
while(T--)
{
en=-; m=;
memset(front,-,sizeof(front)); scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d%d",&x[i],&y[i],&p[i]); double tot=Kruskal(); nodes.clear();
memset(maxcost,,sizeof(maxcost));
dfs(,-,); double ans=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
ans=max(ans,(double)(p[i]+p[j])/(tot-maxcost[i][j]));
printf("%.2lf\n",ans);
}
return ;
}
UValive 5713 Qin Shi Huang's National Road System的更多相关文章
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...
- UVALive 5713 Qin Shi Huang's National Road System(次小生成树)
题意:对于已知的网络构建道路,使城市两两之间能够互相到达.其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少. 因为是求A/B的最大值, ...
- uvalive 5731 Qin Shi Huang’s National Road System
题意: 秦始皇要修路使得所有的城市连起来,并且花费最少:有一个人,叫徐福,他可以修一条魔法路,不花费任何的钱与劳动力. 秦始皇想让修路的费用最少,但是徐福想要受益的人最多,所以他们经过协商,决定让 A ...
- 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 ...
- hdu 4081 Qin Shi Huang's National Road System (次小生成树)
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- 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 ...
- HDU 4081 Qin Shi Huang's National Road System 次小生成树变种
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- [hdu P4081] Qin Shi Huang’s National Road System
[hdu P4081] Qin Shi Huang’s National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- Android 实现 IOS相机滑动控件
IOS相比于Android,动画效果是一方面优势,IOS相机切换时滑动的动画很不错,看着是有一个3D的效果,而且变化感觉很自然.Android也可以通过Graphics下面的Camera可以实现3D ...
- c语言学习之基础知识点介绍(十):数组
本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. ...
- virtualbox共享文件夹无访问权限问题解决方法
virtualbox共享文件夹无访问权限问题解决方法 早就困扰了,这次新装虚拟机又碰到了,记录下来. 这篇文章主要介绍了virtualbox共享文件夹无访问权限问题解决方法,造成这个问题的原因是不跟v ...
- jQuery 如何设置input checkbox 更有效 prop()
问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性 ...
- CI笔记6 json 传值
CI3.x 使用json,配合easyui, 其实很简单,走了很多的弯路, 首先在ci的控制器重,建立2个方法,一个用于显示加载view,一个用于echo json,就可以了. 需要注意的是,在ci的 ...
- 如何写类库方法、属性等的注释,才能在其他地方调用dll文件时,在代码里出现智能提示?
我的本意是想整理下以往写过的代码库,给自己的代码增加复用性.一段时间后,可能自己对写过的代码是什么含义会忘掉,或者别人看自己的代码, 增加可懂性的考虑,决定要添加注释.(好像语句不通:)可是发现,在其 ...
- Html table 实现Excel多格粘贴
Html table 实现Excel多格粘贴 电商网站的后台总少不了各种繁杂数据的录入,旁边的运营妹子录完第138条商品的时候,终于忍不住转身吼到:为什么后台的录入表不能像Excel那样多行粘贴!!! ...
- 【清橙A1094】【牛顿迭代法】牛顿迭代法求方程的根
问题描述 给定三次函数f(x)=ax3+bx2+cx+d的4个系数a,b,c,d,以及一个数z,请用牛顿迭代法求出函数f(x)=0在z附近的根,并给出迭代所需要次数. 牛顿迭代法的原理如下(参考下图) ...
- C++ 静态、动态链接库的简单实现
一.什么是静态链接库,什么是动态链接库? 1.静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些.在静态库情况下,函数和数据被编译进 ...
- js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法
http://blog.csdn.net/deepwishly/article/details/6670942 ajaxPro.dll基础教程(前台调用后台方法,后台调用前台方法) 1. javaS ...