POJ 2069 Super Star(计算几何の最小球包含+模拟退火)
2013-07-22 18:17
501 查看
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个点的最小的球的半径
思路:传说中的模拟退火算法,不断逼近最优解
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 <cstdio> #include <cmath> 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(); } }
相关文章推荐
- POJ 2420 A Star not a Tree? 费马点 计算几何 模拟退火
- POJ 2069 最小球覆盖模拟退火
- POJ 2420 A Star not a Tree? (计算几何-费马点)
- POJ 2420 A Star not a Tree? (计算几何-费马点)
- POJ 2420 A Star not a Tree? (计算几何-费马点)
- POJ-1584-A Round Peg in a Ground Hole-计算几何-凸多边形+多边形包含圆
- POJ 2420 A Star not a Tree?(计算几何 多边形的费马点 模拟退火)
- Poj 2177 Ghost Busters(球交点 三维计算几何模板)
- POJ 1269(计算几何+直线相交)
- 【计算几何】【求凸包】【POJ 1113】wall
- B - Toy Storage(POJ - 2398) 计算几何基础题,比TOYS多了个线段排序
- POJ 3304 Segments(计算几何 判断直线与线段相交)
- poj 1696 (计算几何基础)
- POJ 3335-Rotating Scoreboard(计算几何-半平面交顺时针模板)
- POJ 1127 基础计算几何(判断两线段相交)+并查集
- #51 Codeforces-E. Very simple problem (计算几何)(点被多少个三角形包含)
- POJ 1113 WALL(凸包-计算几何)
- POJ 1873 计算几何
- poj-3565 Ants(计算几何+调整算法)
- POJ 1799 Yeehaa!(计算几何)