【题解】Qin Shi Huang's National Road System HDU - 4081 ⭐⭐⭐⭐ 【次小生成树】
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个点通过N-1条边连接起来, 权值为两点直接距离, B为距离和, 同时可以选中一条边, 使得该边权值变为0, A为该边两点人口数量. 求A/B的最大值
题解:
既然要求A/B的最大值, 就一定要A最大, B最小, 所以B需要求一下MST, A的话我们直接枚举每条边就好了, 如果该边已经在MST中,$$ ans = max(ans, A/(B-w[i][j]));$$ 否则$$ans = max(ans, A/(B-maxD[i][j]));$$
可以看到, 虽然这里没有直接使用次小生成树, 但是完全用到了次小生成树求出的几个数组, 这也是前面为何没有直接求出次小生成树的原因, 因为大部分的题目必然不是裸题, 所以更要仔细理解次小生成树的思想
#include<bits/stdc++.h>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const int inf = 1 << 30;
const LL maxn = 1010;
int N;
double w[maxn][maxn];
struct node {
int x, y;
int p;
node(int xx, int yy, int pp) { x = xx, y = yy, p = pp; }
node() {}
} vs[maxn];
double getDis(int x1, int y1, int x2, int y2) {
return sqrt((double)(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
double d[maxn];
bool used[maxn];
double maxD[maxn][maxn]; //MST中从i->j的最大权值
int pre[maxn]; //某一点父节点
bool mst[maxn][maxn]; //该点是否已经在MST中
typedef pair<int, int> P;
double Prim(int s) {
fill(d, d + maxn, inf);
fill(pre, pre + maxn, s);
ms(maxD, 0); ms(used, 0); ms(mst, 0);
priority_queue<P, vector<P>, greater<P> > q;
q.push(P(d[s] = 0, s));
double res = 0;
while (!q.empty()) {
P cur = q.top();
q.pop();
int u = cur.second;
if (used[u])
continue;
used[u] = true, res += d[u];
mst[u][pre[u]] = mst[pre[u]][u] = true; //加入到MST中
for (int v = 1; v <= N; ++v) {
if (used[v] && w[u][v] < inf) //只更新MST中的
maxD[u][v] = maxD[v][u] = max(maxD[pre[u]][v], d[u]);
if (w[u][v] < d[v]) {
d[v] = w[u][v];
pre[v] = u; //更新父节点
q.push(P(d[v], v));
}
}
}
return res;
}
int main() {
//freopen("in.txt", "r", stdin);
int T, a, b, c;
scanf("%d", &T);
while (T--) {
ms(vs, 0); fill(w[0], w[0] + maxn * maxn, inf);
scanf("%d", &N);
for (int i = 1; i <= N; ++i) {
scanf("%d%d%d", &a, &b, &c);
vs[i] = node(a, b, c);
}
for (int i = 1; i < N; ++i)
for (int j = i + 1; j <= N; ++j)
w[i][j] = w[j][i] = getDis(vs[i].x, vs[i].y, vs[j].x, vs[j].y);
//枚举删边, 找出最大值
double B = Prim(1), A, ans = -1;
for (int i = 1; i < N; ++i)
for (int j = i + 1; j <= N; ++j) {
A = vs[i].p + vs[j].p;
//这条边未在MST中使用, 尝试加边并删去生成环中的最长边, 已使用则直接变0
if (mst[i][j]) {
ans = max(ans, A / (B - w[i][j]));
}
else {
ans = max(ans, A / (B - maxD[i][j]));
}
}
printf("%.2lf\n", ans);
}
return 0;
}
【题解】Qin Shi Huang's National Road System HDU - 4081 ⭐⭐⭐⭐ 【次小生成树】的更多相关文章
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- 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 ...
- 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 ...
- 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: ...
- HDU4081 Qin Shi Huang's National Road System —— 次小生成树变形
题目链接:https://vjudge.net/problem/HDU-4081 Qin Shi Huang's National Road System Time Limit: 2000/1000 ...
- 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 ...
- 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/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 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 ...
随机推荐
- 【外包杯】【报错】微信小程序 “[app.json 文件内容错误]app.json:未找到[“pages”][0]对应 pages/xx/xx.wxml(或其他)文件” 报错 的简单解决方案(已解决)
问题的解决方案 删除components目录下的uni-link文件夹
- wps表格求标准差怎么算?
在WPS表格中,要计算标准差,可以使用STDEV函数.标准差是一种衡量数据集合离散程度的统计指标.下面我将详细介绍如何使用STDEV函数来计算标准差. STDEV函数的语法为:STDEV(range) ...
- 前端学习-html-1
html常用标签 h1-h6:标题 p:段落 strong/em: 对文本进行设置 strong--加粗,强调作用 比如:商品价格 em--斜体,对文本内容修饰成斜体 hr/br: hr ...
- IP交付标准总结。
RTL顶层代码,IP内部需要IP自己完成连接并保证正确,CM/PLL/MCU/SRAM/TX/RX内部模块不接受外部进行拼接,DFT内部自己处理.IP用到的宏,名称功能文档要说明清楚.优先使用硬核IP ...
- idea的maven
在我学习springMvc时一直报一个错,后来发现是maven一直出错导致的 这个maven是idea系统自己的maven,用着用着发现依赖项不见了,怎么导入坐标都导不进去,导致在创建maven项目时 ...
- Python:单元测试框架unittest
1.什么是单元测试 测试函数/方法或者一段代码,用于检验被测代码的一个很小的.很明确的功能是否正确,通常是开发做. 在Python中的单元测试框架有Unittest和Pytest,现在总结Unitte ...
- Pikachu漏洞靶场 PHP反序列化
PHP反序列化 查看源码,以下为关键代码: class S{ var $test = "pikachu"; function __construct(){ echo $this-& ...
- Pikachu漏洞靶场 RCE(远程命令执行/代码执行)
RCE 文章目录 RCE 概述 exec "ping" exec "eval" 概述 RCE(remote command/code execute),远程命令 ...
- STM32CubeMX教程8 TIM 通用定时器 - 输出比较
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 逻 ...
- 为什么Java中“1000==1000”为false,而”100==100“为true?
在日常编程中,我们经常遇到一些看似简单却隐藏着复杂逻辑的问题. 比如,你是否想过为什么在 Java 中表达式1000==1000会返回 false,而 100==100 却返回 true 呢? Int ...