poj2420为例
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
double INF=1000000000;
const double PI = acos(-1.0);//这个就是PI
int n;
struct node{
double x,y;
}num[2000],moni[30];
double ux,uy;
double dis(node a,node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double solve(node p){
double ans=0;
for(int i=0;i<n;i++)
ans+=dis(p,num[i]);
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
scanf("%d",&n);
double t=10000;//初始化温度T
rep(i,0,n-1) scanf("%lf%lf",&num[i].x,&num[i].y);
rep(i,0,19){//随机化20组答案
moni[i].x=ux*((rand() % 1000+1.0)/ 1000.0);//保证区间是[0,1]
moni[i].y=uy*((rand() % 1000+1.0) / 1000.0);
}
while(t>1e-3){
node q;
for(int j=0;j<20;j++){
double ans=solve(moni[j]);
for(int i=0;i<30;i++){
double k= (rand() % 1000+1.0)/ 1000.0 * 2 * PI;
q.x=moni[j].x+sin(k)*t;
q.y=moni[j].y+cos(k)*t;
double res=solve(q);
if(res<ans){//更新最优解
ans=res;
moni[j]=q;
}
else if(exp(res/t)<(double)rand()/(double)RAND_MAX){//返回[0,1]内的数,当然也可用(rand() % 1000+1.0)/ 1000.0
ans=res,moni[j]=q;
}
}
}
t*=0.9;
}
double ans=INF;
int k;
for(int i=0;i<20;i++){//然后从这二十个点中挑选一个最适的点
double res=solve(moni[i]);
if(res<ans){
ans=res;
k=i;
}
}
printf("%.0f\n",ans);
}