Advertisement
Romanchenko

problem188

Nov 1st, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. struct Edge
  7. {
  8.     int u, v;
  9.     int w;
  10.     bool operator <(Edge r)
  11.     {
  12.         return w < r.w || (w == r.w && u < r.u) || (w == r.w && u == r.u && v < r.v);
  13.     }
  14. };
  15.  
  16. vector<int> p;
  17.  
  18. int get_p(int v)
  19. {
  20.     if (p[v] == v)
  21.         return v;
  22.     return p[v] = get_p(p[v]);
  23. }
  24.  
  25. void join(int a, int b)
  26. {
  27.     a = get_p(a);
  28.     b = get_p(b);
  29.     if (a == b)
  30.         return;
  31.     if (rand() % 2)
  32.         p[a] = b;
  33.     else
  34.         p[b] = a;
  35. }
  36.  
  37. int main()
  38. {
  39.     ios_base::sync_with_stdio(false);
  40.     cin.tie(0);
  41.     //freopen("input.txt", "r", stdin);
  42.     int n, m;
  43.     cin >> n >> m;
  44.     vector<Edge> g(m);
  45.     p.resize(n);
  46.     for (int i = 0; i < n; i++)
  47.         p[i] = i;
  48.     for (int i = 0; i < m; i++)
  49.     {
  50.         cin >> g[i].u >> g[i].v >> g[i].w;
  51.         g[i].v--;
  52.         g[i].u--;
  53.     }
  54.     sort(g.begin(), g.end());
  55.     vector<pair<int, int> >ans;
  56.     int tw = 0;
  57.     for (int i = 0; i < m; i++)
  58.     {
  59.         int u = get_p(g[i].u);
  60.         int v = get_p(g[i].v);
  61.         if (u == v)
  62.             continue;
  63.         join(u, v);
  64.         tw += g[i].w;
  65.         ans.push_back({g[i].u + 1, g[i].v + 1});
  66.     }
  67.     cout << tw << endl;
  68.     for (auto x : ans)
  69.         cout << x.first << " " << x.second << endl;
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement