题意:
给定空间上一些点,求出能覆盖所有点的最小半径。
分析:
随机算法
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100;
const double eps=1e-6;
struct node{
double x,y,z;
node(double x=0,double y=0,double z=0):x(x),y(y),z(z){}
}p[maxn];
double dis(node a,node b){
double x=a.x-b.x;
double y=a.y-b.y;
double z=a.z-b.z;
return sqrt(x*x+y*y+z*z);
}
int n;
double hillclimb(node start){
double delta=1000.0;
double ans=1e30;
while(delta>eps){
int d=1;
for(int i=1;i<=n;i++){
if(dis(p[i],start)>dis(p[d],start)){
d=i;
}
}
double r=dis(start,p[d]);
ans=min(ans,r);
start.x+=(p[d].x-start.x)/r*delta;
start.y+=(p[d].y-start.y)/r*delta;
start.z+=(p[d].z-start.z)/r*delta;
delta*=0.98;
}
return ans;
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
}
printf("%.5f\n",hillclimb(node(0,0,0)));
}
return 0;
}