Advertisement
mickypinata

CUBE-T184: Worker

Jun 29th, 2021
673
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct edge {
  5.     int w, u, v;
  6.     edge(int weight, int st, int ed){
  7.         w = weight;
  8.         u = st;
  9.         v = ed;
  10.     }
  11.     bool operator < (const edge &rhs) const{
  12.         if(w != rhs.w){
  13.             return w < rhs.w;
  14.         } else if(u != rhs.u){
  15.             return u < rhs.u;
  16.         } else {
  17.             return v < rhs.v;
  18.         }
  19.     }
  20. };
  21.  
  22. typedef long long lli;
  23.  
  24. const int N = 1000;
  25.  
  26. int ds[N + 1], sz[N + 1];
  27. int dsFind(int u){
  28.     if(ds[u] == u){
  29.         return u;
  30.     }
  31.     return ds[u] = dsFind(ds[u]);
  32. }
  33.  
  34. void dsUnion(int u, int v){
  35.     if(sz[u] < sz[v]){
  36.         swap(u, v);
  37.     }
  38.     ds[v] = u;
  39.     sz[v] += sz[u];
  40. }
  41.  
  42. vector<edge> edges;
  43. int hatred[N + 1];
  44.  
  45. int main(){
  46.  
  47.     int nPeople;
  48.     scanf("%d", &nPeople);
  49.  
  50.     // DSU Setup
  51.     for(int i = 0; i <= nPeople; ++i){
  52.         ds[i] = i;
  53.         sz[i] = 1;
  54.     }
  55.  
  56.     for(int i = 1; i <= nPeople; ++i){
  57.         int talk;
  58.         scanf("%d", &talk);
  59.         edges.emplace_back(talk, 0, i);
  60.     }
  61.     for(int i = 1; i <= nPeople; ++i){
  62.         scanf("%d", &hatred[i]);
  63.     }
  64.     for(int u = 1; u <= nPeople - 1; ++u){
  65.         for(int v = u + 1; v <= nPeople; ++v){
  66.             edges.emplace_back(hatred[u] + hatred[v], u, v);
  67.         }
  68.     }
  69.     sort(edges.begin(), edges.end());
  70.  
  71.     lli sum = 0;
  72.     for(edge e : edges){
  73.         int w = e.w;
  74.         int u = e.u;
  75.         int v = e.v;
  76.         u = dsFind(u);
  77.         v = dsFind(v);
  78.         if(u != v){
  79.             sum += w;
  80.             dsUnion(u, v);
  81.             bool connected = true;
  82.             for(int i = 0; i < nPeople; ++i){
  83.                 if(dsFind(i) != dsFind(i + 1)){
  84.                     connected = false;
  85.                     break;
  86.                 }
  87.             }
  88.             if(connected){
  89.                 break;
  90.             }
  91.         }
  92.     }
  93.     cout << sum;
  94.  
  95.     return 0;
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement