mr_dot_convict

11733-Airports-UVa-mr.convict

May 17th, 2019
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  2.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  3.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  4.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  5.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  6. When I wrote this, only God and I understood what I was doing
  7.  ** * * * * * * * Now, only God knows * * * * * * */
  8. #include         <bits/stdc++.h>
  9. #pragma GCC      optimize ("Ofast")
  10. #pragma GCC      optimize ("unroll-loops")
  11. #pragma GCC      target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  12.  
  13. #define IOS      ios_base::sync_with_stdio(false); cin.tie (nullptr)
  14. #define PREC     cout.precision (10); cout << fixed
  15. #define bg(x)    "[ " << #x << " : " << x << " ]"
  16. #define x        first
  17. #define y        second
  18. using namespace std;
  19. using pii = pair <int, int>;
  20.  
  21. const int N = (int)1e4 + 10;
  22.  
  23. int n, m, A;
  24.  
  25. struct Edge {
  26.    int u, v;
  27.    int w;
  28.    inline bool operator < (const Edge &o) const {
  29.       return w < o.w;
  30.    }
  31. };
  32.  
  33. vector <Edge> edges;
  34. int rep[N], rnk[N];
  35.  
  36. void makeSet() {
  37.    for(int i = 0; i < n; ++i)
  38.       rep[i] = i, rnk[i] = 0;
  39. }
  40.  
  41. int findSet(int u) {
  42.    int ru = u;
  43.    while (ru != rep[ru])
  44.       ru = rep[ru];
  45.  
  46.    while (u != rep[u]) {
  47.       int tmp = rep[u];
  48.       rep[u] = ru;
  49.       u = tmp;
  50.    }
  51.    return ru;
  52. }
  53.  
  54. void mergeSet(int u, int v) {
  55.    int ru = findSet(u), rv = findSet(v);
  56.    if (rnk[ru] > rnk[rv]) rep[rv] = rep[ru];
  57.    else rep[ru] = rep[rv];
  58.  
  59.    if (rnk[ru] == rnk[rv])
  60.       ++rnk[rv];
  61. }
  62.  
  63. pii kruskals () {
  64.    int cost = 0;
  65.    sort (edges.begin(), edges.end());
  66.    makeSet();
  67.    int cnt = n;
  68.  
  69.    for (Edge e : edges) {
  70.       int u = e.u, v = e.v;
  71.       int w = e.w;
  72.       if (findSet(u) == findSet(v) || w >= A) continue;
  73.       cost += w;
  74.       mergeSet(u, v);
  75.       --cnt;
  76.    }
  77.  
  78.    //assert (cnt == n - 1);
  79.    return {cost, cnt};
  80. }
  81.  
  82.  
  83. void solve(int tc) {
  84.    cout << "Case #" << tc << ": ";
  85.  
  86.    pii ans = kruskals();
  87.    cout << 1ll * ans.x + 1ll * ans.y * A << ' ' << ans.y << '\n';
  88. }
  89.  
  90. void read() {
  91.    cin >> n >> m >> A;
  92.    edges.clear();
  93.    int u, v, w;
  94.    for (int i = 0; i < m; ++i) {
  95.       cin >> u >> v >> w;
  96.       --u, --v;
  97.       edges.push_back({u, v, w});
  98.    }
  99. }
  100.  
  101. signed main() {
  102.    int tc;
  103.    cin >> tc;
  104.    for (int i = 1; i <= tc; ++i) {
  105.       read();
  106.       solve(i);
  107.    }
  108.  
  109.    return EXIT_SUCCESS;
  110. }
Add Comment
Please, Sign In to add comment