Advertisement
doofenshmirtzinc

Untitled

Sep 28th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> pii;
  6. typedef pair<long long, long long> pll;
  7. #define ff first
  8. #define ss second
  9. #define mp make_pair
  10. #define pb push_back
  11. #define all(x) (x).begin(), (x).end()
  12. #define fap(x) cerr << __LINE__ << " says: " << #x << " = " << (x) << "\n"
  13. #define FastIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  14. const long long INF = 2000000000000000000LL;    // 2e18
  15. const int inf = 0x3f3f3f3f;
  16. const long double EPS = 1e-9;
  17.  
  18. const int N = 1e5 + 7;
  19. int par[N], sz[N];
  20. vector<int> g[N], c[N];
  21.  
  22. int n;
  23. vector< pii > edges;
  24. vector< vector<int> > queries;
  25.  
  26. int Find(int r) {
  27.     return par[r] == r ? r : Find(par[r]);
  28. }
  29.  
  30. int base[N];
  31. bool vis[N];
  32. int st[N], en[N];
  33.  
  34. void flat() {
  35.     for(int i=1; i<=n; ++i) par[i] = i, sz[i] = 1;
  36.  
  37.     int counter = 0;
  38.     for(auto &e : edges) {
  39.         int u = e.first, v = e.second;
  40.         int pu = Find(u), pv = Find(v);
  41.         if(pu != pv) {
  42.             ++counter;
  43.             if(sz[pu] >= sz[pv]) {
  44.                 g[pu].push_back(pv);
  45.                 c[pu].push_back(counter);
  46.                 par[pv] = pu;
  47.                 sz[pu] += sz[pv];
  48.                 cerr << "Added " << pu << " -> " << pv << "\n";
  49.             }
  50.             else {
  51.                 g[pv].push_back(pu);
  52.                 c[pv].push_back(counter);
  53.                 par[pu] = pv;
  54.                 sz[pv] += sz[pu];
  55.                 cerr << "Added " << pu << " -> " << pv << "\n";
  56.             }
  57.         }
  58.     }
  59.  
  60.     counter = 0;
  61.     memset(vis, false, sizeof vis);
  62.  
  63.     for(int i=1; i<=n; ++i) {
  64.         int p = Find(i);
  65.         cerr << "par of " << i << ": " << p << "\n";
  66.         if(vis[p]) continue;
  67.  
  68.         st[p] = counter + 1;
  69.         priority_queue< pii > pq;
  70.         pq.push(pii(0, p));
  71.         while(!pq.empty()) {
  72.             auto top = pq.top();
  73.             pq.pop();
  74.  
  75.             int u = top.second;
  76.             if(vis[u]) continue;
  77.  
  78.             cerr << "visited " << u << " at " << counter + 1 << "\n";
  79.             ++counter;
  80.             base[counter] = u;
  81.             vis[u] = true;
  82.  
  83.             for(int i=0; i<(int) g[u].size(); ++i) {
  84.                 int v = g[u][i], w = c[u][i];
  85.                 if(!vis[v] and v != u) {
  86.                     pq.push(pii(-w, v));
  87.                 }
  88.             }
  89.         }
  90.         en[p] = counter;
  91.     }
  92.  
  93.     for(int i=1; i<=n; ++i) cerr << base[i] << "\n";
  94. }
  95.  
  96. void clear() {
  97.  
  98. }
  99.  
  100.  
  101.  
  102. int main() {
  103.     FastIO;
  104.  
  105.     int t, tc=0;
  106.     cin >> t;
  107.  
  108.     while(t--) {
  109.         clear();
  110.  
  111.         cin >> n;
  112.         int q;
  113.         cin >> q;
  114.  
  115.         while(q--) {
  116.             vector<int> cur;
  117.             int tp;
  118.             cin >> tp;
  119.            
  120.             if(tp == 0) {
  121.                 int u, v;
  122.                 cin >> u >> v;
  123.                 edges.push_back(pii(u, v));
  124.                 cur = { tp, u, v };
  125.             }
  126.             else if(tp == 1) {
  127.                 int u, t;
  128.                 cin >> u >> t;
  129.                 cur = { tp, u, t };
  130.             }
  131.             else if(tp == 2) {
  132.                 int u, l, r;
  133.                 cin >> u >> l >> r;
  134.                 cur = { tp, u, l, r };
  135.             }
  136.         }
  137.  
  138.         flat();
  139.  
  140.  
  141.     }
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement