smatskevich

Lesson12

Dec 19th, 2024
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <algorithm>
  2. #include <array>
  3. #include <cassert>
  4. #include <climits>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <limits>
  10. #include <list>
  11. #include <map>
  12. #include <numeric>
  13. #include <queue>
  14. #include <set>
  15. #include <sstream>
  16. #include <stack>
  17. #include <string>
  18. #include <tuple>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <vector>
  22.  
  23. #define all(x) x.begin(), x.end()
  24. using namespace std;
  25. using ll=long long;
  26. const double eps = 1e-10;
  27. const int mod = 1000000007;
  28.  
  29. void DFS(const vector<vector<int>>& g, int u, vector<bool>& used, vector<int>& to_go) {
  30.   used[u] = true;
  31.   for (int v : g[u]) {
  32.     if (!used[v]) {
  33.       DFS(g, v, used, to_go);
  34.     }
  35.   }
  36.   to_go.push_back(u);
  37. }
  38. vector<int> DFSGo(const vector<vector<int>>& h) {
  39.   int n = h.size();
  40.   vector<bool> used(n);
  41.   vector<int> to_go(n);
  42.   for (int u = 0; u < n; ++u) {
  43.     if (!used[u]) {
  44.       DFS(h, u, used, to_go);
  45.     }
  46.   }
  47.   return to_go;
  48. }
  49.  
  50. void DFSKss(const vector<vector<int>>& g, int u, vector<int>& kss, int comp) {
  51.   kss[u] = comp;
  52.   for (int v : g[u]) {
  53.     if (kss[v] == -1) {
  54.       DFSKss(g, v, kss, comp);
  55.     }
  56.   }
  57. }
  58. vector<set<int>> Condense(const vector<vector<int>>& g) {
  59.   int n = g.size();
  60.   vector<vector<int>> h(n);
  61.   for (int u = 0; u < n; ++u) {
  62.     for (int v : g[u]) h[v].push_back(u);
  63.   }
  64.  
  65.   vector<int> to_go = DFSGo(h);
  66.   reverse(all(to_go));
  67.   vector<int> kss(n, -1);
  68.   int comp = 0;
  69.   for (int u : to_go) {
  70.     if (kss[u] == -1) {
  71.       DFSKss(g, u, kss, comp++);
  72.     }
  73.   }
  74.   vector<set<int>> condensed(comp);
  75.   for (int u = 0; u < n; ++u) {
  76.     for (int v : g[u]) {
  77.       if (kss[u] == kss[v]) continue;
  78.       condensed[kss[u]].insert(kss[v]);
  79.     }
  80.   }
  81.   return condensed;
  82. }
  83.  
  84. void Solve() {
  85.   int n, e; cin >> n >> e;
  86.   vector<vector<int>> g(n);
  87.   for (int i = 0; i < e; ++i) {
  88.     int u, v; cin >> u >> v;
  89.     g[u].push_back(v);
  90.   }
  91.   auto condense = Condense(g);
  92.   for (int u = 0; u < condense.size(); ++u) {
  93.     cout << u << ": ";
  94.     for (int v : condense[u]) cout << v << " ";
  95.     cout << "\n";
  96.   }
  97. }
  98. int main() {
  99.   ios::sync_with_stdio(false);
  100.   cin.tie(nullptr);
  101.   cout.tie(nullptr);
  102.  
  103.   Solve();
  104.   return 0;
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment