SPFA判负环 84pts 求调 WA#9#10
  • 板块学术版
  • 楼主Polaris_flame
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/10 13:57
  • 上次更新2023/11/3 04:44:58
查看原帖
SPFA判负环 84pts 求调 WA#9#10
1046448
Polaris_flame楼主2023/8/10 13:57

题目link

#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define int long long
using namespace std;
const int MAXN = 2e4 + 10;
const int MAXM = 3e4 + 10;
const int INF = 0x3f3f3f3f;
struct node{
	int nxt,v,w;
}e[MAXN];
int head[MAXN],cnt=0,num[MAXN],dis[MAXN],n,m;
bool vis[MAXN];
void Init(){
	cnt=0;
	memset(head,-1,sizeof(head));
	memset(num,0,sizeof(num));
	memset(vis,false,sizeof(vis));
	fill(dis+1,dis+n+1,INF);
}
void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].nxt=head[u];
	e[cnt].w=w;
	head[u]=cnt;
}
bool spfa(){
	queue<int> q;
	q.push(1);
	dis[1]=0;
	vis[1]=1;
	while(!q.empty()){
		int u=q.front();
		vis[u]=0;
		q.pop();
		//printf("u=%d\n",u);
		for(int i=head[u];~i;i=e[i].nxt){
			int v=e[i].v,w=e[i].w;
			//printf("v=%d,w=%d\n",v,w);
			if(dis[u]+w<dis[v]){
				//printf("dis[v]=%d\n",dis[v]);
				dis[v]=dis[u]+w;
				//printf("dis[v]=%d\n",dis[v]);
				if(!vis[v]){
					num[v]++;
					//printf("num[v]=%d\n",num[v]);
					if(num[v]>=n){
						return 1;
					}
					vis[v]=1;
					q.push(v);
				}
			}
		}
	} 
	return 0;
}
signed main(){
	int T;
	scanf("%lld",&T);
	while(T--){
		Init();
		scanf("%lld%lld",&n,&m);
		FL(i,1,m){
			int u,v,w;
			scanf("%lld%lld%lld",&u,&v,&w);
			if(w>=0){
				add(u,v,w);
				add(v,u,w);
			}
			if(w<0){
				add(u,v,w);
			}
		}
		if(spfa()){
			printf("YES\n");
		}
		else{
			printf("NO\n");
		}
	} 
}
2023/8/10 13:57
加载中...