lighted

Untitled

Oct 13th, 2023
704
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5.  
  6. vector < vector < int > > g, t, tr;
  7. vector < bool > used;
  8.  
  9. vector < int > topsort;
  10.  
  11. void TopSort(int v) {
  12.     if (used[v]) {
  13.         return;
  14.     }
  15.  
  16.     used[v] = true;
  17.  
  18.     for (auto u : t[v])
  19.         TopSort(u);
  20.  
  21.     topsort.push_back(v);
  22. }
  23.  
  24. vector < int > scc;
  25. vector < int > scale;
  26.  
  27. void Paint(int v, int &cnt) {
  28.     if (scc[v] > 0) {
  29.         return;
  30.     }
  31.  
  32.     scc[v] = cnt;
  33.     scale[cnt]++;
  34.  
  35.     for (auto u : tr[v])
  36.         Paint(u, cnt);
  37. }
  38.  
  39. bool exist;
  40.  
  41. void DFS(int v) {
  42.     if (used[v]) {
  43.         return;
  44.     }
  45.  
  46.     used[v] = true;
  47.  
  48.     bool edge = false;
  49.  
  50.     for (auto u : g[v])
  51.         edge |= u != v;
  52.  
  53.     if (scale[scc[v]] == 1 && edge)
  54.         exist = true;
  55.  
  56.     for (auto u : g[v])
  57.         DFS(u);
  58. }
  59.  
  60. signed main() {
  61.     ios_base::sync_with_stdio(0); cin.tie(0);
  62.     //freopen("a.in", "r", stdin); freopen("a.out", "w", stdout);
  63.  
  64.     int n, m, v, u, type; cin >> n >> m;
  65.  
  66.     g = vector < vector < int > >(n + 1);
  67.     t = vector < vector < int > >(n + 1);
  68.     tr = vector < vector < int > >(n + 1);
  69.  
  70.     while (m--) {
  71.         cin >> v >> u >> type;
  72.  
  73.         if (type == 2) {
  74.             t[v].push_back(u);
  75.             tr[u].push_back(v);
  76.         }
  77.  
  78.         g[v].push_back(u);
  79.     }
  80.  
  81.     used = vector < bool >(n + 1);
  82.  
  83.     for (int i = 1; i <= n; i++)
  84.         TopSort(i);
  85.  
  86.     reverse(topsort.begin(), topsort.end());
  87.  
  88.     scc = vector < int >(n + 1);
  89.     scale = vector < int >(n + 1);
  90.  
  91.     int cnt = 0;
  92.  
  93.     for (auto v : topsort)
  94.         if (scc[v] == 0)
  95.             Paint(v, ++cnt);
  96.  
  97.     fill(used.begin(), used.end(), false);
  98.  
  99.     DFS(1);
  100.  
  101.     cout << (exist ? "Yes" : "No") << "\n";
  102. }
Advertisement
Add Comment
Please, Sign In to add comment