POJ 2420
求费马点
代码来自网络
#include<cmath>
#include<cstdio>
const double inf=1e9;
const int N=100;
const double threshold=1e-7,delta=0.98,inital_temperature=100;
const double d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n;
struct Point {
double x,y;
};
Point p[N];
inline double sqr(const double x) {
return x*x;
}
inline double dist(const Point a,const Point b) {
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
inline double getsum(const Point x) {
double ret=0;
for(int i=0;i<n;i++) {
ret+=dist(x,p[i]);
}
return ret;
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%lf%lf",&p[i].x,&p[i].y);
}
Point nowp=p[0];
double ans=getsum(nowp),t=inital_temperature;
while(t>threshold) {
bool finished=false;
while(!finished) {
finished=true;
for(int i=0;i<4;i++) {
Point nextp;
nextp.x=nowp.x+d[i][0]*t;
nextp.y=nowp.y+d[i][1]*t;
if(getsum(nextp)<ans) {
ans=getsum(nextp);
nowp=nextp;
finished=false;
}
}
}
t*=delta;
}
printf("%.f\n",ans);
}