题目链接:点击打开链接

Qin Shi Huang's National Road System

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6405    Accepted Submission(s): 2237

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

题目大意:

有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点。秦始皇希望这所有n-1条路长度之和最短。然后徐福突然有冒出来,说是他有魔法,可以不用人力、财力就变出其中任意一条路出来。

秦始皇希望徐福能把要修的n-1条路中最长的那条变出来,但是徐福希望能把要求的人力数量最多的那条变出来。对于每条路所需要的人力,是指这条路连接的两个城市的人数之和。

最终,秦始皇给出了一个公式,A/B,A是指要徐福用魔法变出的那条路所需人力, B是指除了徐福变出来的那条之外的所有n-2条路径长度之和,选使得A/B值最大的那条。

分析与总结

为了使的A/B值最大,首先是需要是B尽量要小,所以可先求出n个城市的最小生成树。然后,就是决定要选择那一条用徐福的魔法来变。

因此,可以枚举每一条边,假设最小生成树的值是MinMST, 而枚举的那条边长度是w[i][j],  如果这一条边已经是属于最小生成树上的,那么最终式子的值是A/(MinMST-w[i][j])。如果这一条不属于最小生成树上的, 那么添加上这条边,就会有n条边,那么就会使得有了一个环,为了使得它还是一个生成树,就要删掉环上的一棵树。 为了让生成树尽量少,那么就要删掉除了加入的那条边以外,权值最大的那条路径。 假设删除的那个边的权值是path[i][j], 那么就是A/(MinMST-path[i][j]).

解这题的关键也在于怎样求出次小生成树。

以上引自:点击打开链接

网上有很多关于次小生成树的讲解,这里也不多说了。 直接贴代码。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 1010struct Point
{double x,y;
}q[N];
double ma[N][N];///ma数组用来保存初始图
double p[N],d[N],path[N][N];///p是每个城市的人口,d用来维护当前最短距离,path用来记录最小生成树上两点之间所有路径中的单边最大权值
int flag[N],pre[N],n,used[N][N];///flag数组标记当前点是否已经在最小生成树里,pre记录当前点的前驱(因为是无向图,其实也就是一条边的另一个节点)
///used[i][j]用来记录边ij有没有在最小生成树上,0是不在,1是在
double dis(Point a,Point b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double prim()
{double ret=0;///最小生成树大小memset(flag,0,sizeof(flag));memset(used,0,sizeof(used));memset(path,0,sizeof(path));///题目边都是大于0的,所以置为0就好for(int i=1;i<n;i++){d[i]=ma[0][i];pre[i]=0;}flag[0]=1;for(int i=0;i<n;i++){int v=-1;for(int j=0;j<n;j++)if(!flag[j]&&(v==-1||(d[v]>d[j])))v=j;if(v==-1)break;used[v][pre[v]]=used[pre[v]][v]=1;ret+=d[v];flag[v]=1;for(int j=0;j<n;j++){if(flag[j]&&j!=v)path[j][v]=path[v][j]=max(path[pre[v]][j],d[v]);if(!flag[j]&&d[j]>ma[v][j]){d[j]=ma[v][j];pre[j]=v;}}}return ret;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf %lf %lf",&q[i].x,&q[i].y,&p[i]);for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i!=j)ma[i][j]=dis(q[i],q[j]);double ret=prim();double ans=-(1<<30);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j) continue;if(used[i][j])ans=max(ans,(p[i]+p[j])/(ret-ma[i][j]));elseans=max(ans,(p[i]+p[j])/(ret-path[i][j]));}}printf("%.2lf\n",ans);}return 0;
}

hdu-4081 Qin Shi Huang's National Road System(次小生成树)相关推荐

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

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

  3. HDU 4081 Qin Shi Huang's National Road System (次小生成树算法)

    转载自http://blog.csdn.net/shuangde800 D_Double 题目: Problem Description During the Warring States Perio ...

  4. HDU - 4081 Qin Shi Huang's National Road System(次小生成树)

    题目大意:有N个城市,现在要修建一些道路使得这些城市能互相连通,修建一条道路的权值为这两个城市之间的欧几里德距离. 现在你可以选择一条路作为特殊道路,这条道路的权值为0 假设修建道路的总权值为B,用特 ...

  5. HDU 4081 Qin Shi Huang's National Road System

    HDU_4081 这个题目大体的思路是这个样子的,首先求一个最小生成树,然后求出或者顺便求出最小生成树上任意两点间路径上的最大边权,之后枚举magic road,把magic road两个端点间的之前 ...

  6. HDU 4081 Qin Shi Huang‘s National Road System(枚举+倍增优化)

    题目链接 题目链接:给你n个点,每个点都有权值,可以免费连接两个点,然后再选择n-2条边构成一个生成树,使得免费连接的两个点的权值和/n-2条边的长度和比值最大.输出这个最大值. 分析:很容易可以想到 ...

  7. Qin Shi Huang's National Road System HDU - 4081

    Qin Shi Huang's National Road System (HDU - 4081) 次小生成树的思想 题目描述 During the Warring States Period of ...

  8. HDU4081: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 ...

  9. Qin Shi Huang's National Road System( 次小生成树 )

    Qin Shi Huang's National Road System( 次小生成树 ) During the Warring States Period of ancient China(476 ...

最新文章

  1. Open3d学习计划—高级篇 6(体素化)
  2. 收集几个js实现的日期时间控件
  3. 为啥辣椒会辣得人嘴巴疼?这个问题竟然和今年诺奖有关
  4. MiniDao普通项目集成方案
  5. WPF 中动态创建和删除控件
  6. ie9怎么开兼容模式
  7. get php 怎么用,php getdate函数怎么用
  8. windows系统-程序加载时生成栈和堆的过程
  9. Spring@主要注释
  10. ps怎么对比原图快捷键_PS教程:P图前后,你还能认出这是同一个人吗?
  11. python pyquery库_python解析HTML之:PyQuery库的介绍与使用
  12. 阿里云OSS云存储平台
  13. Java 语法 索引 ----- 继承(Inheritance) 和重写(Overriding)
  14. 服务器能用usb pe安装win7系统,另一种U盘(支持winPE,可以安装win7)安装ubuntu系统的方法...
  15. matlab仿真函数,matlab自动控制仿真常见函数应用
  16. 美团商品知识图谱的构建及应用
  17. 网络爬虫的基本结构是什么?如何建立网络爬虫抓取数据?
  18. 二分查找--天堂珍珠(珍珠项链)pearl
  19. PS3主机今日发售 附官方问答
  20. ms17-010永恒之蓝使用和防范(内附视频)

热门文章

  1. FFmpeg常用推流命令
  2. 影视网站排名,关键词SEO注意事项
  3. 浏览器插件FeHelper学习:页面取色器
  4. ubuntu16.04安装iNode客户端心得总结
  5. S变换的Python代码
  6. 【内网安全】域信息收集应用网络凭据CS插件AdfindBloodHound
  7. Remote Desktop Services (Windows)
  8. 使用python的scapy库,提供一个可用的通过nbns协议获取主机名称的示例代码
  9. StringBoot中String转JSON,JSON转Map或List
  10. BAT:一键切换Windows IP地址