[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 Limit: 32768/32768 K (Java/Others)
Problem DescriptionDuring 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.InputThe 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.OutputFor 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 40Sample Output
65.00
70.00
Source
2011 Asia Beijing Regional Contest
一道很不错的题目。
题目大意:
(不想写了,应用一下zk大佬的吧)秦始皇要在n个城市之间修路,他想使得n个城市构成一个树形结构,并使得连接的路的长度和最小。这时,徐福说他有一种办法使得一条路不需要任何花销
就能直接修成。秦始皇想让他修这些必要的路中最长的一条,但是徐福想修造福人口数最多的一条(即该条路连接的两个城市的人口和)。于是秦始皇为了均衡矛盾,给出了一种计算方法,将一条路两端
的人口数A除以其他(n-2)条需要建造的道路的总长B,即计算A/B的比值,选取比值最大的一条修。输出该条路的比值。简而言之,该题就是要求除了徐福变的那条边既可以在秦始皇原定道路上,也可以不
在,其他边都要在秦始皇原定道路上,然后要使徐福变的那条路A/B的值最大。
我们仔细思考,对于每一条路,其A值是固定的,我们要让其B值最小化。
那我们会想到与MST有点关联。那我们先构造出MST,设权值和为sum。
构造出MST后,对于每一条边:
如果在原MST上,则:ans=max(ans,(p[x]+p[y])/(sum-dis(x,y));
如果不在原MST上,怎么办呢?
由于我们要强制将这条边加入生成树,而我们又要维持生成树只有n-1条边的性质,所以我们就要删掉一条边,且这条边满足删去以后保持生成树且边权值最大。
那这就是一个次小生成树的模型了。
关于次小生成树:
code:
#include<bits/stdc++.h> #define sqr(x) ((x)*(x)) #define ms(a,x) memset(a,x,sizeof a) ; using namespace std; int n,x[N],y[N],p[N],pre[N]; double f[N],d[N][N],g[N][N],sum,ans; bool vis[N],used[N][N]; inline int read() { ; char ch=getchar(); ') ch=getchar(); +ch-',ch=getchar(); return x; } double dis(int a,int b) { return sqrt(1.0*sqr(x[a]-x[b])+1.0*sqr(y[a]-y[b])); } int main() { for (int T=read(); T; T--) { n=read(),sum=; ; i<=n; i++) x[i]=read(),y[i]=read(),p[i]=read(); ; i<=n; i++) ; j<=n; j++) d[i][j]=dis(i,j); ms(g,),ms(pre,),ms(used,),ms(vis,),vis[]=; ; i<=n; i++) f[i]=g[][i]=d[][i],pre[i]=; for ( ; ; ) { ; double minor=1e18; ; i<=n; i++) if (!vis[i]&&minor>f[i]) k=i,minor=f[i]; ) break; vis[k]=,sum+=minor; used[k][pre[k]]=used[pre[k]][k]=; ; i<=n; i++) { if (vis[i]&&i!=k) g[k][i]=g[i][k]=max(f[k],g[i][pre[k]]); if (!vis[i]&&f[i]>d[k][i]) f[i]=d[k][i],pre[i]=k; } } ans=; ; i<n; i++) ; j<=n; j++) if (used[i][j]) ans=max(ans,1.0*(p[i]+p[j])/(sum-d[i][j])); else ans=max(ans,1.0*(p[i]+p[j])/(sum-g[i][j])); printf("%.2lf\n",ans); } ; }
[hdu P4081] Qin Shi Huang’s National Road System的更多相关文章
- HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 Qin Shi Huang's National Road System Time Limit: ...
- 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 ...
- HDU 4081—— Qin Shi Huang's National Road System——————【次小生成树、prim】
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 树的基本性质 or 次小生成树思想 难度:1
During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in Ch ...
- HDU - 4081 Qin Shi Huang's National Road System 【次小生成树】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意 给出n个城市的坐标 以及 每个城市里面有多少人 秦始皇想造路 让每个城市都连通 (直接或者 ...
- hdu 4081 Qin Shi Huang's National Road System(次小生成树prim)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点. ...
- HDU 4081 Qin Shi Huang's National Road System [次小生成树]
题意: 秦始皇要建路,一共有n个城市,建n-1条路连接. 给了n个城市的坐标和每个城市的人数. 然后建n-2条正常路和n-1条魔法路,最后求A/B的最大值. A代表所建的魔法路的连接的城市的市民的人数 ...
随机推荐
- drawrect&layoutsubviews
drawrect触发方法: 设置frame setneeddisplay contentmode设置为redraw sizetofit layoutsubviews触发方法 setframe layo ...
- 常见web UI 元素操作 及API使用
1. 链接(Link) // 找到链接元素,这个方法比较直接,即通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接 WebElement link1 = driver.f ...
- css设置input获得焦点的样式
input:focus{ 样式; } 这样就ok
- Oracle——trunc()函数的使用
trunc是oracle数据库中一种格式化函数. 1.处理日期 1.1.当年第一天: SELECT TRUNC(SYSDATE,'YYYY') FROM DUAL; SELECT TRUNC(SYSD ...
- windows程序设计 创建一个新的窗口
#include <windows.h> LRESULT CALLBACK myProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(H ...
- docker安装配置gitlab详细过程
docker安装配置gitlab详细过程 获取镜像 1.方法一 1 docker pull beginor/gitlab-ce:11.0.1-ce.0 2.方法二如果服务器网路不好或者pull不下 ...
- 【Spark-core学习之八】 SparkShuffle & Spark内存管理
[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...
- 重新设计导出API
优雅的API是清晰简洁的,就像少女的肌肤一样柔滑. 背景 API 是软件应用向外部提供自身服务的一种形态和公开接口.就像一个人的着装打扮.举止言行.形象状态,是其内在的某种体现.很少有人能看到对方灵魂 ...
- 20190409Liunx中计划任务及压缩归档week2_day1
计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...
- 在oracle中如何把前台传过来的日期字符串转换成正确格式
insert into ibill_sys_version(versionId,productCode,versionCode,versionDesc,versionUrl, upgradeWay,u ...
