Advertisement
welleyth

G. Велике крадівництво

Apr 11th, 2021
613
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define int long long
  4. #define pb push_back
  5. #define mp make_pair
  6. //#define ull long long
  7.  
  8. typedef unsigned long long ull;
  9.  
  10. using namespace std;
  11.  
  12. const int DEBUG = 0;
  13. const int INF = ((int)1e15 + 10);
  14. const int N = 100010;
  15. const int md = (int)1e7 + 19;
  16.  
  17. vector<int> parent;
  18. vector<int> deep;
  19. vector<set<pair<int,int> > > rest;
  20.  
  21. void init(int n)
  22. {
  23.     parent.resize(n+1);
  24.     deep.resize(n+1,0);
  25.     rest.resize(n+1);
  26.     for(int i = 0; i <= n; i++)
  27.         parent[i] = i;
  28.     return;
  29. }
  30.  
  31. int find_parent(int x)
  32. {
  33.     if(x == parent[x])
  34.         return x;
  35.     return parent[x] = find_parent(parent[x]);
  36. }
  37.  
  38. void union_sets(int a,int b)
  39. {
  40.     int A = find_parent(a);
  41.     int B = find_parent(b);
  42.     if(A == B)
  43.     {
  44.         rest[A].insert(mp(a,b));
  45.         return;
  46.     }
  47.     if(deep[A] > deep[B])
  48.     {
  49.         for(auto x : rest[B])
  50.             rest[A].insert(x);
  51.         rest[B].clear();
  52.         parent[B] = A;
  53.         deep[A] = max(deep[A],deep[B]+1);
  54.     }
  55.     else
  56.     {
  57.         for(auto x : rest[A])
  58.             rest[B].insert(x);
  59.         rest[A].clear();
  60.         parent[A] = B;
  61.         deep[B] = max(deep[B],deep[A]+1);
  62.     }
  63.     return;
  64. }
  65.  
  66. signed main()
  67. {
  68.     ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  69.  
  70.     int n,m;
  71.     cin >> n >> m;
  72.  
  73.     init(n);
  74.  
  75.     int a,b;
  76.  
  77.     for(int i = 0; i < m; i++)
  78.     {
  79.         cin >> a >> b;
  80.         union_sets(a,b);
  81.     }
  82.  
  83.     int cur = find_parent(1);
  84.  
  85.     vector<pair<pair<int,int>,int> > ans;
  86.  
  87.     pair<int,int> p;
  88.     int t;
  89.  
  90.     for(int i = 1; i <= n; i++)
  91.     {
  92.         t = find_parent(i);
  93.         if(t == cur)
  94.             continue;
  95.         if(rest[cur].size())
  96.         {
  97.             p = *rest[cur].begin();
  98.             ans.pb(mp(p,t));
  99.             rest[cur].erase(rest[cur].begin());
  100.             union_sets(cur,t);
  101.             cur = find_parent(i);
  102.         }
  103.         else if(rest[t].size())
  104.         {
  105.             p = *rest[t].begin();
  106.             ans.pb(mp(p,cur));
  107.             rest[t].erase(rest[t].begin());
  108.             union_sets(cur,t);
  109.             cur = find_parent(i);
  110.         }
  111.     }
  112.  
  113.     cout << ans.size() << "\n";
  114.     for(auto x : ans)
  115.     {
  116.         cout << x.first.first << " " << x.first.second << " " << x.second << "\n";
  117.     }
  118.  
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement