跟题解差不多,萌新求助
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const double jw=1-3e-3;
int n;
struct node {
int x,y;
} a[17],b[17];
double endtem=1e-4;
int L=100;
double anssun=1e9;
double fun() {
double ans=0;
for (int i=1; i<=n; i++)
ans+=sqrt((double)(a[i].x - a[i-1].x) * (a[i].x - a[i-1].x) + (a[i].y - a[i-1].y) * (a[i].y - a[i-1].y));
return ans;
}
double rand_f() {
return (double)(rand())/(double)RAND_MAX;
}
void SA() {
// cout<<"114514\n";
for (int i=1; i<=n; i++)
a[i]=b[i];
double ans=fun();
anssun=min(anssun,ans);
double tem=1e5;
while (tem>endtem) {
for (int i=1; i<=L; i++) {
int x=rand()%n+1,y=rand()%n+1;
if (x==y) continue;
swap(a[x],a[y]);
double ans2=fun();
if (ans>ans2||rand_f()<exp((ans-ans2)/tem)) anssun=min(anssun,ans2),ans=ans2;
else swap(a[x],a[y]);
}
tem*=jw;
}
}
signed main() {
srand(time(0));
srand(rand());
cin>>n;
for (int i=1; i<=n; i++)
cin>>b[i].x>>b[i].y;
while (clock()<0.95*CLOCKS_PER_SEC) SA();
printf("%.2lf\n",anssun);
return 0;
}