Advertisement
Mlxa

FUN MEGA-CONDENSATOR

Jan 19th, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <cstdio>
  6. #include <cassert>
  7. #include <list>
  8. using namespace std;
  9.  
  10. typedef long long ll;
  11. namespace Mlxa {
  12.     #define eol '\n'
  13.     #define read cin
  14.     #define mp make_pair
  15.     template <class A> inline   void print (A a)    { cout << a << ' '; }
  16.     template <class A> inline   void println (A a){ cout << a << eol; }
  17.     template <class A> inline   void err (A a)  { cerr << a << ' '; }
  18.     template <class A> inline   void errln (A a)    { cerr << a << eol; }
  19.     template <class A, class... B> inline   void println(A a, B... b) { print(a); println(b...); }
  20.     template <class A, class... B> inline   void errln  (A a, B... b) { err(a); errln(b...); }
  21.  
  22.     #define all(x) begin(x), end(x)
  23.     #ifdef AC
  24.         #define add_log(...) errln(">>", __VA_ARGS__)
  25.     #else
  26.         #define add_log(...) (void(0))
  27.     #endif
  28.     #define fastIO cin.tie(nullptr), ios_base::sync_with_stdio(false);
  29.     #define read_from(x) assert(freopen(x, "r", stdin))
  30.     #define write_to(x) assert(freopen(x, "w", stdout))
  31.     template <class I>
  32.     ostream& operator << (ostream &out, pair<I, I> p) {
  33.         I b(p.first), e(p.second);
  34.         if (b == e) out << "{  }";
  35.         else {
  36.             out << "{ ";
  37.             for (I i(b); i != e; ++ i) out << *i << ' ';
  38.             out << "}";
  39.         } return out;
  40.     }
  41.  
  42. } using namespace Mlxa;
  43.  
  44. struct Graph {
  45.     vector< set<ll> > E;
  46.     vector< set<ll> > R;
  47.     Graph() {}
  48.     void resize (ll n) {
  49.         E.assign(n + 1, set<ll>());
  50.         R.assign(n + 1, set<ll>());
  51.     }
  52.     inline ll n () { return E.size() - 1; }
  53.     inline set<ll> edges (ll v, bool rev=false)
  54.     { if (rev) return R[v]; return E[v]; }
  55.  
  56.     inline void connect (ll a, ll b) {
  57.         E[a].insert(b);
  58.         R[b].insert(a);
  59.     }
  60. };
  61.  
  62. Graph g, res;
  63.  
  64. vector<char> used;
  65. vector<ll> order, in;
  66.  
  67. void dfs (ll i) {
  68.     used[i] = true;
  69.     for (ll j : g.edges(i))
  70.     if (not used[j]) {
  71.         dfs(j);
  72.     }
  73.     order.push_back(i);
  74. }
  75.  
  76.  
  77. void start () {
  78.     read_from("in.txt");
  79.     ll n, m; read >> n >> m;
  80.     add_log("|V| =", n, "|E| =", m);
  81.     g.resize(n);
  82.     for (ll a, b, i(0); i < m; ++ i) {
  83.         read >> a >> b;
  84.         g.connect(a, b);
  85.     }
  86.     used.assign(g.n() + 1, false);
  87.     in.assign(g.n() + 1, -1);
  88.     for (ll i(1); i <= g.n(); ++ i)
  89.     if (not used[i]) dfs(i);
  90.  
  91.     reverse(all(order));
  92.     println("      Top-sorted like this:");
  93.     add_log(mp(all(order)));
  94. }
  95.  
  96.  
  97. vector<ll> component;
  98.  
  99.  
  100. void write_c (ll i) {
  101.     used[i] = true;
  102.     component.push_back(i);
  103.     for (ll j : g.edges(i, true))
  104.     if (not used[j]) write_c(j);
  105. }
  106.  
  107. void separate () {
  108.     used.assign(g.n() + 1, false);
  109.     ll cnt(0);
  110.     for (ll i : order)
  111.     if (not used[i]) {
  112.         write_c(i);
  113.         add_log("Component @", ++ cnt, ":\t", mp(all(component)));
  114.         for (ll v : component) in[v] = cnt;
  115.         component.clear();
  116.     } res.resize(cnt);
  117. }
  118.  
  119. void condensate () {
  120.     for (ll v(1); v <= g.n(); ++ v)
  121.     for (ll u : g.edges(v))
  122.     if (in[v] != in[u])
  123.         res.connect(in[v], in[u]);
  124.  
  125.     for (ll C(1); C <= res.n(); ++ C) {
  126.         auto tmp = res.edges(C);
  127.         add_log("@", C, ":   ", mp(all(tmp)));
  128.     }
  129. }
  130.  
  131. int main () {
  132.     println("-----Let's condensate it-----");
  133.     start();
  134.  
  135.     println("------------------------------");
  136.     println("     Separated components:");
  137.     separate();
  138.  
  139.     println("------------------------------");
  140.     println("     Graph condensation:");
  141.     condensate();
  142.  
  143.     println("------------------------------");
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement