求调
查看原帖
求调
639198
Steve_xh楼主2023/11/8 18:41

求算下时间复杂度,只要不tle哪怕wa都行,感谢大佬!

#include<bits/stdc++.h>
#define mod 998244353
#define int long long
#define pii pair<int,int>
using namespace std;
int n,m,ans;
map<pii,int> dist;
//vector<int> secto[262145];
int path_size(int now,int en,int len){
	if(now==en)
		return len;
	int reans=-1;
	for(int i=1;i<(1<<n);i++){
		if(!dist[make_pair(now,i)])
			continue;
		if(abs(i-en)>abs(now-en))
			continue;
		int tmp=path_size(i,en,len+dist[make_pair(now,i)])%mod;
		if(reans==-1)
			reans=tmp;
		reans=min(reans,tmp)%mod;
	}
	return reans;
}
int simp_path(int st){
	int reans=0;
	for(int i=st;i;i>>=1)
		for(int j=st;j;j>>=1){
			if(i==j)
				continue;
			int tmp=path_size(i,j,0);
			//printf("path_size(%d,%d,0):%d\n",i,j,tmp);
			reans=(reans+tmp)%mod;
		}
	return reans;
}
signed main(){
	//freopen("trade2.in","r",stdin);
	//freopen("trade2.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	dist[make_pair(1ll,1ll)]=0;
	for(int i=2,t;i<(1<<n);i++)
		scanf("%lld",&t),dist[make_pair(i,i>>1)]=t,dist[make_pair(i,i)]=0;
	for(int i=1,u,v,w;i<=m;i++){
		scanf("%lld%lld%lld",&u,&v,&w);
		//secto[u].push_back(v);
		dist[make_pair(u,v)]=w;
	}
	for(int i=1<<(n-1);i<(1<<n);i++){
		int tmp=simp_path(i);
		//printf("simp_path(%d):%d\n",i,tmp);
		ans=(ans+tmp)%mod;
	}
	printf("%lld",ans);
	return 0;
}
2023/11/8 18:41
加载中...