题目链接:http://poj.org/problem?id=2420
A Star not a Tree?
题目大意:求费马点!!!模拟退火即可......
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define eps 1e-9
#define INF 0xfffffff
using namespace std;
int n;
int dx[]={-1,-1,-1,0,1,1,1,0},dy[]={1,0,-1,-1,-1,0,1,1};
double ans,t;
struct point
{
double x,y;
}p[110];
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double fun2(double x,double y)
{
double sum=0;
for(int i=0;i<n;i++)
sum+=dis(x,y,p[i].x,p[i].y);
return sum;
}
void fun(double x,double y)
{
t=1;
ans=fun2(x,y);
double xx,yy,sum,tmpx,tmpy;
while(t>eps)
{
int flag=1;
while(flag)
{
flag=0;
for(int i=0;i<8;i++)
{
xx=x+dx[i]*t;
yy=y+dy[i]*t;
sum=fun2(xx,yy);
if(ans>sum)
{
ans=sum;
tmpx=xx;
tmpy=yy;
flag=1;
}
}
x=tmpx;
y=tmpy;
}
t*=0.99;
}
printf("%.lf\n",ans);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
fun(0,0);
}
return 0;
}