20分 其他点都是wa 看不出来哪里不对 求调 回关注 谢谢
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<cstring>
using namespace std;
const int N = 4e6 + 10;
struct edge {
int v, w, ne;
}e[N];
int h[N]; int idx = 1;
int d[N], q[N]; //d[i]源点到节点距离的表 q[i]哪些节点被松弛了放入队列
bool st[N]; //节点是否在队列中
int cnt[N]; //节点被松弛次数
int l = 0, r = 0;
void add(int u, int v, int w) {
e[idx] = { v,w,h[u] };
h[u] = idx++;
}
bool SPFA(int n) {
d[1] = 0;
cnt[1]++;
q[r++] = 1;
st[1] = true;
while (l < r) {
int u = q[l++];
//考察从u出发的所有边
for (int i = h[u]; i > 0; i = e[i].ne) {
int v = e[i].v;
int w = e[i].w;
if (d[u] + w < d[v]) {
d[v] = d[u] + w;
if (!st[v]) {
if (cnt[v]++ == n) //松弛次数为n 说明有负环
return true;
q[r++] = v;
st[v] = true;
}
}
}
}
return false;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
l = r = 0;
memset(e, 0, sizeof(e));
memset(h, 0, sizeof(h));
memset(cnt, 0, sizeof(cnt));
memset(d, INT_MAX, sizeof(d));
memset(st, 0, sizeof(st));
memset(q, 0, sizeof(q));
idx = 1;
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; 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);
}
}
if (SPFA(n))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}