模拟退火调哭了/ll
查看原帖
模拟退火调哭了/ll
50477
linfourxu楼主2021/6/2 07:03

rt,心态崩了,题解里这种逆天代码都能过,而且只调用3遍”EA()"...

exp(-(double)delta*RAND_MAX/T)

先不说这里的delta是小于0的他还取个负,把RAND_MAX乘进exp里的操作我是咋都没想到,但人家就是能过,还只需要调用3遍,我调用2e6遍都过不了/ll,有无巨佬帮忙看看或者调调参/ll

#include<bits/stdc++.h>
using namespace std;
namespace lin4xu{

#define re register
#define rint re int
#define ll long long
#define rll re ll
#define db double
#define rdb re db
#define rch re char
#define ldb long db
#define rldb re ldb
#define un unsigned
#define ull un ll
#define rull re ull

template <typename T> inline T read()
{
	re T ans=0;rint f=0;rch ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
	for(;isdigit(ch);ch=getchar()) ans=ans*10+(ch&15);
	return f?-ans:ans;
}

const int maxn=5e1+10;
const int det=0.999;
const int inf=0x3f3f3f3f;

int mapp[maxn][maxn];
int a[maxn];
bool vis[maxn];
int b[maxn];
int N,m,K,lst,ans;

inline int calc()
{
	rint ans=0;
	for(rint i=K+1;i<=N;i++)
	{
		rint tmp=inf,x=a[i];
		for(rint j=K;j;j--) mapp[x][a[j]]<tmp?tmp=mapp[x][a[j]]:0;
		for(rint j=m;j;j--) mapp[x][b[j]]<tmp?tmp=mapp[x][b[j]]:0;
		ans<tmp?ans=tmp:0;
	}
	return ans;
}

inline void SA()
{
	for(rdb t=1949;t>1e-10;t*=det)
	{
		rint x=rand()%K+1,y=rand()%(N-K)+K+1;
		swap(a[x],a[y]);
		rint tmp=calc();
		if(tmp<lst||exp((lst-tmp)/t)*RAND_MAX>rand()) lst=tmp;
		else swap(a[x],a[y]);
		if(lst<ans) ans=lst;
	}
}

int main()
{
    srand(time(NULL));
	rint n=read<int>(),beg=clock();m=read<int>(),K=read<int>();
	memset(mapp,0x3f,sizeof(mapp));
	for(rint i=1;i<=n;i++) b[i]=read<int>()+1;
	for(rint i=1;i<=n;i++) mapp[i][b[i]]=mapp[b[i]][i]=read<int>();
	for(rint i=n;i;i--) mapp[i][i]=0;
	for(rint k=n;k;k--)
		for(rint i=n;i;i--)
			for(rint j=n;j;j--)
				mapp[i][j]=min(mapp[i][j],mapp[i][k]+mapp[k][j]);
	for(rint i=m;i;i--) vis[b[i]=read<int>()+1]=1;
	if(m+K==n) return printf("0\n"),0;
	for(rint i=n;i;i--) if(!vis[i]) a[++N]=i;
	random_shuffle(a+1,a+N+1),ans=lst=calc();
	while(clock()-beg<796000) SA();
	printf("%d\n",ans);
	return 0;
}};

int main(){return lin4xu::main();}
2021/6/2 07:03
加载中...