判负环

洛谷P3385 负环

#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10, M = 1e4 + 10, inf = 0x3f3f3f3f;
int n, m, dis[N], cnt[N];
bool in[N];
int hd[N], nt[M], to[M], w[M], tot;
queue<int> q;
inline void add(int u, int v, int c)
{
	nt[++tot] = hd[u];
	hd[u] = tot;
	to[tot] = v;
	w[tot] = c;
}
inline bool SPFA(int s)
{
	for(int i = 1; i <= n; ++i) dis[i] = inf, in[i] = false, cnt[i] = 0;
	dis[s] = 0;
	q.push(s);
	int u, v;
	while(!q.empty())
	{
		u = q.front(); q.pop();
		in[u] = false;
		for(int e = hd[u]; e; e = nt[e])
		{
			if(dis[v = to[e]] > dis[u] + w[e])
			{
				dis[v] = dis[u] + w[e];
				if(!in[v])
				{
					if(++cnt[v] >= n) return true;
					q.push(v);
					in[v] = true;
				}
			}
		}
	}
	return false;
}
int main()
{
	int T;
    scanf("%d", &T);
    while(T--)
    {
    	scanf("%d%d", &n, &m);
    	memset(hd, 0, sizeof hd);
    	memset(nt, 0, sizeof nt);
    	memset(to, 0, sizeof to);
    	memset(w, 0, sizeof w);
    	tot = 0;
    	for(int i = 1, u, v, c; i <= m; ++i)
        {
         	scanf("%d%d%d", &u, &v, &c);
         	add(u, v, c);
         	if(c >= 0) add(v, u, c);
		}
		if(SPFA(1)) puts("YES");
		else puts("NO");
	}
	return 0;
}
posted @ 2022-05-13 21:59  Faker_yu  阅读(32)  评论(0)    收藏  举报