模拟退火的一些问题
查看原帖
模拟退火的一些问题
690827
Noname_min楼主2022/7/15 15:03
#include<bits/stdc++.h>//想不出正解,只好模拟退火 
using namespace std;
const int N=505;
int flag,n,m,d[N][N],np,dp,p[N],maxxxx;
int main()
{
	//freopen("sanguo.in","r",stdin);
	//freopen("sanguo,out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			scanf("%d",&d[i][j]);
			d[j][i]=d[i][j];
		}
	}
	int k=800;
	while(k--)
	{	
		int mac[N],peo[N],f[N];int cnt=0;
		memset(f,0,sizeof(f));
		label:
			for(int i=1;i;i++)
			{
				int r=rand();
				int l=r%n;if(f[l]) continue;
				if(f[l]==0)	
				{
					peo[++cnt]=l;
					f[l]=1;
					break;
				}
			}
			int res=0;
			int id;
			for(int l=1;l<=cnt;l++)
				for(int i=1;i<=n;i++)
				{
					if(d[peo[l]][i]>res&&f[i]==0&&i!=peo[l]) 
					{
						res=d[peo[l]][i];
						id=i;
					}
				}
			mac[cnt]=id;
			f[id]=1;
		if(cnt<n/2) goto label;
		int maxx=0,maxxx=0;
		for(int i=1;i<=n/2;i++)
			for(int j=1;j<=n/2;j++)
			{
				maxx=max(d[mac[i]][mac[j]],maxx);
				maxxx=max(d[peo[i]][peo[j]],maxxx);
			}
		if(maxxx>maxx) flag=1,maxxxx=max(maxxxx,maxxx);;
		
	}
	cout<<flag;
	if(flag==1)
		cout<<endl<<maxxxx;
	return 0;
}

500数据超时不出所料 但是有没有大佬指点为什么18以下也会错一个点,有点不明白

2022/7/15 15:03
加载中...