// P3385:检测从 1 可达的负环。C++11。 #include #include #include using namespace std; using ll = long long; struct Edge { int v, w; }; bool hasNegativeCycle(const vector>& g) { int n = static_cast(g.size()) - 1; const ll INF = (1LL << 60); vector dis(n + 1, INF); vector len(n + 1, 0); vector inq(n + 1, false); queue q; dis[1] = 0; q.push(1); inq[1] = true; while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = false; for (auto e : g[u]) { int v = e.v; ll nd = dis[u] + e.w; if (nd >= dis[v]) continue; dis[v] = nd; len[v] = len[u] + 1; if (len[v] >= n) return true; if (!inq[v]) { q.push(v); inq[v] = true; } } } return false; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; if (!(cin >> T)) return 0; while (T--) { int n, m; cin >> n >> m; vector> g(n + 1); for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; g[u].push_back({v, w}); if (w >= 0) g[v].push_back({u, w}); } bool bad = hasNegativeCycle(g); cout << (bad ? "YES" : "NO") << '\n'; } }