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 ...
随机推荐
- FragmentTransaction.addToBackStack无效的问题
FragmentTransaction.addToBackStack无效的问题: 如果当前的类继承的ActionBarActivity,则FragmentManager必须来自v4包,这样addToB ...
- django基本命令备忘录
1. 新建一个 django project django-admin.py startproject project-name 新建 app python manage.py startapp ap ...
- js学习--DOM操作详解大全一(浏览器对象)
一.客户端中的window对象 window对象表示当前浏览器的窗口,它是一个顶级对象,我们创建的所有对象.函数.变量都是window对象的成员. window对象自带了一些非常有用的方法.属性. w ...
- 安装ImageMagick扩展出现configure: error: not found. Please provide a path to MagickWand-config or Wand- config program
安装ImageMagick扩展报错: checking ImageMagick MagickWand API configuration program... checking Testing /u ...
- sublime支持显示中文
Sublime Text 2是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦.不过Sublime Package Control所以供的插件可以让Subli ...
- Java实现Http服务器(四)
(1)HTTPServer的监听启动 sun.net.httpserver.ServerImpl类中启动了Socket监听,ServerImpl的内部类Dispatch类启动了Http服务器的监听 / ...
- SqlServer 允许保存对数据库中表结构的修改
1.Tools-->optisons-->Designers 如下截图
- 解决类型“System.Web.UI.UpdatePanel”不具有名为“Gridview”的公共属性,
类型“system.web.ui.updatepanel” 不具有名为“XXX”的公共属性,其实原因很简单.就是少了一个<ContentTemplate></ContentTempl ...
- hadoop 学习笔记 (十) mapreduce2.0
MapReduce的特色---不擅长的方面 >实时计算 像mysql一样,在毫秒级或者秒级内返回结果 >流式计算 Mapreduce的输入数据时静态的,不能动态变化 MapReduce自身 ...
- Yarn应用程序编程实例
Yarn自带的Application示例程序:DistributedShell 和 UnManaged AM1 DistributedShell ,故名思意,是一个分布式运行shell命令的应用程序, ...