spfa 模版零分求助
查看原帖
spfa 模版零分求助
704275
无名之雾楼主2024/8/8 13:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
inline void write(int x){
    if(x==0){putchar('0');return;}
	int len=0,k1=x,c[10005];
	if(k1<0)k1=-k1,putchar('-');
	while(k1)c[len++]=k1%10+'0',k1/=10;
	while(len--)putchar(c[len]);
}
const int N=1e4+5;
struct node{
	int w,v;
};
vector<node>edge[N];
int dist[N],cnt[N];bitset<N>vis; 
void init(int n){
	for(int i=1;i<=n;i++)cnt[i]=0,dist[i]=INT_MAX;
	vis.reset();
}
bool spfa(int n){
	queue<int>q;
	dist[1]=0,q.push(1),cnt[1]=1;
	while(!q.empty()){
		int top=q.front();q.pop();
		vis[top]=0;
        for(int i=0;i<edge[top].size();i++){
			int w=edge[top][i].w,v=edge[top][i].v;
			if(dist[v]>dist[top]+w){
				dist[v]=dist[top]+w;
				if(cnt[v]>=n)return 1;
				if(!vis[v])q.push(v),cnt[v]++,vis[v]=1;
			}
        }
	}
	return 0;
}
signed main(){
	int t=read();
	while(t--){
		int n=read(),m=read();
		init(n);
		for(int i=1;i<=m;i++){
			int u=read(),v=read(),w=read();
		    edge[u].push_back({v,w});
		    if(w>=0)edge[v].push_back({u,w});
		}
		if(spfa(n))puts("YES");
		else puts("NO");
	}
	return 0;
}
2024/8/8 13:55
加载中...