POJ 2069最小球覆盖

1.给定N个三维点,要求覆盖这些点的最小球半径; 2.采用模拟淬火算法,随机选取一个点作为初始解,然后不断向当前最远的点靠近; 3.这是一个不断调整的过程,对应模拟淬火算法中不断向内能最低这一目标函数(半径最小)逼近,温度对应控制变量

  • 对于一个点,球心就是这个点,且半径无穷小
  • 对于两个点,球心就是两点线段的中点,半径就是线段长度的一半
  • 对于三个点,三点构成的平面必为球的大圆,球心是三角形的外心,半径就是球心到某个点的距离
  • 对于四个点,若四点共面,则转换到3点共面;若四点不共面,四面体可以唯一确定一个外接球
  • 对于五个点及五个点以上,最小球必为某四个点的外接球
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
#include<sstream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<cstdlib>
using namespace std;
const double eps=1e-3;
//POJ2069 最小球覆盖
struct POINT{double x,y,z;
}p[110];//N个点
POINT op;//最小球的球心
int n;
inline 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));
}
double solve(){double ret,delta=100.0;//温度double maxDis,tempDis;int i,id;while(delta>eps){id=0;maxDis=dist(op,p[id]);for(i=1;i<n;i++){tempDis=dist(op,p[i]);if(tempDis>maxDis){maxDis=tempDis;id=i;}}ret=maxDis;op.x+=(p[id].x-op.x)/maxDis*delta;op.y+=(p[id].y-op.y)/maxDis*delta;op.z+=(p[id].z-op.z)/maxDis*delta;delta*=0.98;}return ret;//最小球半径
}
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);}printf("%lf\n", solve());}return 0;
}

HDU3007最小圆覆盖

给定N个二维点,求覆盖这些点的最小圆半径

#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
#include<sstream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<cstdlib>
using namespace std;
const double eps=1e-8;
//HDU3001 最小圆覆盖
struct POINT{double x,y,z;
}p[510];
POINT op;//最小圆的圆心
int n;
inline double dist(POINT &a,POINT &b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void solve(){double ret,delta=100.0;double maxDis,tempDis;int i,id;while(delta>eps){id=0;maxDis=dist(op,p[id]);for(i=1;i<n;i++){tempDis=dist(op,p[i]);if(tempDis>maxDis){maxDis=tempDis;id=i;}}ret=maxDis;op.x+=(p[id].x-op.x)/maxDis*delta;op.y+=(p[id].y-op.y)/maxDis*delta;delta*=0.98;}printf("%.2lf %.2lf %.2lf\n",op.x,op.y,ret);
}
int main(){while(scanf("%d",&n)!=EOF){if(n==0)    break;op.x=op.y=0;for(int i=0;i<n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);op.x+=p[i].x;op.y+=p[i].y;}op.x/=n;op.y/=n;solve();}return 0;
}

POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】相关推荐

  1. POJ - 2069 Super Star HDU - 3007 Buried memory

    模拟退火求最小球覆盖和最小圆覆盖 原本在我的认识中,模拟退火一定要有一个随机化在里面. 但是有些模拟退火,你可以清楚地意识到答案是可以向某个方向逼近的,这个时候就不用随机了. 比如像第一道题POJ 2 ...

  2. 最小球覆盖最小圆覆盖 题目总结

    最小圆覆盖: HYSBZ 1337 最小圆覆盖 给出平面上N个点,N<=10^5.请求出一个半径最小的圆覆盖住所有的点 Input 第一行给出数字N,现在N行,每行两个实数x,y表示其坐标. O ...

  3. matlab模拟退火最小球覆盖,最小圆覆盖最小球覆盖 (增量法和模拟退火法)

    这种题几乎一套板子走天下. 昨天做最小圆覆盖用的都是增量法,压根没看过退火模拟法,因为退火模拟法并不是很稳定.今天看最小球覆盖时发现用到了退火模拟法,于是看了看最小圆覆盖的退火模拟法,用退火板子提交直 ...

  4. HDU2215(最小圆覆盖问题)

    题意:就是求最小圆覆盖问题 方法一: #include<iostream> #include<algorithm> #include<cmath> #include ...

  5. 【hdoj】3007 Buried memory 【计算几何--最小圆覆盖】

    传送门:Buried memory 苍天饶过谁,第三次在hdoj上 交计算几何的题了,没一次是AC的. ┭┮﹏┭┮都是模板题啊,我都是抄板子的啊,为什么会这样,我怎么这么菜. 题意: 求最小圆覆盖 的 ...

  6. hdu 2215(最小圆覆盖)

    解题思路:最小圆覆盖,注意由于树也有半径,所以要加上树的半径0.5 #include<iostream> #include<cmath> #include<cstdio& ...

  7. ZOJ - 1450 Minimal Circle HDU - 3007 Buried memory 最小圆覆盖模板 【随机函数】【增量法】

    题意 给N个点,求最小的圆将这N个点全部覆盖,输出圆心坐标和半径 分析 最小的圆肯定落在三个点上,因此暴力枚举圆上的三个点即可,点增量算法O(n ^ 3),加入随机化,平均复杂度可以降到O(n^2) ...

  8. P1742 最小圆覆盖

    P1742 最小圆覆盖 题意: 给出N个点,让你画一个最小的包含所有点的圆. 题解: 先说结论: 最优解的圆一定是在以某两个点连线为直径的圆 或者 某三个点组成的三角形的外接圆 初始化将某个圆心定为第 ...

  9. ZOJ 1450 Minimal Circle 点集的最小圆覆盖

    From: http://blog.csdn.net/zmx354/article/details/17076267 给定一个点集,求出能覆盖点集内所有点的半径最小的圆.包含点在圆上的情况.个人感觉算 ...

最新文章

  1. Windows不能在本地计算机启动MongoDB,错误代码 100
  2. Kubernetes(1) kubectl 入门
  3. python中data.find_all爬取网站为空列表_Python网络爬虫之Scrapy 框架-分布式【第二十九节】...
  4. 【cocos2d-x从c++到js】16:使用cocos2d-console工具转换脚本为字节码
  5. 【java】简单的方式实现文本文件的读写
  6. 设计模式学习笔记(十七)——Command命令模式
  7. JDeps入门–分析项目的依赖关系
  8. HTML5儿童玩具游戏商店网站模板
  9. Express--socket.io使用session验证
  10. Spring boot(8)---手动构建maven项目springboot
  11. java exec waitfor,Java Process waitFor()方法与示例
  12. tensorflow代码学习:二分类模型
  13. Unicode 汉字编码表
  14. 软件是怎么开发出来的?怎么进行软件开发流程
  15. STM32MP157移植Qt5.12.10
  16. python修改文件的某一行_简单文件操作python 修改文件指定行的方法
  17. pythonidle是什么_Python入门 | IDLE的介绍和使用方法
  18. Windows GetLastError返回值 【转】
  19. 【LeetCode-SQL】579. 查询员工的累计薪水
  20. 后缀数组(倍增)学习记录,我尽可能详细的讲了

热门文章

  1. [Python3] 020 借函数,谈一谈变量的作用域
  2. 如何区分Oracle的数据库,实例,服务名,SID
  3. 顺序表基本操作函数总结
  4. python url配置单独放在某个应用目录中
  5. MSSSQL 脚本收藏
  6. Linux 进程内 全局看见,Android获得全局进程信息以及进程使用的内存情况
  7. 计算机在管理会计应用中的作用,计算机在现代管理会计中的应用(共3736字).doc...
  8. 傅里叶变换音频可视化_快速上手网易云音乐可视化
  9. 年龄和收入对数的线性回归_Logistics回归——分析富士康的员工自杀
  10. 设计一款博弈类游戏的人机对战算法、策略_卡牌游戏八合一,华人团队开源强化学习研究平台RLCard...