博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 最小球覆盖 模拟退火
阅读量:7038 次
发布时间:2019-06-28

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

最小球覆盖:用半径最小的球去覆盖所有点。

纯粹的退火算法,是搞不定的,精度不够,不然就会TLE,根本跑不出答案来。

任取一点为球心,然后一点点靠近最远点。其实这才是最主要的。

因为:4个点确定一个球,也就是说,这个球,会慢慢稳定,每次用一个点到最远的点的距离去靠近,怎么靠近,玄学距离 ​ 。

再在这个基础上乘以 t ,模拟退火温度。这样靠近速度增加。并且不用判断是否较以前是否更优才转移,因为他是必须转移过去。至少你不可能是最长边的端点的,而且他会随着温度逐渐稳定。

#include 
#include
#include
​using namespace std;​const int maxn = 35;​struct Node { double x,y,z;}nodes[maxn];​int n;​double dist(Node a,Node 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 calc(Node z) { double ret = 0; for(int i = 0; i < n; i++) ret = max(ret,dist(z,nodes[i])); return ret;}​int dx[6] = {
0,0,0,0,1,-1};int dy[6] = {
0,0,-1,1,0,0};int dz[6] = {-1,1,0,0,0,0};​int main(){ //freopen("in.txt","r",stdin); while(scanf("%d",&n),n) { for(int i = 0; i < n; i++) scanf("%lf%lf%lf",&nodes[i].x,&nodes[i].y,&nodes[i].z); Node s = nodes[0]; double t = 10; double ans = 0x3f3f3f3f; while(t>1e-8) { double d = 0; int k = 0; for(int i = 0; i < n; i++) { double dis = dist(s,nodes[i]); if(d

 

 

转载于:https://www.cnblogs.com/TreeDream/p/8392221.html

你可能感兴趣的文章
什么是MQTT协议?
查看>>
我回来了....
查看>>
sql DATEPART() MONTH() convert() cast() dateadd() DATEDIFF() with(nolock)
查看>>
线程池ThreadPoolExecutor
查看>>
github中删除项目
查看>>
CentOS中/英文环境切换教程(CentOS6.8)
查看>>
Python的一个命名空间冲突,关于from-import机制
查看>>
jQuery动画详解
查看>>
3.移植驱动到3.4内核-移植DM9000C驱动
查看>>
Mysql 奇怪的连接错误
查看>>
给程序员简历的一些建议
查看>>
CSS3饼状loading效果
查看>>
docker日志
查看>>
Postman使用入门
查看>>
编程修养(一)
查看>>
Solidworks如何替换工程图参考零件
查看>>
2013年第四届蓝桥杯C/C++B组省赛题目解析
查看>>
重温.NET下Assembly的加载过程
查看>>
SpringBoot 之Spring Boot Starter依赖包及作用
查看>>
websocket 协议 使用
查看>>