Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. struct edge {
  7.     unsigned short int v, u;
  8.     double e;
  9.     bool operator<(edge b) {
  10.         return e < b.e;
  11.     }
  12.     edge(unsigned short int _v = 0, unsigned short int _u = 0, long double _e = 0) {
  13.         v = _v;
  14.         u = _u;
  15.         e = _e;
  16.     }
  17. };
  18.  
  19. const int C = 330;
  20.  
  21. array <unsigned short int, 3> p[50050];
  22. vector <edge> e;
  23.  
  24. long double dis(array <unsigned short int, 3> a, array <unsigned short int, 3> b) {
  25.     return sqrt((a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]));
  26. }
  27.  
  28. int dsu[50050];
  29. int ran[50050];
  30.  
  31. int get(int v) {
  32.     if (dsu[v] == v) {
  33.         return v;
  34.     }
  35.     else {
  36.         return dsu[v] = get(dsu[v]);
  37.     }
  38. }
  39.  
  40. void unite(int a, int b) {
  41.     a = get(a);
  42.     b = get(b);
  43.     if (ran[a] < ran[b]) {
  44.         dsu[a] = b;
  45.     }
  46.     else {
  47.         dsu[b] = dsu[a];
  48.         if (ran[a] == ran[b]) {
  49.             ran[b]++;
  50.         }
  51.     }
  52. }
  53.  
  54. bool cmp(array <int, 3> a, array <int, 3> b) {
  55.     return a[1] < b[1] || (a[1] == b[1] && a[0] < b[0]);
  56. }
  57.  
  58. int32_t main() {
  59.     e.reserve(50000 * C);
  60.     ios_base::sync_with_stdio(false);
  61.     cin.tie(NULL);
  62.     cout.tie(NULL);
  63.     for (int i = 0; i < 50050; i++) {
  64.         dsu[i] = i;
  65.     }
  66.     int n;
  67.     cin >> n;
  68.     for (int i = 0; i < n; i++) {
  69.         cin >> p[i][0] >> p[i][1];
  70.         p[i][2] = i;
  71.     }
  72.     sort(p, p + n);
  73.     for (int i = 0; i < n; i++) {
  74.         for (int j = i + 1; j < min(n, i + C + 200); j++) {
  75.             double d = dis(p[i], p[j]);
  76.             if (n > 10000 && d > 1000) {
  77.                 continue;
  78.             }
  79.             e.push_back({p[i][2], p[j][2], d});
  80.         }
  81.     }
  82.     sort(e.begin(), e.end());
  83.     vector <array <int, 2> > ans;
  84.     long double ansv = 0;
  85.     for (auto ed : e) {
  86.         if (get(ed.v) == get(ed.u)) {
  87.             continue;
  88.         }
  89.         else {
  90.             ansv += ed.e;
  91.             ans.push_back({ed.v, ed.u});
  92.             unite(ed.v, ed.u);
  93.         }
  94.     }
  95.     cout.precision(20);
  96.     cout << fixed;
  97.     cout << ansv << "\n";
  98.     for (auto z : ans) {
  99.         cout << z[0] + 1 << " " << z[1] + 1 << "\n";
  100.     }
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement