求助 SPFA wa前两个点
查看原帖
求助 SPFA wa前两个点
287395
abc_de楼主2022/4/5 18:32
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+5;
int t,in[maxn],w[maxn][maxn],dis[maxn],n,m;
vector<int> q1[maxn];
queue<int> q;
int rd(){
	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-'0';
		ch=getchar();	
	}	
	return x*f;
}
void spfa(int v0){
	int f=0;
	q.push(v0);
	while(!q.empty()){
		int u=q.front();
		q.pop();
//		in[u];
		if(++in[u]>n){cout<<"YES"<<endl;f=1;break;}
		for(int i=0;i<q1[u].size();i++){
			int v=q1[u][i];
			if(dis[v]>dis[u]+w[u][v]){
				dis[v]=dis[u]+w[u][v];
				q.push(v);
			}
		}
	}
	if(!f) cout<<"NO"<<endl;
}
void inti(){
	memset(dis,0x3f3f3f3f,sizeof(dis));
	memset(in,0,sizeof(in));
	dis[1]=0;
	while(!q.empty()) q.pop();
	for(int i=1;i<=n;i++) q1[i].clear();
}
int main(){
	t=rd();
	while(t--){
		n=rd();m=rd();
		inti();
		for(int i=1;i<=m;i++){
			int u,v;
			u=rd();v=rd(); 
			w[u][v]=rd();
			if(w[u][v]>=0){
				q1[u].push_back(v);
				q1[v].push_back(u);
				w[v][u]=w[u][v];
			}
			else q1[u].push_back(v);
		}
		spfa(1);
	}
	return 0;	
}
2022/4/5 18:32
加载中...