poj 2420 A Star not a Tree?(贪心+求多边形费马点)

原创 2012年03月25日 21:36:33

【题目大意】:找出一个点,使得到多边形每个点的距离和最小。输出最小距离和。


【解题思路】:求的是一个多边形的费马点。三边以上没有公式,我们可以使用随机化变步长贪心法来解这道题。


【随机化变步长贪心法】:随机选取一个点,再取一个步长,朝这个方向走,如果新位置到各点距离比原来小,则走过去。直到走不动为止,再缩小步长。直到步长小于题目精度。


【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

struct Point{
    double x,y;
    Point(){}
    Point(double a,double b){
        x=a,y=b;
    }
}point[101];

double pt_distance(const Point &p1,const Point &p2){
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

double get_all_dis(const Point &p,int n){
    double ans=0.0;
    for (int i=0; i<n; i++) ans+=pt_distance(point[i],p);
    return ans;
}

int main() {
    int n;
    while (~scanf("%d",&n)){
        for (int i=0; i<n; i++)
            scanf("%lf%lf",&point[i].x,&point[i].y);
        Point st=point[0];
        double step=100,mind=get_all_dis(st,n);
        while (step>0.2){
            int ok=1;
            while (ok){
                Point tmp,nt;
                double t;
                ok=0,nt=st;
                tmp=Point(st.x,st.y+step);
                t=get_all_dis(tmp,n);
                if (t<mind) mind=t,ok=1,nt=tmp;
            
                tmp=Point(st.x,st.y-step);
                t=get_all_dis(tmp,n);
                if (t<mind) mind=t,ok=1,nt=tmp;
            
                tmp=Point(st.x+step,st.y);
                t=get_all_dis(tmp,n);
                if (t<mind) mind=t,ok=1,nt=tmp;
            
                tmp=Point(st.x-step,st.y);
                t=get_all_dis(tmp,n);
                if (t<mind) mind=t,ok=1,nt=tmp;

                st=nt;
            }
            step=step/2.0;
        }
        int ans=(int)(mind+0.5)*100/100;
        printf("%d\n",ans);
    }
    return 0;
}



poj 2420 A Star not a Tree?(模拟退火求费马点)

Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing netw...
  • xiaosshhaa
  • xiaosshhaa
  • 2017年03月13日 18:27
  • 126

POJ 2420 A Star not a Tree? 费马点 计算几何 模拟退火

题目大意:给出平面中一些点,求平面中的一个点,使得这个点到其他所有点的距离之和最短,并输出这个距离和。 思路:模拟退火。精度到整数。。。没什么需要注意的。。 话说费马点只能用模拟退火求近似...
  • jiangyuze831
  • jiangyuze831
  • 2014年09月17日 20:41
  • 1243

POJ 2420 A Star not a Tree?(计算几何 多边形的费马点 模拟退火)

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2991...
  • sunrainchy
  • sunrainchy
  • 2013年07月19日 18:38
  • 587

POJ2420(求多边形费马点)

题目:题目链接   题意:题目的意思就是给你N个点,在平面上寻找一个点,使得这个点到其他点的距离之和最小,问你最小的距离是多 少?   分析:在三角形内部这个点叫做费马点(费马点定义)。那么这道题目就...
  • u010057864
  • u010057864
  • 2013年09月07日 19:44
  • 954

除法取模与逆元/费马小定理

对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。 逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为。(都要求a和m互质) 推导过程如下(摘...
  • tree__water
  • tree__water
  • 2016年08月05日 02:30
  • 5590

<模板>Hdu4869 Turn the pokers 组合数求余 费马小定理

Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • modiz
  • modiz
  • 2014年07月25日 15:29
  • 749

Miller_Rabin素数测试[Fermat小定理][二次探测定理][同余式][Wilson定理]

Miller和Rabin两个人的工作让Fermat素性测试迈出了革命性的一步,建立了Miller-Rabin素性测试算法。新的测试基于下面的定理: 如果p是素数,x是小于p的正整数,且,那么要么x=1...
  • zhangliang011258
  • zhangliang011258
  • 2013年08月14日 19:06
  • 2515

A Star not a Tree?——poj2420 费马点退火算法(伪)

DescriptionLuke wants to upgrade his home computer network from 10mbs to 100mbs. His existing networ...
  • qq_26723893
  • qq_26723893
  • 2017年04月10日 19:55
  • 61

poj 1385 找多边形的重心

1. 1 累加和求重心 设平面上有N 个离散数据点( xi , yi ) ( i = 1, 2, ., n) , 其 多边形重心G( . x1, . y1) 为:      这是求多边...
  • u010793761
  • u010793761
  • 2014年04月09日 20:17
  • 339

poj-3130-3335-求多边形的核

求多边形的核一般使用半平面交的方法。 如图所示: 在对多边形的每一个边进行延长,然后每条变把多边形分成两半。 图中红色的区域就是核所在的区域。红色区域上的点可以看到多边形的任何一个顶点。...
  • rowanhaoa
  • rowanhaoa
  • 2014年02月18日 09:21
  • 1473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2420 A Star not a Tree?(贪心+求多边形费马点)
举报原因:
原因补充:

(最多只允许输入30个字)