社区讨论

萌新刚学模拟退火,求调

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 条回复,欢迎继续交流。

正在加载回复...