Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef pair<int,int> pii;
- int n,M,k;
- vector<int> nation[50005];
- int found(vector<int> &parent,int u){
- if(parent[u] == u || parent[u] == 0){
- return parent[u] = u;
- }else{
- return parent[u] = found(parent,parent[u]);
- }
- }
- void uni(vector<int> &parent,vector<int> &r,int u,int v){
- if(r[found(parent,u)] >= r[found(parent,v)]){
- parent[found(parent,v)] = parent[found(parent,u)];
- r[found(parent,u)] += r[found(parent,v)] + 1;
- }else{
- parent[found(parent,u)] = parent[found(parent,v)];
- r[found(parent,v)] += r[found(parent,u)] + 1;
- }
- }
- int mst(priority_queue<pair<int,pii>> pq,int m){
- vector<int> parent(n+1,0);
- vector<int> r(n+1,0);
- while(!pq.empty()){
- int u = pq.top().second.first;
- int v = pq.top().second.second;
- int d = pq.top().first;
- pq.pop();
- if(d <= m){
- break;
- }
- uni(parent,r,u,v);
- }
- for(int i=1;i<=k;++i){
- int head = -1;
- for(auto have:nation[i]){
- if(head == -1){
- head = found(parent,have);
- }else{
- if(found(parent,have) != head){
- return -2e9;
- }
- }
- }
- }
- return pq.size()+1;
- }
- int main(){
- scanf("%d %d %d",&n,&M,&k);
- for(int i=1;i<=n;++i){
- int sth;
- scanf("%d",&sth);
- nation[sth].push_back(i);
- }
- int l = 2e9,r = -2e9;
- priority_queue<pair<int,pii>> pq;
- for(int i=0;i<M;++i){
- int u,v,d;
- scanf("%d %d %d",&u,&v,&d);
- l = min(l,d);
- r = max(r,d);
- pq.push({d,{u,v}});
- }
- int ans = 0;
- while(l<=r){
- int m = (l+r)/2;
- int x = mst(pq,m);
- if(x == -2e9){
- r = m-1;
- }else{
- l = m+1;
- ans = max(ans,x);
- }
- }
- printf("%d",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement