poj2728 Desert King

2023-10-31 09:50
文章标签 king desert poj2728

本文主要是介绍poj2728 Desert King,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

poj2728 Desert King

大概题意:

  每两个点中的边权有两个:一个是两点坐标的欧几里得距离( horizontal distance),暂且成为ai,第二个是两点的海拔之差,称为bi.然后需要一个生成树使sum(ai)\sum(bi)最小。

 

这里可以引入分数规划:我们设ai\bi=k,那么ai-bi*k=0

我们只需要二分一个值mid,当ai-bi*mid=0时,这时的mid便是最优值。

对于每一个mid,将每一条边的边权都变为ai-bi*mid,然后求一个最小生成树,如果总长是0,说明mid是答案,如果总长>0说明mid小了,让mid变大,反之让mid变小。

但是!!你以为这样就完了吗?根本没有!!!

坑点:

1、这个点是一个完全图,也就是有足足n^2条边,我们使用的算法一定要尽力规避m,再见kruskal!,再见堆优化!甚至临界表,再见!我们必须要用没有堆优化,使用邻接矩阵的prim!

2、精度不能取0.0001或者0.001就ok了,必须要取到0.00001!

3、二分时r一定不能开大,开打一点都会T,开到100就行,不要怕错!!!

4、终极大坑,最后的输出不能用%lf,必须用%f,不要为我为什么!厂长是我表哥!!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue> 
#include <cmath>
#include <cstdlib>
#define REP(i,k,n)  for(int i=k;i<=n;i++)
#define in(a) a=read()
#define MAXN 1000030 
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
}
int n; 
int x[1010],y[1010],d[1010];
int f[1010];
struct edge{int u,v;double a,b;
}old[10101010];
double map[1010][1010],dis[1010];
int vis[1010];
int total;
inline double check(double k){double sum=0;memset(dis,127,sizeof(dis));memset(vis,0,sizeof(vis));memset(map,127,sizeof(map));REP(i,1,total)  map[old[i].v][old[i].u]=map[old[i].u][old[i].v]=old[i].a-k*old[i].b;dis[1]=0;for(int i=1;i<=n;i++){double minn=2147483647;int v=-1;for(int j=1;j<=n;j++)if(vis[j]==0 && (v==-1 || dis[j]<minn)){minn=dis[j];v=j;}sum+=dis[v];vis[v]=1;for(int j=1;j<=n;j++)if(dis[j]>map[v][j])dis[j]=map[v][j];}return sum;
}
int main(){while(cin>>n){if(!n)  break;total=0;REP(i,1,n)  in(x[i]),in(y[i]),in(d[i]),x[i]++,y[i]++,d[i]++;REP(i,1,n)REP(j,1,i-1){old[++total].a=abs(d[i]-d[j]);old[total].b=sqrt(abs(x[i]-x[j])*abs(x[i]-x[j])+abs(y[i]-y[j])*abs(y[i]-y[j]));old[total].u=i,old[total].v=j;
            }double l=0,r=100.0,mid,k;while(r-l>0.00001){mid=(l+r)/2;k=check(mid);if(k>0)  l=mid;if(k<0)  r=mid;if(k==0) break;}printf("%.3f\n",mid);}return 0;
}
/*
5
2 3 3
3 2 10
5 1 3
5 7 6
7 8 4
*/

 

posted @ 2019-01-29 21:02 Dijkstra·Liu 阅读( ...) 评论( ...) 编辑 收藏

这篇关于poj2728 Desert King的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/314496

相关文章

【POJ】2728 Desert King 最优比率生成树——01分数规划【经典】

最近在刷巨巨们放出来的专题,然后没做几题就卡住了,果然还是太弱了T U T... 这次做到了一题01分数规划求解的生成树问题。 题目大意是这样的:给你一个无向完全图,每条边i都有两个权值,长度a[ i ],花费b[ i ],需要选出其中的一些边构造一颗生成树,生成树需要满足条件:∑ b [ i ] / ∑ a [ i ]最小。 这样我还是先来介绍一下01分数规划吧~ 给定一个上述的问

【HDU】3861 The King’s Problem 强连通缩点+有向图最小路径覆盖

传送门:【HDU】3861 The King’s Problem 题目分析:首先强连通缩点,因为形成一个环的王国肯定在一条路径中,这样才能保证拆的少。 然后缩点后就是DAG图了,由于题目要求的是最小路径覆盖,那么二分匹配即可。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>#includ

【贪心】codeforces30D King‘s problem

直接上中文题面 King's Problem? 时间限制:3.0s  内存限制:256.0MB   Special Judge 问题描述   每一个真正的国王在他的一生中,一定会征服世界,取得 codeforces 的世界冠军,在射击场赢得粉色的熊猫(= =),并游历整个王国。   国王 Copa 已经完成了前三件事。现在他只需要游历完整个王国了。他的王国在一个无限大的笛卡尔坐标系上,每

非常有趣的一道区块连CTF题目的思考————king

区块连CTF题目 区块连CTF题目king 区块连CTF题目前言一、题目以及解答二、题目分析1.进攻receive()函数2.守护king强行selfdestruct转入为什么拿不到king 前言 这道题目在于处理接受函数的知识,另外我们结合selfdestruct函数进行分析 一、题目以及解答 这是一个非常有意思的问题: 首先下面的solidity代码是本次的题

HDU 3861 The King’s Problem

http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1828    Accepted Submission

Lesson 73 The way to King Street

Lesson 73 The way to King Street 词汇 week n. 周 = 7 days 相关:weekend 周末    weekday 工作日    weekly adv. 一周一次的    = once a week 例句:一周有七天。    There are seven days in a week. days of the week: Monday 星期一 T

To-King战地日记(之二)

其实我不想告诉大家,在我这篇战地日记之前,我们战队的马姐还有一篇ToKing战地日记,原因是这厮的战地日记让我觉得我头上顶着一个山大的鸭梨。但我还是告诉大家了,为什么呢?因为那篇战地日记介绍了我们战队的每一个成员?因为那是我们战队的第一篇战地日记?还是因为……?其实我只是想让你们知道知道什么是ws。         好吧,说正题。今天我要说的就是我自己前半半(请不要怀疑我多打字了)生的梗概,虽然马

POJ-1904 King's Quest 强连通分量求完美匹配

http://poj.org/problem?id=1904 题目意思:有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚其他人还难能都找个女生结婚。 思路:第一反应还以为是求二分完美匹配,百度题解再知道用连通分量 0.0  将男生从1到n编号,女生从(n+1)到2*n

POJ 1904 King's Quest 强连通分量+二分匹配

好题啊,先赞一个,这里有个讲的好的,感觉让我讲也没他这么好。。。 King's Quest #include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <stack>using namespace std;const int maxn = 2010;vector <int> G[

Codeforces #217 (Div. 2) A Rook, Bishop and King

Little Petya is learning to play chess. He has already learned how to move a king, a rook and a bishop. Let us remind you the rules of moving chess pieces. A chessboard is 64 square fields org