Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #pragma comment(linker, "/STACK:25600000000000000000000000000000000")
  3. #define qq cout << "!!" << endl;
  4. #define ww cout << "??" << endl;
  5. #define rr return 0;
  6. #define nl cout << endl;
  7. #define pb push_back
  8. #define mk make_pair
  9. #define sqr(a) a * a
  10. #define imp(a) fixed << setprecision(a)
  11. #define x first
  12. #define y second
  13. #define acmSqrt(a) __asm__ ("fsqrt" : "+t" (a));
  14.  
  15. using namespace std;
  16.  
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. typedef long double ld;
  20. typedef pair<int, int> pp;
  21. typedef pair<double, double> point;
  22.  
  23. int n, m, s;
  24.  
  25. int *p, *Size, minSpanTree = 0;
  26.  
  27. void makeSet(int k) {
  28.     p[k] = k;
  29. }
  30.  
  31. int Find(int k) {
  32.     if(p[k] == k) {
  33.         return k;
  34.     }
  35.     return p[k] = Find(p[k]);
  36. }
  37.  
  38. vector<pp> tree;
  39.  
  40. void Union(int a, int b, int w) {
  41.     a = Find(a);
  42.     b = Find(b);
  43.  
  44.     if(a == b) {
  45.         return;
  46.     }
  47.  
  48.     minSpanTree = w;
  49.     tree.pb(mk(a, b));
  50.  
  51.     if(Size[a] < Size[b]) {
  52.         swap(a, b);
  53.     }
  54.     p[b] = a;
  55.     Size[a] += Size[b];
  56. }
  57.  
  58. pair<int, pp> *Q;
  59.  
  60. int main() {
  61.     ios_base::sync_with_stdio(0);
  62.     ios::sync_with_stdio(0);
  63.     cin.tie(0);
  64.     cout.tie(0);
  65.     freopen("input.txt", "r", stdin);
  66.     freopen("output.txt", "w", stdout);
  67.  
  68.     cin >> n >> m >> s;
  69.  
  70.     p = new int[n + 1];
  71.     Size = new int[n + 1];
  72.     Q = new pair<int, pp>[m];
  73.  
  74.     for(register int i = 1; i <= n; ++i) {
  75.         makeSet(i);
  76.     }
  77.  
  78.     for(register int i = 0; i < m; ++i) {
  79.         int a, b, c;
  80.         cin >> a >> b >> c;
  81.         Q[i] = (mk(c, mk(a, b)));
  82.     }
  83.  
  84.     sort(Q, Q + m);
  85.  
  86.     for(register int i = 0; i < m; ++i) {
  87.         Union(Q[i].y.x, Q[i].y.y, Q[i].x);
  88.  
  89.         if(Find(1) == Find(n)) {
  90.             break;
  91.         }
  92.     }
  93.  
  94.     cout << minSpanTree << " " << s << endl;
  95.  
  96.     for(auto a : tree) {
  97.         cout << a.x << " " << a.y << endl;
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement