本地能过,上面却不能是咋回事?
查看原帖
本地能过,上面却不能是咋回事?
117658
Space_Gold_Trash楼主2020/7/2 20:21
in:
5 4
1 2 3
1 3 3
1 4 3
1 5 3

out:
12
#include<bits/stdc++.h>
const int M(1<<12|1),N(13),EDGE(1011),INF(20050305);
using namespace std;
int n,m;
int dis[N][N];
namespace bit{
	inline int count(int k){
		int ans(0);
		while(k){
			ans+=k&1;
			k>>=1;
		}
		return ans;
	}
	inline bool get(int k,int p){                           //从右往左p位 
		return k&(1<<p-1);
	}
	inline int to(int k,int p){
		return k&~(1<<p-1);
	}
	inline int add(int x,int y){
		while(!!y){
			int t(x);
			x^=y;
			y=(x&y)<<1;
		}
	}
	inline void print_bit(int k){
		if(!k)return;
		print_bit(k>>1);
		putchar('0'+(k&1));
	}
	inline void swap(int x,int y){
		x^=y;
		y^=x;
		x^=y;
	}
	inline int fan(int k){
		return k^(1<<n)-1;
	}
}
namespace get_in{
	inline int read( ){
		int sum(0);
		char ch(getchar( ));
		while(ch==' '||ch=='\n')ch=getchar( );
		while(ch>='0'&&ch<='9'){
			sum=(sum<<1)+(sum<<3)+ch-'0';
			ch=getchar( );
		}
		return sum;
	}
}
using namespace get_in;
using namespace bit;
int t[N][N];
int len[N];
inline void pre( ){
	int i,j,k;
	n=read( );m=read( );
	for(i=1;i<=n;++i){
		for(j=1;j<=n;++j){
			dis[i][j]=INF;
		}
		dis[i][i]=0;
	}
	while(m--){
		int x(read( )),y(read( )),z(read( ));
		if(z>dis[x][y])continue;
		if(dis[x][y]==INF){
			t[x][++len[x]]=y;
			t[y][++len[y]]=x;
		}
		dis[x][y]=dis[y][x]=z;
	}
	
}
int d[N],que[N];
int tep,ans(INF);
int cnt,minn,nod;
inline void dfs(int first,int k){
	if(k==n){
		ans=tep;
		return;
	}
	int i,j,x,y;
	for(x=first;x<=cnt;++x){
		if(tep+d[i]*minn>=ans)return;
		i=que[x];
		for(y=1;y<=len[i];++y)
		if(!d[j=t[i][y]]){
			tep+=d[i]*dis[i][j];
			d[j]=d[i]+1;
			que[++cnt]=j;
			minn-=dis[i][t[i][1]];
			dfs(x,k+1);
			minn+=dis[i][t[i][1]];
			--cnt;
			d[j]=0;
			tep-=d[i]*dis[i][j];
		}
	}
}
int p;
inline bool cmp(int x,int y){
	return dis[x][p]<dis[y][p];
}
signed main( ){
	pre( );
	int i;
	for(i=1;i<=n;i++){
		p=i;
		sort(t[i]+1,t[i]+1+len[i],cmp);
		minn+=dis[i][t[i][1]];
	}
	for(i=1;i<=n;i++){
		tep=0;
		fill(d+1,d+1+n,0);
		d[i]=1;
		que[cnt=1]=i;
		minn-=dis[i][t[i][1]];
		dfs(1,1);
		d[i]=0;
		minn+=dis[i][t[i][1]];
	}
	printf("%d",ans);
}
2020/7/2 20:21
加载中...