MLE80求调
查看原帖
MLE80求调
1364336
pengyirui楼主2025/1/14 21:21

为什么一下代码在测试点1至50、67至70会MLE?

#include<bits/stdc++.h>
#define int long long
using namespace std;
int cnt,T,d[3005][4096],a,b,c;
int n,m,i,j,k,Log[4096],maxn,A[3005][4096],f[4096][4096],Next[4096],ans,sup,now;
signed main()
{
	memset(A,63,sizeof(A));
	memset(f,63,sizeof(f)),ans=45121999;
	cin>>n>>m;
	maxn=(1<<n)-1;
	for(i=1;i<=m;i++)
	{
		cin>>a>>b>>c;
		A[a][b]=A[b][a]=min(c,A[a][b]);
	}
	for(i=0;i<=n;i++)Log[1<<i]=i;
	for(i=0;i<=n;i++)f[0][1<<i]=0;
	for(i=1;i<=maxn;i++)
	{
		cnt=0;
		for(j=sup=maxn^i;j;j=(j-1)&sup)Next[j]=cnt,cnt=j;
		for(j=cnt;j;j=Next[j])
		{
			now=Log[j&(-j)]+1,T=45121999;
			for(k=1;k<=n;k++)if(1<<(k-1)&i)T=min(T,A[now][k]);
			d[i][j]=d[i][j^(j&-j)]+T;
		}
	}
	for(i=1;i<n;i++)
	    for(j=1;j<=maxn;j++)
	        for(k=j;k;k=(k-1)&j)
	            f[i][j]=min(f[i][j],f[i-1][j^k]+i*d[j^k][k]);
	for(i=0;i<=n;i++)ans=min(ans,f[i][maxn]);
	cout<<ans;
	return 0;
}

评测记录

2025/1/14 21:21
加载中...