三维空间中,给你n个点,找到一个点与这n个点的最大距离最小
模拟退火
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-8;
struct point3D
{
double x,y,z;
}a[105];
int n;
double dis(point3D a,point3D b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
double solve()
{
double step=10000,ans=1e30,mt;
point3D z;
z.x=z.y=z.z=0;
int s=0;
while(step>eps)
{
for(int i=0; i<n; i++)
if(dis(z,a[s])<dis(z,a[i])) s=i;
mt=dis(z,a[s]);
ans=min(ans,mt);
z.x+=(a[s].x-z.x)/mt*step;
z.y+=(a[s].y-z.y)/mt*step;
z.z+=(a[s].z-z.z)/mt*step;
step*=0.98;
}
return ans;
}
int main()
{
double ans; scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z);
ans=solve();
printf("%.7f\n",ans);
return 0;
}