50pts求调
查看原帖
50pts求调
45827
hasten楼主2024/7/18 17:36
#include<bits/stdc++.h>
using namespace std;

const int inf=0x3f3f3f3f, N=2010, M=6010;
int n, m;
int to[N], ne[N], w[M], h[N], tot;
int d[N], cnt[N], vis[N];

void add(int a, int b, int c){
	to[++tot]=b; w[tot]=c;
	ne[tot]=h[a];h[a]=tot;
}

bool spfa(){
	memset(d, 0x3f, sizeof d);
	memset(vis, 0, sizeof vis);
	memset(cnt, 0, sizeof cnt);
	queue<int> q;
	q.push(1); vis[1]=1; d[1]=0;
	
	while(q.size()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=h[u];i;i=ne[i]){
			int v=to[i];
			if(d[v]>d[u]+w[i]){
				d[v]=d[u]+w[i];
				cnt[v]=cnt[u]+1;
				if(++cnt[v]>=n) return 1;
				if(!vis[v]) q.push(v), vis[v]=1;
			}
		}
	}
	return 0;
}

int main(){
	int T; scanf("%d", &T);
	while(T--){
		tot=0; memset(h, 0, sizeof h);
		scanf("%d%d", &n, &m);
		for(int i=1;i<= m;i++){
			int u, v, w;
			scanf("%d%d%d", &u, &v, &w);
			add(u, v, w);
			if(w>=0) add(v, u, w);
		}
		puts(spfa()?"YES":"NO");
	}
	return 0;
}

求dalao帮助

2024/7/18 17:36
加载中...