先试着打了打暴力分,Floyd和dijkstra都过了前两个样例,但是一交上去全WA掉了。
求各位大佬指出错误!orz
//Test:1~4
#include <cmath>
#include <cstdio>
#include <algorithm>
#define lint long long
using namespace std;
const lint mod=998244353,inf=1e9+7;
int n,m; lint ans,w[1005][1005];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int main()
{
n=pow(2,read())-1,m=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i^j) w[i][j]=inf;
for(int i=2;i<=n;++i) w[i][i>>1]=1ll*read();
for(int i=1,u,v;i<=m;++i) u=read(),v=read(),w[u][v]=1ll*read();
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) w[i][j]=min(w[i][j],w[i][k]+w[k][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(w[i][j]^inf) ans=(ans+w[i][j])%mod;
printf("%lld",ans);
return 0;
}
//Test:1~8
#include <queue>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define lint long long
using namespace std;
const lint mod=998244353,inf=1e9+7;
struct Edge{int to,next; lint w;};
int n,m; lint ans;
int total,head[300005];
lint dis[300005];
bool vis[300005];
Edge edge[600005];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
inline void link(const int u,const int v,const lint w) {edge[++total]=(Edge){v,head[u],w},head[u]=total;}
inline void dijkstra(const int source)
{
priority_queue<pair<lint,int>,vector<pair<lint,int> >,greater<pair<lint,int> > > q;
for(int i=1;i<=n;++i) dis[i]=inf,vis[i]=false;
dis[source]=0,q.push(make_pair(0,source));
while(!q.empty())
{
int u=q.top().second; q.pop();
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to; lint w=edge[i].w;
if(dis[u]+w<dis[v]) dis[v]=dis[u]+w,q.push(make_pair(dis[v],v));
}
}
}
int main()
{
n=pow(2,read())-1,m=read();
for(int i=2;i<=n;++i) link(i,i>>1,1ll*read());
for(int i=1,u,v;i<=m;++i) u=read(),v=read(),link(u,v,1ll*read());
for(int i=1;i<=n;++i)
{
dijkstra(i);
for(int j=1;j<=n;++j)
if(dis[j]^inf) ans=(ans+dis[j])%mod;
}
printf("%lld",ans);
return 0;
}