码迷,mamicode.com
首页 > 编程语言 > 详细

【模拟退火算法】

时间:2016-06-10 21:34:10      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

 

技术分享
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ld long double
#define eps 1e-8
using namespace std;
int n;double r;
struct point{
  double x,y; 
}p[100005],o;
inline double sqr(double x){
  return x*x;
}
double dis(point a,point b)
{
  return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));  
}
inline bool cmp(double a,double b)
{
  return fabs(a-b)<eps;
}
point geto(point a,point b,point c)
{
      double a1,a2,b1,b2,c1,c2;
      point ans;
      a1=2*(b.x-a.x),b1=2*(b.y-a.y),c1=sqr(b.x)-sqr(a.x)+sqr(b.y)-sqr(a.y);
      a2=2*(c.x-a.x),b2=2*(c.y-a.y),c2=sqr(c.x)-sqr(a.x)+sqr(c.y)-sqr(a.y);
      if(cmp(a1,0)) 
      { 
           ans.y=c1/b1; 
           ans.x=(c2-ans.y*b2)/a2; 
      } 
      else if(cmp(b1,0)) 
      { 
           ans.x=c1/a1; 
           ans.y=(c2-ans.x*a2)/b2; 
      } 
      else
      { 
          ans.x=(c2*b1-c1*b2)/(a2*b1-a1*b2); 
          ans.y=(c2*a1-c1*a2)/(b2*a1-b1*a2); 
      } 
      return ans; 
}

int main()
{
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  {
      scanf("%lf%lf",&p[i].x,&p[i].y);
  } 
  o=p[1];
  for(int i=1;i<=n;i++)
  {
    if(dis(o,p[i])<r||cmp(dis(o,p[i]),r))continue;
    o.x=(p[i].x+p[1].x/2);o.y=(p[i].y+p[1].y/2);r=dis(p[i],p[1])/2;
    for(int j=2;j<i;j++)
    {
      if(dis(o,p[j])<r||cmp(dis(o,p[j]),r))continue;
      o.x=(p[i].x+p[j].x)/2;o.y=(p[i].y+p[j].y)/2;r=dis(p[i],p[j])/2;
      for(int k=1;k<j;k++)
      {
        if(dis(o,p[k])<r||cmp(dis(o,p[k]),r))continue;
        o=geto(p[i],p[j],p[k]);r=dis(o,p[i]);
      }
    }
  } 
  printf("%.3f",r);return 0;
} 
View Code

MARK VOID(GETO)

bzoj1336/bzoj1337

张老师上上礼拜讲的课,感觉再不写就要忘记这个鬼畜的东西了。

【模拟退火算法】

标签:

原文地址:http://www.cnblogs.com/wxxlouisa/p/5574157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!