题目大意:在二维平面上找出一个点,使它到所有给定点的距离和最小,距离定义为欧氏距离,求这个最小的距离和是多少(结果需要四舍五入)?

思路:如果不能加点,问所有点距离和的最小值那就是经典的MST,如果只可以加一个点问最小值就是广义的费马点的问题,如果加点的数目不加限制,那问题就成了斯坦纳树的问题(介个属于NPC问题)

这题显然就是广义费马点问题,可以采用局部贪心法,从一个初始点出发,不断向上下左右四个方向拓展,如果在一个方向上走过去到所有点的距离和小于目前这个点到所有点的距离和,那就更新目前点的值,直到从四个方向拓展都不能比目前的点更优,那就说明目前的点属于局部最优,那就减少步长,从刚才给出点处继续搜索,直到精度小于题目所需的精度(整数)

需要注意的是局部贪心(又叫爬山法)很容易卡在局部最优上,因此往往随机初始点多次,以保证局部最优是全局最优,但广义费马点好像这种局部最优的点不多的样子,选原点为初始点就可以AC这题

//POJ2420

#include <cstdio>

#include <iostream>

#include <string.h>

#include <math.h>

#define maxn 110

const short dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};

using namespace std;

double x[maxn]={0},y[maxn]={0};int n;

double sumlen(double xx,double yy)

{

double ret=0;

for(int i=1;i<=n;i++)

{

ret+=sqrt((xx-x[i])*(xx-x[i])+(yy-y[i])*(yy-y[i]));

}

return ret;

}

int main()

{

scanf("%d",&n);

for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);

double a=0,b=0,min=sumlen(a,b),step=100;

while (step>0.1)

{

short flag=1;

while (flag==1)//如果这层循环结束,说明从四个方向拓展都不能得到更优解也就是达到了局部最优解

{

flag=0;

for(int i=1;i<=4;i++)

{

doublexx=a+dx[i]*step,yy=b+dy[i]*step,t=sumlen(xx,yy);

if (t<min){min=t;a=xx;b=yy;flag=1;}

}

}

step/=2;

}

printf("%d",(int)(min+0.5));

return 0;

}

转载于:https://www.cnblogs.com/philippica/p/4006985.html

POJ 2420 A Star not a Tree?【爬山法】相关推荐

  1. POJ2420——A Star not a Tree?

    题目链接:http://poj.org/problem?id=2420 A Star not a Tree? 题目大意:求费马点!!!模拟退火即可...... #include<iostream ...

  2. 【POJ】1308 Is It A Tree?((并查集 + set)or (map))

    http://poj.org/problem?id=1308 这个题数组开到200就可以了,但题目中貌似没有说呢? 读入每一对顶点,看看他们是否在同一个集合中,如果是的话,肯定成环,不是一棵树. 用s ...

  3. Poj2420 A Star not a Tree? 模拟退火算法

    题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...

  4. [POJ2420]A Star not a Tree?(模拟退火)

    题目链接:http://poj.org/problem?id=2420 求费马点,即到所有其他点总和距离最小的点. 一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相 ...

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

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

  6. poj2420A Star not a Tree?(模拟退火)

    链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 1 #include <iostream> 2 #include<cstdio> 3 #incl ...

  7. poj2420 A Star not a Tree? 【模拟退火】

    题意:平面上给你n个点,让你求一个点,到这n点的距离和最小 板子得模拟退火,系数也是很好控制,对数器和ACdream得代码跑了1884组样例,结果只有一组不一样,可是我得解更优啊, 交上去RE, 不想 ...

  8. poj 2069 Super Star 最小求覆盖【爬山算法】

    题意:给定几个点,要求覆盖这些点的最小球半径.(求到n个点的最大距离最小化的点 因为是单峰的所以可以用爬山算法 主要是我的退火算法板子精度达不到? //#include<bits/stdc++. ...

  9. poj 2069 Super Star 模拟退火

    题目大意: 给定三位空间上的n(\(n \leq 30\))个点,求最小的球覆盖掉所有的点. 题解: 貌似我们可以用类似于二维平面中的随机增量法瞎搞一下 但是我不会怎么搞 所以我们模拟退火就好了啊QA ...

最新文章

  1. 学习人工智能必须攻克三道门槛:数学基础、英语水平与编程技术
  2. Ubuntu安装软件失败
  3. STM32F4_LCD12864并行驱动
  4. 鼠标在计算机上被关闭了怎么处理,鼠标驱动程序丢失导致系统自动关闭的解决方法...
  5. 扩展entity framework core实现默认字符串长度,decimal精度,entity自动注册和配置
  6. [react] React的render中可以写{if else}这样的判断吗?
  7. 首次曝光的计算模型!对标阿里?有没有想过你的中台只是废纸?
  8. [转载] Numpy 使用教程--Numpy 数学函数及代数运算
  9. 管理感悟:测试的目的是什么
  10. erlang连接数据库mysql_[原]Erlang连接mysql问题解决
  11. 纯C++编写Win32/X64通用Shellcode注入csrss进程
  12. 【AIS学习】05:AIS消息
  13. Python 无监督学习实用指南:1~5
  14. 视频直播APP源码,通过css控制div内容展开更多/收起效果
  15. excel多次使用格式刷的方法步骤
  16. linux中哪个系统适合做服务器
  17. Docker 容器文件存储驱动 Overlay2
  18. STGCN、ASTGCN、STSGCN、STFGNN模型的对比实验操作步骤
  19. 每次都想呼喊你的名字
  20. 2018网易秋招编程题【彩色砖块】

热门文章

  1. ie8下ewebeditor无效的解决办法
  2. 昨日参加Symantec公司用户大会
  3. altas(ajax)控件(二十三):等级选择控件Rating
  4. intercontenient hotels
  5. key to ribbon chart in powerbi: time, category, value
  6. 什么是is research?
  7. 学术写作强力推荐语法检查神器:marking mate
  8. 申请英国学校最晚什么时候考出雅思呢?
  9. 338. Counting Bits_比特位计数_简单动态规划
  10. Centos7.x下Nginx安装及SSL配置与常用命令