题意:给个四边形,问一个点到四边形四个点距离最小的距离和是多少。

分析:如果是凸四边形,费马点就是对角线的交点,距离就是对角线长度。

如果是凹多边形,费马点就是那个凹点。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;
#define eps 1e-8
int Fabs(double d)
{
    if(fabs(d)<eps) return 0;
    else return d>0?1:-1;
}
struct point
{
    double x,y;
}p[10],sta[10];
int oper[8][2]={0,1,0,-1,-1,0,1,0,1,1,1,-1,-1,1,-1,-1},top;
double x_multi(point p1,point p2,point p3)
{
    return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
}

double Dis(point p1,point p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
bool cmp(point a,point b)
{
    if(Fabs(x_multi(p[0],a,b))>0) return 1;
    if(Fabs(x_multi(p[0],a,b))<0) return 0;
    if(Fabs(Dis(p[0],a)-Dis(p[0],b))<0)
        return 1;
    return 0;
}
void Graham(int n)
{
    int i,k=0,tot;
    for(i=1;i<n;i++)
        if((p[i].y<p[k].y)||((p[i].y==p[k].y)&&(p[i].x<p[k].x)))
            k=i;
    swap(p[0],p[k]);
    sort(p+1,p+n,cmp);
    sta[0]=p[0],sta[1]=p[1];
    i=top=1;
    for(i=2;i<n;i++)
    {
        while(top>=1&&Fabs(x_multi(p[i],sta[top],sta[top-1]))>=0)
        {
            if(top==0) break;
            top--;
        }
        sta[++top]=p[i];
    }
}
int main()
{
    int i,j;
    while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y))
    {
        if(p[0].x==-1&&p[0].y==-1&&p[1].x==-1&&p[1].y==-1&&p[2].x==-1&&p[2].y==-1&&p[3].x==-1&&p[3].y==-1)
            break;
        Graham(4);
        double ans;
        if(top==3)
            ans=Dis(sta[0],sta[2])+Dis(sta[1],sta[3]);//凸四边形就直接取对角线交点
        else
        {
            ans=1e50;
            double sum=0;
            for(i=0;i<4;i++)
            {
                sum=0.0;
                for(j=0;j<4;j++)
                    if(i!=j)
                        sum+=Dis(p[i],p[j]);
                 ans=min(sum,ans);
            }
        }
        printf("%.4lf\n",ans);
    }
    return 0;
}