http://poj.org/problem?id=2420

题意:给n个点,求一个点使得到这个n个点的距离和最短,输出这个最短距离(n<=100)

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=5005;
struct P { int x, y; }a[N];
int n;
inline int rand(int x, int y) { return x+(rand()%(y-x+1)); }
inline double sqr(double x) { return x*x; }
inline double dis(double x1, double y1, double x2, double y2) { return sqrt(sqr(x1-x2)+sqr(y1-y2)); }
inline double getdis(double x, double y) {
double ret=0;
for(int i=0; i<n; ++i) ret+=dis(x, y, a[i].x, a[i].y);
return ret;
}
double getnode(double x, double y, double T, double &xx, double &yy) {
double tx, ty, dis, ret=1e300;
for(int i=0; i<50; ++i) {
tx=x+((double)rand(-100, 100)/100)*T;
ty=y+((double)rand(-100, 100)/100)*T;
dis=getdis(tx, ty);
if(dis<ret) {
ret=dis;
xx=tx;
yy=ty;
}
}
return ret;
}
int main() {
srand(1998);
while(~scanf("%d", &n)) {
double x=0, y=0, T=1e20, dE, tans, ans, nans, xx, yy;
for(int i=0; i<n; ++i) scanf("%d%d", &a[i].x, &a[i].y), x+=a[i].x, y+=a[i].y;
x/=n; y/=n;
nans=ans=getdis(x, y);
while(T>0.01) {
tans=getnode(x, y, T, xx, yy);
dE=nans-tans;
if(dE>=0 || exp(dE/T)>(double)rand(1, 99999)/100000) {
nans=tans; x=xx; y=yy; ans=min(ans, nans);
}
T*=0.9;
}
printf("%.0f\n", ans);
}
return 0;
}

  

随机化大法好= =

学习了下模拟退火...其实就是啥玩意随机一下再随机一下QAQ

具体学习看http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html

引用一个上边的比喻:

爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。

模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。

现在有个退火公式= =

$$exp(dE/T)$$

其中$dE$是解的代表值之间的差,即$ans-temp$,其中$ans$是之前得到的最优解,$temp$是当前的解。$dE>=0$显然是可以取的,$dE<0$那么就要一定概率的取= =;$T$代表此时的温度,而且T是一直下降的

由于这个式子的取值在$(0, 1)$之间,所以我们在这个区间随机取一个值然后来搞就行了= =

具体看代码QAQ

upd:我发现我的模拟退火好像写错了啊...降温是在接受较差的解那里降温啊......

【POJ】2420 A Star not a Tree?的更多相关文章

  1. 【POJ】2420 A Star not a Tree?(模拟退火)

    题目 传送门:QWQ 分析 军训完状态不好QwQ,做不动难题,于是就学了下模拟退火. 之前一直以为是个非常nb的东西,主要原因可能是差不多省选前我试着学一下但是根本看不懂? 骗分利器,但据说由于调参困 ...

  2. 【POJ】2069.Super Star

    题解 求一个最小的半径的球,包括三维平面上所有的点,输出半径 随机移动球心,半径即为距离最远的点,移动的方式是向离的最远的那个点移动一点,之后模拟退火就好 代码 #include <iostre ...

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

    题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点. 模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解.移动的过程中温度缓慢降低,接受更劣解的概率降低. 在网上看到的 ...

  4. 【题解】UVA10228 A Star not a Tree?

    题面传送门 解决思路 本题数据范围较小,可以使用模拟退火算法(随机化). 顾名思义,模拟退火就是一个类似于降温的过程.先设置一个较大的初温,每次随机改变状态,若使答案更优,则采取更优答案,否则根据其与 ...

  5. 【POJ】1704 Georgia and Bob(Staircase Nim)

    Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...

  6. 【POJ】1067 取石子游戏(博弈论)

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  7. 三分 POJ 2420 A Star not a Tree?

    题目传送门 /* 题意:求费马点 三分:对x轴和y轴求极值,使到每个点的距离和最小 */ #include <cstdio> #include <algorithm> #inc ...

  8. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

    [BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...

  9. 【BZOJ2588】Spoj 10628. Count on a tree 主席树+LCA

    [BZOJ2588]Spoj 10628. Count on a tree Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lasta ...

随机推荐

  1. Dubbo集成Spring与Zookeeper实例

    >>Dubbo最佳实践 使用Dubbo结合Zookeeper和Spring,是使用比较广泛的一种组合,下面参考官方文档,做个简单的示例,一步步搭建一个使用dubbo结合Zookeeper和 ...

  2. 2-04使用SQL语句创建数据库

    下面是创建数据库的一些语法: USE master--指向当前使用的数据库 GO--批处理的标志 CREATE DATABASE E_Market--创建E_market数据库 ON PRMARY-- ...

  3. WPF中使用ReportViewer报表

    本篇博客将介绍如何在WPF中使用ReportViewer控件. 1. 环境准备:下载安装最新版ReportViewer(PS:需要安装Microsoft SQL Server System CLR T ...

  4. WPF 多语言实现

    很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件.这篇博客中将介绍在WPF中实现多语言的方式. 方式一,使用WPF动态资源的方式实现.先简单介绍下StaticResour ...

  5. SQL常见错误及处理方法

    1.情况:数据库引擎安装失败,报类似权限不足的错误 解决:可能由于计算机名和用户名相同导致,更改计算机名,卸载干净重装即可

  6. 对ASP.NET 5和ASP.NET MVC 6应用程序进行集成测试

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:之前有文章谈到如何对ASP.NET 5的应用程序进行单元测试(需使用xunit),今天 ...

  7. 【使用Unity开发Windows Phone上的2D游戏】(1)千里之行始于足下

    写在前面的 其实这个名字起得不太欠当,Unity本身是很强大的工具,可以部署到很多个平台,而不仅仅是可以开发Windows Phone上的游戏. 只不过本人是Windows Phone 应用开发出身, ...

  8. 利用Visual GDB在Visual Studio中进行Android开发

    转载请注明http://www.cnblogs.com/adong7639/p/4119467.html 无意中发现了Visual GDB这个工具,可以再Visual Studio中进行Android ...

  9. 智能车学习(十二)——智能车原理

    一.直立行走任务分解 1.任务分解 (1) 控制车模平衡:通过控制两个电机正反向运动保持车模直立平衡状态 (2) 控制车模速度:通过调节车模的倾角来实现车模速度控制,实际上最后还是演变成通过控制电机的 ...

  10. UML 之 四种关系

    学习过UML的人都知道,UML之中有九种图和四种关系,今天,我们先来介绍一下这四种关系: 对于我们这些初学者来说,UML之中无非是  关联.依赖.泛化和实现,但是其中,关联和依赖又如何区分?泛化又如何 ...