Advertisement
mickypinata

CUBE-T165: National Ant Colony

Apr 17th, 2020
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <tuple>
  4. using namespace std;
  5.  
  6. #define tiii tuple<int, int, int>
  7.  
  8. vector<vector<int>> ants;
  9. vector<tiii> edges; /// (u, v, w)
  10. vector<int> DS;
  11. vector<int> ranks;
  12. int nv, ne, ns;
  13.  
  14. int DSFind(int x){
  15.     if(DS[x] == x){
  16.         return x;
  17.     } else {
  18.         return DS[x] = DSFind(DS[x]);
  19.     }
  20. }
  21.  
  22. void DSUnion(int x, int y){
  23.     int headx = DSFind(x);
  24.     int heady = DSFind(y);
  25.     if(ranks[headx] > ranks[heady]){
  26.         DS[heady] = headx;
  27.     } else {
  28.         DS[headx] = heady;
  29.         if(ranks[headx] == ranks[heady]){
  30.             ++ranks[heady];
  31.         }
  32.     }
  33.     return;
  34. }
  35.  
  36. int DestroyEdge(int limit){
  37.     DS.assign(nv + 2, 0);
  38.     ranks.assign(nv + 2, 1);
  39.     for(int i = 1; i <= nv; ++i){
  40.         DS[i] = i;
  41.     }
  42.  
  43.     int cnt = 0;
  44.     for(auto edge : edges){
  45.         int u = get<0>(edge);
  46.         int v = get<1>(edge);
  47.         int w = get<2>(edge);
  48.         if(w <= limit){
  49.             ++cnt;
  50.             continue;
  51.         }
  52.         if(DSFind(u) != DSFind(v)){
  53.             DSUnion(u, v);
  54.         }
  55.     }
  56.  
  57.     for(int i = 1; i <= ns; ++i){
  58.         int sz = ants[i].size();
  59.         if(sz == 0 || sz == 1){
  60.             continue;
  61.         }
  62.         for(int j = 0; j < sz - 1; ++j){
  63.             if(DSFind(ants[i][j]) != DSFind(ants[i][j + 1])){
  64.                 return -1;
  65.             }
  66.         }
  67.     }
  68.     return cnt;
  69. }
  70.  
  71. int main(){
  72.  
  73.     int x, w, u, v, mxlen, mnlen;
  74.  
  75.     scanf("%d %d %d", &nv, &ne, &ns);
  76.     ants.assign(ns + 1, vector<int>());
  77.     for(int i = 1; i <= nv; ++i){
  78.         scanf("%d", &x);
  79.         ants[x].push_back(i);
  80.     }
  81.  
  82.     mxlen = 0;
  83.     mnlen = 1e9;
  84.     for(int i = 0; i < ne; ++i){
  85.         scanf("%d %d %d", &u, &v, &w);
  86.         edges.push_back(make_tuple(u, v, w));
  87.         mxlen = max(mxlen, w);
  88.         mnlen = min(mnlen, w);
  89.     }
  90.  
  91.     int l = mnlen;
  92.     int r = mxlen;
  93.     int ans = 0;
  94.     while(l <= r){
  95.         int m = (l + r) / 2;
  96.         int tmp = DestroyEdge(m);
  97.         if(tmp == -1){
  98.             r = m - 1;
  99.         } else {
  100.             ans = max(ans, tmp);
  101.             l = m + 1;
  102.         }
  103.     }
  104.  
  105.     cout << ans;
  106.  
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement