Qin Shi Huang's National Road System

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

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个城市,需要修建一些道路让任意两个城市(每个城市都有人口)都可以联通,徐福可以用用法力修一条路,这条路不需要劳动力,秦始皇希望其他的道路总长度
B尽量短,还希望连接的两个城市人口之和A尽量大,找到最大的A/B。
题解:这题的做法是去枚举每条边,如果枚举的这条边在最小生成树上,那么结果为 person[i]+person[j]/(MST-graph[i][j])
如果没在最小生成树上,那么加进去之后我们要删掉一条边,我们肯定是要i, j所在的环里面最大的边,这里就要用到次小生成树里面的path数组了. 结果为person[i]+person[j]/(MST-path[i][j])因为i - j不需要花费,所以不必再加上去.
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
typedef double type;
const int N = ;
const double INF = ;
struct Point
{
int x,y;
} p[N];
double graph[N][N];
int person[N];
int n,m;
int pre[N];
type path[N][N],low[N]; ///path[i][j]用于记录i到j路径上的权值最大的边
bool vis[N],used[N][N];
type prim(int pos,int n){
memset(used,false,sizeof(used));
memset(vis,false,sizeof(vis));
memset(path,,sizeof(path));
vis[pos]=true;
type cost = ;
for(int i=;i<=n;i++){
low[i]= graph[pos][i];
pre[i]=;
}
low[pos]=;
for(int i=;i<n;i++){
type Min = INF;
for(int j=;j<=n;j++){
if(!vis[j]&&low[j]<Min){
pos = j;
Min = low[j];
}
}
used[pre[pos]][pos] = used[pos][pre[pos]] = true;
cost+= Min;
vis[pos] = true;
for(int j=;j<=n;j++){
if(vis[j]&&j!=pos){
path[pos][j] = path[j][pos] = max(low[pos],path[j][pre[pos]]);
}
if(!vis[j]&&low[j]>graph[pos][j]){
low[j]=graph[pos][j];
pre[j] = pos;
}
}
}
return cost;
}
double dis(Point a,Point b)
{
return sqrt(1.0*((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
void init()
{
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
if(i==j) graph[i][j] = ;
else graph[i][j] = INF;
}
}
} int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d",&n);
init();
for(int i=; i<=n; i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&person[i]);
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
graph[i][j] = graph[j][i] = dis(p[i],p[j]);
}
}
double MST = prim(,n);
double Max = -;
for(int i=;i<=n;i++){ ///枚举所有的边
for(int j=;j<=n;j++){
if(i!=j){
if(used[i][j]){ ///如果枚举的边属于最小生成树,那么结果为 A/(MST-此边)
Max = max(Max,(person[i]+person[j])/(MST-graph[i][j]));
}else{ ///如果枚举的边不属于最小生成树,那么必定要删掉最小生成树中的一条边,删掉的肯定就是i-j之间最长的那条
Max = max(Max,(person[i]+person[j])/(MST-path[i][j]));
}
} }
}
printf("%.2lf\n",Max);
}
return ;
}

hdu 4081(次小生成树)的更多相关文章

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

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

  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 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

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

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

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

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

  6. HDU 4756 Install Air Conditioning(次小生成树)

    题目大意:给你n个点然后让你求出去掉一条边之后所形成的最小生成树. 比較基础的次小生成树吧. ..先prime一遍求出最小生成树.在dfs求出次小生成树. Install Air Conditioni ...

  7. [kuangbin带你飞]专题八 生成树 - 次小生成树部分

    百度了好多自学到了次小生成树 理解后其实也很简单 求最小生成树的办法目前遇到了两种 1 prim 记录下两点之间连线中的最长段 F[i][k] 之后枚举两点 若两点之间存在没有在最小生成树中的边 那么 ...

  8. hdu4081 次小生成树变形

    pid=4081">http://acm.hdu.edu.cn/showproblem.php?pid=4081 Problem Description During the Warr ...

  9. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

    第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...

随机推荐

  1. 网络编程介绍(uninx/windows)

    1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.a ...

  2. P1395 会议(求树的重心)

    P1395 会议 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么 ...

  3. 洛谷P1451 求细胞数量

    求细胞数量 题目链接 这道题大概是一个最简单的联通块的题了qwq 注意枚举起点的时候 一定不要从0开始不然你就会从0进入到了其他联通块中从而多查. 一定看清题意这道题不是同色为联通块!!! AC代码如 ...

  4. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)

    本文导航 -1. 注册并启用红帽订阅 -2. 使用静态 IP 地址配置网络 -3. 设置服务器的主机名称 -4. 更新或升级最小化安装的 CentOS -5. 安装命令行 Web 浏览器 -6. 安装 ...

  5. .swp文件的恢复

    .swp 编辑文件的过程中会出现这个隐藏文件. 文件如果正常保存,.swp就会自动删除.如果不正常退出,比如关机,.swp就会留下来. linux下: ls -all 可以查看隐藏文件 命令: vi ...

  6. springboot生成表结构

    https://blog.csdn.net/yalishadaa/article/details/59656332

  7. Mysql与Oracle之间的数据类型转换

    MySQL Data Type Oracle Data Type BIGINT NUMBER(19, 0) BIT RAW BLOB BLOB, RAW CHAR CHAR DATE DATE DAT ...

  8. FlexGrid布局

    FlexGrid布局: Grid布局时网格大小是固定的,如果想网格大小不同的界面可以使用FlexGrid布局.FlexGrid是更加灵活的Grid布局.FlexGrid布局类是wx.FlexGridS ...

  9. 孤荷凌寒自学python第三十天python的datetime.datetime模块

     孤荷凌寒自学python第三十天python的datetime.datetime模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.datetime模块包含了:datet ...

  10. php数组循环的三种方式

    PHP 的遍历数组的三种方式:for循环.foreach循环.while.list().each()组合循环 PHP当中数组分为:索引数组[转换成json是数组]和关联数组[转换成json是对象] f ...