Advertisement
mickypinata

TOI15: Budget

Nov 23rd, 2020
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 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 = 3000;
  9.  
  10. vector<tiii> edges(0);
  11. vector<pii> promo(0);
  12. int ds[N + 10];
  13. int nVertex, nEdge, nPromo;
  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. void dsUnion(int u, int v){
  23.     ds[dsFind(u)] = dsFind(v);
  24. }
  25.  
  26. int main(){
  27.  
  28.     scanf("%d %d", &nVertex, &nEdge);
  29.     for(int i = 0; i < nVertex; ++i){
  30.         ds[i] = i;
  31.     }
  32.     for(int i = 1; i <= nEdge; ++i){
  33.         int u, v, w, roof;
  34.         scanf("%d %d %d %d", &u, &v, &w, &roof);
  35.         if(roof == 1){
  36.             dsUnion(u, v);
  37.         } else {
  38.             edges.emplace_back(w, u, v);
  39.         }
  40.     }
  41.     sort(edges.begin(), edges.end());
  42.  
  43.     scanf("%d", &nPromo);
  44.     for(int i = 1; i <= nPromo; ++i){
  45.         int dist, cost;
  46.         scanf("%d %d", &dist, &cost);
  47.         promo.emplace_back(dist, cost);
  48.     }
  49.     sort(promo.begin(), promo.end());
  50.     int currMn = 1e9;
  51.     for(int i = nPromo - 1; i >= 0; --i){
  52.         if(promo[i].second < currMn){
  53.             currMn = promo[i].second;
  54.         }
  55.         promo[i].second = currMn;
  56.     }
  57.  
  58.     lli sum = 0;
  59.     for(tiii e : edges){
  60.         int w = get<0>(e);
  61.         int u = get<1>(e);
  62.         int v = get<2>(e);
  63.         int x = dsFind(u);
  64.         int y = dsFind(v);
  65.         if(x != y){
  66.             ds[x] = y;
  67.             sum += promo[lower_bound(promo.begin(), promo.end(), make_pair(w, 0)) - promo.begin()].second;
  68.         }
  69.     }
  70.  
  71.     cout << sum;
  72.  
  73.     return 0;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement