Nik_Perepelov

7 контест 2 задача

Nov 2nd, 2021
573
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. vector<vector<int>> g, g_r;
  7. vector<bool> used;
  8. vector<int> order;
  9. vector<int> component;
  10.  
  11. void dfs(int v) {
  12.     used[v] = true;
  13.     for (int i : g[v])
  14.         if (!used[i])
  15.             dfs(i);
  16.     order.emplace_back(v);
  17. }
  18.  
  19. void dfs_r(int v) {
  20.     used[v] = true;
  21.     component.push_back(v);
  22.     for (int i : g_r[v])
  23.         if (!used[i])
  24.             dfs_r(i);
  25. }
  26.  
  27. int main() {
  28.     int n, m;
  29.     cin >> n >> m;
  30.  
  31.     used = vector<bool> (n);
  32.     g = vector<vector<int>> (n);
  33.     g_r = vector<vector<int>> (n);
  34.     vector<pair<int,int>> s(m);
  35.  
  36.     for (int i = 0; i < m; i++) {
  37.         int fr, to;
  38.         cin >> fr >> to;
  39.         fr--; to--;
  40.         s[i] = make_pair(fr, to);
  41.         g[fr].emplace_back(to);
  42.         g_r[to].emplace_back(fr);
  43.     }
  44.  
  45.     for (int i = 0; i < n; ++i)
  46.         if (!used[i])
  47.             dfs(i);
  48.  
  49.     used = vector<bool> (n);
  50.  
  51.     vector<int> component_per_v(n);
  52.     int cnt = 0;
  53.     for (int i = 0; i < n; ++i) {
  54.         int v = order[n - 1 - i];
  55.         if (!used[v]) {
  56.             dfs_r(v);
  57.             for (auto j : component){
  58.                 component_per_v[j] = cnt;
  59.             }
  60.             cnt++;
  61.             component.clear();
  62.         }
  63.     }
  64.  
  65.     vector<bool> ans(cnt);
  66.     for (int i = 0; i < m; i++){
  67.         if (component_per_v[s[i].first] != component_per_v[s[i].second]){
  68.             ans[component_per_v[s[i].first]] = true;
  69.         }
  70.     }
  71.  
  72.     vector<int> f_ans;
  73.     for (int i = 0; i < cnt; i++){
  74.         if (!ans[i]){
  75.             for (int j = 0; j < n; j++){
  76.                 if (component_per_v[j] == i){
  77.                     f_ans.emplace_back(j);
  78.                     break;
  79.                 }
  80.             }
  81.         }
  82.     }
  83.     cout << f_ans.size() << '\n';
  84.     for (auto &i : f_ans){
  85.         cout << i + 1 << '\n';
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment