暴力怎么也WA掉了呢
查看原帖
暴力怎么也WA掉了呢
363529
ForLune_楼主2023/7/31 21:31

先试着打了打暴力分,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;
}
2023/7/31 21:31
加载中...