社区讨论
萌新刚学模拟退火,求调
UVA10228A Star not a Tree?参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhj1mktb
- 此快照首次捕获于
- 2025/11/03 19:15 4 个月前
- 此快照最后确认于
- 2025/11/03 19:15 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define db double
#define N 110
struct node{int x,y;}z[N];
int n,sumx,sumy;
db ansx,ansy;
db ans_min=1e18;
db delta=0.985;
const int start=10000;
const db small=1e-8;
const int num=20;
db dis(db x,db y,db x1,db y1){return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));}
db getsum(db x,db y)
{
db sum=0.0;
for(int i=1;i<=n;i++) sum+=dis(z[i].x,z[i].y,x,y);
return sum;
}
void simulate_anneal()
{
db lx=ansx,ly=ansy,t=start;
while(t>small)
{
db x=lx+(rand()*2-RAND_MAX)*t,y=ly+(rand()*2-RAND_MAX)*t;
db now=getsum(x,y);
db shu=now-ans_min;
if(shu<0)
lx=x,ly=y,
ansx=x,ansy=y,ans_min=now;
else if(exp(-shu/t)*RAND_MAX*1.0>rand()) lx=x,ly=y;
t=t*delta;
}
}
void solve()
{
ans_min=1e18;
for(int i=1;i<=num;i++) simulate_anneal();
}
int T;
int main()
{
srand(time(0));
cin>>T;
while(T--)
{
cin>>n;
sumx=sumy=0;
for(int i=1;i<=n;i++)
{
cin>>z[i].x>>z[i].y;
sumx+=z[i].x,sumy+=z[i].y;
}
ansx=sumx*1.0/n,ansy=sumy*1.0/n;
solve();
cout<<round(ans_min);
if(T) cout<<'\n';
}
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...