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

来源:互联网 发布:淘宝可以买凤楼信息吗 编辑:程序博客网 时间:2024/05/23 15:12
 题目大意:在多边形中找一个点,让这个点距离所有点的距离和最短。
          模拟退火,选一个随机点,朝上,下,左,右四个点移动
          代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 100+10
#define sqr(x) ((x)*(x))
#define F(i,n) for(int i=0;i<n;i++)
#define eps 1e-3
#define pi acos(-1.0)
#define Min(a,b) a>b?b:a
using namespace std;
int dr[4][2]={-1,0,0,-1,1,0,0,1};
struct cpoint{    
double x,y,d;    
cpoint()    
{
  d=0;    
}
};
cpoint cp[maxn],rp;
int n;
double dis(cpoint p,cpoint q)
{    
  return sqrt(sqr(p.x-q.x)+sqr(p.y-q.y));
}
void solve()
{    
    rp=cp[0];
    rp.d=0;
    F(i,n)
     rp.d+=dis(rp,cp[i]);     //printf("rp :%lf\n",rp.d);
    double dal=10000;
    while(dal>0.2)
    {
            cpoint t;
            F(j,4)
            {
                t.x=rp.x+dal*dr[j][0];
                t.y=rp.y+dal*dr[j][1];
                if(t.x>10000||t.x<0||t.y>10000||t.y<0)
                   continue;
                t.d=0;
                F(k,n)
                {
                    t.d+=dis(t,cp[k]);
                }                //printf("d :%lf\n",t.d);
                if(rp.d>t.d)
                   rp=t;
            }        
dal*=0.5;
    }
    printf("%d\n",(int)(rp.d+0.5)*100/100);
}
int main()
{    
while(scanf("%d",&n)!=EOF)
    {       
      F(i,n)
      scanf("%lf %lf",&cp[i].x,&cp[i].y);
        solve();
    }
    return 0;
}
原创粉丝点击