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 ...
随机推荐
- [Mime] QuotedPrintableEncoding帮助类 (转载)
点击下载 QuotedPrintableEncoding.rar 这个类是关于QuotedPrintableEncoding的帮助类看下面代码吧 /// <summary> /// 类说明 ...
- Windows I/O模型、同步/异步、阻塞/非阻塞
转载自:http://www.cppblog.com/tx7do/articles/5954.html 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实 ...
- Android本地JUnit Text
Android本地JUnit Text 步骤 创建一个和source文件,里面添加和src目录相同的包. 在AndroidManifest.xml文件manifest根节点添加如下文件 <ins ...
- WCF 无法生成 client
在MVC中调用WCF 总是没有client 后来在网上查找原因,去掉Reuse type in referrenced assenbiles ,就可以生成代理代码.
- IE9透明filter和opacity同时生效的解决办法 IE9 hack only
转载请注明:来自于http://www.cnblogs.com/bluers/ 问题: 假设结构如下: <div class="wrapper"> <p clas ...
- codeblocks调试(转载)
单步调试 1)设置断点 在需要设置断点处,右击左边行号,Add breakpoint,则出现一个红色的点(可以同时设置多个,前提是不能在debug的运行模式下). 2)调试运行 Debug-> ...
- git推送失败的问题
git报错如下: fatal: 'origen' does not appear to be a git repositoryfatal: The remote end hung up unexpec ...
- python基础之列表常用操作及知识点小结
列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...
- EQueue 2.3.2
EQueue 2.3.2版本发布(支持高可用) 前言 前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果.这次新版本主要为EQueue实现了集群功能,基本实现了B ...
- Django1.7.1设置TEMPLATE_DIRS
首先附上我的django工程目录结构: mysite│ db.sqlite3│ manage.py│├─mysite │ settings.py │ urls.py │ views.py ...