Desert King(POJ2728+最优比率生成树+二分)
题目链接:http://poj.org/problem?id=2728
题目:
题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差。
思路:
由上图我们可以得知,我们只需对x进行二分(最大化平均值),以cost[i]-len[i]*x为边权跑prime即可。
代码实现如下:
- #include <set>
- #include <map>
- #include <queue>
- #include <stack>
- #include <cmath>
- #include <bitset>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef pair<ll, int> pli;
- typedef pair<int, ll> pil;;
- typedef pair<int, int> pii;
- typedef unsigned long long ull;
- #define lson i<<1
- #define rson i<<1|1
- #define bug printf("*********\n");
- #define FIN freopen("D://code//in.txt", "r", stdin);
- #define debug(x) cout<<"["<<x<<"]" <<endl;
- #define IO ios::sync_with_stdio(false),cin.tie(0);
- const double eps = 1e-;
- const int mod = ;
- const int maxn = + ;
- const double pi = acos(-);
- const int inf = 0x3f3f3f3f;
- const ll INF = 0x3f3f3f3f3f3f3f;
- int n, x, y, z;
- double ans;
- int vis[maxn];
- double mp[maxn][maxn], dis[maxn];
- struct node {
- int x, y ,z;
- }p[maxn];
- double dist(node& a, node& b) {
- return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
- }
- bool prime(double x) {
- for(int i = ; i <= n; i++) {
- dis[i] = inf;
- vis[i] = ;
- }
- ans = ;
- dis[] = ;
- for(int i = ; ; i++) {
- double mx = inf;
- int t = -;
- for(int j = ; j <= n; j++) {
- if(!vis[j] & mx > dis[j]) {
- mx = dis[j];
- t = j;
- }
- }
- if(t == -) break;
- ans += mx;
- vis[t] = ;
- for(int j = ; j <= n; j++) {
- if(!vis[j] && dis[j] > fabs(p[t].z - p[j].z) - mp[t][j] * x) {
- dis[j] = fabs(p[t].z - p[j].z) - mp[t][j] * x;
- }
- }
- }
- return ans >= ;
- }
- int main() {
- //FIN;
- while(~scanf("%d", &n) && n) {
- for(int i = ; i <= n; i++) {
- scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].z);
- }
- for(int i = ; i <= n; i++) {
- for(int j = ; j <= n; j++) {
- mp[i][j] = dist(p[i], p[j]);
- }
- }
- double ub = , lb = , mid;
- while(ub - lb > eps) {
- mid = (ub + lb) / ;
- if(prime(mid)) lb = mid;
- else ub = mid;
- }
- printf("%.3f\n", lb);
- }
- return ;
- }
Desert King(POJ2728+最优比率生成树+二分)的更多相关文章
- POJ2728 Desert King 【最优比率生成树】
POJ2728 Desert King Description David the Great has just become the king of a desert country. To win ...
- poj 2728 Desert King (最优比率生成树)
Desert King http://poj.org/problem?id=2728 Time Limit: 3000MS Memory Limit: 65536K Descripti ...
- POJ 2728 Desert King(最优比率生成树 01分数规划)
http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...
- poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】
含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解. Desert King Time Limit: 3000MS Memory Li ...
- POJ 2728 Desert King(最优比例生成树 二分 | Dinkelbach迭代法)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25310 Accepted: 7022 Desc ...
- POJ 2728:Desert King(最优比率生成树)
http://poj.org/problem?id=2728 题意:有n个点,有三个属性代表每个点在平面上的位置,和它的高度.点与点之间有一个花费:两点的高度差:还有一个长度:两点的距离.现在要让你在 ...
- POJ 2728 Desert King:最优比率生成树
题目链接:http://poj.org/problem?id=2728 题意: 给你n个点(x,y,z),让你求一棵生成树,使得 k = ∑ |z[i]-z[j]| / ∑ dis(i,j)最小. | ...
- 2018.09.13 poj2728Desert King(最优比率生成树)
传送门 01分数规划经典题. 不过用krsukal会T掉. 这题用prim反而更快(毕竟是完全图) 因此直接二分+最小生成树搞定. 代码: #include<iostream> #incl ...
- poj 2728 Desert King(最优比例生成树)
#include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #i ...
随机推荐
- 网众远程修改ip、dns
修改文件 修改ip vi /etc/rc.d/rc.inetd1.config IPADDR[0] 对应第一块网卡的ip 修改dns vi /etc/resolv.conf nameserver 21 ...
- .NET中SQL Server数据库连接方法
1. 使用本机上的SQL Server Express 实例上的用户实例. 用户实例的连接创建了一个新的SQL Server 实例.此连接只能是在本地SQL Server 2005实例上并 ...
- 【Python】python之set
阅读目录 一.set集合介绍 二.集合的方法 1.s.add()添加元素 3.s.copy()浅拷贝 4.s.difference(b) 5.s.difference_update(b) 6.s.di ...
- BZOJ 1037 生日聚会(神DP)
这题的DP很难想,定义dp[i][j][a][b]表示用了i个男生,j个女生,任一连续的后缀区间内,男生比女生最多多a人,女生比男生最多多b人. 转移就是显然了. # include <cstd ...
- openstack之neutron
Neutron neutron主要就是用于网络虚拟化,之前将nova的时候说过,网络部分没有写,因为openstack中的网络属于一个大部分,所以今天咱们就来看看neutron到底是怎么样实现网络虚拟 ...
- C# 跨服务大文件复制
跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······ 首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参 ...
- [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]
题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...
- POJ3090:Visible Lattice Points——题解
http://poj.org/problem?id=3090 题目大意:你站在(0,0)的点上看向第一向限的点,点和点会互相阻挡,问最多看到多少点. 很容易想到,我们能看到的点,它的横纵坐标一定是互质 ...
- git生成ssh key和多账号支持
git配置ssh 1.首先设置git的全局user name和email $ git config --global user.name "ygtzz"$ git config - ...
- bzoj3810: [Coci2015]Stanovi(记忆化搜索)
实际上切出来的矩阵在原矩阵上的位置是不重要的...重要的只有矩阵的大小和上下左右是否在边界上. 于是我们可以设f[x][y][l][r][u][d]表示x*y的矩阵上下左右是不是边界的最小代价. 记忆 ...