这是一个求多边形费马点的问题,通过求出的费马点,进而求出费马点到各个顶点之和。
方法:模拟退火
#include <iostream>
#include <cstdio>
#include <cmath>
#define eps 1e-10
using namespace std;
struct Point
{
double x, y;
};
double dist(Point *p, int n, Point t)
{
double dis = 0.0;
for (int i=0; i<n; i++)
dis += sqrt( (p[i].x-t.x)*(p[i].x-t.x) + (p[i].y-t.y)*(p[i].y-t.y) );
return dis;
}
double get_ferment(Point *p, int n)
{
double temp, cur, step;
Point u, v;
u = p[0];
temp = dist(p, n, u);
while (step > eps)
{
for (int k=0; k<10; k++, step/=2)
for(step = 10000; step>0.2; step/=2)
for (int i=-1; i<=1; i++)
for (int j=-1; j<=1; j++)
{
v.x = u.x+step*i;
v.y = u.y+step*j;
cur = dist(p, n, v);
if (cur < temp)
{
u = v;
temp = cur;
}
}
}
return temp;//temp为距离,u为费马点
}
int main()
{
Point p[100];
int n;
while(~scanf("%d", &n))
{
for (int i=0; i<n; i++)
scanf("%lf %lf", &p[i].x, &p[i].y);
printf("%d\n", (int)(get_ferment(p, n)+0.5));
}
return 0;
}