poj 2420 A Star not a Tree?——模拟退火

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

精度设成1e-17,做三遍。ans设成double,最后再取整。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
#define db double
using namespace std;
const int N=105;
const db dc=0.99,eps=1e-17;
int n,nx[N],ny[N];
db px,py,ans;
db dis(db x0,db y0,db x1,db y1)
{
  return sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
}
db calc(db x,db y)
{
  db ret=0;
  for(int i=1;i<=n;i++)ret+=dis(nx[i],ny[i],x,y);
  return ret;
}
db gtrd(db T){return (rand()*2-RAND_MAX)*T;}
void SA(db T)
{
  db x0=px,y0=py,pr=calc(x0,y0),x,y,cr;
  while(T>eps)
    {
      x=x0+gtrd(T); y=y0+gtrd(T); cr=calc(x,y);
      if(cr<pr||(exp((cr-pr)/T)*RAND_MAX<rand()))
    {
      ans=min(ans,cr);
      x0=x;y0=y;pr=cr;
    }
      T*=dc;
    }
}
int main()
{
  srand(time(0));
  scanf("%d",&n);
  for(int i=1;i<=n;i++)scanf("%d%d",&nx[i],&ny[i]),px+=nx[i],py+=ny[i];
  px/=n; py/=n; ans=calc(px,py);
  SA(10000);SA(10000);SA(10000);
  printf("%.0lf\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/Narh/p/9876847.html

时间: 2024-11-13 07:07:50

poj 2420 A Star not a Tree?——模拟退火的相关文章

POJ 2420 A Star not a Tree? (模拟退火)

题目地址:POJ 2420 今天在比赛遇到了这题..于是现场学了一下模拟退火.... 这题是先初始化为一个点,然后不断趋近距离和最短的点.还是挺简单的.. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h&g

三分 POJ 2420 A Star not a Tree?

题目传送门 1 /* 2 题意:求费马点 3 三分:对x轴和y轴求极值,使到每个点的距离和最小 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 10 const int MAXN = 1e2 + 10; 11 const int INF = 0x3f3f3f3f; 12 double x[MAXN], y[MAXN]; 13 i

[POJ 2420] A Star not a Tree?

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4058   Accepted: 2005 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allow you

POJ 2420 A Star not a Tree? (计算几何-费马点)

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3435   Accepted: 1724 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allow you

POJ 2420 A Star not a Tree? 爬山算法

B - A Star not a Tree? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88808#problem/B Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10ba

POJ 2420 A Star not a Tree?【爬山法】

题目大意:在二维平面上找出一个点,使它到所有给定点的距离和最小,距离定义为欧氏距离,求这个最小的距离和是多少(结果需要四舍五入)? 思路:如果不能加点,问所有点距离和的最小值那就是经典的MST,如果只可以加一个点问最小值就是广义的费马点的问题,如果加点的数目不加限制,那问题就成了斯坦纳树的问题(介个属于NPC问题) 这题显然就是广义费马点问题,可以采用局部贪心法,从一个初始点出发,不断向上下左右四个方向拓展,如果在一个方向上走过去到所有点的距离和小于目前这个点到所有点的距离和,那就更新目前点的值

UVA 10228 - Star not a Tree?(模拟退火)

UVA 10228 - Star not a Tree? 题目链接 题意:给定一些点,费马点(到这些点距离和最短),输出距离和 思路:模拟退火去搞,初始温度1W步,降温系数设为0.83,然后每次找周围4个方向,做10次保证答案准确 代码: #include <cstdio> #include <cstring> #include <cmath> #include <ctime> #include <cstdlib> #include <al

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

链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #inclu

poj-2420 A Star not a Tree?(模拟退火算法)

题目链接: A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5219   Accepted: 2491 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allo