help
查看原帖
help
193653
Tree_new_bee楼主2021/2/2 18:42
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10015;
struct edge {
	int x,y,w,nxt;
} E[MAXN<<2];
int head[MAXN],dis[MAXN],cnt[MAXN],inq[MAXN];
int n,m,tot;
inline void addedge(int x,int y,int w) {
	E[++tot]=(edge) {x,y,w,head[x]};
	head[x]=tot;
}
queue<int>Q;
inline int SPFA(int s) {
	while(!Q.empty()) Q.pop();
	Q.push(s);
	inq[s]=1;
	dis[s]=0;
	while(!Q.empty()) {
		int now=Q.front();
		Q.pop();
		inq[now]=0;
		for(int i=head[now]; ~i; i=E[i].nxt) {
			int to=E[i].y;
			if(dis[to]>dis[now]+E[i].w) {
				dis[to]=dis[now]+E[i].w;
				if(!inq[to]) {
					inq[to]=1;
					Q.push(to);
					++cnt[to];
					if(cnt[to]>=n)
						return 1;
				}
			}
		}
	}
	return 0;
}
int main() {
	int T;
	cin>>T;
	while(T--) {
		memset(head,-1,sizeof(head));
		tot=0;
		cin>>n>>m;
		for(int i=1,x,y,z; i<=m; i++) {
			cin>>x>>y>>z;
			if(z>=0){
				addedge(x,y,z);
			addedge(y,x,z);
			}
			else addedge(x,y,z);

		}
		memset(dis,0x3f,sizeof(dis));
		memset(cnt,0,sizeof(cnt));
		memset(inq,0,sizeof(inq));
		int fl=1;
		for(int i=1; i<=n; ++i) {
			if(dis[i]==0x3f3f3f3f) {
				if(SPFA(i)) {
					puts("YES");
					fl=0;
					break;
				}
			}
		}
		if(fl) puts("NO");
	}
	return 0;
}
2021/2/2 18:42
加载中...