题意:给出三维空间的一些点,要求你找到三维空间的一个点使这个点形成的球包含所有的点并且半径最小,输出这个半径
分析:每次找到距离半径到最小的点进行退火操作
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<cmath>
#include<vector>
//#pragma comment(linker, "/STACK:1024000000,1024000000");
using namespace std;
#define INF 0x3f3f3f3f
struct node
{
double x,y,z;
}p[35];
int n;
double dis(node a,node 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) );
}
void cal(node &k,double &r,double t)
{
int index=0;
double temp=0;
for(int i=0;i<n;i++)
{
if(dis(k,p[i])>temp)
{
temp=dis(k,p[i]);
index=i;
}
}
r=min(r,temp);
k.x+=(p[index].x-k.x)/temp*t;
k.y+=(p[index].y-k.y)/temp*t;
k.z+=(p[index].z-k.z)/temp*t;
}
double solve()
{
node s=p[0];
double delte=0.98;
double eps=1e-8;
double t=100;
double r=INF;
while(t>eps)
{
cal(s,r,t);
t*=delte;
}
return r;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
}
double ans=solve();
printf("%.5f\n",ans);
}
return 0;
}