POJ2069 最小球覆盖 几何法和退火法

对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450

现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径。

先给出以下几个事实:

1.对于一个点,球心就是这个点且半径无穷小。

2.对于两个点,球心是两个点线段的中点,半径就是线段长度的一半。

3.对于三个点,三个点构成的平面必为球的大圆,所以球心是三角形的外心,半径就是球心到某个点的距离。

4.对于四个点,若四个点共面则转化到3,只需考虑某三个点的情况,若四点不共面,四面体可以唯一确定一个外接球。

5.对于五个及以上点,其最小球必为其中某4个点的外接球(假设不全共面)。

C(30,4)是可以接受的复杂度。在编程实现的时候,碰到不在球内的点,就让它成为球面上的点,期望复杂度为O(n)。

-----------------------------------------------------------------------------------------------------------------------------------------------

以上我们给出了一般的几何解法,但是求三角形外心和四面体的外界球,方程很复杂,代码量也很大,有没有简单的方法呢?

我们根据以上5个事实,可以知道所谓最小球的球心,它必然处于一个稳定态,也就是与它距离最远的点最多有4个且等距离。

于是,我们首先任选一个点作为球心,并找到点集中与它距离最远的点,我们让球心靠近最远的点,不断重复此过程,就可以让球心达到稳定态了!此时我们就找到了最小球。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const double eps=1e-7;
 8 struct point3D
 9 {
10     double x,y,z;
11 } data[35];
12 int n;
13 double dis(point3D a,point3D b)
14 {
15     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));
16 }
17 double solve()
18 {
19     double step=100,ans=1e30,mt;
20     point3D z;
21     z.x=z.y=z.z=0;
22     int s=0;
23     while(step>eps)
24     {
25         for(int i=0; i<n; i++)
26             if(dis(z,data[s])<dis(z,data[i])) s=i;
27         mt=dis(z,data[s]);
28         ans=min(ans,mt);
29         z.x+=(data[s].x-z.x)/mt*step;
30         z.y+=(data[s].y-z.y)/mt*step;
31         z.z+=(data[s].z-z.z)/mt*step;
32         step*=0.98;
33     }
34     return ans;
35 }
36 int main()
37 { // freopen("t.txt","r",stdin);
38     double ans;
39     while(~scanf("%d",&n),n)
40     {
41         for(int i=0; i<n; i++)
42             scanf("%lf%lf%lf",&data[i].x,&data[i].y,&data[i].z);
43         ans=solve();
44         printf("%.5f\n",ans);
45     }
46     return 0;
47 }  

 

时间: 2024-11-14 08:26:39

POJ2069 最小球覆盖 几何法和退火法的相关文章

【模板】模拟退火 费马点以及最小球覆盖

最近学了一波模拟退火.个人感觉,就是随机算法,然后我们的目标点,一开始温度T高的时候会移动的剧烈,T小的时候移动的缓和(所以这就是为什么每一次移动的距离都是乘T).然后真正的模拟退火是如果当前的tem比ans优,那就毫不犹豫地接受,否则则以一定概率接受.也就是那个exp(dE/T)> rand 那个. 然后还有爬山算法,就是只会一直找更优解,不接受差解,具体就是在模拟退火基础上,一直找最优解,找不到就降温(所以会陷入局部最优解的坑).在网上嫖了一份代码(https://blog.csdn.net

D.Country Meow 最小球覆盖 三分套三分套三分 &amp;&amp; 模拟退火

// 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值. ? 思路 非常裸的最小球覆盖问题啊,即找到半径最小的球包含全部的点. 在最小圆覆盖问题上,可以使用随机增量法,这里没有四点确定球心的公式,所以板子失效了. 最小圆覆盖可以用三分套三分,这里空间有三维,假装证明得到在任意一维上都满足凸函数特性,那么再套一层维度三分就OK了. ? AC代码 三分套三分套三分写法,复杂度O(n

POJ 2420 模拟退火法

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3272   Accepted: 1664 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allow you

NOIP2002矩形覆盖[几何DFS]

题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴.当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4.问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢.约定:覆盖一个点的矩形面积为 0:覆盖平行于坐标轴

POJ 2069 Super Star(模拟退火,最小球覆盖)

解题思路: 给出空间内的n个点,找出覆盖这n个点的最小球的半径.用模拟退火来做. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <map> #include <cmath>

POJ 1379 模拟退火法

Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5631   Accepted: 1728 Description One of the traps we will encounter in the Pyramid is located in the Large Room. A lot of small holes are drilled into the floor. They look complet

POJ2069 最小球体覆盖, 模拟退火

只是套了个模板,模拟退火具体的过程真心不懂阿 1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler 2 #include <stdio.h> 3 #include <iostream> 4 #include <cstring> 5 #include <cmath> 6 #include <stack> 7 #include <queue>

夏令营讲课内容整理 Day 4.

本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多的分数. 有句话说的好嘛,骗分过样例,暴力出奇迹. 真的可以出奇迹的,只要你用得好. 1.搜索的概念 在一个给定的空间内,运用一定的查找(遍历)方式,直到找到目标解(状态)的过程,我们称之为搜索. 搜素是尝试性的,搜索是无脑的,搜索是朴素的,搜索在很多时候是显然的,搜索应该总是暴力的.但搜索也是很常

人工智能包括约束求解器吗?

以下是翻译Optaplanner创始人Geoffrey De Smet的一篇文章<Does A.I. include constraint solvers?>. 因为英语及中文表达习惯的差异,以该博文发表示Optaplanner官网,其描述的问题及概念具有一定的上下文关联性:因此,为了认还不太熟悉Optaplanner的同学更容易理解,令文章更符合中文母语读者的阅读习惯,我并没有完全按字面生硬直译.其中添加了一些扩展性的意译,基本上能在脱离Optaplanner官网上下文情况下,一定程序上表达