#include using namespace std; const int N = 2010, M = 10010; int n, m; // 点数、边数 int d[N]; // 存储每个点到1号点的最短距离 bool st[N]; // 存储每个点是否在队列中 int cnt[N]; // // 邻接表 int e[M], h[N], idx, w[M], ne[M]; void add(int a, int b, int c) { e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; } int spfa() { queue q; // 构建超级源点,防止负环与出发点不连通 for (int i = 1; i <= n; i++) { q.push(i); st[i] = true; } while (q.size()) { int u = q.front(); q.pop(); st[u] = 0; for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (d[v] > d[u] + w[i]) { d[v] = d[u] + w[i]; cnt[v] = cnt[u] + 1; if (cnt[v] >= n) return 1; if (!st[v]) { q.push(v); st[v] = 1; } } } } return 0; } int main() { memset(h, -1, sizeof h); cin >> n >> m; while (m--) { int a, b, c; cin >> a >> b >> c; add(a, b, c); } // 调用spfa判断是否有负环 if (spfa()) puts("Yes"); else puts("No"); return 0; }