poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions:31622 | Accepted: 8670 |
Description
After days of study, he finally figured his plan out. He wanted the average cost of each mile of the channels to be minimized. In other words, the ratio of the overall cost of the channels to the total length must be minimized. He just needs to build the necessary channels to bring water to all the villages, which means there will be only one way to connect each village to the capital.
His engineers surveyed the country and recorded the position and altitude of each village. All the channels must go straight between two villages and be built horizontally. Since every two villages are at different altitudes, they concluded that each channel between two villages needed a vertical water lifter, which can lift water up or let water flow down. The length of the channel is the horizontal distance between the two villages. The cost of the channel is the height of the lifter. You should notice that each village is at a different altitude, and different channels can't share a lifter. Channels can intersect safely and no three villages are on the same line.
As King David's prime scientist and programmer, you are asked to find out the best solution to build the channels.
Input
Output
Sample Input
4
0 0 0
0 1 1
1 1 2
1 0 3
0
Sample Output
1.000
Source
题意:
有$n$个城市,每个城市有对应的坐标和海拔。两个城市之间的距离是坐标的距离,路的花费是海拔之差。
现在要建$n-1$条路,使得花费之和比距离之和最小。
思路:
一道0/1分数规划的题目。
0/1分数规划模型指:给定整数$a_1,a_2,...,a_n$,以及$b_1,b_2,...,b_n$,求一组解$x_i(1\leq i \leq n,x_i=0或1)$,
使得$\frac{\sum_{i=1}^{n} a_i*x_i}{\sum_{i=1}^{n}b_i*x_i}$最大化。
这种类型的题目我们可以通过二分答案来做。
因为如果对于$mid$,存在一组解,使得$\sum_{i=1}^{n}(a_i - mid * b_i) * x_i \geq 0$那么我们可以变形得到
存在一组解,使得$\frac{\sum_{i=1}^{n} a_i*x_i}{\sum_{i=1}^{n}b_i*x_i} \geq mid$
也就是说,$mid$比我们实际的答案要小。
反之,如果对于任意一组解,都有$\sum_{i=1}^{n}(a_i - mid * b_i) * x_i <0$那么我们可以得到
任意的解都有$\frac{\sum_{i=1}^{n} a_i*x_i}{\sum_{i=1}^{n}b_i*x_i} < mid$
也就是说,$mid$比我们实际的答案要大。
所以我们每次只需要计算$\sum_{i=1}^{n}(a_i - mid * b_i)*x_i$的最大值,如果最大值非负,令$st = mid$,否则$ed = mid$
对于这道题,也是类似。我们二分最终的答案。
每一次重新建图,城市和城市之间的边变为$cost - mid * length$
然后在新图上跑最小生成树。
如果最小生成树的值非负,说明实际答案比$mid$要大,令$st = mid$
由于这道题是完全图,而点的个数只有$1000$所以用prim比较好
WA了好久,后来发现是对d赋初值的问题。
对于double的数组赋初值$+\infty$不能用$0x3f$而应该用$0x7f$,就改了这里就过了。
#include<iostream>
//#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
//#include<cstdlib>
#include<cstring>
#include<algorithm>
//#include<queue>
#include<vector>
//#include<set>
//#include<climits>
//#include<map>
using namespace std;
typedef long long LL;
#define N 100010
#define pi 3.1415926535
#define inf 0x3f3f3f3f const int maxn = ;
const double eps = 1e-;
int n;
struct city{
double x, y, height;
}c[maxn];
double dist[maxn][maxn], cost[maxn][maxn], g[maxn][maxn]; double get_dist(int i, int j)
{
return sqrt((c[i].x - c[j].x) * (c[i].x - c[j].x) + (c[i].y - c[j].y) * (c[i].y - c[j].y));
} double d[maxn];
bool vis[maxn];
void prim()
{
memset(d, 0x7f, sizeof(d));
memset(vis, , sizeof(vis));
/*for(int i = 1; i <= n; i++){
d[i] = (double)inf;
vis[i] = 0;
}*/
d[] = ;
for(int i = ; i <= n; i++){
int x = ;
for(int j = ; j <= n; j++){
if(!vis[j] && (x == || d[j] < d[x]))x = j;
}
vis[x] = ;
for(int y = ; y <= n; y++){
if(!vis[y])d[y] = min(d[y], g[x][y]);
}
}
} void getgraph(double mid)
{
for(int i = ; i <= n; i++){
for(int j = i; j <= n; j++){
g[i][j] = g[j][i] = cost[i][j] - mid * dist[i][j];
}
}
} bool check(double mid)
{
getgraph(mid);
prim();
double res = ;
for(int i = ; i <= n; i++){
res += d[i];
}
return res >= ;
} int main()
{
while(scanf("%d", &n) != EOF && n){
for(int i = ; i <= n; i++){
scanf("%lf%lf%lf", &c[i].x, &c[i].y, &c[i].height);
} for(int i = ; i <= n; i++){
for(int j = i; j <= n; j++){
dist[i][j] = dist[j][i] = get_dist(i, j);
cost[i][j] = cost[j][i] = fabs(c[i].height - c[j].height);
}
}
double st = 0.0, ed = 100.0;
while(ed - st >= eps){
double mid = (st + ed) / ;
if(check(mid))st = mid;
else ed = mid;
}
printf("%.3f\n", ed);
} return ;
}
poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】的更多相关文章
- POJ2728 Desert King 最优比率生成树
题目 http://poj.org/problem?id=2728 关键词:0/1分数规划,参数搜索,二分法,dinkelbach 参考资料:http://hi.baidu.com/zzningxp/ ...
- POJ2728 Desert King —— 最优比率生成树 二分法
题目链接:http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS Memory Limit: 65536K Total Subm ...
- POJ.2728.Desert King(最优比率生成树 Prim 01分数规划 二分/Dinkelbach迭代)
题目链接 \(Description\) 将n个村庄连成一棵树,村之间的距离为两村的欧几里得距离,村之间的花费为海拔z的差,求花费和与长度和的最小比值 \(Solution\) 二分,假设mid为可行 ...
- POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
- 【POJ2728】Desert King 最优比率生成树
题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题 ...
- Desert King(最优比率生成树)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22717 Accepted: 6374 Desc ...
- POJ 2728 Desert King(最优比率生成树, 01分数规划)
题意: 给定n个村子的坐标(x,y)和高度z, 求出修n-1条路连通所有村子, 并且让 修路花费/修路长度 最少的值 两个村子修一条路, 修路花费 = abs(高度差), 修路长度 = 欧氏距离 分析 ...
- POJ 2728 Desert King (最优比率树)
题意:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目 ...
- poj-2728Desert King(最优比率生成树)
David the Great has just become the king of a desert country. To win the respect of his people, he d ...
- POJ 2728 Desert King (最优比例生成树)
POJ2728 无向图中对每条边i 有两个权值wi 和vi 求一个生成树使得 (w1+w2+...wn-1)/(v1+v2+...+vn-1)最小. 采用二分答案mid的思想. 将边的权值改为 wi- ...
随机推荐
- about the libiconv.2.dylib
https://stackoverflow.com/questions/5835847/libiconv-2-dylib-mac-os-x-problem https://blog.csdn.net/ ...
- 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻译,导致系统切换语言后崩溃)
Android项目开发过程中,容易出现缺少对应中英文翻译的情况,这个Python脚本是用于检查字符串是否缺少了对应的翻译 #!/usr/bin/env python # encoding: utf-8 ...
- android异步向服务器请求数据
下面就android向服务器请求数据的问题分析如下: 1.在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据: ...
- 一个vue请求接口渲染页面的例子
new Vue({ el:'#bodylist', data: { list: [ { "type_id": "1", "type_name" ...
- android 加载远程Jar、APK
参考链接: .http://blog.csdn.net/bboyfeiyu/article/details/117104972\ http://www.cnblogs.com/LittleRedPoi ...
- Selenium Web 自动化 - 项目实战环境准备
Selenium Web 自动化 - 项目实战环境准备 2016-08-29 目录 1 部署TestNG 1.1 安装TestNG 1.2 添加TestNG类库2 部署Maven 2.1 mav ...
- LeetCode: Best Time to Buy and Sell Stock III 解题报告
Best Time to Buy and Sell Stock IIIQuestion SolutionSay you have an array for which the ith element ...
- 【九天教您南方cass 9.1】 07 绘制与标注圆曲线和细部点的方法
同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取测量空间中. [点击索取cass教程]5元立得 (给客服说暗号:“ ...
- 块级格式化上下文( Block formatting contexts)
那么如何触发BFC呢? float 除了none以外的值 overflow 除了visible 以外的值(hidden,auto,scroll ) display (table-cell,table- ...
- android开发(46) 使用 textview实现文字的阴影效果,浮雕效果
前言 最近看到一些文字的阴影效果很有意思,尝试了下,形成本文.“平面效果“是我们平时常见的平面的样子.“阴影效果”会给人一种凸起的感觉.浮雕效果会给一种雕刻“凹陷”的感觉. 演示效果图 方法 使用 t ...