poj 2420 A Star not a Tree?

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

题目大意:求一个点到给出的n个点的距离和最小。

分析:随机化算法。其实本题的正解应该是模拟退火,可是本菜现在还不会...所以写了一个纯乱随机的,

  额,其实也不是纯随机,先在数据范围内随机20个点Pi,然后定一个距离s,判断每一个Pi的周围距离s的四个点是否比pi优,是则更新Pi,缩小s。让它搞个1000次取个最小就好了。其实六七百次之后20个点基本就不动了。

 

代码:

View Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
#define MaxN 110
#define INF 200000000
struct atp
{
double x,y;
}p[MaxN];
struct atp2
{
double x,y,dis;
}a[MaxN*50];
int n,maxx=0,maxy=0,T=1;

double dis(double x,double y)
{
double t=0;
for (int i=1;i<=n;i++)
{
t+=sqrt((p[i].x-x)*(p[i].x-x)+(p[i].y-y)*(p[i].y-y));
}
return t;
}

void work()
{
atp temp;
double tt;
for (int i=1;i<=1000;i++)
{
for (int j=1;j<=20;j++)
{
temp.x=rand()%1000+1*T;
temp.y=rand()%1000+1*T;
for (int x=-1;x<=1;x+=2)
for (int y=-1;y<=1;y+=2)
{
tt=dis(a[j].x+temp.x*x,a[j].x+temp.y*y);
if (a[j].dis>tt)
{
a[j].dis=tt;
a[j].x+=temp.x*x;
a[j].y+=temp.y*y;
}
}

}
T*=0.97;
}
}
int main()
{
srand(time(NULL));
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
if (p[i].x>maxx) maxx=p[i].x;
if (p[i].y>maxy) maxy=p[i].y;
}
for (int i=1;i<=20;i++)
{
a[i].x=rand()%maxx+1;
a[i].y=rand()%maxy+1;
a[i].dis=dis(a[i].x,a[i].y);
}
work();
double ans=INF;
for(int i=1;i<=20;i++)
if (a[i].dis<ans) ans=a[i].dis;
printf("%0.lf",ans);
return 0;
}



posted @ 2012-03-26 21:58  Evan1004  阅读(212)  评论(0编辑  收藏  举报