poj2069Super Star【空间最小球覆盖模拟退火】
2015-10-07 09:26
337 查看
Language: Default Super Star
During a voyage of the starship Hakodate-maru (see Problem 1406), researchers found strange synchronized movements of stars. Having heard these observations, Dr. Extreme proposed a theory of "super stars". Do not take this term as a description of actors or singers. It is a revolutionary theory in astronomy. According to this theory, starts we are observing are not independent objects, but only small portions of larger objects called super stars. A super star is filled with invisible (or transparent) material, and only a number of points inside or on its surface shine. These points are observed as stars by us. In order to verify this theory, Dr. Extreme wants to build motion equations of super stars and to compare the solutions of these equations with observed movements of stars. As the first step, he assumes that a super star is sphere-shaped, and has the smallest possible radius such that the sphere contains all given stars in or on it. This assumption makes it possible to estimate the volume of a super star, and thus its mass (the density of the invisible material is known). You are asked to help Dr. Extreme by writing a program which, given the locations of a number of stars, finds the smallest sphere containing all of them in or on it. In this computation, you should ignore the sizes of stars. In other words, a star should be regarded as a point. You may assume the universe is a Euclidean space. Input The input consists of multiple data sets. Each data set is given in the following format. n x1 y1 z1 x2 y2 z2 . . . xn yn zn The first line of a data set contains an integer n, which is the number of points. It satisfies the condition 4 <= n <= 30. The location of n points are given by three-dimensional orthogonal coordinates: (xi, yi, zi) (i = 1, ..., n). Three coordinates of a point appear in a line, separated by a space character. Each value is given by a decimal fraction, and is between 0.0 and 100.0 (both ends inclusive). Points are at least 0.01 distant from each other. The end of the input is indicated by a line containing a zero. Output For each data set, the radius of the smallest sphere containing all given points should be printed, each in a separate line. The printed values should have 5 digits after the decimal point. They may not have an error greater than 0.00001. Sample Input 4 10.00000 10.00000 10.00000 20.00000 10.00000 10.00000 20.00000 20.00000 10.00000 10.00000 20.00000 10.00000 4 10.00000 10.00000 10.00000 10.00000 50.00000 50.00000 50.00000 10.00000 50.00000 50.00000 50.00000 10.00000 0 Sample Output 7.07107 34.64102 |
解题思路:随机选取一点作圆心求出点到该点距离最长的点逐步将圆心向该点移动模拟退火
刚做这道题时以为和poj1369一样就按1369的思路去做结果却不能找到合适的对应关系
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
const int NUM=30;
struct point{
double x,y,z;
}A[35];
double MAX(double a,double b){
return a>b?a:b;
}
double MIN(double a,double b){
return a<b?a:b;
}
double dist(point a,point 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));
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n),n){
for(i=0;i<n;++i){
scanf("%lf%lf%lf",&A[i].x,&A[i].y,&A[i].z);
}
point center;int lm=0;
center.x=center.y=center.z=0;
double dmax=100,ans=inf;
while(dmax>eps){
for(i=0;i<n;++i){
if(dist(center,A[i])>dist(center,A[lm]))lm=i;
}
double d=dist(center,A[lm]);
ans=MIN(ans,d);
center.x+=(A[lm].x-center.x)/d*dmax;//逐步向最远点移动
center.y+=(A[lm].y-center.y)/d*dmax;
center.z+=(A[lm].z-center.z)/d*dmax;
dmax*=0.98;//0.97都不行至少0.98
}
printf("%.5lf\n",ans);
}
return 0;
}
相关文章推荐
- android动画的简单使用
- 由一道面试题所想到的--Java实例变量初始化
- 某自称菜鸟总结的知识点(2)
- 设计模式之工厂模式
- Codeforces Round #324 (Div. 2) D. Dima and Lisa 数论 三素数定理
- 简易sniffer演示程序
- 周报
- 某自称菜鸟总结的知识点(1)
- 输出菱形
- Ios66详解之地图定位失败错误信息处理
- Android加载网络图片学习过程
- 获取一个字符串在另一个字符串中出现的次数
- easyUI resizable组件使用
- php请求API接口方法
- 用PhotoShop制作透明背景图片
- Android字体高度的研究
- 快速与MySQL交互,使用XMAPP打开MySQL数据库,并用shell进行与MySQL交互<Window 10>
- OC中的字母大小写转换
- IOS Map
- Objective-C---8---@property KVC