https://www.luogu.com.cn/problem/P3385
思路
进行spfa的松弛操作,如果一个点松弛了n次则存在负环
(一个憨批错误卡半天)
代码
#include <bits/stdc++.h>
using namespace std;
const int M = 6002;
const int N = 2002;
struct edge {
int v, w, next;
} e[M];
int inq[N], head[N], dis[N];
queue <int> q;
int n, m, cnt, num[N];
inline void read(int &x) {
int flag = 1; x = 0;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-') flag = -1;
for (; isdigit(ch); ch = getchar())
x = x * 10 + ch - 48;
x *= flag;
}
void add(int u, int v, int w) {
cnt++;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt;
}
void reset() {
cnt = 0;
//memset(e, 0, sizeof(e));
memset(inq, 0, sizeof(inq));
memset(num, 0, sizeof(num));
memset(dis, 0x7f, sizeof(dis));
memset(head, -1, sizeof(head));
while (!q.empty()) q.pop();
}
bool spfa(int s) {
q.push(s);
inq[s] = 1; num[s] = 0; dis[s] = 0;
while (!q.empty()) {
int fro = q.front();
q.pop();
inq[fro] = 0;
for (int i = head[fro]; i != -1; i = e[i].next) {
int nv = e[i].v;
if (dis[nv] > dis[fro] + e[i].w) {
dis[nv] = dis[fro] + e[i].w;
if (!inq[nv]) {
inq[nv] = 1;
q.push(nv);
if (++num[nv] == n) return 1;
}
}
}
}
return 0;
}
int main() {
//freopen("in.txt", "r", stdin);
int T; cin >> T;
while (T--) {
reset();
read(n), read(m);
for (int i = 0; i < m; i++) {
int u, v, w;
read(u), read(v), read(w);
add(u, v, w);
if (w >= 0) add(v, u, w);
}
if (spfa(1)) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}