提交时间:2024-10-22 19:48:18

运行 ID: 33808

//100pts #include <bits/stdc++.h> #include <bits/extc++.h> #define int long long #define rep(i, l, r) for (int i = l; i <= r; i++) #define per(i, r, l) for (int i = r; i >= l; i--) #define il inline using namespace std; using namespace __gnu_cxx; int n, m, q[1000005], l, r, dis[4005], cnt[4005]; struct edge { int v, w, nxt; } ed[8005]; int head[4005], ec; bool inq[4005]; il void add(int u, int v, int w) { ed[++ec] = (edge){v, w, head[u]}; head[u] = ec; } signed main() { scanf("%lld %lld", &n, &m); rep(i, 1, m) { int u, v; char w; scanf("%lld %lld %c", &u, &v, &w); add(u, v, w == '(' ? 1 : -1); } memset(dis, 0x3f, sizeof dis); l = 1, r = 0; q[++r] = 1; dis[1] = 0; inq[1] = 1; bool b1 = 0; while (r - l + 1) { int u = q[l++]; inq[u] = 0; for (int i = head[u]; i; i = ed[i].nxt) { int v = ed[i].v, w = ed[i].w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; cnt[v] = cnt[u] + 1; if (cnt[v] >= n) { b1 = 1; break; } if (!inq[v]) q[++r] = v, inq[v] = 1; } } if (b1) break; } memset(cnt, 0, sizeof cnt); memset(inq, 0, sizeof inq); memset(dis, 0x3f, sizeof dis); for (int i = 1; i <= m; i++) ed[i].w = -ed[i].w; l = 1, r = 0; q[++r] = 1; dis[1] = 0; inq[1] = 1; bool b2 = 0; while (r - l + 1) { int u = q[l++]; inq[u] = 0; for (int i = head[u]; i; i = ed[i].nxt) { int v = ed[i].v, w = ed[i].w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; cnt[v] = cnt[u] + 1; if (cnt[v] >= n) { b2 = 1; break; } if (!inq[v]) q[++r] = v, inq[v] = 1; } } if (b2) break; } if (b2 && b1 || !b2 && !b1) puts("Yes"); else puts("No"); return 0; }