Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- vector < vector < int > > g, t, tr;
- vector < bool > used;
- vector < int > topsort;
- void TopSort(int v) {
- if (used[v]) {
- return;
- }
- used[v] = true;
- for (auto u : t[v])
- TopSort(u);
- topsort.push_back(v);
- }
- vector < int > scc;
- vector < int > scale;
- void Paint(int v, int &cnt) {
- if (scc[v] > 0) {
- return;
- }
- scc[v] = cnt;
- scale[cnt]++;
- for (auto u : tr[v])
- Paint(u, cnt);
- }
- bool exist;
- void DFS(int v) {
- if (used[v]) {
- return;
- }
- used[v] = true;
- bool edge = false;
- for (auto u : g[v])
- edge |= u != v;
- if (scale[scc[v]] == 1 && edge)
- exist = true;
- for (auto u : g[v])
- DFS(u);
- }
- signed main() {
- ios_base::sync_with_stdio(0); cin.tie(0);
- //freopen("a.in", "r", stdin); freopen("a.out", "w", stdout);
- int n, m, v, u, type; cin >> n >> m;
- g = vector < vector < int > >(n + 1);
- t = vector < vector < int > >(n + 1);
- tr = vector < vector < int > >(n + 1);
- while (m--) {
- cin >> v >> u >> type;
- if (type == 2) {
- t[v].push_back(u);
- tr[u].push_back(v);
- }
- g[v].push_back(u);
- }
- used = vector < bool >(n + 1);
- for (int i = 1; i <= n; i++)
- TopSort(i);
- reverse(topsort.begin(), topsort.end());
- scc = vector < int >(n + 1);
- scale = vector < int >(n + 1);
- int cnt = 0;
- for (auto v : topsort)
- if (scc[v] == 0)
- Paint(v, ++cnt);
- fill(used.begin(), used.end(), false);
- DFS(1);
- cout << (exist ? "Yes" : "No") << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment