一道生成树+\(0/1\)分数规划

原题链接

设每条边的距离为\(dis[x]\),两点高度差为\(h[x]\),该图的生成树为\(T\),则题目实际求的就是\(\dfrac{\sum\limits_{x\in T}h[x]}{\sum\limits_{x\in T}dis[x]}\)的最小值。

这就是经典的\(0/1\)分数规划问题。

这里我用的是二分法。二分答案,记为\(mid\)。将图上的边权全部改为\(h[x]-mid\times dis[x]\),然后在上面跑最小生成树并计算边权和,如果非负说明\(mid\)过小,否则过大。

另外,虽然理论二分上界为\(10^7\),不过数据水,上界开四五十基本就能过了。

#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1010;
struct dd {
int x, y, z;
};
dd a[N];
int n;
double D[N][N], dis[N];
bool v[N];
int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c<'0' || c>'9'; c = getchar())
p |= c == '-';
for (; c >= '0'&&c <= '9'; c = getchar())
x = x * 10 + (c - '0');
return p ? -x : x;
}
inline double minn(double x, double y)
{
return x < y ? x : y;
}
inline int jd(int x)
{
return x < 0 ? -x : x;
}
inline double co(int x, int y, double mid)
{
return -mid * D[x][y] + jd(a[x].z - a[y].z);
}
double judge(double mid)
{
double s = 0;
int i, j, x;
memset(v, 0, sizeof(v));
memset(dis, 66, sizeof(dis));
dis[1] = 0;
for (i = 1; i <= n; i++)
{
x = 0;
for (j = 1; j <= n; j++)
if (!v[j] && (dis[j] < dis[x] || !x))
x = j;
if (!x)
break;
v[x] = 1;
s += dis[x];
for (j = 1; j <= n; j++)
if (!v[j])
dis[j] = minn(dis[j], co(x, j, mid));
}
return s;
}
int main()
{
int i, j;
double l, r, mid;
while (1)
{
n = re();
if (!n)
return 0;
for (i = 1; i <= n; i++)
{
a[i].x = re();
a[i].y = re();
a[i].z = re();
}
for (i = 1; i < n; i++)
for (j = i + 1; j <= n; j++)
D[i][j] = D[j][i] = sqrt(1.0*(a[i].x - a[j].x)*(a[i].x - a[j].x) + 1.0*(a[i].y - a[j].y)*(a[i].y - a[j].y));
l = 0;
r = 1e7;
while (l + 1e-4 < r)
{
mid = (l + r) / 2;
if (judge(mid) >= 0)
l = mid;
else
r = mid;
}
printf("%.3f\n", l);
}
return 0;
}

POJ2728 Desert King的更多相关文章

  1. POJ2728 Desert King 【最优比率生成树】

    POJ2728 Desert King Description David the Great has just become the king of a desert country. To win ...

  2. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  3. POJ2728 Desert King —— 最优比率生成树 二分法

    题目链接:http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Subm ...

  4. [POJ2728] Desert King 解题报告(最优比率生成树)

    题目描述: David the Great has just become the king of a desert country. To win the respect of his people ...

  5. poj2728 Desert King --- 01分数规划 二分水果。。

    这题数据量较大.普通的求MST是会超时的. d[i]=cost[i]-ans*dis[0][i] 据此二分. 但此题用Dinkelbach迭代更好 #include<cstdio> #in ...

  6. POJ2728 Desert King 最优比率生成树

    题目 http://poj.org/problem?id=2728 关键词:0/1分数规划,参数搜索,二分法,dinkelbach 参考资料:http://hi.baidu.com/zzningxp/ ...

  7. 【最优比率生成树】poj2728 Desert King

    最优比率生成树教程见http://blog.csdn.net/sdj222555/article/details/7490797 个人觉得很明白易懂,但他写的代码略囧. 模板题,但是必须Prim,不能 ...

  8. poj2728 Desert King——01分数规划

    题目:http://poj.org/problem?id=2728 第一道01分数规划题!(其实也蛮简单的) 这题也可以用迭代做(但是不会),这里用了二分: 由于比较裸,不作过多说明了. 代码如下: ...

  9. poj2728 Desert King(最小生成树+01分数规划=最优比率生成树)

    题意 n个点完全图,每个边有两个权值,求分数规划要求的东西的最小值. (n<=1000) 题解 心态炸了. 堆优化primT了. 普通的就过了. 我再也不写prim了!!!! 咳咳 最优比率生成 ...

随机推荐

  1. 上任com的发布流程

    参考:https://blog.csdn.net/qq_19674905/article/details/80268815 首先把本地代码提交到远程自己的git分支,然后merge request到m ...

  2. tomcat修改上下文path

    server.xml <Host name="localhost" appBase="webapps" unpackWARs="true&quo ...

  3. ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力。

    ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力. 1.http://www.yangqq.com/jstt/css3/2017-08-08/787. ...

  4. xlrd使用

    import xlrd //导入模块filename='路径/文件名' //文件路径.名称python读取excel中单元格的内容返回的有5种类型,即ctype:0. empty(空的),1 stri ...

  5. sqlite3调试

    [sqlite3调试] 1.adb shell 激活模拟器shell. 2.cd /data/data/com.xxx.xxx/databases 进入app 数据库目录. 3.ls 查看有哪些数据库 ...

  6. Laravel5.1 与 Laypage 结合进行分页

    demo地址:http://lara.ytlwin.top/orm 路由 Route::match(array('get','post'),'/orm','StuController@orm'); 控 ...

  7. ELK Deployed

    Enviroment prepare rpm -qa | grep java wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/51 ...

  8. PTA 7-2 符号配对(栈模拟)

    请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束.程序中需要检查配对 ...

  9. [剑指offer]51-数组中的逆序对(归并排序)

    题目链接 https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5 题意 在数组中的两个数字,如果前面一个数 ...

  10. [剑指Offer]24-反转链表

    题目链接 https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId=11168&t ...