开O2RE??玄关
查看原帖
开O2RE??玄关
989997
DGL__DGL_AFO楼主2024/9/6 21:58

不开O2能过赛事

开O2全RE

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
ll w[14][14];
ll f[1<<14],res,ans=1e18;
ll len[1<<14][14][14];
ll cmp=1145140;

int main()
{
	//freopen("baozang.in","r",stdin);
	//freopen("baozang.out","w",stdout);
	cin>>n>>m;
	
	memset(w,0x3f,sizeof f);
	for(int i=1;i<=n;i++)
	  w[i][i]=0;
	for(int i=1;i<=m;i++)
	{
		int a,b;
		ll c;
		cin>>a>>b>>c;
		w[a][b]=min(w[a][b],c);
		w[b][a]=min(w[b][a],c);
	}
	
	/*for(int i=1;i<=n;i++)
	{
	    for(int j=1;j<=n;j++)
		  	cout<<w[i][j]<<' ';	
		cout<<'\n';
	}*/
	  
	
	for(int op=1;op<=n;op++)
	{
		memset(f,0x3f,sizeof f);
		memset(len,0x3f,sizeof len);
		
		f[1<<op-1]=0;
		len[1<<op-1][op][op]=0;
		
		for(int k=0;k<=(1<<n)-1;k++)
		{
			if(f[k]<=cmp)
			for(int i=1;i<=n;i++)
			    if((1<<i-1)&k)
				    for(int j=1;j<=n;j++)
						if(!((1<<j-1)&k))
							if(w[i][j]<=cmp)
							{
								
								  
								if(f[k|(1<<j-1)]>f[k]+w[i][j]*(len[k][op][i]+1))
								{
									for(int a=1;a<=n;a++)
							        	len[k|(1<<j-1)][op][a]=len[k][op][a];
																		 
									len[k|(1<<j-1)][op][j]=len[k][op][i]+1;
									f[k|(1<<j-1)]=f[k]+w[i][j]*len[k|(1<<j-1)][op][j];
																										
								}
								
							}
								
							
							    
									
			
						
		}
	//	cout<<f[(1<<n)-1]<<'\n';		
		ans=min(ans,f[(1<<n)-1]);	  
	}
	
			
	cout<<ans;		
	
	return 0;
}
  
/*
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1

*/  
2024/9/6 21:58
加载中...