[hdu P4081] Qin Shi Huang’s National Road System

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

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

一道很不错的题目。

题目大意:

(不想写了,应用一下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的更多相关文章

  1. 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: ...

  2. 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 ...

  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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. HDU - 4081 Qin Shi Huang's National Road System 【次小生成树】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意 给出n个城市的坐标 以及 每个城市里面有多少人 秦始皇想造路 让每个城市都连通 (直接或者 ...

  8. hdu 4081 Qin Shi Huang's National Road System(次小生成树prim)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点. ...

  9. HDU 4081 Qin Shi Huang's National Road System [次小生成树]

    题意: 秦始皇要建路,一共有n个城市,建n-1条路连接. 给了n个城市的坐标和每个城市的人数. 然后建n-2条正常路和n-1条魔法路,最后求A/B的最大值. A代表所建的魔法路的连接的城市的市民的人数 ...

随机推荐

  1. maven build resources

    1.在我用springboot+mytatis时,生成完mapper后,然后访问网站总是报错 错误信息: Servlet.service() for servlet [dispatcherServle ...

  2. Mac快捷键大全及cheatsheet插件

    常用快捷键 CheatSheet 在微信上看到一篇文章分享了一款小软件,觉得有必要推荐一下.名叫CheatSheet.如果你想知道某程序的所有快捷键,只需在Mac上安装CheatSheet,然后长按住 ...

  3. javaweb(3)之JSP&EL&JSTL

    JSP(Java Server Page) 介绍 什么是 JSP ? 从用户角度看,JSP 就是一个网页. 从开发者角度看,它其实就是一个继承了 Servlet 的 java 类,所以可以直接说 JS ...

  4. python 发送email邮件带附件

    EMAIL功能实现: 1.发送EMAIL带附件,并且带压缩文件夹做为附件 #_*_coding:utf-8_*_ import smtplib from email.mime.text import ...

  5. 读取excel日期数据问题

    1.企业导入数据,遇到日期数据, excel中显示日期格式正常 2009/3/13, 结果利用npoi读出来的竟然是 13-3月-2009,特别奇葩. so把excel中的日期数据统一成文本.利用Te ...

  6. shell 三剑客

    grep 过滤来自一个文件或标准输入匹配模式内容. 除了grep外,还有egrep.fgrep.egrep是grep的扩展,相当于grep -E.fgrep相当于grep -f,用的少. Usage: ...

  7. [openjudge-动态规划]滑雪

    题目描述 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区 ...

  8. 创建多线程的第一种方式——创建Thread子类和重写run方法

    创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...

  9. 01:open-falcon入门篇

    open-falcon其他篇 目录: 1.1 openfalcon介绍 1.2 open-falcon架构 1.1 openfalcon介绍返回顶部   openfalcon官网: https://b ...

  10. maven开发项目中遇到的问题

    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com ...