Hdu 4081 最小生成树
Qin Shi Huang's National Road System
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6137 Accepted Submission(s): 2143
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.
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.
4
1 1 20
1 2 30
200 2 80
200 1 100
3
1 1 20
1 2 30
2 2 40
70.00
题意:给你n个点的坐标和每个城市的人数p,现在要修路,两点之间距离就是欧拉距离,要使得所有的n个城市都联通,且可以免费修一条路(u,v),求使得A =pu + pv, B = 要修的其他路的总长度, 求A/B的最大值
因为要使得n个城市联通,那我们只需要修n-1条路,可以枚举免费修的路(u,v),只需要得出:包含边(u,v)的最小生成树mst(u,v)
如何得出包含边(u,v)的最小生成树呢?
我们先求一次原图的最小生成树MST,在该生成树上添加边(u,v),就会形成一个环,我们要做的就是在树中去掉u到v唯一路径上的最大边权
如何求出u到v唯一路径上的最大边呢?
mc[u][v]表示节点u到v路径上的最大边,用数组记录访问过的节点x, 有mc[v][x] = max(mc[v][u], mc[u][x]) 其中u是v的父亲
在CF上有一题就是求包含每一条边的最小生成树,我们也可以在原图的最小生成树上用LCA预处理出fa[u][i]表示节点u到其第2^i个祖先的路径上的最大边权,每次可以log得出u到v的最大边
#include <bits/stdc++.h>
using namespace std;
const int N = ;
struct Edge {
int u, v;
double w;
Edge() {}
Edge(int u, int v, double w):u(u),v(v),w(w) {}
friend bool operator < (Edge a, Edge b) {
return a.w < b.w;
}
};
Edge e[N * N * ];
int x[N], y[N], fa[N];
int p[N];
vector<Edge> g[N];
double dist(int i, int j) {
return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) * 1.0);
}
int findx(int x) {
return fa[x] == x ? x:fa[x] = findx(fa[x]);
}
double MST(int m, int n) {
for(int i = ; i < n; ++i) fa[i] = i;
sort(e, e + m);
double ans = ;
int num = ;
for(int i = ; i < m; ++i)
{
int fu = findx(e[i].u);
int fv = findx(e[i].v);
if(fu == fv) continue;
num++;
fa[fu] = fv;
ans += e[i].w;
g[e[i].u].push_back(Edge(-,e[i].v, e[i].w));
g[e[i].v].push_back(Edge(-,e[i].u, e[i].w));
if(num == n - ) break;
}
return ans;
}
double mc[N][N];
int vis[N], cur[N], c;
void DFS(int u) {
vis[u] = ; cur[c++] = u;
int sx = g[u].size();
for(int i = ; i < sx; ++i) {
int v = g[u][i].v;
double w = g[u][i].w;
if(vis[v]) continue;
for(int j = ; j < c; ++j) {
int x = cur[j];
mc[v][x] = mc[x][v] = max(w, mc[x][u]);
}
DFS(v);
}
}
double solve(int n, double B) {
double ans = ;
for(int i = ; i < n; ++i) {
for(int j = i + ; j < n; ++j)
ans = max(ans, (p[i] + p[j]) * 1.0 / (B - mc[i][j]));
}
return ans;
}
int main()
{
int _; scanf("%d", &_);
while(_ --) {
int n; scanf("%d", &n);
for(int i = ; i < n; ++i) g[i].clear();
for(int i = ; i < n; ++i) scanf("%d%d%d", &x[i], &y[i], &p[i]);
int m = ;
for(int i = ; i < n; ++i)
for(int j = i + ; j < n; ++j) {
e[m++] = Edge(i, j, dist(i, j));
}
// for(int i = 0; i < m; ++i) printf("%d %d %f\n", e[i].u, e[i].v, e[i].w);
c = ;
memset(mc, , sizeof mc);
memset(vis, , sizeof vis);
double res = MST(m, n);
DFS();
printf("%.2f\n", solve(n, res));
}
return ;
}
Hdu 4081 最小生成树的更多相关文章
- hdu 4081 最小生成树+树形dp
思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...
- hdu 4081 最小生成树变形
/*关于最小生成树的等效边,就是讲两个相同的集合连接在一起 先建立一个任意最小生成树,这条边分开的两个子树的节点最大的一个和为A,sum为最小生成树的权值和,B为sum-当前边的权值 不断枚举最小生成 ...
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- HDU 1233(最小生成树)
HDU 1233(最小生成树 模板) #include <iostream> #include <algorithm> #include <cstdio> usin ...
- 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(最小生成树+dp)2011 Asia Beijing Regional Contest
同样是看别人题解才明白的 题目大意—— 话说秦始皇统一六国之后,打算修路.他要用n-1条路,将n个城市连接起来,并且使这n-1条路的距离之和最短.最小生成树是不是?不对,还有呢.接着,一个自称徐福的游 ...
- HDU 4081 Qin Shi Huang's National Road System 最小生成树
分析:http://www.cnblogs.com/wally/archive/2013/02/04/2892194.html 这个题就是多一个限制,就是求包含每条边的最小生成树,这个求出原始最小生成 ...
- HDU 4081 Qin Shi Huang's National Road System(最小生成树/次小生成树)
题目链接:传送门 题意: 有n坐城市,知道每坐城市的坐标和人口.如今要在全部城市之间修路,保证每一个城市都能相连,而且保证A/B 最大.全部路径的花费和最小,A是某条路i两端城市人口的和,B表示除路i ...
- HDU 4081 Peach Blossom Spring (最小生成树+dfs)
题意:给定一个 n 个点和相应的权值,要求你用 n-1 条边连接起来,其中一条边是魔法边,不用任何费用,其他的边是长度,求该魔法边的两端的权值与其他边费用的尽量大. 析:先求出最小生成树,然后再枚举每 ...
随机推荐
- HTML颜色、超链接设置
<html> <head> <title>显示的页面选项卡标题</title> <style type="text/css"& ...
- Windows中创建桌面快捷方式
Windows中创建桌面快捷方式 -------------- -------------- -------------- --------------
- HDFS中JAVA API的使用
HDFS中JAVA API的使用 HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...
- Python之路【第十七篇】Django进阶篇
规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...
- Hadoop 2.6.0+ZooKeeper+Hive HA高可用集群安装
http://blog.csdn.net/totxian/article/details/45248399
- 微信公众平台"微信连Wi-Fi"功能来了 线下微信增粉利器
微信连Wi-Fi功能在第三方开发者和服务商已经有出现了,但有些成本相对会高些.近日微信公众平台新添了一个功能插件“微信连Wi-Fi”,已有微信认证过的公众号即可申请开通.赶紧去布局这个线下微信增粉利器 ...
- 《UNIX网络编程(第3版)》unp.h等源码文件的编译安装
操作系统:Mac OS X 10.11.5 1.下载书中的源代码:点击下载 2.切换到解压后的目录 unpv13e,先查看下 README,依次执行: ./configure cd lib make ...
- 【重装系统】线上Linux服务器(2TB)分区参考方案
如果是线上服务器,假设它是 2TB 的 SATA 硬盘.8GB 内存,建议按如下方式进行分区: / 20480M(20G)(主分区) /boot 128M swap 10240M /data 2016 ...
- redis部署
下载软件 [root@localhost /]# wget http://download.redis.io/releases/redis-2.8.9.tar.gz 解压.编译.安装 [root@lo ...
- Qt:正则表达式语法:
正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式; Qt 提供了一个Q ...