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 条边连接起来,其中一条边是魔法边,不用任何费用,其他的边是长度,求该魔法边的两端的权值与其他边费用的尽量大. 析:先求出最小生成树,然后再枚举每 ...
随机推荐
- Spring IoC容器的初始化过程
Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...
- BZOJ 4568 幸运数字
题目传送门 4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Description A 国共有 n 座城市,这些城市由 n-1 ...
- iOS plist文件创建
iOS中plist的创建,数据写入与读取功能创建一个test.plist文件,textInput作为输入,displayLabel作为显示,有一个按钮来触发保持程序triggerStorage: -( ...
- C#内存管理与垃圾回收
垃圾回收还得从根说起,就像生儿育女一样. 根:根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null.根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为 ...
- Java Web学习笔记3
今天做了一个实验:Servlet访问WEB-INF目录下的文件notice.html 最后始终不能出现预期的效果,我猜想可能是使用了Tomcat 8版本的原因吧,暂时放下,等以后知识丰富了,再来解决它 ...
- 【Tomcat 6.0官方文档翻译】—— 简介
Tomcat作为使用最多的web容器,研究其原理过程,对掌握java web开发有很重要的影响. 因此下定决心,从官方文档入手,好好学学web相关的知识. 介绍 本篇是Apache Tomca ...
- Java与MySQL的连接
下载数据库驱动文件,解压并保存至任意位置 下载地址 新建Java项目,并将驱动文件添加到项目中 项目名右键-->构建路径-->配置构建路径-->添加外部Jar 在项目中新建类,编写代 ...
- 布局之按钮的图片分辨率--Android Studio
在布局页面,想把取消按钮和确认钮大小一致,刚开始想法是错的,不用在控制层设置,也不用在布局层压缩图片,有两个方法法: 1.直接用美图秀秀“尺寸”功能,修改成另一按钮一样的分辨率. 2.设置按钮相同高度 ...
- CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(2)CSS3利用图层叠加实现多背景
CSS 3允许设置多个背景图片,每个背景图片占一层,层的上下按照在CSS中书写的顺序来定,最先写的背景在最上层,每层图片定义使用英文逗号隔开. 例如下面的代码: background:url(http ...
- PHP连接mysql数据库,并将取出的数据以json的格式输出
<?php error_reporting(E_ALL || ~E_NOTICE); header("Access-Control-Allow-Origin:*");//此处 ...