随机算法求助
查看原帖
随机算法求助
203623
critnos楼主2020/7/1 21:18

RT,一直是 76pts,模拟退火/随机

随机:

#include<bits/stdc++.h>
using namespace std;
int n,k,w;
bool t[55];
int r[55],ex[55];
int a[55][55];
const double o=0.9999,e=1e-8;
int ask()
{
	int i,j,mx=0,mn;
	random_shuffle(ex,ex+w);
	for(i=0;i<k;i++)
		t[ex[i]]=1;
	
	for(i=0;i<n;i++)
	{
		mn=1e9;
		for(j=0;j<n;j++)
			if(t[j])
				mn=min(mn,a[i][j]);
		mx=max(mn,mx);
	}			
	
	for(i=0;i<k;i++)
		t[ex[i]]=0;
	return mx;
}
int main()
{
	srand(time(0));
	int m,i,j,d,mn=1e9;
	cin>>n>>m>>k;
	for(i=0;i<n;i++)
		cin>>r[i];
	memset(a,127/3,sizeof(a));
	
	for(i=0;i<n;i++)
	{
		cin>>d;
		a[i][r[i]]=a[r[i]][i]=min(d,a[r[i]][i]);
	}
	for(i=0;i<n;i++)
		a[i][i]=0;
	for(int k=0;k<n;k++)
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
//	for(i=0;i<n;i++,cout<<endl)
//			for(j=0;j<n;j++)
//				cout<<a[i][j]<<' ';
	while(m--)
	{
		cin>>d;
		t[d]=1;
	}
	for(i=0;i<n;i++)
		if(!t[i])
			ex[w++]=i;
	while(clock()<1000000*0.75)
		mn=min(mn,ask());
	cout<<mn;
}

模拟退火:

#include<bits/stdc++.h>
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
int n,k,w,w2,mn=1e9;
bool t[55];
int r[55],ex[55],ex2[55],ans[55];
int a[55][55];
const double o=0.99999,e=1e-8;
int ask()
{
	int i,j,mx=0,mn;
	for(i=0;i<n;i++)
	{
		mn=1e9;
		for(j=0;j<k;j++)
			mn=min(mn,a[i][ex[j]]);
		mx=max(min(mn,ans[i]),mx);
	}			
	return mx;
}
void SA()
{
	double s=1,ans;
	int w1,w2;
	for(;s>e;s*=o)
	{
		w1=rand()%k,w2=rand()%(w-k)+k;
		swap(ex[w1],ex[w2]);
		ans=ask();
		if(ans<mn)
			mn=ans;
		else if(exp((ans-mn)/s)*RAND_MAX<rand())
			swap(ex[w1],ex[w2]);
		if(clock()>1000000*0.75) return;
	}
}
int main()
{
	srand(time(0));
	int m,i,j,d;
	cin>>n>>m>>k;
	if(m+k==n)
	{
		cout<<ask();
		return 0;
	}
	for(i=0;i<n;i++)
		cin>>r[i];
	memset(a,127/3,sizeof(a));
	memset(ans,127/3,sizeof(ans));
	for(i=0;i<n;i++)
	{
		cin>>d;
		a[i][r[i]]=a[r[i]][i]=min(d,a[r[i]][i]);
	}
	for(i=0;i<n;i++)
		a[i][i]=0;
	for(int k=0;k<n;k++)
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
//	for(i=0;i<n;i++,cout<<endl)
//			for(j=0;j<n;j++)
//				cout<<a[i][j]<<' ';
	while(m--)
	{
		cin>>d;
		ex2[w2++]=d;
		t[d]=1;
	}
	for(i=0;i<n;i++)
		for(j=0;j<w2;j++)
			ans[i]=min(ans[i],a[i][ex2[j]]);	
	for(i=0;i<n;i++)
		if(!t[i])
			ex[w++]=i;
	while(clock()<1000000*0.75)
		SA();
	cout<<mn;
}
2020/7/1 21:18
加载中...