赏-“拜谢”之SA 80pts
查看原帖
赏-“拜谢”之SA 80pts
975287
KDL_ANIPLEX楼主2025/1/21 15:46

跟题解差不多,萌新求助

#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;
}

2025/1/21 15:46
加载中...