Advertisement
Mlxa

ALGO Edge graph

Feb 6th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include <cassert>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <iostream>
  5. #include <vector>
  6. #include <set>
  7. #include <map>
  8. #include <numeric>
  9.  
  10. namespace Mlxa {
  11.     using namespace std;
  12.     typedef   long long         ll;
  13.  
  14.     #define read                cin
  15.     #define eol                 '\n'
  16.     #define endln               cout << eol
  17.  
  18.     template <class A>              inline void print   (A a)           { cout << a << ' '; }
  19.     template <class A>              inline void println (A a)           { cout << a << eol; }
  20.     template <class A, class... B>  inline void println (A a, B... b)   { print(a); println(b...); }
  21.  
  22.     template <class A>              inline void err     (A a)         { cerr << a << ' '; }
  23.     template <class A>              inline void errln   (A a)         { cerr << a << eol; }
  24.     template <class A, class... B>  inline void errln   (A a, B... b) { cerr << a << ' '; errln(b...); }
  25.  
  26.     #ifdef AC
  27.         #define addLog(...) errln("log:", __VA_ARGS__)
  28.     #else
  29.         #define addLog(...) (void(0))
  30.     #endif
  31.  
  32.     #define pb                  push_back
  33.     #define mp                  make_pair
  34.     #define all(x)              begin(x), end(x)
  35.  
  36.     #define openFiles(name)     freopen(name ".in", "r", stdin), freopen(name ".out", "w", stdout)
  37.     #define fastIO              ios_base::sync_with_stdio(false), cin.tie(nullptr)
  38. } using namespace Mlxa;
  39.  
  40. /*
  41. Getting edge graph for undirected unweighted graph
  42. */
  43.  
  44. struct Graph
  45. {
  46.     vector< set<size_t> > g;
  47.     size_t N;
  48.  
  49.     Graph (size_t n) { assign(n); }
  50.  
  51.     void assign (size_t n)
  52.     {   N = n;
  53.         g.assign(n + 1, set<size_t>());
  54.     }
  55.  
  56.     void add (size_t i, size_t j)
  57.     {
  58.         g[i].insert(j);
  59.         g[j].insert(i);
  60.     }
  61.  
  62.     void refresh () { N = g.size(); }
  63.  
  64.     vector<size_t> edges (size_t v)
  65.     {   return vector<size_t>(all(g[v]));   }
  66.  
  67.     void print ()
  68.     {
  69.         addLog("Logging graph:");
  70.         for (size_t i = 0; i < N; ++ i) {
  71.             err(i); err(":\t");
  72.             for (size_t j : edges(i))
  73.                 err(j);
  74.             errln("");
  75.         }
  76.         addLog("---------");
  77.     }
  78. };
  79.  
  80. struct EdgeId
  81. {
  82.     size_t cur;
  83.     map< pair<size_t, size_t>, size_t> m;
  84.  
  85.     EdgeId () : cur(0) {}
  86.  
  87.     void add (size_t i, size_t j)
  88.     {
  89.         if (i > j) swap(i, j);
  90.         if (!m.count({i, j}))
  91.             m[{i, j}] = cur ++;
  92.     }
  93.  
  94.     size_t get (size_t i, size_t j)
  95.     {
  96.         if (i > j) swap(i, j);
  97.         return m[{i, j}];
  98.     }
  99. };
  100.  
  101. /// O(E^2 (* log [by set]) )
  102. Graph edgeGraph (Graph &G)
  103. {
  104.     EdgeId mapper;
  105.     for (size_t i = 0; i < G.N; ++ i)
  106.         for (size_t j : G.edges(i))
  107.             mapper.add(i, j);
  108.  
  109.     Graph E(mapper.m.size());
  110.  
  111.     for (size_t i = 0; i < G.N; ++ i) {
  112.         auto near = G.edges(i);
  113.         addLog(i, near.size());
  114.         for (size_t j : near)
  115.         for (size_t k : near)
  116.         if (j < k) {
  117.             size_t ij = mapper.get(i, j);
  118.             size_t ik = mapper.get(i, k);
  119.             E.add(ij, ik);
  120.         }
  121.     }
  122.     addLog("E.|V| =", E.N);
  123.     return E;
  124. }
  125.  
  126. int main () {
  127.     addLog("Hello, world!");
  128.     Graph G(2);
  129.     G.g = {
  130.         {1, 3},
  131.         {0, 2},
  132.         {1, 3},
  133.         {0, 2}
  134.     }; G.refresh();
  135.  
  136.     addLog(G.N);
  137.  
  138.     Graph E = edgeGraph(G);
  139.  
  140.     E.print();
  141.  
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement