调了好几天了,wa了9和10,求大佬救救 SPFA
查看原帖
调了好几天了,wa了9和10,求大佬救救 SPFA
565852
Small_Traveler楼主2023/5/22 12:56
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int T,n,m,h[2005],nex[6005],av[6005],aw[6005],dis[2005],cnt,num[2005];
bool vis[2005];
void initialize(){
	memset(h,0,sizeof(h));
	memset(nex,0,sizeof(nex));
	memset(av,0,sizeof(av));
	memset(aw,0,sizeof(aw));
	for(int i=1;i<=n;i++)dis[i]=0x7fffffff;
	cnt=0;
	memset(num,0,sizeof(num));
	memset(vis,0,sizeof(vis));
	return;
}
void add(int u,int v,int w){
	av[++cnt]=v;
	aw[cnt]=w;
	nex[cnt]=h[u];
	h[u]=cnt;
	return;
}
bool SPFA(){
    queue < int > q;
	dis[1]=0;q.push(1);
	while(!q.empty()){
		int u=q.front();
		q.pop();vis[u]=0;
		for(int i=h[u];i;i=nex[i]){
			if(dis[av[i]]>dis[u]+aw[i]){
				dis[av[i]]=dis[u]+aw[i];
				if(!vis[av[i]]){
					q.push(av[i]);
					num[av[i]]++;
					if(num[av[i]]>n+1)return 1;
				}
			}
		}
	}
	return 0;
}
int main(){
	scanf("%d",&T);
	for(int i=T;i;i--){
		initialize();
		scanf("%d%d",&n,&m);
		for(int j=m;j;j--){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			if(w>=0){
				add(u,v,w);
				add(v,u,w);
			}
			else{
				add(u,v,w);
			}
		}
		if(SPFA())printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
2023/5/22 12:56
加载中...