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?(计算几何 多边形的费马点 模拟退火)

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2991...

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

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2519...
  • fp_hzq
  • fp_hzq
  • 2012年09月12日 15:42
  • 1596

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

DescriptionLuke wants to upgrade his home computer network from 10mbs to 100mbs. His existing networ...

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

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

poj 2420 A Star not a Tree? 随机化变步长贪心

题意:
  • sepNINE
  • sepNINE
  • 2014年11月14日 21:03
  • 379

POJ2420(求多边形费马点)

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

【POJ】【P2420】【A Star not a Tree?】【题解】【模拟退火】

传送门:http://poj.org/problem?id=2420 题意:求费马点 模拟退火……WA的停不下来,...

poj 2420 A Star not a Tree? 模拟退火

模拟退火基础题

poj 2420 A Star not a Tree?

题意:给出平面上N(cal(midmid)) r= midmid

POJ 2420 A Star not a Tree?

题目描述:平面上给你n个点,让你求一个点,到这n点的距离和最小。 #include #include #include #include #define PI acos(-1.0) #def...
  • pbj1203
  • pbj1203
  • 2011年11月02日 23:34
  • 255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2420 A Star not a Tree?(贪心+求多边形费马点)
举报原因:
原因补充:

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