mr_dot_convict

BMW-SPOJ-mr.convict

May 18th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 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 x        first
  16. #define y        second
  17. using namespace std;
  18. using pii = pair <int, long long>;
  19.  
  20. const int N = (int)1e5 + 10;
  21. const long long inf = (long long)1e18 + 10;
  22. struct Edge {
  23.    int u, v;
  24.    long long w;
  25.    inline bool operator > (const Edge &o) const {
  26.       return w > o.w;
  27.    }
  28. };
  29.  
  30. vector <Edge> edges;
  31. vector <vector <pii>> T;
  32.  
  33. int n, m;
  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. long long kruskals () {
  64.    makeSet();
  65.    long long ans = inf;
  66.    bool ok = false;
  67.  
  68.    for (Edge e : edges) {
  69.       int u = e.u, v = e.v;
  70.       long long w = e.w;
  71.       if (findSet(u) == findSet(v)) continue;
  72.       mergeSet(u, v);
  73.       if (!ok && findSet(0) == findSet(n - 1)) {
  74.          ans = min(ans, w);
  75.          ok = true;
  76.       }
  77.       T[u].push_back(pii(v, w));
  78.       T[v].push_back(pii(u, w));
  79.    }
  80.    return ans;
  81. }
  82.  
  83. // bool dfs (int u, int pr, int tar, long long& mn, bool vis[]) {
  84. //    vis[u] = true;
  85. //    for (auto vPair : T[u]) {
  86. //       int v = vPair.x;
  87. //       long long w = vPair.y;
  88. //       if (v == pr) continue;
  89. //       if (v == tar) {
  90. //          vis[tar] = true;
  91. //          mn = min(mn, w);
  92. //          return true;
  93. //       }
  94. //       if (!vis[v]) {
  95. //          bool ok = dfs (v, u, tar, mn, vis);
  96. //          if (ok) {
  97. //             mn = min(mn, w);
  98. //             return true;
  99. //          }
  100. //       }
  101. //    }
  102. //    return false;
  103. // }
  104.  
  105. void solve() {
  106.    sort (edges.begin(), edges.end(), greater<Edge>());
  107.    long long ans = kruskals();
  108.    cout << (ans == inf ? -1 : ans) << '\n';
  109. //    long long mn = inf;
  110. //    bool vis[N];
  111. //    for (int i = 0; i < n; ++i) vis[i] = false;
  112. //
  113. //    bool ok = dfs (0, -1, n - 1, mn, vis);
  114. //    cout << (ok ? mn : -1) << '\n';
  115. }
  116.  
  117. void read() {
  118.    cin >> n >> m;
  119.    T.assign(n, vector <pii>());
  120.    edges.clear();
  121.    int u, v;
  122.    long long w;
  123.    for (int i = 0; i < m; ++i) {
  124.       cin >> u >> v >> w;
  125.       --u, --v;
  126.       edges.push_back({u, v, w});
  127.    }
  128. }
  129.  
  130. signed main() {
  131.    IOS; PREC;
  132.    int tc;
  133.    cin >> tc;
  134.    for (int i = 1; i <= tc; ++i) {
  135.       read();
  136.       solve();
  137.    }
  138.    return EXIT_SUCCESS;
  139. }
Add Comment
Please, Sign In to add comment