博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2069 Super Star(计算几何の最小球包含+模拟退火)
阅读量:5089 次
发布时间:2019-06-13

本文共 3510 字,大约阅读时间需要 11 分钟。

Description

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.
 
题目大意:给n个点,求能包含这n个点的最小的球的半径
思路:传说中的模拟退火算法,不断逼近最优解
 
#include 
#include
const int MAXN = 50;const double EPS = 1e-6;struct Point3D { double x, y, z; Point3D(double xx = 0, double yy = 0, double zz = 0): x(xx), y(yy), z(zz) {}};Point3D operator - (const Point3D &a, const Point3D &b) { return Point3D(a.x - b.x, a.y - b.y, a.z - b.z);}double dist(const Point3D &a, const Point3D &b) { Point3D c = a - b; return sqrt(c.x * c.x + c.y * c.y + c.z * c.z);}Point3D p[MAXN];int n;void solve() { Point3D s; double delta = 100, ans = 1e20; while(delta > EPS) { int d = 0; for(int i = 1; i < n; ++i) if(dist(s, p[i]) > dist(s,p[d])) d = i; double maxd = dist(s, p[d]); if(ans > maxd) ans = maxd; s.x += (p[d].x - s.x)/maxd*delta; s.y += (p[d].y - s.y)/maxd*delta; s.z += (p[d].z - s.z)/maxd*delta; delta *= 0.98; } printf("%.5f\n", ans);}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); solve(); }}

  

 

转载于:https://www.cnblogs.com/oyking/p/3205856.html

你可能感兴趣的文章
Struts 有哪些经常使用标签库
查看>>
他毕业两年,博客一年,时间
查看>>
登录模块
查看>>
推荐:想了解一个项目完整测试流程,看这篇文章就OK了
查看>>
Java中常见的排序方式-选择排序(升序)
查看>>
前端性能优化之数据存取(二)
查看>>
[bzoj4889] [Tjoi2017]不勤劳的图书管理员
查看>>
Effective Objective-C 2.0
查看>>
php异常处理示例
查看>>
JS小问题之——如何用原生js触发事件
查看>>
按值传递
查看>>
将 Excel 2007 读取到 Byte[], 然后再保存到新的Excel文件中, 这时打开新文件会出错....
查看>>
react学习笔记2--练习Demos
查看>>
图像预处理第9步:存为.bmp文件
查看>>
使用STL map和模板时遇到的一个错误
查看>>
Linux查看CPU《型号..》《内存..》《硬盘..》《系统..》
查看>>
github使用个人总结
查看>>
异常处理
查看>>
Django(四) ORM 外键操作及初识Ajax
查看>>
局部最优解与全局最优解(转)
查看>>