求算下时间复杂度,只要不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;
}