求助题目数据是否不符(SPFA)
查看原帖
求助题目数据是否不符(SPFA)
70029
李泽影楼主2021/10/18 21:54

RT,数据范围m<=3000,但蒟蒻不开60000+就RE,开了就AC,好奇原因

#include<bits/stdc++.h>
using namespace std;
const int MAXM=60003;
const int MAXN=20003;
const int MAX=10004;
int t,n,m,cnt;
inline int read() {
    int X=0,w=1; char c=getchar();
    while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
    while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
    return X*w;
}
int head[MAXN],dis[MAXN],tot[MAXN];
bool vis[MAXN];
struct Node{
	int to,w,nxt;
}edge[MAXM];
inline void addedge(int x,int y,int z){
	edge[++cnt].to=y;
	edge[cnt].w=z;
	edge[cnt].nxt=head[x];
	head[x]=cnt;
}
queue <int> q;
bool dij(){
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	memset(vis,0,sizeof(vis));
	memset(head,0,sizeof(head));
	memset(tot,0,sizeof(tot));
	n=read(),m=read();
	int u,v,w;
	for(int i=1;i<=m;i++){
		u=read(),v=read(),w=read(); 
		addedge(u,v,w);
		if(w>=0)addedge(v,u,w);
	}
	q.push(1);
	vis[1]=1;
	while(!q.empty()){
		int x=q.front(),v;
		q.pop();
		vis[x]=0;
		for(int i=head[x];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(dis[v]>dis[x]+edge[i].w){
				dis[v]=dis[x]+edge[i].w;
				tot[v]=tot[x]+1;
				if(tot[v]>n)return 1;
				if(!vis[v]){
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	return 0;
}
int main(){
	t=read();
	while(t--){
		printf(dij()?"YES\n":"NO\n");
	}
	return 0;
}
2021/10/18 21:54
加载中...