Advertisement
lLab__

cube-165

Apr 8th, 2020
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> pii;
  4.  
  5. int n,M,k;
  6.  
  7. vector<int> nation[50005];
  8.  
  9. int found(vector<int> &parent,int u){
  10.     if(parent[u] == u || parent[u] == 0){
  11.         return parent[u] = u;
  12.     }else{
  13.         return parent[u] = found(parent,parent[u]);
  14.     }
  15. }
  16.  
  17. void uni(vector<int> &parent,vector<int> &r,int u,int v){
  18.     if(r[found(parent,u)] >= r[found(parent,v)]){
  19.         parent[found(parent,v)] = parent[found(parent,u)];
  20.         r[found(parent,u)] += r[found(parent,v)] + 1;
  21.     }else{
  22.         parent[found(parent,u)] = parent[found(parent,v)];
  23.         r[found(parent,v)] += r[found(parent,u)] + 1;
  24.     }
  25. }
  26.  
  27. int mst(priority_queue<pair<int,pii>> pq,int m){
  28.     vector<int> parent(n+1,0);
  29.     vector<int> r(n+1,0);
  30.  
  31.     while(!pq.empty()){
  32.         int u = pq.top().second.first;
  33.         int v = pq.top().second.second;
  34.         int d = pq.top().first;
  35.         pq.pop();
  36.  
  37.         if(d <= m){
  38.             break;
  39.         }
  40.  
  41.         uni(parent,r,u,v);
  42.     }
  43.  
  44.     for(int i=1;i<=k;++i){
  45.         int head = -1;
  46.         for(auto have:nation[i]){
  47.             if(head == -1){
  48.                 head = found(parent,have);
  49.             }else{
  50.                 if(found(parent,have) != head){
  51.                     return -2e9;
  52.                 }
  53.             }
  54.         }
  55.     }
  56.  
  57.     return pq.size()+1;
  58. }
  59.  
  60. int main(){
  61.  
  62.     scanf("%d %d %d",&n,&M,&k);
  63.  
  64.     for(int i=1;i<=n;++i){
  65.         int sth;
  66.  
  67.         scanf("%d",&sth);
  68.  
  69.         nation[sth].push_back(i);
  70.     }
  71.  
  72.     int l = 2e9,r = -2e9;
  73.  
  74.     priority_queue<pair<int,pii>> pq;
  75.  
  76.     for(int i=0;i<M;++i){
  77.         int u,v,d;
  78.  
  79.         scanf("%d %d %d",&u,&v,&d);
  80.  
  81.         l = min(l,d);
  82.         r = max(r,d);
  83.  
  84.         pq.push({d,{u,v}});
  85.     }
  86.  
  87.     int ans = 0;
  88.  
  89.     while(l<=r){
  90.         int  m = (l+r)/2;
  91.  
  92.         int x = mst(pq,m);
  93.  
  94.         if(x == -2e9){
  95.             r = m-1;
  96.         }else{
  97.             l = m+1;
  98.             ans = max(ans,x);
  99.         }
  100.     }
  101.  
  102.     printf("%d",ans);
  103.  
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement