mickypinata

CUBE-T181: Copying is not Permitted

Jul 5th, 2021 (edited)
867
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. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef pair<int, int> pii;
  6. typedef tuple<int, int, int> tiii;
  7.  
  8. const int N = 4e4;
  9. const int P = 5e4;
  10.  
  11. vector<tiii> edges;
  12. int ds[N + 1], sz[N + 1], nVertex, nCopy;
  13. pii copying[P + 1];
  14.  
  15. int dsFind(int u){
  16.     if(ds[u] == u){
  17.         return u;
  18.     }
  19.     return ds[u] = dsFind(ds[u]);
  20. }
  21.  
  22. bool isDisconnect(int upbWeight){
  23.     for(int i = 1; i <= nVertex; ++i){
  24.         ds[i] = i;
  25.         sz[i] = 1;
  26.     }
  27.     for(tiii e : edges){
  28.         int w = get<0>(e);
  29.         int u = get<1>(e);
  30.         int v = get<2>(e);
  31.         if(w >= upbWeight){
  32.             break;
  33.         }
  34.         u = dsFind(u);
  35.         v = dsFind(v);
  36.         if(u != v){
  37.             if(sz[u] < sz[v]){
  38.                 swap(u, v);
  39.             }
  40.             ds[v] = u;
  41.             sz[u] += sz[v];
  42.         }
  43.     }
  44.     for(int i = 1; i <= nCopy; ++i){
  45.         if(dsFind(copying[i].first) == dsFind(copying[i].second)){
  46.             return false;
  47.         }
  48.     }
  49.     return true;
  50. }
  51.  
  52. int main(){
  53.  
  54.     int nEdge;
  55.     scanf("%d%d%d", &nVertex, &nEdge, &nCopy);
  56.     int mxFriendship = 1;
  57.     for(int i = 1; i <= nEdge; ++i){
  58.         int u, v, w;
  59.         scanf("%d%d%d", &u, &v, &w);
  60.         edges.emplace_back(w, u, v);
  61.         mxFriendship = max(mxFriendship, w);
  62.     }
  63.     sort(edges.begin(), edges.end());
  64.  
  65.     for(int i = 1; i <= nCopy; ++i){
  66.         int u, v;
  67.         scanf("%d%d", &u, &v);
  68.         copying[i] = pii(u, v);
  69.     }
  70.  
  71.     int l = 1;
  72.     int r = mxFriendship + 1;
  73.     int ans = 1;
  74.     while(l <= r){
  75.         int m = ((lli)l + r) / 2;
  76.         if(isDisconnect(m)){
  77.             ans = max(ans, m);
  78.             l = m + 1;
  79.         } else {
  80.             r = m - 1;
  81.         }
  82.     }
  83.     if(ans == mxFriendship + 1){
  84.         cout << "-1";
  85.     } else {
  86.         cout << ans;
  87.     }
  88.  
  89.     return 0;
  90. }
  91.  
Add Comment
Please, Sign In to add comment