提交时间:2024-10-22 16:40:00

运行 ID: 33806

#include <iostream> #include <tuple> #include <vector> using namespace std; using i64 = long long; constexpr int INF = 0x3f3f3f3f; bool find_neg_cyc(const vector<tuple<int, int, int>>& edges, int n) { vector<int> dist(n + 1, INF); dist[1] = 0; for (int i = 1; i < n; ++i) { bool relax = false; for (auto [u, v, w] : edges) { if (dist[u] < INF && dist[v] > dist[u] + w) { dist[v] = dist[u] + w; relax = true; } } if (!relax) return false; } for (auto [u, v, w] : edges) { if (dist[u] < INF && dist[v] > dist[u] + w) return true; } return false; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m; cin >> n >> m; vector<tuple<int, int, int>> edges(m); for (int i = 0; i < m; ++i) { int u, v; char w; cin >> u >> v >> w; edges.emplace_back(u, v, w == ')' ? -1 : 1); } bool neg = find_neg_cyc(edges, n); for (auto& [_, __, w] : edges) w *= -1; bool pos = find_neg_cyc(edges, n); cout << (pos != neg ? "No\n" : "Yes\n"); return 0; }