求问hack的是哪些做法
查看原帖
求问hack的是哪些做法
848391
fantastic_dream楼主2023/7/8 11:31

状压dp100pts被hack

#include<bits/stdc++.h>
using namespace std;
int n,m,sz[15][15]={0},f[4097],dis[15][4097],ans=INT_MAX;
int anw(int x,int l){
	return ((x>>l)&1);
}
int main(){
//	freopen("24,out","w",stdout);
	cin>>n>>m;
	memset(f,0x3f,sizeof(f));
	int u,v,w;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		if(!sz[u][v])	sz[u][v]=sz[v][u]=w;
		else	sz[u][v]=sz[v][u]=min(sz[u][v],w);
	}	
	for(int s=1;s<=n;s++){
		memset(f,0x3f,sizeof(f)),memset(dis,0,sizeof(dis));
		f[(1<<n-s)]=0;
		for(int i=1;i<=(1<<n)-1;i++){
			if(!anw(i,n-s)||i==(1<<n-s))	continue;
			for(int j=1;j<=n;j++){
				if(!anw(i,n-j)||j==s)	continue;
				int t=i-(1<<n-j);//上一个状态 cout<<"!";
//				if(s==1)	cout<<i<<" "<<t<<'\n';
				for(int k=1;k<=n;k++){
					if(j==k||!anw(t,n-k)||!sz[j][k])	continue;
					if(f[t]+(dis[k][t]+1)*sz[j][k]<f[i]){
						f[i]=f[t]+(dis[k][t]+1)*sz[j][k];
						dis[j][i]=dis[k][t]+1;
						for(int l=1;l<=n;l++){
							if(l!=j)	dis[l][i]=dis[l][t];
						}
					}
				}
			}
		}
		ans=min(ans,f[(1<<n)-1]);
	}
	cout<<ans;
	return 0;
}
2023/7/8 11:31
加载中...